[tbb] 28/64: Imported Upstream version 4.0+r233
Graham Inggs
ginggs at moszumanska.debian.org
Mon Jul 3 12:27:53 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 b206109de0490b534304e87f3bdc5d9884e6279f
Author: Graham Inggs <ginggs at debian.org>
Date: Mon Jul 3 14:13:46 2017 +0200
Imported Upstream version 4.0+r233
---
CHANGES | 91 +-
Makefile | 14 +-
build/Makefile.rml | 4 +-
build/Makefile.tbb | 3 +-
build/Makefile.tbbmalloc | 10 +-
build/Makefile.tbbproxy | 116 +
build/Makefile.test | 31 +-
build/SunOS.suncc.inc | 7 +-
build/big_iron.inc | 74 +
build/common_rules.inc | 2 +-
build/generate_tbbvars.bat | 12 +-
build/generate_tbbvars.sh | 12 +-
build/index.html | 7 +-
build/linux.gcc.inc | 4 +-
build/linux.icc.inc | 9 +-
build/linux.inc | 2 +-
build/{linux.gcc.inc => linux.xl.inc} | 100 +-
build/macos.icc.inc | 3 +
build/vsproject/index.html | 7 +-
build/vsproject/tbb.vcproj | 4 +-
build/vsproject/tbbmalloc.vcproj | 2 +-
build/windows.gcc.inc | 2 +-
build/windows.inc | 7 +
build/xbox360.cl.inc | 2 +-
doc/Release_Notes.txt | 61 +-
doc/html/a00001.html | 7 +-
doc/html/a00002.html | 8 +-
doc/html/a00003.html | 6 +-
doc/html/a00004.html | 17 +-
doc/html/a00005.html | 13 +-
doc/html/a00006.html | 26 +-
doc/html/a00007.html | 28 +-
doc/html/a00008.html | 43 -
doc/html/a00009.html | 22 +-
doc/html/a00011.html | 15 +-
doc/html/{a00014.html => a00012.html} | 6 +-
doc/html/a00013.html | 75 +-
doc/html/a00015.html | 69 +-
doc/html/{a00019.html => a00016.html} | 24 +-
doc/html/a00017.html | 16 +-
doc/html/a00018.html | 33 +-
doc/html/a00020.html | 54 -
doc/html/{a00024.html => a00022.html} | 48 +-
doc/html/{a00025.html => a00023.html} | 56 +-
doc/html/a00025.html | 65 +-
doc/html/a00027.html | 68 -
doc/html/{a00032.html => a00031.html} | 142 +-
doc/html/{a00037.html => a00036.html} | 70 +-
doc/html/{a00040.html => a00039.html} | 4 +-
doc/html/a00041.html | 41 +
doc/html/a00042.html | 17 +-
doc/html/a00043.html | 25 +-
doc/html/a00044.html | 25 +-
doc/html/a00045.html | 43 -
doc/html/a00047.html | 47 +
doc/html/a00048.html | 25 +-
doc/html/a00049.html | 21 +-
doc/html/a00050.html | 16 +-
doc/html/a00052.html | 40 +
doc/html/a00053.html | 42 -
doc/html/a00054.html | 29 +-
doc/html/a00055.html | 89 -
doc/html/a00057.html | 50 +
doc/html/a00058.html | 112 +-
doc/html/a00059.html | 93 -
doc/html/a00060.html | 115 +-
doc/html/a00061.html | 81 +-
doc/html/a00062.html | 87 +
doc/html/a00063.html | 55 +
doc/html/a00065.html | 44 -
doc/html/a00067.html | 48 -
doc/html/a00068.html | 54 +
doc/html/a00070.html | 43 +
doc/html/{a00040.html => a00072.html} | 5 +-
doc/html/{a00078.html => a00074.html} | 36 +-
doc/html/{a00079.html => a00075.html} | 16 +-
doc/html/{a00080.html => a00076.html} | 10 +-
doc/html/{a00081.html => a00077.html} | 14 +-
doc/html/a00078.html | 23 +-
doc/html/a00079.html | 17 +-
doc/html/a00080.html | 8 +-
doc/html/a00082.html | 7 +-
doc/html/a00083.html | 11 +-
doc/html/a00084.html | 9 +-
doc/html/a00085.html | 5 +-
doc/html/a00086.html | 8 +-
doc/html/a00087.html | 12 +-
doc/html/{a00088.html => a00089.html} | 11 +-
doc/html/a00090.html | 13 +-
doc/html/{a00093.html => a00091.html} | 46 +-
doc/html/a00092.html | 34 +-
doc/html/a00093.html | 36 +-
doc/html/a00094.html | 31 +-
doc/html/a00095.html | 23 +-
doc/html/a00096.html | 9 +-
doc/html/a00097.html | 17 +-
doc/html/a00098.html | 15 +-
doc/html/a00099.html | 16 +-
doc/html/a00100.html | 23 +-
doc/html/a00101.html | 15 +-
doc/html/a00102.html | 21 +-
doc/html/a00103.html | 19 +-
doc/html/a00104.html | 14 +-
doc/html/a00105.html | 30 +-
doc/html/a00106.html | 39 -
doc/html/a00107.html | 36 +-
doc/html/a00109.html | 8 +-
doc/html/a00111.html | 20 +-
doc/html/a00112.html | 16 +-
doc/html/a00113.html | 22 +-
doc/html/a00114.html | 22 +-
doc/html/a00116.html | 2 +-
doc/html/a00117.html | 52 -
doc/html/a00119.html | 117 +-
doc/html/a00120.html | 113 +-
doc/html/a00121.html | 18 +-
doc/html/a00128.html | 20 +-
doc/html/a00130.html | 44 +-
doc/html/a00132.html | 8 +-
doc/html/a00134.html | 26 +-
doc/html/a00136.html | 10 +-
doc/html/a00138.html | 6 +-
doc/html/a00139.html | 4 +-
doc/html/a00140.html | 4 +-
doc/html/a00141.html | 4 +-
doc/html/a00142.html | 14 +-
doc/html/a00143.html | 26 +-
doc/html/a00144.html | 28 +-
doc/html/a00145.html | 12 +-
doc/html/{a00146.html => a00150.html} | 10 +-
doc/html/{a00014.html => a00154.html} | 6 +-
doc/html/{a00014.html => a00155.html} | 6 +-
doc/html/{a00153.html => a00164.html} | 4 +-
doc/html/{a00159.html => a00168.html} | 8 +-
doc/html/{a00160.html => a00169.html} | 20 +-
doc/html/a00212.html | 59 -
doc/html/a00213.html | 56 -
doc/html/a00214.html | 83 -
doc/html/a00215.html | 63 -
doc/html/a00217.html | 56 -
doc/html/a00218.html | 59 -
doc/html/a00219.html | 64 -
doc/html/a00220.html | 50 -
doc/html/a00221.html | 224 --
doc/html/a00222.html | 86 -
doc/html/a00223.html | 93 -
doc/html/a00224.html | 86 -
doc/html/a00224.png | Bin 891 -> 0 bytes
doc/html/a00225.html | 407 +--
doc/html/a00225.png | Bin 1836 -> 674 bytes
doc/html/a00226.html | 90 +-
doc/html/a00226.png | Bin 0 -> 671 bytes
doc/html/a00227.html | 42 +-
doc/html/a00228.html | 132 +-
doc/html/a00228.png | Bin 472 -> 0 bytes
doc/html/a00229.html | 56 +-
doc/html/a00230.html | 277 +-
doc/html/a00230.png | Bin 731 -> 0 bytes
doc/html/a00231.html | 618 +----
doc/html/a00232.html | 36 +-
doc/html/a00232.png | Bin 1371 -> 0 bytes
doc/html/a00233.html | 199 +-
doc/html/a00234.html | 88 +-
doc/html/a00235.html | 290 +--
doc/html/a00236.html | 158 +-
doc/html/a00236.png | Bin 0 -> 1270 bytes
doc/html/a00237.html | 381 ++-
doc/html/a00237.png | Bin 720 -> 2898 bytes
doc/html/a00238.html | 586 +----
doc/html/a00239.html | 33 +-
doc/html/a00240.html | 136 +-
doc/html/a00240.png | Bin 691 -> 472 bytes
doc/html/a00241.html | 145 +-
doc/html/a00241.png | Bin 459 -> 0 bytes
doc/html/a00242.html | 278 +-
doc/html/a00242.png | Bin 387 -> 731 bytes
doc/html/a00243.html | 673 ++++-
doc/html/a00244.html | 65 +-
doc/html/a00244.png | Bin 709 -> 1371 bytes
doc/html/a00245.html | 211 +-
doc/html/a00246.html | 82 +-
doc/html/{a00234.png => a00246.png} | Bin
doc/html/a00247.html | 323 ++-
doc/html/a00248.html | 137 +-
doc/html/a00249.html | 139 +-
doc/html/a00249.png | Bin 543 -> 720 bytes
doc/html/a00250.html | 523 +++-
doc/html/a00251.html | 35 +-
doc/html/a00251.png | Bin 23191 -> 0 bytes
doc/html/a00252.html | 59 +-
doc/html/a00252.png | Bin 0 -> 777 bytes
doc/html/a00253.html | 136 +-
doc/html/a00253.png | Bin 0 -> 668 bytes
doc/html/a00254.html | 65 +-
doc/html/a00254.png | Bin 1138 -> 387 bytes
doc/html/a00255.html | 218 +-
doc/html/a00255.png | Bin 843 -> 0 bytes
doc/html/a00256.html | 204 +-
doc/html/{a00245.png => a00256.png} | Bin
doc/html/a00257.html | 151 +-
doc/html/a00258.html | 109 +-
doc/html/a00259.html | 45 +-
doc/html/a00260.html | 65 +-
doc/html/a00260.png | Bin 0 -> 942 bytes
doc/html/a00261.html | 68 +-
doc/html/a00261.png | Bin 0 -> 1016 bytes
doc/html/a00262.html | 200 +-
doc/html/a00263.html | 46 +-
doc/html/a00263.png | Bin 0 -> 4876 bytes
doc/html/a00264.html | 33 +-
doc/html/a00265.html | 108 +-
doc/html/a00266.html | 124 +-
doc/html/a00266.png | Bin 0 -> 1209 bytes
doc/html/a00267.html | 28 +-
doc/html/a00268.html | 104 +-
doc/html/a00268.png | Bin 1370 -> 0 bytes
doc/html/a00269.html | 89 +-
doc/html/a00269.png | Bin 1523 -> 0 bytes
doc/html/a00270.html | 110 +-
doc/html/a00271.html | 95 +-
doc/html/a00272.html | 49 +-
doc/html/a00273.html | 132 +-
doc/html/{a00257.png => a00273.png} | Bin
doc/html/a00274.html | 200 +-
doc/html/a00274.png | Bin 0 -> 943 bytes
doc/html/a00275.html | 109 +-
doc/html/a00276.html | 50 +-
doc/html/a00277.html | 66 +-
doc/html/a00277.png | Bin 2390 -> 0 bytes
doc/html/a00278.html | 89 +-
doc/html/a00279.html | 54 +-
doc/html/a00280.html | 85 +-
doc/html/a00281.html | 46 +-
doc/html/a00282.html | 139 +-
doc/html/a00282.png | Bin 1782 -> 0 bytes
doc/html/a00283.html | 80 +-
doc/html/a00283.png | Bin 1445 -> 0 bytes
doc/html/a00284.html | 83 +-
doc/html/a00285.html | 106 +-
doc/html/a00285.png | Bin 732 -> 0 bytes
doc/html/a00286.html | 162 +-
doc/html/a00286.png | Bin 0 -> 2103 bytes
doc/html/a00287.html | 122 +-
doc/html/a00287.png | Bin 0 -> 2251 bytes
doc/html/a00288.html | 98 +-
doc/html/a00289.html | 97 +-
doc/html/a00290.html | 50 +-
doc/html/a00291.html | 578 +----
doc/html/a00292.html | 189 +-
doc/html/a00293.html | 218 +-
doc/html/a00294.html | 56 +-
doc/html/a00295.html | 162 +-
doc/html/a00295.png | Bin 0 -> 3242 bytes
doc/html/a00296.html | 134 +-
doc/html/a00297.html | 56 +-
doc/html/a00298.html | 287 ++-
doc/html/a00299.html | 107 +-
doc/html/a00300.html | 39 +-
doc/html/a00301.html | 118 +-
doc/html/a00301.png | Bin 426 -> 2681 bytes
doc/html/a00302.html | 92 +-
doc/html/a00302.png | Bin 0 -> 2045 bytes
doc/html/a00303.html | 62 +-
doc/html/a00304.html | 125 +-
doc/html/a00304.png | Bin 548 -> 1084 bytes
doc/html/a00305.html | 102 +-
doc/html/a00306.html | 94 +-
doc/html/a00307.html | 107 +-
doc/html/{a00289.html => a00308.html} | 24 +-
doc/html/{a00290.html => a00309.html} | 8 +-
doc/html/a00310.html | 75 +
doc/html/a00310.png | Bin 0 -> 3064 bytes
doc/html/{a00291.html => a00311.html} | 156 +-
doc/html/{a00291.png => a00311.png} | Bin
doc/html/{a00292.html => a00312.html} | 2 +-
doc/html/{a00239.html => a00314.html} | 15 +-
doc/html/{a00294.html => a00315.html} | 16 +-
doc/html/{a00295.html => a00316.html} | 30 +-
doc/html/{a00296.html => a00317.html} | 22 +-
doc/html/{a00297.html => a00318.html} | 4 +-
doc/html/{a00298.html => a00319.html} | 42 +-
doc/html/{a00298.png => a00319.png} | Bin
doc/html/{a00299.html => a00320.html} | 12 +-
doc/html/{a00216.html => a00321.html} | 33 +-
doc/html/{a00301.html => a00322.html} | 18 +-
doc/html/{a00301.png => a00322.png} | Bin
doc/html/{a00302.html => a00323.html} | 20 +-
doc/html/{a00303.html => a00324.html} | 26 +-
doc/html/{a00305.html => a00325.html} | 8 +-
doc/html/a00326.html | 171 +-
doc/html/{a00307.html => a00327.html} | 4 +-
doc/html/{a00326.html => a00343.html} | 150 +-
doc/html/a00344.html | 55 +-
doc/html/{a00344.html => a00363.html} | 59 +-
doc/html/a00370.html | 61 -
doc/html/a00373.html | 313 ---
doc/html/a00377.html | 159 --
doc/html/a00381.html | 942 -------
doc/html/{a00362.html => a00383.html} | 506 ++--
doc/html/{a00371.html => a00395.html} | 180 +-
doc/html/{a00372.html => a00396.html} | 28 +-
doc/html/a00397.html | 1692 +++----------
doc/html/{a00374.html => a00398.html} | 40 +-
doc/html/{a00375.html => a00399.html} | 4 +-
doc/html/{a00376.html => a00400.html} | 20 +-
doc/html/{a00409.html => a00401.html} | 8 +-
doc/html/a00403.html | 433 ++++
doc/html/a00407.html | 107 -
doc/html/a00410.html | 376 ---
doc/html/{a00418.html => a00412.html} | 38 +-
doc/html/{a00419.html => a00413.html} | 36 +-
doc/html/{a00420.html => a00414.html} | 52 +-
doc/html/{a00421.html => a00415.html} | 26 +-
doc/html/{a00423.html => a00417.html} | 12 +-
doc/html/a00418.html | 1240 ++++++++-
doc/html/a00424.html | 1219 ---------
doc/html/a00429.html | 328 +++
doc/html/{a00436.html => a00432.html} | 126 +-
doc/html/a00433.html | 337 ---
doc/html/a00436.html | 505 ++--
doc/html/a00437.html | 263 --
doc/html/a00440.html | 199 ++
doc/html/a00442.html | 926 -------
doc/html/a00443.html | 927 +++++++
doc/html/{a00451.html => a00452.html} | 0
doc/html/a00454.html | 967 -------
doc/html/a00455.html | 968 +++++++
doc/html/a00466.html | 2522 ------------------
doc/html/a00468.html | 1479 +++++++++++
doc/html/a00480.html | 259 ++
doc/html/{a00499.html => a00487.html} | 72 +-
doc/html/{a00501.html => a00489.html} | 20 +-
doc/html/{a00502.html => a00490.html} | 20 +-
doc/html/{a00503.html => a00491.html} | 20 +-
doc/html/a00500.html | 256 ++
doc/html/{a00516.html => a00504.html} | 24 +-
doc/html/{a00518.html => a00506.html} | 616 ++---
doc/html/a00512.html | 595 +++--
doc/html/a00518.html | 607 +++--
doc/html/{a00533.html => a00523.html} | 188 +-
doc/html/a00524.html | 340 ---
doc/html/{a00537.html => a00527.html} | 36 +-
doc/html/a00528.html | 341 ---
doc/html/a00531.html | 500 ++++
doc/html/a00541.html | 230 --
doc/html/{a00546.html => a00543.html} | 154 +-
doc/html/{a00560.html => a00557.html} | 44 +-
doc/html/{a00561.html => a00558.html} | 48 +-
doc/html/{a00562.html => a00559.html} | 54 +-
doc/html/a00560.html | 271 +-
doc/html/a00561.html | 195 +-
doc/html/a00562.html | 304 ++-
doc/html/a00563.html | 241 --
doc/html/a00564.html | 199 --
doc/html/a00565.html | 64 +-
doc/html/a00566.html | 74 +-
doc/html/a00567.html | 1061 ++++----
doc/html/a00577.html | 422 +--
doc/html/a00584.html | 96 +-
doc/html/a00588.html | 42 +-
doc/html/a00592.html | 374 +--
doc/html/a00593.html | 118 +-
doc/html/a00594.html | 1329 +++++-----
doc/html/a00599.html | 225 --
doc/html/a00600.html | 382 ++-
doc/html/{a00600.html => a00601.html} | 325 +--
doc/html/{a00606.html => a00608.html} | 2 +-
doc/html/a00614.html | 96 -
doc/html/a00616.html | 160 +-
doc/html/{a00616.html => a00618.html} | 52 +-
doc/html/annotated.html | 199 +-
doc/html/deprecated.html | 2 +-
doc/html/files.html | 83 +-
doc/html/functions.html | 30 +-
doc/html/functions_0x62.html | 10 +-
doc/html/functions_0x63.html | 47 +-
doc/html/functions_0x64.html | 18 +-
doc/html/functions_0x65.html | 32 +-
doc/html/functions_0x66.html | 20 +-
doc/html/functions_0x67.html | 15 +-
doc/html/functions_0x69.html | 46 +-
doc/html/functions_0x6c.html | 11 +-
doc/html/functions_0x6d.html | 13 +-
doc/html/functions_0x6e.html | 8 +-
doc/html/functions_0x6f.html | 24 +-
doc/html/functions_0x70.html | 32 +-
doc/html/functions_0x71.html | 6 +-
doc/html/functions_0x72.html | 57 +-
doc/html/functions_0x73.html | 50 +-
doc/html/functions_0x74.html | 37 +-
doc/html/functions_0x75.html | 6 +-
doc/html/functions_0x76.html | 2 +-
doc/html/functions_0x77.html | 4 +-
doc/html/functions_0x7e.html | 48 +-
doc/html/functions_enum.html | 11 +-
doc/html/functions_eval.html | 21 +-
doc/html/functions_func.html | 24 +-
doc/html/functions_func_0x62.html | 10 +-
doc/html/functions_func_0x63.html | 42 +-
doc/html/functions_func_0x64.html | 12 +-
doc/html/functions_func_0x65.html | 15 +-
doc/html/functions_func_0x66.html | 10 +-
doc/html/functions_func_0x67.html | 15 +-
doc/html/functions_func_0x69.html | 44 +-
doc/html/functions_func_0x6c.html | 11 +-
doc/html/functions_func_0x6d.html | 7 +-
doc/html/functions_func_0x6e.html | 6 +-
doc/html/functions_func_0x6f.html | 18 +-
doc/html/functions_func_0x70.html | 28 +-
doc/html/functions_func_0x71.html | 6 +-
doc/html/functions_func_0x72.html | 47 +-
doc/html/functions_func_0x73.html | 42 +-
doc/html/functions_func_0x74.html | 37 +-
doc/html/functions_func_0x75.html | 6 +-
doc/html/functions_func_0x77.html | 4 +-
doc/html/functions_func_0x7e.html | 48 +-
doc/html/functions_rela.html | 6 +-
doc/html/functions_type.html | 30 +-
doc/html/functions_vars.html | 22 +-
doc/html/globals.html | 22 +-
doc/html/globals_func.html | 22 +-
doc/html/hierarchy.html | 290 +--
doc/html/modules.html | 12 +-
doc/html/namespacemembers.html | 40 +-
doc/html/namespacemembers_enum.html | 4 +-
doc/html/namespacemembers_eval.html | 9 +-
doc/html/namespacemembers_func.html | 27 +-
doc/html/namespacemembers_type.html | 2 +-
doc/html/namespaces.html | 3 +-
examples/GettingStarted/index.html | 7 +-
examples/GettingStarted/sub_string_finder/Makefile | 8 +
.../sub_string_finder/Makefile.windows | 3 +
.../GettingStarted/sub_string_finder/index.html | 7 +-
.../msvs/sub_string_finder.vcproj | 24 +-
.../msvs/sub_string_finder_extended.vcproj | 24 +-
.../msvs/sub_string_finder_pretty.vcproj | 24 +-
.../sub_string_finder.xcodeproj/project.pbxproj | 97 +-
examples/Makefile | 29 +-
examples/common/copy_libraries.bat | 22 +-
examples/common/gui/Makefile.gmake | 12 +-
examples/common/gui/macvideo.cpp | 192 +-
examples/common/gui/video.h | 4 +-
examples/common/index.html | 7 +-
examples/common/utility/fast_random.h | 90 +
.../concurrent_hash_map/count_strings/Makefile | 4 +
.../concurrent_hash_map/count_strings/index.html | 7 +-
.../count_strings/msvs/count_strings.vcproj | 24 +-
.../xcode/count_strings.xcodeproj/project.pbxproj | 39 +-
examples/concurrent_hash_map/index.html | 7 +-
.../shortpath}/Makefile | 16 +-
.../shortpath}/Makefile.windows | 10 +-
.../concurrent_priority_queue/shortpath/index.html | 82 +
.../shortpath/msvs/shortpath.icproj | 11 +
.../shortpath/msvs/shortpath.vcproj} | 40 +-
.../shortpath/msvs/shortpath_cl.sln | 25 +
.../shortpath/msvs/shortpath_icl.sln | 33 +
.../shortpath/shortpath.cpp | 375 +++
.../xcode/shortpath.xcodeproj}/project.pbxproj | 123 +-
.../{task_group/sudoku => graph/binpack}/Makefile | 19 +-
.../sudoku => graph/binpack}/Makefile.windows | 10 +-
examples/graph/binpack/binpack.cpp | 305 +++
examples/graph/binpack/index.html | 72 +
examples/graph/binpack/msvs/binpack.icproj | 11 +
.../binpack/msvs/binpack.vcproj} | 46 +-
examples/graph/binpack/msvs/binpack_cl.sln | 25 +
examples/graph/binpack/msvs/binpack_icl.sln | 33 +
.../xcode/binpack.xcodeproj}/project.pbxproj | 123 +-
.../dining_philosophers}/Makefile | 19 +-
.../dining_philosophers}/Makefile.windows | 18 +-
examples/graph/dining_philosophers/index.html | 48 +
.../msvs/dining_philosophers.icproj | 11 +
.../msvs/dining_philosophers.vcproj} | 56 +-
.../msvs/dining_philosophers_cl.sln | 25 +
.../msvs/dining_philosophers_icl.sln | 33 +
.../src/dining_philosophers.cpp | 318 +++
.../dining_philosophers.xcodeproj}/project.pbxproj | 83 +-
examples/graph/index.html | 26 +
examples/index.html | 11 +-
examples/parallel_do/index.html | 7 +-
examples/parallel_do/parallel_preorder/Makefile | 4 +
examples/parallel_do/parallel_preorder/index.html | 7 +-
.../msvs/parallel_preorder.vcproj | 24 +-
.../parallel_preorder.xcodeproj/project.pbxproj | 39 +-
examples/parallel_for/game_of_life/Makefile | 9 +-
.../parallel_for/game_of_life/Makefile.windows | 7 +-
examples/parallel_for/game_of_life/index.html | 7 +-
.../game_of_life/msvs/Game_of_life.vcproj | 48 +-
.../xcode/game_of_life.xcodeproj/project.pbxproj | 31 +-
examples/parallel_for/index.html | 7 +-
examples/parallel_for/polygon_overlay/Makefile | 21 +-
.../parallel_for/polygon_overlay/Makefile.windows | 3 +
examples/parallel_for/polygon_overlay/index.html | 7 +-
.../parallel_for/polygon_overlay/msvs/pover.vcproj | 48 +-
.../parallel_for/polygon_overlay/msvs/pover_cl.sln | 12 +-
.../polygon_overlay/msvs/pover_icl.sln | 20 +-
.../xcode/PolygonOverlay.xcodeproj/project.pbxproj | 38 +-
examples/parallel_for/seismic/Makefile | 28 +-
examples/parallel_for/seismic/Makefile.windows | 22 +-
.../parallel_for/seismic/SeismicSimulation.cpp | 439 ----
examples/parallel_for/seismic/index.html | 51 +-
examples/parallel_for/seismic/main.cpp | 133 +
.../seismic/msvs/SeismicSimulation.icproj | 2 +-
.../seismic/msvs/SeismicSimulation.vcproj | 82 +-
.../seismic/msvs/SeismicSimulation_cl.sln | 28 +-
.../seismic/msvs/SeismicSimulation_icl.sln | 62 +-
examples/parallel_for/seismic/seismic_video.cpp | 156 ++
.../parallel_for/seismic/seismic_video.h | 47 +-
examples/parallel_for/seismic/universe.cpp | 230 ++
examples/parallel_for/seismic/universe.h | 120 +
.../SeismicSimulation.xcodeproj/project.pbxproj | 52 +-
examples/parallel_for/tachyon/Makefile | 39 +-
examples/parallel_for/tachyon/Makefile.windows | 22 +-
examples/parallel_for/tachyon/index.html | 33 +-
.../tachyon/msvs/tachyon.serial.vcproj | 48 +-
.../parallel_for/tachyon/msvs/tachyon.tbb.vcproj | 104 +-
.../parallel_for/tachyon/msvs/tachyon.tbb1d.vcproj | 104 +-
examples/parallel_for/tachyon/msvs/tachyon.vcproj | 52 +-
examples/parallel_for/tachyon/msvs/tachyon_cl.sln | 104 +-
examples/parallel_for/tachyon/msvs/tachyon_icl.sln | 227 +-
examples/parallel_for/tachyon/src/api.cpp | 4 +-
examples/parallel_for/tachyon/src/api.h | 2 +-
examples/parallel_for/tachyon/src/getargs.cpp | 204 --
examples/parallel_for/tachyon/src/grid.cpp | 11 +-
.../tachyon/src/{video.cpp => main.cpp} | 219 +-
examples/parallel_for/tachyon/src/render.cpp | 4 +-
.../tachyon/src/{getargs.h => tachyon_video.cpp} | 45 +-
.../tachyon/src/{video.h => tachyon_video.h} | 6 +
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/types.h | 2 +-
examples/parallel_for/tachyon/src/ui.cpp | 14 +-
examples/parallel_for/tachyon/src/util.cpp | 59 +-
examples/parallel_for/tachyon/src/util.h | 20 +-
.../xcode/tachyon.xcodeproj/project.pbxproj | 98 +-
examples/parallel_reduce/convex_hull/Makefile | 14 +
.../parallel_reduce/convex_hull/Makefile.windows | 12 +-
examples/parallel_reduce/convex_hull/convex_hull.h | 152 +-
.../convex_hull/convex_hull_bench.cpp | 122 +-
.../convex_hull/convex_hull_sample.cpp | 95 +-
examples/parallel_reduce/convex_hull/index.html | 7 +-
.../convex_hull/msvs/convex_hull_benchmark.vcproj | 24 +-
.../convex_hull/msvs/convex_hull_sample.vcproj | 24 +-
.../xcode/convex_hull.xcodeproj/project.pbxproj | 69 +-
examples/parallel_reduce/index.html | 7 +-
examples/parallel_reduce/primes/Makefile | 4 +
examples/parallel_reduce/primes/index.html | 7 +-
examples/parallel_reduce/primes/msvs/primes.vcproj | 24 +-
.../primes/xcode/primes.xcodeproj/project.pbxproj | 39 +-
examples/pipeline/index.html | 7 +-
examples/pipeline/square/Makefile | 13 +-
examples/pipeline/square/Makefile.windows | 8 +-
examples/pipeline/square/index.html | 27 +-
examples/pipeline/square/msvs/square.vcproj | 28 +-
examples/pipeline/square/square.cpp | 118 +-
.../square/xcode/square.xcodeproj/project.pbxproj | 61 +-
examples/task/index.html | 7 +-
examples/task/tree_sum/Makefile | 12 +-
examples/task/tree_sum/Makefile.windows | 8 +-
examples/task/tree_sum/{main.cpp => TreeMaker.h} | 83 +-
examples/task/tree_sum/index.html | 29 +-
examples/task/tree_sum/main.cpp | 205 +-
examples/task/tree_sum/msvs/tree_sum.vcproj | 28 +-
.../xcode/tree_sum.xcodeproj/project.pbxproj | 39 +-
examples/task_group/index.html | 7 +-
examples/task_group/sudoku/Makefile | 13 +-
examples/task_group/sudoku/Makefile.windows | 8 +-
examples/task_group/sudoku/index.html | 26 +-
examples/task_group/sudoku/msvs/sudoku.vcproj | 24 +-
examples/task_group/sudoku/sudoku.cpp | 108 +-
.../sudoku/xcode/sudoku.xcodeproj/project.pbxproj | 43 +-
examples/task_priority/fractal/Makefile | 19 +-
examples/task_priority/fractal/Makefile.windows | 11 +-
examples/task_priority/fractal/fractal.cpp | 31 +-
examples/task_priority/fractal/fractal.h | 16 +-
examples/task_priority/fractal/fractal_video.h | 10 +-
examples/task_priority/fractal/index.html | 7 +-
examples/task_priority/fractal/msvs/fractal.icproj | 2 +-
examples/task_priority/fractal/msvs/fractal.vcproj | 117 +-
examples/task_priority/fractal/msvs/fractal_cl.sln | 26 +-
.../task_priority/fractal/msvs/fractal_icl.sln | 58 +-
.../xcode/fractal.xcodeproj/project.pbxproj | 48 +-
examples/task_priority/index.html | 7 +-
examples/test_all/fibonacci/Makefile | 4 +
examples/test_all/fibonacci/index.html | 7 +-
examples/test_all/fibonacci/msvs/fibonacci.vcproj | 24 +-
.../xcode/fibonacci.xcodeproj/project.pbxproj | 39 +-
examples/test_all/index.html | 7 +-
include/index.html | 7 +-
include/serial/tbb/parallel_for.h | 173 ++
.../serial/tbb/tbb_annotate.h | 28 +-
include/tbb/atomic.h | 148 +-
include/tbb/blocked_range2d.h | 2 +-
include/tbb/blocked_range3d.h | 2 +-
include/tbb/compat/ppl.h | 2 +
include/tbb/compat/tuple | 5 +
include/tbb/concurrent_hash_map.h | 2 +-
include/tbb/concurrent_priority_queue.h | 104 +-
include/tbb/concurrent_queue.h | 8 +-
include/tbb/concurrent_unordered_map.h | 17 +-
..._unordered_map.h => concurrent_unordered_set.h} | 116 +-
include/tbb/concurrent_vector.h | 1 +
include/tbb/enumerable_thread_specific.h | 1 +
include/tbb/flow_graph.h | 1589 ++++++++++++
include/tbb/graph.h | 2673 --------------------
include/tbb/index.html | 7 +-
.../_aggregator_impl.h} | 26 +-
.../_concurrent_queue_impl.h} | 28 +-
.../_concurrent_unordered_impl.h} | 32 +-
include/tbb/internal/_flow_graph_impl.h | 582 +++++
.../tbb/internal/_flow_graph_item_buffer_impl.h | 190 ++
include/tbb/internal/_flow_graph_join_impl.h | 1702 +++++++++++++
include/tbb/internal/_flow_graph_node_impl.h | 473 ++++
include/tbb/internal/_flow_graph_or_impl.h | 268 ++
.../tbb/internal/_flow_graph_tagged_buffer_impl.h | 212 ++
include/tbb/internal/_flow_graph_types_impl.h | 158 ++
include/tbb/{ => internal}/_tbb_windef.h | 8 +-
include/tbb/machine/gcc_generic.h | 74 +
include/tbb/machine/ibm_aix51.h | 43 +-
include/tbb/machine/linux_common.h | 2 +-
include/tbb/machine/linux_ia32.h | 74 +-
include/tbb/machine/linux_ia64.h | 184 +-
include/tbb/machine/linux_intel64.h | 73 +-
include/tbb/machine/mac_ppc.h | 296 ++-
include/tbb/machine/macos_common.h | 100 +-
include/tbb/machine/sunos_sparc.h | 55 +-
include/tbb/machine/windows_ia32.h | 78 +-
include/tbb/machine/windows_intel64.h | 100 +-
include/tbb/machine/xbox360_ppc.h | 37 +-
include/tbb/memory_pool.h | 259 ++
include/tbb/parallel_for.h | 118 +-
include/tbb/parallel_for_each.h | 6 +-
include/tbb/parallel_invoke.h | 14 +-
include/tbb/parallel_reduce.h | 198 +-
include/tbb/parallel_sort.h | 4 +
include/tbb/partitioner.h | 503 +++-
include/tbb/queuing_mutex.h | 4 +-
include/tbb/queuing_rw_mutex.h | 20 +-
include/tbb/reader_writer_lock.h | 2 +-
include/tbb/runtime_loader.h | 188 ++
include/tbb/scalable_allocator.h | 26 +
include/tbb/spin_mutex.h | 8 +-
include/tbb/task.h | 190 +-
include/tbb/task_group.h | 4 +
include/tbb/task_scheduler_init.h | 6 +-
include/tbb/tbb_config.h | 119 +-
include/tbb/tbb_machine.h | 861 ++++---
include/tbb/tbb_stddef.h | 110 +-
include/tbb/tbb_thread.h | 2 +-
index.html | 7 +-
src/Makefile | 43 +-
src/index.html | 7 +-
src/old/concurrent_queue_v2.h | 11 +-
src/old/concurrent_vector_v2.h | 4 +-
src/old/spin_rw_mutex_v2.h | 10 +-
src/perf/perf.h | 1 -
src/perf/time_hash_map.cpp | 2 +-
src/perf/time_hash_map_fill.cpp | 2 +-
src/perf/time_hash_map_fill.html | 7 +-
src/rml/client/index.html | 7 +-
src/rml/include/index.html | 7 +-
src/rml/index.html | 7 +-
src/rml/server/index.html | 7 +-
src/rml/server/thread_monitor.h | 113 +-
src/rml/test/test_thread_monitor.cpp | 1 +
src/tbb/arena.cpp | 25 +-
src/tbb/arena.h | 13 +-
src/tbb/cilk-tbb-interop.h | 12 +-
src/tbb/concurrent_monitor.cpp | 14 +-
src/tbb/concurrent_monitor.h | 83 +-
src/tbb/concurrent_queue.cpp | 4 +-
src/tbb/custom_scheduler.h | 163 +-
src/tbb/dynamic_link.cpp | 19 +-
src/tbb/governor.cpp | 47 +-
src/tbb/ia64-gas/ia64_misc.s | 72 +
src/tbb/ibm_aix51/atomic_support.c | 12 +-
src/tbb/index.html | 7 +-
src/tbb/itt_notify.h | 2 +-
src/tbb/lin64ipf-tbb-export.lst | 8 +
src/tbb/mac32-tbb-export.lst | 4 +
src/tbb/mac64-tbb-export.lst | 4 +
src/tbb/mailbox.h | 103 +-
src/tbb/market.cpp | 194 +-
src/tbb/market.h | 15 +-
src/tbb/queuing_mutex.cpp | 15 +-
src/tbb/queuing_rw_mutex.cpp | 330 +--
src/tbb/scheduler.cpp | 500 ++--
src/tbb/scheduler.h | 164 +-
src/tbb/scheduler_common.h | 48 +-
src/tbb/semaphore.cpp | 101 +
src/tbb/semaphore.h | 128 +
src/tbb/spin_mutex.cpp | 2 +-
src/tbb/task.cpp | 18 +-
src/tbb/tbb_main.cpp | 2 +-
src/tbb/tbb_main.h | 14 +-
src/tbb/tbb_misc.cpp | 2 +-
src/tbb/tbb_misc.h | 4 +-
src/tbb/tbb_misc_ex.cpp | 11 +-
src/tbbmalloc/Customize.h | 43 +-
src/tbbmalloc/LifoList.h | 106 -
src/tbbmalloc/MapMemory.h | 25 +-
src/tbbmalloc/backend.cpp | 1033 ++++++--
src/tbbmalloc/backref.cpp | 54 +-
src/tbbmalloc/frontend.cpp | 1028 +++++---
src/tbbmalloc/large_objects.cpp | 224 +-
...alloc-export.def => lin32-tbbmalloc-export.def} | 9 +-
...alloc-export.def => lin64-tbbmalloc-export.def} | 9 +-
...oc-export.def => lin64ipf-tbbmalloc-export.def} | 10 +-
src/tbbmalloc/mac32-tbbmalloc-export.def | 8 +-
src/tbbmalloc/mac64-tbbmalloc-export.def | 8 +-
src/tbbmalloc/tbb_function_replacement.cpp | 2 +-
src/tbbmalloc/tbbmalloc_internal.h | 411 ++-
...c-export.def => win32-gcc-tbbmalloc-export.def} | 8 +
src/tbbmalloc/win32-tbbmalloc-export.def | 9 +-
...c-export.def => win64-gcc-tbbmalloc-export.def} | 8 +
src/tbbmalloc/win64-tbbmalloc-export.def | 9 +-
src/tbbproxy/tbbproxy-windows.asm | 121 +
src/tbbproxy/tbbproxy.cpp | 616 +++++
src/test/harness.h | 56 +-
src/test/harness_allocator.h | 6 +-
src/test/harness_graph.h | 228 +-
src/test/harness_inject_scheduler.h | 1 +
src/test/harness_iterator.h | 35 +
src/test/harness_m128.h | 77 +-
.../fractal_video.h => src/test/harness_task.h | 73 +-
src/test/harness_tbb_independence.h | 23 +
src/test/test_ScalableAllocator.cpp | 74 +-
src/test/test_ScalableAllocator_STL.cpp | 15 +
src/test/test_aligned_space.cpp | 7 +-
src/test/test_allocator.h | 32 +-
src/test/test_allocator_STL.h | 44 +-
src/test/test_assembly.cpp | 4 +-
src/test/test_atomic.cpp | 438 +++-
src/test/test_broadcast_node.cpp | 42 +-
src/test/test_buffer_node.cpp | 80 +-
src/test/test_cilk_dynamic_load.cpp | 16 +-
src/test/test_cilk_interop.cpp | 14 +-
src/test/test_combinable.cpp | 2 +-
src/test/test_concurrent_hash_map.cpp | 7 +
src/test/test_concurrent_monitor.cpp | 47 +-
src/test/test_concurrent_priority_queue.cpp | 114 +-
src/test/test_concurrent_queue.cpp | 51 +-
src/test/test_concurrent_unordered.cpp | 70 +-
src/test/test_concurrent_vector.cpp | 28 +-
src/test/test_condition_variable.h | 10 +-
src/test/test_continue_node.cpp | 225 +-
src/test/test_eh_algorithms.cpp | 4 +-
src/test/test_enumerable_thread_specific.cpp | 3 +-
src/test/test_executable_node.cpp | 123 -
src/test/test_faf_task.cpp | 155 --
src/test/test_fast_random.cpp | 59 +-
src/test/test_flow_graph.cpp | 141 ++
src/test/test_function_node.cpp | 242 +-
src/test/test_intrusive_list.cpp | 7 -
src/test/test_join_node.cpp | 767 +++++-
src/test/test_lambda.cpp | 4 +
src/test/test_limiter_node.cpp | 82 +-
src/test/test_malloc_compliance.cpp | 140 +-
src/test/test_malloc_overload.cpp | 14 +-
src/test/test_malloc_pools.cpp | 397 +++
src/test/test_malloc_regression.cpp | 10 +-
src/test/test_malloc_whitebox.cpp | 174 +-
src/test/test_multioutput_function_node.cpp | 471 ++++
src/test/test_mutex_native_threads.cpp | 18 +-
src/test/test_or_node.cpp | 458 ++++
src/test/test_overwrite_node.cpp | 36 +-
src/test/test_parallel_do.cpp | 2 +
src/test/test_parallel_for.cpp | 247 +-
src/test/test_parallel_for_each.cpp | 9 +
src/test/test_parallel_invoke.cpp | 8 +-
src/test/test_parallel_reduce.cpp | 75 +-
src/test/test_parallel_sort.cpp | 6 +-
src/test/test_priority_queue_node.cpp | 71 +-
src/test/test_queue_node.cpp | 71 +-
src/test/test_runtime_loader.cpp | 300 +++
src/test/test_semaphore.cpp | 37 +
src/test/test_sequencer_node.cpp | 81 +-
src/test/test_source_node.cpp | 30 +-
src/test/test_split_node.cpp | 363 +++
src/test/test_task.cpp | 196 +-
src/test/test_task_assertions.cpp | 19 +-
src/test/test_task_auto_init.cpp | 24 +-
src/test/test_task_enqueue.cpp | 329 +++
src/test/test_task_group.cpp | 29 +-
src/test/test_task_leaks.cpp | 27 +-
src/test/test_task_priority.cpp | 62 +-
src/test/test_task_scheduler_observer.cpp | 4 +-
src/test/test_tbb_header.cpp | 8 +-
src/test/test_tbb_version.cpp | 8 +-
src/test/test_tuple.cpp | 22 +-
src/test/test_write_once_node.cpp | 38 +-
792 files changed, 44004 insertions(+), 37157 deletions(-)
diff --git a/CHANGES b/CHANGES
index 18a03b9..848c169 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,81 @@
+TBB 4.0 commercial-aligned release
+
+Changes (w.r.t. TBB 3.0 Update 8 commercial-aligned release):
+
+- concurrent_priority_queue is now a supported feature. Capacity
+ control methods were removed.
+- Flow graph is now a supported feature of TBB,
+ rather than being a community preview feature.
+- A new memory backend has been implemented in the TBB allocator.
+ It can return small memory blocks to the OS and thus later reuse
+ that memory for large object allocation.
+- Improved partitioning algorithms for parallel_for and parallel_reduce
+ to better handle load imbalance.
+- The convex_hull example has been refactored to produce reproducible
+ performance results.
+- The Major Interface version has changed from 5 to 6. Deprecated interfaces
+ might be removed in future releases.
+
+Community Preview Features:
+
+- Added Community Preview Feature: serial subset of TBB for modeling
+ a sequential execution of a parallel algorithm. This release introduces
+ serial parallel_for.
+- Added Community Preview Feature: or_node (accepts multiple inputs,
+ forwarding each input separately to successors), split_node (accepts
+ tuples, and forwards each element to a corresponding successor),
+ and multioutput_function_node (accepts one input, and passes the input
+ and a tuple of output ports to the function body to support outputs
+ to multiple successors).
+- Added Community Preview Feature: Scalable Memory Pools (more control on
+ memory source, grouping, collective deallocatation).
+
+------------------------------------------------------------------------
+TBB 3.0 Update 8 commercial-aligned release
+
+Changes (w.r.t. TBB 3.0 Update 7 commercial-aligned release):
+
+- Task priorities become an official feature of TBB,
+ not community preview as before.
+- Atomics API extended, and implementation refactored.
+- Added task::set_parent() method.
+- Added concurrent_unordered_set container.
+
+Open-source contributions integrated:
+
+- PowerPC support by Raf Schietekat.
+- Fix of potential task pool overrun and other improvements
+ in the task scheduler by Raf Schietekat.
+- Fix in parallel_for_each to work with std::set in Visual* C++ 2010.
+
+Community Preview Features:
+
+- Graph community preview feature was renamed to flow graph.
+ Multiple improvements in the implementation.
+ Binpack example of the feature was added.
+- A number of improvements to concurrent_priority_queue.
+ Shortpath example was added for the feature.
+- TBB runtime loaded functionality was added (Windows*-only).
+ This allows set exact versions of TBB library to be used in run-time,
+ while setting directories for the library search.
+- parallel_deterministic_reduce template function was added.
+
+------------------------------------------------------------------------
+TBB 3.0 Update 7 commercial-aligned release
+
+Changes (w.r.t. 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
+ where GCC has these built-ins.
+
+Community Preview Features:
+
+- Graph's dining_philosophers example added
+- A number of improvements to graph and concurrent_priority_queue
+
+
+------------------------------------------------------------------------
TBB 3.0 Update 6 commercial-aligned release
Changes (w.r.t. TBB 3.0 Update 5 commercial-aligned release):
@@ -14,11 +92,11 @@ Open-source contributions integrated:
Bugs fixed:
-- Failure to locate Cilk runtime library to enable Cilk/TBB interop.
+- Failure to enable interoperability with Intel(R) Cilk(tm) Plus runtime
+ library, and a crash caused by invoking the interoperability layer
+ after one of the libraries was unloaded.
- Data race that could result in concurrent_unordered_map structure
corruption after call to clear() method.
-- Crash caused by invoking Cilk/TBB interop after one of the libraries
- is unloaded.
- Stack corruption caused by PIC version of 64-bit CAS compiled by Intel
compiler on Linux.
- Inconsistency of exception propagation mode possible when application
@@ -115,8 +193,8 @@ Changes (w.r.t. 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.
-- Cilk-TBB interop layer added to protect TBB TLS in case of
- "Cilk-TBB-Cilk nesting" usage model.
+- Interoperability layer with Intel Cilk Plus runtime library added
+ to protect TBB TLS in case of nested usage with Intel Cilk Plus.
- Compilation fix for dependent template names in concurrent_queue.
- Memory allocator code refactored to ease development and maintenance.
@@ -1056,4 +1134,7 @@ Packaging:
are provided separately on Intel(R) Premier.
------------------------------------------------------------------------
+Intel and Cilk 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.
diff --git a/Makefile b/Makefile
index 982975d..dd167e9 100644
--- a/Makefile
+++ b/Makefile
@@ -26,15 +26,15 @@
tbb_root?=.
include $(tbb_root)/build/common.inc
-.PHONY: default all tbb tbbmalloc test examples
+.PHONY: default all tbb tbbmalloc tbbproxy test examples
#workaround for non-depend targets tbb and tbbmalloc which both depend on version_string.tmp
#According to documentation submakes should run in parallel
-.NOTPARALLEL: tbb tbbmalloc
+.NOTPARALLEL: tbb tbbmalloc tbbproxy
-default: tbb tbbmalloc
+default: tbb tbbmalloc $(if $(use_proxy),tbbproxy)
-all: tbb tbbmalloc test examples
+all: tbb tbbmalloc tbbproxy test examples
tbb: mkdir
$(MAKE) -C "$(work_dir)_debug" -r -f $(tbb_root)/build/Makefile.tbb cfg=debug tbb_root=$(tbb_root)
@@ -44,7 +44,11 @@ tbbmalloc: mkdir
$(MAKE) -C "$(work_dir)_debug" -r -f $(tbb_root)/build/Makefile.tbbmalloc cfg=debug malloc tbb_root=$(tbb_root)
$(MAKE) -C "$(work_dir)_release" -r -f $(tbb_root)/build/Makefile.tbbmalloc cfg=release malloc tbb_root=$(tbb_root)
-test: tbb tbbmalloc
+tbbproxy: mkdir
+ $(MAKE) -C "$(work_dir)_debug" -r -f $(tbb_root)/build/Makefile.tbbproxy cfg=debug tbbproxy tbb_root=$(tbb_root)
+ $(MAKE) -C "$(work_dir)_release" -r -f $(tbb_root)/build/Makefile.tbbproxy cfg=release tbbproxy tbb_root=$(tbb_root)
+
+test: tbb tbbmalloc $(if $(use_proxy),tbbproxy)
-$(MAKE) -C "$(work_dir)_debug" -r -f $(tbb_root)/build/Makefile.tbbmalloc cfg=debug malloc_test tbb_root=$(tbb_root)
-$(MAKE) -C "$(work_dir)_debug" -r -f $(tbb_root)/build/Makefile.test cfg=debug tbb_root=$(tbb_root)
-$(MAKE) -C "$(work_dir)_release" -r -f $(tbb_root)/build/Makefile.tbbmalloc cfg=release malloc_test tbb_root=$(tbb_root)
diff --git a/build/Makefile.rml b/build/Makefile.rml
index 9c8692b..ff00bc8 100644
--- a/build/Makefile.rml
+++ b/build/Makefile.rml
@@ -24,7 +24,7 @@
# invalidate any other reasons why the executable file might be covered by
# the GNU General Public License.
-tbb_root ?= $(TBB30_INSTALL_DIR)
+tbb_root ?= $(TBBROOT)
BUILDING_PHASE=1
TEST_RESOURCE = $(RML.RES)
include $(tbb_root)/build/common.inc
@@ -60,7 +60,7 @@ ifeq (linux,$(tbb_os))
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) tbb_misc_rml.$(OBJ) tbb_misc_ex_rml.$(OBJ)
+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)
ifeq ($(cfg),debug)
diff --git a/build/Makefile.tbb b/build/Makefile.tbb
index 1ad9c04..99c20dc 100644
--- a/build/Makefile.tbb
+++ b/build/Makefile.tbb
@@ -28,7 +28,7 @@
# Define rules for making the TBB shared library.
#------------------------------------------------------------------------------
-tbb_root ?= "$(TBB30_INSTALL_DIR)"
+tbb_root ?= "$(TBBROOT)"
BUILDING_PHASE=1
include $(tbb_root)/build/common.inc
DEBUG_SUFFIX=$(findstring _debug,_$(cfg))
@@ -73,6 +73,7 @@ TBB_CPLUS.OBJ = concurrent_hash_map.$(OBJ) \
condition_variable.$(OBJ) \
tbb_thread.$(OBJ) \
concurrent_monitor.$(OBJ) \
+ semaphore.$(OBJ) \
private_server.$(OBJ) \
rml_tbb.$(OBJ) \
task_group_context.$(OBJ) \
diff --git a/build/Makefile.tbbmalloc b/build/Makefile.tbbmalloc
index 4a89d98..f0bcdeb 100644
--- a/build/Makefile.tbbmalloc
+++ b/build/Makefile.tbbmalloc
@@ -27,7 +27,7 @@
# default target
default_malloc: malloc malloc_test
-tbb_root ?= $(TBB30_INSTALL_DIR)
+tbb_root ?= $(TBBROOT)
BUILDING_PHASE=1
TEST_RESOURCE = $(MALLOC.RES)
include $(tbb_root)/build/common.inc
@@ -131,7 +131,8 @@ MALLOC_MAIN_TESTS = test_ScalableAllocator.$(TEST_EXT) \
test_ScalableAllocator_STL.$(TEST_EXT) \
test_malloc_compliance.$(TEST_EXT) \
test_malloc_regression.$(TEST_EXT) \
- test_malloc_init_shutdown.$(TEST_EXT)
+ test_malloc_init_shutdown.$(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))
@@ -175,7 +176,10 @@ MALLOC_TESTS += $(MALLOC_OVERLOAD_TESTS) test_malloc_lib_unload.$(TEST_EXT)
endif
# run_cmd is usually empty
-malloc_test: $(call cross_suffix,$(MALLOC.DLL)) $(TEST_PREREQUISITE) $(MALLOC_TESTS)
+malloc_test: $(call cross_suffix,$(MALLOC.DLL)) malloc_test_no_depends
+
+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)
diff --git a/build/Makefile.tbbproxy b/build/Makefile.tbbproxy
new file mode 100644
index 0000000..93433d0
--- /dev/null
+++ b/build/Makefile.tbbproxy
@@ -0,0 +1,116 @@
+# Copyright 2005-2011 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.
+
+# default target
+default_tbbproxy: tbbproxy tbbproxy_test
+
+tbb_root ?= $(TBBROOT)
+BUILDING_PHASE=1
+include $(tbb_root)/build/common.inc
+DEBUG_SUFFIX=$(findstring _debug,_$(cfg))
+
+PROXY_ROOT ?= $(tbb_root)/src/tbbproxy
+PROXY_SOURCE_ROOT ?= $(PROXY_ROOT)
+
+VPATH = $(tbb_root)/src/tbb/$(ASSEMBLY_SOURCE) $(tbb_root)/src/tbb $(tbb_root)/src/test
+VPATH += $(PROXY_ROOT) $(PROXY_SOURCE_ROOT)
+
+CPLUS_FLAGS += $(DEFINE_KEY)__TBB_DLL_NAME=$(TBB.DLL)
+CPLUS_FLAGS += $(DEFINE_KEY)__TBB_LST=$(TBB.LST)
+CPLUS_FLAGS += $(foreach dir,$(VPATH),$(INCLUDE_KEY)$(dir))
+CPLUS_FLAGS += $(PIC_KEY)
+
+include $(tbb_root)/build/common_rules.inc
+
+#------------------------------------------------------
+# Define rules for making the TBB Proxy static library.
+#------------------------------------------------------
+
+# Object files that make up TBB Proxy
+PROXY_CPLUS.OBJ = tbbproxy.$(OBJ)
+PROXY_ASM.OBJ = tbbproxy-asm.$(OBJ)
+PROXY.OBJ := $(PROXY_CPLUS.OBJ) $(PROXY_ASM.OBJ)
+
+# Not using intrinsics prevents undesired dependence from ICL libraries (e.g. libirc).
+# 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): %.$(OBJ): %.cpp
+ $(CPLUS) $(COMPILE_ONLY) $(CPLUS_FLAGS) $(INCLUDES) $<
+
+$(PROXY.LIB): $(PROXY.OBJ)
+ $(AR) $(AR_FLAGS) $(AR_OUTPUT_KEY)$@ $^
+
+.PRECIOUS : %.$(ASMEXT)
+tbbproxy-asm.$(ASMEXT) : tbbproxy-$(tbb_os).$(ASMEXT) $(TBB.LST) $(TBB-OBJECTS.LST)
+ $(CPLUS) $(PREPROC_ONLY) $< $(INCLUDES) $(CPLUS_FLAGS) > $@
+
+.PHONY: tbbproxy
+ifeq (windows,$(tbb_os))
+tbbproxy: $(PROXY.LIB)
+else
+tbbproxy:
+endif
+
+#------------------------------------------------------
+# End of rules for making the TBB Proxy static library
+#------------------------------------------------------
+
+#------------------------------------------------------
+# Define rules for making the TBB Proxy unit tests
+#------------------------------------------------------
+
+add_debug=$(basename $(1))_debug$(suffix $(1))
+cross_suffix=$(if $(crosstest),$(if $(DEBUG_SUFFIX),$(subst _debug,,$(1)),$(call add_debug,$(1))),$(1))
+
+PROXY_LIB = $(call cross_suffix,$(PROXY.LIB))
+PROXY_TESTS_SRCS = test_runtime_loader.cpp
+PROXY_TESTS_OBJS = $(PROXY_TESTS_SRCS:.cpp=.$(OBJ))
+PROXY_TESTS_EXES = $(PROXY_TESTS_OBJS:.$(OBJ)=.$(TEST_EXT))
+
+# Run rules.
+.PHONY: tbbproxy_test
+ifeq (windows,$(tbb_os))
+tbbproxy_test: $(call cross_suffix,$(PROXY.LIB)) $(TEST_PREREQUISITE) $(PROXY_TESTS_EXES)
+ $(run_cmd) ./test_runtime_loader.$(TEST_EXT) $(args)
+else
+tbbproxy_test:
+endif
+
+# Link rules.
+$(PROXY_TESTS_EXES): %.$(TEST_EXT): %.$(OBJ) $(PROXY_LIB)
+ $(CPLUS) $(OUTPUT_KEY)$@ $(CPLUS_FLAGS) $< $(PROXY_LIB) $(LIBS) $(LIBDL) $(LINK_FLAGS)
+
+# Compilation rules.
+$(PROXY_TESTS_OBJS): %.$(OBJ): %.cpp
+ $(CPLUS) $(COMPILE_ONLY) $(CPLUS_FLAGS) $(CXX_ONLY_FLAGS) $(CXX_WARN_SUPPRESS) $(INCLUDES) $(OUTPUT_KEY)$@ $<
+
+#------------------------------------------------------
+# End of rules for making the TBB Proxy unit tests
+#------------------------------------------------------
+
+# Include automatically generated dependences
+-include *.d
diff --git a/build/Makefile.test b/build/Makefile.test
index 0e17b14..26c0a14 100644
--- a/build/Makefile.test
+++ b/build/Makefile.test
@@ -31,7 +31,7 @@
default: test_tbb_plain test_tbb_old
-tbb_root ?= $(TBB30_INSTALL_DIR)
+tbb_root ?= $(TBBROOT)
BUILDING_PHASE=1
TEST_RESOURCE = $(TBB.RES)
include $(tbb_root)/build/common.inc
@@ -44,11 +44,17 @@ DEBUG_SUFFIX=$(findstring _debug,$(call cross_cfg,_$(cfg)))
VPATH = $(tbb_root)/src/tbb/$(ASSEMBLY_SOURCE) $(tbb_root)/src/tbb $(tbb_root)/src/rml/client $(tbb_root)/src/old $(tbb_root)/src/test $(tbb_root)/src/perf
CPLUS_FLAGS += $(if $(crosstest),$(DEFINE_KEY)__TBB_NO_IMPLICIT_LINKAGE=1)
+ifdef use_proxy
+ USE_PROXY_FLAG = $(DEFINE_KEY)HARNESS_USE_PROXY
+ CPLUS_FLAGS += $(USE_PROXY_FLAG)
+ LINK_TBB.LIB = $(PROXY.LIB)
+ LIBS += $(LIBDL)
+endif
include $(tbb_root)/build/common_rules.inc
# Rule for generating executable test
-%.$(TEST_EXT): %.$(OBJ) $(TBB.LIB)
+%.$(TEST_EXT): %.$(OBJ) $(TBB.LIB) $(if $(use_proxy),$(LINK_TBB.LIB))
$(CPLUS) $(OUTPUT_KEY)$@ $(CPLUS_FLAGS) $< $(LINK_TBB.LIB) $(LIBS) $(AUX_LIBS) $(LINK_FLAGS)
# Rules for generating a test DLL
@@ -57,9 +63,9 @@ include $(tbb_root)/build/common_rules.inc
.PRECIOUS: %_dll.$(OBJ) %_dll.$(DLL)
# Rules for the tests, which use TBB in a dynamically loadable library
+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)
-
test_cilk_dynamic_load.$(TEST_EXT): test_cilk_dynamic_load.$(OBJ) test_cilk_dynamic_load_dll.$(DLL)
$(CPLUS) $(OUTPUT_KEY)$@ $(CPLUS_FLAGS) $< $(LINK_TBB.LIB) $(LIBDL) $(LIBS) $(LINK_FLAGS)
@@ -142,8 +148,8 @@ TEST_TBB_PLAIN.EXE = test_assembly.$(TEST_EXT) \
test_combinable.$(TEST_EXT) \
test_task_auto_init.$(TEST_EXT) \
test_concurrent_monitor.$(TEST_EXT) \
+ semaphore.$(OBJ) \
test_critical_section.$(TEST_EXT) \
- test_semaphore.$(TEST_EXT) \
test_reader_writer_lock.$(TEST_EXT) \
test_tbb_condition_variable.$(TEST_EXT) \
test_intrusive_list.$(TEST_EXT) \
@@ -151,12 +157,12 @@ TEST_TBB_PLAIN.EXE = test_assembly.$(TEST_EXT) \
test_cilk_dynamic_load.$(TEST_EXT) \
test_concurrent_priority_queue.$(TEST_EXT) \
test_task_priority.$(TEST_EXT) \
- test_faf_task.$(TEST_EXT) \
+ test_task_enqueue.$(TEST_EXT) \
test_hw_concurrency.$(TEST_EXT) \
test_fp.$(TEST_EXT) \
+ test_flow_graph.$(TEST_EXT) \
test_broadcast_node.$(TEST_EXT) \
test_continue_node.$(TEST_EXT) \
- test_executable_node.$(TEST_EXT) \
test_function_node.$(TEST_EXT) \
test_limiter_node.$(TEST_EXT) \
test_join_node.$(TEST_EXT) \
@@ -167,7 +173,11 @@ TEST_TBB_PLAIN.EXE = test_assembly.$(TEST_EXT) \
test_source_node.$(TEST_EXT) \
test_overwrite_node.$(TEST_EXT) \
test_write_once_node.$(TEST_EXT) \
+ test_or_node.$(TEST_EXT) \
+ test_multioutput_function_node.$(TEST_EXT) \
+ test_split_node.$(TEST_EXT) \
test_tbb_version.$(TEST_EXT) # insert new files right above
+TEST_TBB_PLAIN.OBJ = $(TEST_TBB_PLAIN.EXE:$(TEST_EXT)=.$(OBJ))
ifdef OPENMP_FLAG
TEST_TBB_PLAIN.EXE += test_tbb_openmp
@@ -240,7 +250,7 @@ test_tbb_plain: $(TEST_PREREQUISITE) $(TASK_CPP_DIRECTLY_INCLUDED) $(TEST_TBB_PL
$(run_cmd) ./test_tbb_header.$(TEST_EXT) $(args)
$(run_cmd) ./test_concurrent_monitor.$(TEST_EXT) $(args) 6:8
$(run_cmd) ./test_critical_section.$(TEST_EXT) $(args) 1:4
- $(run_cmd) ./test_semaphore.$(TEST_EXT) $(args) 1:4
+# $(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_intrusive_list.$(TEST_EXT) $(args)
@@ -248,12 +258,12 @@ test_tbb_plain: $(TEST_PREREQUISITE) $(TASK_CPP_DIRECTLY_INCLUDED) $(TEST_TBB_PL
$(run_cmd) ./test_cilk_dynamic_load.$(TEST_EXT) $(args)
$(run_cmd) ./test_concurrent_priority_queue.$(TEST_EXT) $(args) 1:4
$(run_cmd) ./test_task_priority.$(TEST_EXT) $(args)
- $(run_cmd) ./test_faf_task.$(TEST_EXT) $(args)
+ $(run_cmd) ./test_task_enqueue.$(TEST_EXT) $(args) 1:4
$(run_cmd) ./test_hw_concurrency.$(TEST_EXT) $(args)
$(run_cmd) ./test_fp.$(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
- $(run_cmd) ./test_executable_node.$(TEST_EXT) $(args) 1:4
$(run_cmd) ./test_function_node.$(TEST_EXT) $(args) 1:4
$(run_cmd) ./test_limiter_node.$(TEST_EXT) $(args) 1:4
$(run_cmd) ./test_join_node.$(TEST_EXT) $(args) 1:4
@@ -264,6 +274,9 @@ test_tbb_plain: $(TEST_PREREQUISITE) $(TASK_CPP_DIRECTLY_INCLUDED) $(TEST_TBB_PL
$(run_cmd) ./test_source_node.$(TEST_EXT) $(args) 1:4
$(run_cmd) ./test_overwrite_node.$(TEST_EXT) $(args) 1:4
$(run_cmd) ./test_write_once_node.$(TEST_EXT) $(args) 1:4
+ $(run_cmd) ./test_or_node.$(TEST_EXT) $(args) 1:4
+ $(run_cmd) ./test_multioutput_function_node.$(TEST_EXT) $(args) 1:4
+ $(run_cmd) ./test_split_node.$(TEST_EXT) $(args) 1:4
CPLUS_FLAGS_DEPRECATED = $(DEFINE_KEY)TBB_DEPRECATED=1 $(subst $(WARNING_KEY),,$(CPLUS_FLAGS)) $(WARNING_SUPPRESS)
diff --git a/build/SunOS.suncc.inc b/build/SunOS.suncc.inc
index 8ec15ac..d29c60f 100644
--- a/build/SunOS.suncc.inc
+++ b/build/SunOS.suncc.inc
@@ -35,7 +35,8 @@ DYLIB_KEY = -G
LIBDL = -ldl
# WARNING_AS_ERROR_KEY = -errwarn=%all
WARNING_AS_ERROR_KEY = Warning as error
-WARNING_SUPPRESS = -erroff=unassigned,attrskipunsup,badargtype2w,badbinaryopw,wbadasg,wvarhidemem
+# Supported Solaris Studio* 12.2 and above, remove ',inlasmpnu' in the line below to build by compiler prior Solaris Studio* 12.2
+WARNING_SUPPRESS = -erroff=unassigned,attrskipunsup,badargtype2w,badbinaryopw,wbadasg,wvarhidemem,inlasmpnu
tbb_strict=0
TBB_NOSTRICT = 1
@@ -77,8 +78,8 @@ ifeq (sparc,$(arch))
LIB_LINK_FLAGS += -m64
endif
-export TBB_CUSTOM_VARS_SH=export CXXFLAGS="-I$${TBB30_INSTALL_DIR}/include -library=stlport4 $(CXXFLAGS) -M$${TBB30_INSTALL_DIR}/build/suncc.map.pause"
-export TBB_CUSTOM_VARS_CSH=setenv CXXFLAGS "-I$${TBB30_INSTALL_DIR}/include -library=stlport4 $(CXXFLAGS) -M$${TBB30_INSTALL_DIR}/build/suncc.map.pause"
+export TBB_CUSTOM_VARS_SH=export CXXFLAGS="-I$${TBBROOT}/include -library=stlport4 $(CXXFLAGS) -M$${TBBROOT}/build/suncc.map.pause"
+export TBB_CUSTOM_VARS_CSH=setenv CXXFLAGS "-I$${TBBROOT}/include -library=stlport4 $(CXXFLAGS) -M$${TBBROOT}/build/suncc.map.pause"
#------------------------------------------------------------------------------
# Setting assembler data.
diff --git a/build/big_iron.inc b/build/big_iron.inc
new file mode 100644
index 0000000..a533188
--- /dev/null
+++ b/build/big_iron.inc
@@ -0,0 +1,74 @@
+# Copyright 2005-2011 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.
+
+#------------------------------------------------------------------------------
+# Defines settings for building the TBB run-time as a static library.
+# Use these only on platforms where dynamic linking is impractical.
+#
+# IF YOU USE TBB AS A STATIC LIBRARY, YOU MUST GUARANTEE THAT ONLY ONE COPY OF
+# THE TBB RUN-TIME IS LINKED INTO AN APPLICATION! LINKING IN MULTIPLE COPIES
+# OF THE TBB RUN-TIME, DIRECTLY OR INDIRECTLY, MAY CAUSE PROGRAM FAILURE!
+#------------------------------------------------------------------------------
+
+# Note that ITT_NOTIFY allows to selectively remove the definition of
+# DO_ITT_NOTIFY without sabotaging deferred expansion of CPLUS_FLAGS.
+# TODO: currently only in linux.{gcc,xl}.inc
+
+# Note that -pthread with xl gives "1501-210 (W) command option t contains an incorrect subargument";
+# multithreading is instead achieved by using the _r affix in the compiler name.
+# TODO: is -lpthread still relevant/needed with XL and _r affix?
+
+# Note that -D__TBB_NO_DLOPEN is only for scalability,
+# and is not necessarily needed by any static build.
+
+# OS specific settings =>
+ LIB_LINK_CMD = ar rcs
+ LIB_LINK_FLAGS =
+ LIB_LINK_LIBS =
+ LIB_OUTPUT_KEY =
+ ifeq ($(tbb_os),linux)
+ ifeq ($(compiler),gcc)
+ LIBS = -pthread -ldl -lrt
+ endif
+ ifeq ($(compiler),xl)
+ LIBS = -lpthread -ldl -lrt
+ endif
+ LINK_FLAGS =
+ endif
+ CXXFLAGS += -D__TBB_DYNAMIC_LOAD_ENABLED=0
+ ITT_NOTIFY =
+ LIBEXT = a
+ LIBPREF = lib
+# <= OS specific settings
+
+TBB.DLL = $(LIBPREF)tbb$(DEBUG_SUFFIX).$(LIBEXT)
+TBB.LST =
+TBB.DEF =
+MALLOC.DLL = $(LIBPREF)tbbmalloc$(DEBUG_SUFFIX).$(LIBEXT)
+MALLOC.DEF =
+MALLOCPROXY.DLL =
+MALLOCPROXY.DEF =
+LINK_TBB.LIB = $(TBB.DLL)
diff --git a/build/common_rules.inc b/build/common_rules.inc
index 95d6f9f..e8b9d88 100644
--- a/build/common_rules.inc
+++ b/build/common_rules.inc
@@ -79,7 +79,7 @@ CONLY ?= $(CPLUS)
# TODO Rule for generating .asm file if needed for visual inspection
%.asm: %.cpp
- $(CPLUS) /c /Fa $(CPLUS_FLAGS) $(CXX_ONLY_FLAGS) $(INCLUDES) $<
+ $(CPLUS) /c /FAs /Fa $(CPLUS_FLAGS) $(CXX_ONLY_FLAGS) $(INCLUDES) $<
# TODO Rule for generating .s file if needed for visual inspection
%.s: %.cpp
diff --git a/build/generate_tbbvars.bat b/build/generate_tbbvars.bat
index f42db52..05dc4fe 100644
--- a/build/generate_tbbvars.bat
+++ b/build/generate_tbbvars.bat
@@ -37,10 +37,10 @@ if not x%UNIXMODE%==x set _INCLUDE=CPATH& set _LIB=LIBRARY_PATH
if exist tbbvars.bat goto skipbat
echo Generating local tbbvars.bat
echo @echo off>tbbvars.bat
-echo SET TBB30_INSTALL_DIR=%actual_root%>>tbbvars.bat
+echo SET TBBROOT=%actual_root%>>tbbvars.bat
echo SET TBB_ARCH_PLATFORM=%arch%\%runtime%>>tbbvars.bat
echo SET TBB_TARGET_ARCH=%arch%>>tbbvars.bat
-echo SET %_INCLUDE%=%%TBB30_INSTALL_DIR%%\include;%%%_INCLUDE%%%>>tbbvars.bat
+echo SET %_INCLUDE%=%%TBBROOT%%\include;%%%_INCLUDE%%%>>tbbvars.bat
echo SET %_LIB%=%bin_dir%;%%%_LIB%%%>>tbbvars.bat
echo SET PATH=%bin_dir%;%%PATH%%>>tbbvars.bat
if not x%UNIXMODE%==x echo SET LD_LIBRARY_PATH=%bin_dir%;%%LD_LIBRARY_PATH%%>>tbbvars.bat
@@ -49,10 +49,10 @@ if not x%UNIXMODE%==x echo SET LD_LIBRARY_PATH=%bin_dir%;%%LD_LIBRARY_PATH%%>>tb
if exist tbbvars.sh goto skipsh
echo Generating local tbbvars.sh
echo #!/bin/sh>tbbvars.sh
-echo export TBB30_INSTALL_DIR="%fslash_root%">>tbbvars.sh
+echo export TBBROOT="%fslash_root%">>tbbvars.sh
echo export TBB_ARCH_PLATFORM="%arch%\%runtime%">>tbbvars.sh
echo export TBB_TARGET_ARCH="%arch%">>tbbvars.sh
-echo export %_INCLUDE%="${TBB30_INSTALL_DIR}/include;$%_INCLUDE%">>tbbvars.sh
+echo export %_INCLUDE%="${TBBROOT}/include;$%_INCLUDE%">>tbbvars.sh
echo export %_LIB%="%fslash_bin_dir%;$%_LIB%">>tbbvars.sh
echo export PATH="%fslash_bin_dir%;$PATH">>tbbvars.sh
if not x%UNIXMODE%==x echo export LD_LIBRARY_PATH="%fslash_bin_dir%;$LD_LIBRARY_PATH">>tbbvars.sh
@@ -61,10 +61,10 @@ if not x%UNIXMODE%==x echo export LD_LIBRARY_PATH="%fslash_bin_dir%;$LD_LIBRARY_
if exist tbbvars.csh goto skipcsh
echo Generating local tbbvars.csh
echo #!/bin/csh>tbbvars.csh
-echo setenv TBB30_INSTALL_DIR "%actual_root%">>tbbvars.csh
+echo setenv TBBROOT "%actual_root%">>tbbvars.csh
echo setenv TBB_ARCH_PLATFORM "%arch%\%runtime%">>tbbvars.csh
echo setenv TBB_TARGET_ARCH "%arch%">>tbbvars.csh
-echo setenv %_INCLUDE% "${TBB30_INSTALL_DIR}\include;$%_INCLUDE%">>tbbvars.csh
+echo setenv %_INCLUDE% "${TBBROOT}\include;$%_INCLUDE%">>tbbvars.csh
echo setenv %_LIB% "%bin_dir%;$%_LIB%">>tbbvars.csh
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
diff --git a/build/generate_tbbvars.sh b/build/generate_tbbvars.sh
index 16f4639..4bc967e 100644
--- a/build/generate_tbbvars.sh
+++ b/build/generate_tbbvars.sh
@@ -34,12 +34,12 @@ cd "$bin_dir" # to EOL encoding
[ "`uname`" = "Darwin" ] && dll_path="DYLD_LIBRARY_PATH" || dll_path="LD_LIBRARY_PATH" #
[ -f ./tbbvars.sh ] || cat >./tbbvars.sh <<EOF
#!/bin/bash
-export TBB30_INSTALL_DIR="${tbb_root}" #
+export TBBROOT="${tbb_root}" #
tbb_bin="${bin_dir}" #
if [ -z "\$CPATH" ]; then #
- export CPATH="\${TBB30_INSTALL_DIR}/include" #
+ export CPATH="\${TBBROOT}/include" #
else #
- export CPATH="\${TBB30_INSTALL_DIR}/include:\$CPATH" #
+ export CPATH="\${TBBROOT}/include:\$CPATH" #
fi #
if [ -z "\$LIBRARY_PATH" ]; then #
export LIBRARY_PATH="\${tbb_bin}" #
@@ -55,12 +55,12 @@ ${TBB_CUSTOM_VARS_SH} #
EOF
[ -f ./tbbvars.csh ] || cat >./tbbvars.csh <<EOF
#!/bin/csh
-setenv TBB30_INSTALL_DIR "${tbb_root}" #
+setenv TBBROOT "${tbb_root}" #
setenv tbb_bin "${bin_dir}" #
if (! \$?CPATH) then #
- setenv CPATH "\${TBB30_INSTALL_DIR}/include" #
+ setenv CPATH "\${TBBROOT}/include" #
else #
- setenv CPATH "\${TBB30_INSTALL_DIR}/include:\$CPATH" #
+ setenv CPATH "\${TBBROOT}/include:\$CPATH" #
endif #
if (! \$?LIBRARY_PATH) then #
setenv LIBRARY_PATH "\${tbb_bin}" #
diff --git a/build/index.html b/build/index.html
index ae10fc4..61846a8 100644
--- a/build/index.html
+++ b/build/index.html
@@ -224,10 +224,9 @@ See the Makefile infrastructure files for examples.
<P></P>
Copyright © 2005-2011 Intel Corporation. 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>
+Intel and Itanium 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.
</BODY>
</HTML>
diff --git a/build/linux.gcc.inc b/build/linux.gcc.inc
index ec356f7..1c20c3f 100644
--- a/build/linux.gcc.inc
+++ b/build/linux.gcc.inc
@@ -45,7 +45,7 @@ TBB_NOSTRICT = 1
CPLUS = g++
CONLY = gcc
LIB_LINK_FLAGS = $(DYLIB_KEY) -Wl,-soname=$(BUILDING_LIBRARY)
-LIBS = -lpthread -lrt
+LIBS += -lpthread -lrt
LINK_FLAGS = -Wl,-rpath-link=.
C_FLAGS = $(CPLUS_FLAGS)
@@ -118,7 +118,7 @@ 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
+ MALLOC_ASM.OBJ += atomic_support.o lock_byte.o pause.o log2.o
endif
#------------------------------------------------------------------------------
# End of setting assembler data.
diff --git a/build/linux.icc.inc b/build/linux.icc.inc
index d477b53..fa24432 100644
--- a/build/linux.icc.inc
+++ b/build/linux.icc.inc
@@ -44,7 +44,7 @@ CPLUS = icpc
CONLY = icc
ifeq (release,$(cfg))
-CPLUS_FLAGS = -O2 -strict-ansi -DUSE_PTHREAD
+CPLUS_FLAGS = -O2 -g -strict-ansi -DUSE_PTHREAD
else
CPLUS_FLAGS = -O0 -g -strict-ansi -DUSE_PTHREAD -DTBB_USE_DEBUG
endif
@@ -57,14 +57,15 @@ endif
OPENMP_FLAG = -openmp
LIB_LINK_FLAGS = -shared -i-static -Wl,-soname=$(BUILDING_LIBRARY)
-LIBS = -lpthread -lrt
+LIBS += -lpthread -lrt
C_FLAGS = $(CPLUS_FLAGS)
TBB_ASM.OBJ=
MALLOC_ASM.OBJ=
ifeq (ia32,$(arch))
- CPLUS_FLAGS += -falign-stack=maintain-16-byte
+ CPLUS_FLAGS += -m32 -falign-stack=maintain-16-byte
+ LIB_LINK_FLAGS += -m32
endif
ifeq (ia64,$(arch))
@@ -94,7 +95,7 @@ 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
+ MALLOC_ASM.OBJ += atomic_support.o lock_byte.o pause.o log2.o
endif
#------------------------------------------------------------------------------
# End of setting assembler data.
diff --git a/build/linux.inc b/build/linux.inc
index e0e2889..aea0392 100644
--- a/build/linux.inc
+++ b/build/linux.inc
@@ -121,7 +121,7 @@ TBB_NO_VERSION.DLL=libtbb$(CPF_SUFFIX)$(DEBUG_SUFFIX).$(DLL)
LINK_TBB.LIB = $(TBB_NO_VERSION.DLL)
MALLOC_NO_VERSION.DLL = libtbbmalloc$(DEBUG_SUFFIX).$(DLL)
-MALLOC.DEF = $(MALLOC_ROOT)/lin-tbbmalloc-export.def
+MALLOC.DEF = $(MALLOC_ROOT)/$(def_prefix)-tbbmalloc-export.def
MALLOC.DLL = $(MALLOC_NO_VERSION.DLL).$(SONAME_SUFFIX)
MALLOC.LIB = $(MALLOC_NO_VERSION.DLL)
LINK_MALLOC.LIB = $(MALLOC_NO_VERSION.DLL)
diff --git a/build/linux.gcc.inc b/build/linux.xl.inc
similarity index 55%
copy from build/linux.gcc.inc
copy to build/linux.xl.inc
index ec356f7..6f980d9 100644
--- a/build/linux.gcc.inc
+++ b/build/linux.xl.inc
@@ -24,29 +24,30 @@
# 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++
+####### Detections and Commands ###############################################
+
+COMPILE_ONLY = -c
+PREPROC_ONLY = -E -qsourcetype=c
INCLUDE_KEY = -I
DEFINE_KEY = -D
OUTPUT_KEY = -o #
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)
+PIC_KEY = -qpic
+WARNING_AS_ERROR_KEY = -qhalt=w
+WARNING_KEY =
+TEST_WARNING_KEY =
-WARNING_SUPPRESS = -Wno-parentheses -Wno-non-virtual-dtor
-DYLIB_KEY = -shared
+WARNING_SUPPRESS =
+DYLIB_KEY = -qmkshrobj
EXPORT_KEY = -Wl,--version-script,
LIBDL = -ldl
TBB_NOSTRICT = 1
-CPLUS = g++
-CONLY = gcc
+CPLUS = xlc++_r
+CONLY = xlc_r
LIB_LINK_FLAGS = $(DYLIB_KEY) -Wl,-soname=$(BUILDING_LIBRARY)
LIBS = -lpthread -lrt
-LINK_FLAGS = -Wl,-rpath-link=.
C_FLAGS = $(CPLUS_FLAGS)
ITT_NOTIFY = -DDO_ITT_NOTIFY
@@ -57,78 +58,55 @@ ifeq ($(cfg), debug)
CPLUS_FLAGS = -DTBB_USE_DEBUG $(ITT_NOTIFY) -g -O0 -DUSE_PTHREAD
endif
-ifneq (0,$(cpp0x))
- CXX_ONLY_FLAGS = -std=c++0x
-endif
+# Adding directly to CPLUS_FLAGS instead of to WARNING_SUPPRESS because otherwise it would not be used in several tests (why not?).
+# Suppress warnings like:
+# - "1500-029: (W) WARNING: subprogram [...] could not be inlined into [...]."
+# - "1501-201: (W) Maximum number of common component diagnostics, 10 has been exceeded."
+# see http://www-01.ibm.com/support/docview.wss?uid=swg1LI72843
+# it seems that the internal compiler error that would ensue has now been avoided, making the condition harmless
+# - "1540-0198 (W) The omitted keyword "private" is assumed for base class "no_copy"."
+# - "1540-0822 (W) The name "__FUNCTION__" must not be defined as a macro."
+CPLUS_FLAGS += -qsuppress=1500-029:1501-201:1540-0198:1540-0822
-TBB_ASM.OBJ=
-MALLOC_ASM.OBJ=
+ASM=
+ASM_FLAGS=
-ifeq (ia64,$(arch))
-# Position-independent code (PIC) is a must on IA-64, even for regular (not shared) executables
- CPLUS_FLAGS += $(PIC_KEY)
-endif
+TBB_ASM.OBJ=
ifeq (intel64,$(arch))
- CPLUS_FLAGS += -m64
- LIB_LINK_FLAGS += -m64
+ CPLUS_FLAGS += -q64
+ LIB_LINK_FLAGS += -q64
endif
+# TODO: equivalent for -march=pentium4 in CPLUS_FLAGS
ifeq (ia32,$(arch))
- CPLUS_FLAGS += -m32 -march=pentium4
- LIB_LINK_FLAGS += -m32
+ CPLUS_FLAGS += -q32 -qarch=pentium4
+ LIB_LINK_FLAGS += -q32
endif
ifeq (ppc64,$(arch))
- CPLUS_FLAGS += -m64
- LIB_LINK_FLAGS += -m64
+ CPLUS_FLAGS += -q64
+ LIB_LINK_FLAGS += -q64
endif
ifeq (ppc32,$(arch))
- CPLUS_FLAGS += -m32
- LIB_LINK_FLAGS += -m32
+ CPLUS_FLAGS += -q32
+ LIB_LINK_FLAGS += -q32
endif
ifeq (bgp,$(arch))
- CPLUS = mpicxx
- CONLY = mpicc
+ CPLUS = bgxlC_r
+ CONLY = bgxlc_r
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
-endif
-
-#------------------------------------------------------------------------------
-# Setting assembler data.
-#------------------------------------------------------------------------------
-ASM = as
-ifeq (intel64,$(arch))
- ASM_FLAGS += --64
-endif
-ifeq (ia32,$(arch))
- ASM_FLAGS += --32
-endif
-ifeq ($(cfg),debug)
- ASM_FLAGS += -g
-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
-endif
-#------------------------------------------------------------------------------
-# End of setting assembler data.
-#------------------------------------------------------------------------------
-
#------------------------------------------------------------------------------
# Setting tbbmalloc data.
#------------------------------------------------------------------------------
-M_CPLUS_FLAGS = $(CPLUS_FLAGS) -fno-rtti -fno-exceptions -fno-schedule-insns2
+# Suppress innumerable warnings like "1540-1088 (W) The exception specification is being ignored."
+# Suppress warnings like "1540-1090 (I) The destructor of "lock" might not be called."
+# TODO: aren't these warnings an indication that -qnoeh might not be appropriate?
+M_CPLUS_FLAGS = $(CPLUS_FLAGS) -qnortti -qnoeh -qsuppress=1540-1088:1540-1090
#------------------------------------------------------------------------------
# End of setting tbbmalloc data.
diff --git a/build/macos.icc.inc b/build/macos.icc.inc
index f3f21f8..37b5d0d 100644
--- a/build/macos.icc.inc
+++ b/build/macos.icc.inc
@@ -70,6 +70,9 @@ ifeq (intel64,$(arch))
ASM_FLAGS += -arch x86_64
endif
ifeq (ia32,$(arch))
+ CPLUS_FLAGS += -m32
+ LINK_FLAGS += -m32
+ LIB_LINK_FLAGS += -m32
ASM_FLAGS += -arch i386
endif
ifeq ($(cfg), debug)
diff --git a/build/vsproject/index.html b/build/vsproject/index.html
index cd1788a..6179447 100644
--- a/build/vsproject/index.html
+++ b/build/vsproject/index.html
@@ -22,10 +22,9 @@ This directory contains the visual studio* 2005 solution to build Threading Buil
<P></P>
Copyright © 2005-2011 Intel Corporation. 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>
+Intel is a registered trademark or trademark 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.
</BODY>
</HTML>
diff --git a/build/vsproject/tbb.vcproj b/build/vsproject/tbb.vcproj
index 704111d..1c77711 100644
--- a/build/vsproject/tbb.vcproj
+++ b/build/vsproject/tbb.vcproj
@@ -325,9 +325,9 @@
" 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 [...]
+ <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\_concurrent_queue_internal.h">
+ <File RelativePath="..\..\include\tbb\internal\_concurrent_queue_impl.h">
</File>
<File RelativePath="..\..\include\tbb\_tbb_windef.h">
</File>
diff --git a/build/vsproject/tbbmalloc.vcproj b/build/vsproject/tbbmalloc.vcproj
index ff5ac1d..d00a511 100644
--- a/build/vsproject/tbbmalloc.vcproj
+++ b/build/vsproject/tbbmalloc.vcproj
@@ -261,7 +261,7 @@
</File>
<File RelativePath="..\..\src\tbbmalloc\frontend.cpp"/><File RelativePath="..\..\src\tbbmalloc\backend.cpp"/><File RelativePath="..\..\src\tbbmalloc\large_objects.cpp"/><File RelativePath="..\..\src\tbbmalloc\backref.cpp"/><File RelativePath="..\..\src\tbb\itt_notify.cpp"/><File RelativePath="..\..\src\tbbmalloc\tbbmalloc.cpp"/></Filter>
<Filter Name="Header Files" Filter="h;hpp;hxx;hm;inl;inc;xsd" UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
- <File RelativePath="..\..\include\tbb\_concurrent_queue_internal.h">
+ <File RelativePath="..\..\include\tbb\internal\_concurrent_queue_impl.h">
</File>
<File RelativePath="..\..\include\tbb\_tbb_windef.h">
</File>
diff --git a/build/windows.gcc.inc b/build/windows.gcc.inc
index 807bd20..6233c33 100644
--- a/build/windows.gcc.inc
+++ b/build/windows.gcc.inc
@@ -44,7 +44,7 @@ ifeq (ia32,$(arch))
else
TBB.LST = $(tbb_root)/src/tbb/win64-gcc-tbb-export.lst
endif
-MALLOC.DEF = $(MALLOC_ROOT)/win-gcc-tbbmalloc-export.def
+MALLOC.DEF = $(MALLOC_ROOT)/$(def_prefix)-gcc-tbbmalloc-export.def
RML.DEF = $(RML_SERVER_ROOT)/lin-rml-export.def
LINK_TBB.LIB = $(TBB.LIB)
diff --git a/build/windows.inc b/build/windows.inc
index 7b09ee4..6d1150e 100644
--- a/build/windows.inc
+++ b/build/windows.inc
@@ -53,9 +53,14 @@ MD=cmd /c mkdir
SLASH=\\
NUL = nul
+AR=lib
+AR_OUTPUT_KEY=/out:
+AR_FLAGS=/nologo /nodefaultlib
+
OBJ = obj
DLL = dll
LIBEXT = lib
+ASMEXT = asm
def_prefix = $(if $(findstring ia32,$(arch)),win32,win64)
@@ -89,6 +94,8 @@ LINK_MALLOC.LIB = $(MALLOC.LIB)
MALLOCPROXY.DLL = tbbmalloc_proxy$(DEBUG_SUFFIX).$(DLL)
MALLOCPROXY.LIB = tbbmalloc_proxy$(DEBUG_SUFFIX).$(LIBEXT)
+PROXY.LIB = tbbproxy$(DEBUG_SUFFIX).$(LIBEXT)
+
RML.DEF = $(RML_SERVER_ROOT)/$(def_prefix)-rml-export.def
RML.DLL = irml$(DEBUG_SUFFIX).$(DLL)
RML.LIB = irml$(DEBUG_SUFFIX).$(LIBEXT)
diff --git a/build/xbox360.cl.inc b/build/xbox360.cl.inc
index a06e2e8..0322df6 100644
--- a/build/xbox360.cl.inc
+++ b/build/xbox360.cl.inc
@@ -44,7 +44,7 @@ ifeq ($(cfg), release)
endif
ifeq ($(cfg), debug)
CPLUS_FLAGS = $(MS_CRT_KEY) /Od /Ob0 /Zi $(EH_FLAGS) /Zc:forScope \
- /DTBB_DO_ASSERT /D_XBOX /DTBB_NO_LEGACY=1
+ /DTBB_USE_DEBUG /D_XBOX /DTBB_NO_LEGACY=1
ASM_FLAGS = /DUSE_FRAME_POINTER
endif
diff --git a/doc/Release_Notes.txt b/doc/Release_Notes.txt
index 96f70ec..d92e7a6 100644
--- a/doc/Release_Notes.txt
+++ b/doc/Release_Notes.txt
@@ -1,6 +1,6 @@
------------------------------------------------------------------------
Intel(R) Threading Building Blocks - Release Notes
- Version 3.0
+ Version 4.0
------------------------------------------------------------------------
@@ -8,7 +8,7 @@ System Requirements
-------------------
Intel(R) Threading Building Blocks (Intel(R) TBB) is available
-commercially (see http://www.intel.com/software/products/threading) as a
+commercially (see http://software.intel.com/en-us/intel-tbb) as a
binary distribution, and in open source, in both source and binary
forms (see http://threadingbuildingblocks.org).
@@ -27,68 +27,60 @@ Hardware - Recommended
or higher
Linux* Systems
Intel(R) Core(TM) 2 Duo processor or Intel(R) Xeon(R) processor
- or Intel(R) Itanium(R) processor or higher
+ or higher
Mac 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) Itanium(R) processor family (Linux* systems only)
Non Intel(R) processors compatible with the above processors
Software - Minimum Requirements
Supported operating system (see below)
Supported compiler (see below)
- Xcode* tool suite 3.1.4 or higher (Mac OS* X systems only)
- Microsoft* Internet Explorer* 8.0, or other compatible web browser
- Adobe(R) Reader(R)* 6.0 or higher
+ Adobe(R) Reader(R)* 7.0 or higher
Software - Recommended
- Intel(R) Parallel Studio
- Intel(R) C++ Compiler 11.1 or higher
- Intel(R) Thread Checker 3.1 or higher
- Intel(R) Thread Profiler 3.1 or higher
+ Intel(R) Parallel Studio XE 2011 and higher
+ Intel(R) Parallel Studio 2011 and higher
Software - Supported Operating Systems
Microsoft* Windows* Systems
- Microsoft* Windows* XP Professional
- Microsoft* Windows* Server 2003
- Microsoft* Windows* Vista
- Microsoft* Windows* Server 2008
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* 5, 6, 4 (deprecated)
- (when using Red Hat* Enterprise Linux* 4 with Intel(R)
- Itanium(R) processors, operating system Update 2 or higher
- is recommended)
- Fedora* 12, 13
- (not with Intel(R) Itanium(R) processors)
- Asianux* 3.0
- Debian* GNU/Linux* 5.0
- Ubuntu* 10.04
- SuSE* Linux* Enterprise Server (SLES) 10, 11
+ 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.5.8 or higher
+ Mac OS* X 10.6.7 or higher
Software - Supported Compilers
- Microsoft* Visual C++ 8.0 (Microsoft* Visual Studio* 2005,
+ Intel(R) C++ Composer XE 2011 and higher
+ Intel(R) C++ Compiler 11.1
+ Microsoft* Visual C++ 10.0 (Microsoft* Visual Studio* 2010,
Windows* systems only)
Microsoft* Visual C++ 9.0 (Microsoft* Visual Studio* 2008,
Windows* systems only)
- Microsoft* Visual C++ 10.0 (Microsoft* Visual Studio* 2010,
- Windows* systems only)
- Intel(R) C++ Compiler 11.1 or higher
+ Microsoft* Visual C++ 8.0 (Microsoft* Visual Studio* 2005,
+ Windows* systems only, deprecated)
For each supported Linux* operating system, the standard gcc
version provided with that operating system is supported,
- including gcc 3.4 through 4.5
+ 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.1.4 or higher)
+ including: 4.0.1 or higher (Xcode* tool suite 3.2.5 or higher)
Known Issues
@@ -128,8 +120,7 @@ Library Issues
------------------------------------------------------------------------
Copyright (C) 2005-2011 Intel Corporation. All Rights Reserved.
-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.
+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.
diff --git a/doc/html/a00001.html b/doc/html/a00001.html
index 50c62c7..c5c6e06 100644
--- a/doc/html/a00001.html
+++ b/doc/html/a00001.html
@@ -20,10 +20,9 @@
<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::internal::aggregated_operation< Derived > Member List</h1>This is the complete list of members for <a class="el" href="a00213.html">tbb::interface6::internal::aggregated_operation< Derived ></a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>aggregated_operation</b>() (defined in <a class="el" href="a00213.html">tbb::interface6::internal::aggregated_operation< Derived ></a>)</td><td><a class="el" href="a00213.html">tbb::interface6::internal::aggregated_operation< Derived ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>next</b> (defined in <a class="el" href="a00213.html">tbb::interface6::internal::aggregated_operation< Derived ></a>)</td><td><a class="el" href="a00213.html">tbb::interface6::internal::aggregated_operation< Derived ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>status</b> (defined in <a class="el" href="a00213.html">tbb::interface6::internal::aggregated_operation< Derived ></a>)</td><td><a class="el" href="a00213.html">tbb::interface6::internal::aggregated_operation< Derived ></a></td><td></td></tr>
+<h1>tbb::aligned_space< T, N > Member List</h1>This is the complete list of members for <a class="el" href="a00227.html">tbb::aligned_space< T, N ></a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00227.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>()</td><td><a class="el" href="a00227.html">tbb::aligned_space< T, N ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00227.html#024be075c23c0394c9a2518d993bcd9e">end</a>()</td><td><a class="el" href="a00227.html">tbb::aligned_space< T, N ></a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00002.html b/doc/html/a00002.html
index 753bae4..e08c449 100644
--- a/doc/html/a00002.html
+++ b/doc/html/a00002.html
@@ -20,11 +20,9 @@
<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::internal::aggregator< handler_type, operation_type > Member List</h1>This is the complete list of members for <a class="el" href="a00214.html">tbb::interface6::internal::aggregator< handler_type, operation_type ></a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>aggregator</b>() (defined in <a class="el" href="a00214.html">tbb::interface6::internal::aggregator< handler_type, operation_type ></a>)</td><td><a class="el" href="a00214.html">tbb::interface6::internal::aggregator< handler_type, operation_type ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00214.html#282d5a2f1216b185c91ed23d00119481">execute</a>(operation_type *op)</td><td><a class="el" href="a00214.html">tbb::interface6::internal::aggregator< handler_type, operation_type ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>initialize_handler</b>(handler_type h) (defined in <a class="el" href="a00214.html">tbb::interface6::internal::aggregator< handler_type, operation_type ></a>)</td><td><a class="el" href="a00214.html">tbb::interface6::internal::aggregator< handler_type, operation_type ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>~aggregator</b>() (defined in <a class="el" href="a00214.html">tbb::interface6::internal::aggregator< handler_type, operation_type ></a>)</td><td><a class="el" href="a00214.html">tbb::interface6::internal::aggregator< handler_type, operation_type ></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="a00228.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="a00228.html">tbb::atomic< T ></a>)</td><td><a class="el" href="a00228.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="a00228.html">tbb::atomic< T ></a>)</td><td><a class="el" href="a00228.html">tbb::atomic< T ></a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00003.html b/doc/html/a00003.html
index e2b0392..e9e631b 100644
--- a/doc/html/a00003.html
+++ b/doc/html/a00003.html
@@ -20,9 +20,9 @@
<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="a00215.html">tbb::aligned_space< T, N ></a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00215.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>()</td><td><a class="el" href="a00215.html">tbb::aligned_space< T, N ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00215.html#024be075c23c0394c9a2518d993bcd9e">end</a>()</td><td><a class="el" href="a00215.html">tbb::aligned_space< T, N ></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="a00229.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="a00229.html">tbb::atomic< void * ></a>)</td><td><a class="el" href="a00229.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="a00229.html">tbb::atomic< void * ></a>)</td><td><a class="el" href="a00229.html">tbb::atomic< void * ></a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00004.html b/doc/html/a00004.html
index 6029fc7..c03e3ae 100644
--- a/doc/html/a00004.html
+++ b/doc/html/a00004.html
@@ -20,9 +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::atomic< T > Member List</h1>This is the complete list of members for <a class="el" href="a00216.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="a00216.html">tbb::atomic< T ></a>)</td><td><a class="el" href="a00216.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="a00216.html">tbb::atomic< T ></a>)</td><td><a class="el" href="a00216.html">tbb::atomic< T ></a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::blocked_range< Value > Member List</h1>This is the complete list of members for <a class="el" href="a00233.html">tbb::blocked_range< Value ></a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00233.html#18d2258400756ac1446dac7676b18df3">begin</a>() const </td><td><a class="el" href="a00233.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00233.html#94607755c5110d199202234d58d022ac">blocked_range</a>()</td><td><a class="el" href="a00233.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00233.html#14795a36ead1414b4371dbe1a4656359">blocked_range</a>(Value begin_, Value end_, size_type grainsize_=1)</td><td><a class="el" href="a00233.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00233.html#4c0efd2be3f96a0ab3ba5085e8b3fcc7">blocked_range</a>(blocked_range &r, split)</td><td><a class="el" href="a00233.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="a00233.html">tbb::blocked_range< Value ></a>)</td><td><a class="el" href="a00233.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="a00233.html">tbb::blocked_range< Value ></a>)</td><td><a class="el" href="a00233.html">tbb::blocked_range< Value ></a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00233.html#1a8d05842c2b3dfc177bc4d347e4cef7">const_iterator</a> typedef</td><td><a class="el" href="a00233.html">tbb::blocked_range< Value ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00233.html#8f4f02f530eb3f2e7ea26e06f76aef9d">empty</a>() const </td><td><a class="el" href="a00233.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00233.html#8b929d93ddc13f148b11bceef3a3bdf8">end</a>() const </td><td><a class="el" href="a00233.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00233.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>() const </td><td><a class="el" href="a00233.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00233.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a>() const </td><td><a class="el" href="a00233.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00233.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>() const </td><td><a class="el" href="a00233.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00233.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> typedef</td><td><a class="el" href="a00233.html">tbb::blocked_range< Value ></a></td><td></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00005.html b/doc/html/a00005.html
index 5c001f4..7d34f8a 100644
--- a/doc/html/a00005.html
+++ b/doc/html/a00005.html
@@ -20,9 +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::atomic< void * > Member List</h1>This is the complete list of members for <a class="el" href="a00217.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="a00217.html">tbb::atomic< void * ></a>)</td><td><a class="el" href="a00217.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="a00217.html">tbb::atomic< void * ></a>)</td><td><a class="el" href="a00217.html">tbb::atomic< void * ></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="a00234.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="a00234.html">tbb::blocked_range2d< RowValue, ColValue ></a>)</td><td><a class="el" href="a00234.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="a00234.html">tbb::blocked_range2d< RowValue, ColValue ></a>)</td><td><a class="el" href="a00234.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="a00234.html">tbb::blocked_range2d< RowValue, ColValue ></a>)</td><td><a class="el" href="a00234.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="a00234.html">tbb::blocked_range2d< RowValue, ColValue ></a>)</td><td><a class="el" href="a00234.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00234.html#392a46759af2c884957115771affa7f4">cols</a>() const </td><td><a class="el" href="a00234.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00234.html#d144cb2d88cef553420311aca8667a44">empty</a>() const </td><td><a class="el" href="a00234.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00234.html#ad36a9b38e4fef26d376f99552ce2d92">is_divisible</a>() const </td><td><a class="el" href="a00234.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00234.html#a807a22fe658ec38b8edfd69521d0383">row_range_type</a> typedef</td><td><a class="el" href="a00234.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00234.html#f496e7348a82652fba581203477cc07c">rows</a>() const </td><td><a class="el" href="a00234.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00006.html b/doc/html/a00006.html
index 267678b..2281c6c 100644
--- a/doc/html/a00006.html
+++ b/doc/html/a00006.html
@@ -20,20 +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::blocked_range< Value > Member List</h1>This is the complete list of members for <a class="el" href="a00221.html">tbb::blocked_range< Value ></a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00221.html#18d2258400756ac1446dac7676b18df3">begin</a>() const </td><td><a class="el" href="a00221.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00221.html#94607755c5110d199202234d58d022ac">blocked_range</a>()</td><td><a class="el" href="a00221.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00221.html#14795a36ead1414b4371dbe1a4656359">blocked_range</a>(Value begin_, Value end_, size_type grainsize_=1)</td><td><a class="el" href="a00221.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00221.html#4c0efd2be3f96a0ab3ba5085e8b3fcc7">blocked_range</a>(blocked_range &r, split)</td><td><a class="el" href="a00221.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="a00221.html">tbb::blocked_range< Value ></a>)</td><td><a class="el" href="a00221.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="a00221.html">tbb::blocked_range< Value ></a>)</td><td><a class="el" href="a00221.html">tbb::blocked_range< Value ></a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00221.html#1a8d05842c2b3dfc177bc4d347e4cef7">const_iterator</a> typedef</td><td><a class="el" href="a00221.html">tbb::blocked_range< Value ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00221.html#8f4f02f530eb3f2e7ea26e06f76aef9d">empty</a>() const </td><td><a class="el" href="a00221.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00221.html#8b929d93ddc13f148b11bceef3a3bdf8">end</a>() const </td><td><a class="el" href="a00221.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00221.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>() const </td><td><a class="el" href="a00221.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00221.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a>() const </td><td><a class="el" href="a00221.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00221.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>() const </td><td><a class="el" href="a00221.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00221.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> typedef</td><td><a class="el" href="a00221.html">tbb::blocked_range< Value ></a></td><td></td></tr>
+<h1>tbb::blocked_range3d< PageValue, RowValue, ColValue > Member List</h1>This is the complete list of members for <a class="el" href="a00235.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="a00235.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>)</td><td><a class="el" href="a00235.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="a00235.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>)</td><td><a class="el" href="a00235.html">tbb::blocked_range3d [...]
+ <tr bgcolor="#f0f0f0"><td><b>blocked_range3d</b>(blocked_range3d &r, split) (defined in <a class="el" href="a00235.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>)</td><td><a class="el" href="a00235.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="a00235.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>)</td><td><a class="el" href="a00235.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00235.html#3336ba9480fd6c43e158f9beb024c050">cols</a>() const </td><td><a class="el" href="a00235.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00235.html#356860e1c977d91711e8216bd55c0b25">empty</a>() const </td><td><a class="el" href="a00235.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00235.html#39d69191721c488e737ae5d9c5336b9c">is_divisible</a>() const </td><td><a class="el" href="a00235.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00235.html#b8ebf17a552ba47825e9b3887855b719">page_range_type</a> typedef</td><td><a class="el" href="a00235.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00235.html#cf971430aa12361d3ed245344b7c6764">pages</a>() const </td><td><a class="el" href="a00235.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="a00235.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>)</td><td><a class="el" href="a00235.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00235.html#1584623e59ff32a8aa82006827508be4">rows</a>() const </td><td><a class="el" href="a00235.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00007.html b/doc/html/a00007.html
index 9d62bdf..0445b25 100644
--- a/doc/html/a00007.html
+++ b/doc/html/a00007.html
@@ -20,16 +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::blocked_range2d< RowValue, ColValue > Member List</h1>This is the complete list of members for <a class="el" href="a00222.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="a00222.html">tbb::blocked_range2d< RowValue, ColValue ></a>)</td><td><a class="el" href="a00222.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="a00222.html">tbb::blocked_range2d< RowValue, ColValue ></a>)</td><td><a class="el" href="a00222.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="a00222.html">tbb::blocked_range2d< RowValue, ColValue ></a>)</td><td><a class="el" href="a00222.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="a00222.html">tbb::blocked_range2d< RowValue, ColValue ></a>)</td><td><a class="el" href="a00222.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00222.html#392a46759af2c884957115771affa7f4">cols</a>() const </td><td><a class="el" href="a00222.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00222.html#d144cb2d88cef553420311aca8667a44">empty</a>() const </td><td><a class="el" href="a00222.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00222.html#ad36a9b38e4fef26d376f99552ce2d92">is_divisible</a>() const </td><td><a class="el" href="a00222.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00222.html#a807a22fe658ec38b8edfd69521d0383">row_range_type</a> typedef</td><td><a class="el" href="a00222.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00222.html#f496e7348a82652fba581203477cc07c">rows</a>() const </td><td><a class="el" href="a00222.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::cache_aligned_allocator< T > Member List</h1>This is the complete list of members for <a class="el" href="a00238.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="a00238.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00238.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="a00238.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00238.html">tbb::cache_aligned_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00238.html#4cdeea67af6c1fcd8f1d5e9c4cab61e8">allocate</a>(size_type n, const void *hint=0)</td><td><a class="el" href="a00238.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="a00238.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00238.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="a00238.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00238.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="a00238.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00238.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="a00238.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00238.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="a00238.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00238.html">tbb::cache_aligned_allocator< T ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00238.html#958ee8745c86c275bfc9533af565e017">construct</a>(pointer p, const value_type &value)</td><td><a class="el" href="a00238.html">tbb::cache_aligned_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00238.html#3d4eadf188f7d85d3805ae534e0b8e1c">deallocate</a>(pointer p, size_type)</td><td><a class="el" href="a00238.html">tbb::cache_aligned_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00238.html#cd298895a4f1654b5149ec84b591ecb5">destroy</a>(pointer p)</td><td><a class="el" href="a00238.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="a00238.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00238.html">tbb::cache_aligned_allocator< T ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00238.html#fb23b687b4c0429dab4c7f8017266cf0">max_size</a>() const </td><td><a class="el" href="a00238.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="a00238.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00238.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="a00238.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00238.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="a00238.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00238.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="a00238.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00238.html">tbb::cache_aligned_allocator< T ></a></td><td></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00008.html b/doc/html/a00008.html
deleted file mode 100644
index 856f6e6..0000000
--- a/doc/html/a00008.html
+++ /dev/null
@@ -1,43 +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::blocked_range3d< PageValue, RowValue, ColValue > Member List</h1>This is the complete list of members for <a class="el" href="a00223.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="a00223.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>)</td><td><a class="el" href="a00223.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="a00223.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>)</td><td><a class="el" href="a00223.html">tbb::blocked_range3d [...]
- <tr bgcolor="#f0f0f0"><td><b>blocked_range3d</b>(blocked_range3d &r, split) (defined in <a class="el" href="a00223.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>)</td><td><a class="el" href="a00223.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="a00223.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>)</td><td><a class="el" href="a00223.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00223.html#3336ba9480fd6c43e158f9beb024c050">cols</a>() const </td><td><a class="el" href="a00223.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00223.html#356860e1c977d91711e8216bd55c0b25">empty</a>() const </td><td><a class="el" href="a00223.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00223.html#39d69191721c488e737ae5d9c5336b9c">is_divisible</a>() const </td><td><a class="el" href="a00223.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00223.html#b8ebf17a552ba47825e9b3887855b719">page_range_type</a> typedef</td><td><a class="el" href="a00223.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00223.html#cf971430aa12361d3ed245344b7c6764">pages</a>() const </td><td><a class="el" href="a00223.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="a00223.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>)</td><td><a class="el" href="a00223.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00223.html#1584623e59ff32a8aa82006827508be4">rows</a>() const </td><td><a class="el" href="a00223.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
-</table><hr>
-<p></p>
-Copyright © 2005-2011 Intel Corporation. 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/a00009.html b/doc/html/a00009.html
index 9b88443..e747ba6 100644
--- a/doc/html/a00009.html
+++ b/doc/html/a00009.html
@@ -20,24 +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::cache_aligned_allocator< T > Member List</h1>This is the complete list of members for <a class="el" href="a00226.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="a00226.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00226.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="a00226.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00226.html">tbb::cache_aligned_allocator< T ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00226.html#4cdeea67af6c1fcd8f1d5e9c4cab61e8">allocate</a>(size_type n, const void *hint=0)</td><td><a class="el" href="a00226.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="a00226.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00226.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="a00226.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00226.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="a00226.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00226.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="a00226.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00226.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="a00226.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00226.html">tbb::cache_aligned_allocator< T ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00226.html#958ee8745c86c275bfc9533af565e017">construct</a>(pointer p, const value_type &value)</td><td><a class="el" href="a00226.html">tbb::cache_aligned_allocator< T ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00226.html#3d4eadf188f7d85d3805ae534e0b8e1c">deallocate</a>(pointer p, size_type)</td><td><a class="el" href="a00226.html">tbb::cache_aligned_allocator< T ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00226.html#cd298895a4f1654b5149ec84b591ecb5">destroy</a>(pointer p)</td><td><a class="el" href="a00226.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="a00226.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00226.html">tbb::cache_aligned_allocator< T ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00226.html#fb23b687b4c0429dab4c7f8017266cf0">max_size</a>() const </td><td><a class="el" href="a00226.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="a00226.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00226.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="a00226.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00226.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="a00226.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00226.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="a00226.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00226.html">tbb::cache_aligned_allocator< T ></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="a00239.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="a00239.html">tbb::cache_aligned_allocator< void ></a>)</td><td><a class="el" href="a00239.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="a00239.html">tbb::cache_aligned_allocator< void ></a>)</td><td><a class="el" href="a00239.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="a00239.html">tbb::cache_aligned_allocator< void ></a>)</td><td><a class="el" href="a00239.html">tbb::cache_aligned_allocator< void ></a></td><td></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00011.html b/doc/html/a00011.html
index 8795e2e..6cfd67c 100644
--- a/doc/html/a00011.html
+++ b/doc/html/a00011.html
@@ -20,10 +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::cache_aligned_allocator< void > Member List</h1>This is the complete list of members for <a class="el" href="a00227.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="a00227.html">tbb::cache_aligned_allocator< void ></a>)</td><td><a class="el" href="a00227.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="a00227.html">tbb::cache_aligned_allocator< void ></a>)</td><td><a class="el" href="a00227.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="a00227.html">tbb::cache_aligned_allocator< void ></a>)</td><td><a class="el" href="a00227.html">tbb::cache_aligned_allocator< void ></a></td><td></td></tr>
+<h1>tbb::combinable< T > Member List</h1>This is the complete list of members for <a class="el" href="a00241.html">tbb::combinable< T ></a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>clear</b>() (defined in <a class="el" href="a00241.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00241.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="a00241.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00241.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="a00241.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00241.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="a00241.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00241.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="a00241.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00241.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="a00241.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00241.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="a00241.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00241.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="a00241.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00241.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="a00241.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00241.html">tbb::combinable< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00241.html#2c87e79ae98588a5780f708773388843">~combinable</a>()</td><td><a class="el" href="a00241.html">tbb::combinable< T ></a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00014.html b/doc/html/a00012.html
similarity index 85%
copy from doc/html/a00014.html
copy to doc/html/a00012.html
index 0d81875..e55415c 100644
--- a/doc/html/a00014.html
+++ b/doc/html/a00012.html
@@ -20,9 +20,9 @@
<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="a00300.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="a00300.html">tbb::tbb_hash_compare< Key ></a>)</td><td><a class="el" href="a00300.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="a00300.html">tbb::tbb_hash_compare< Key ></a>)</td><td><a class="el" href="a00300.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="a00321.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="a00321.html">tbb::tbb_hash_compare< Key ></a>)</td><td><a class="el" href="a00321.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="a00321.html">tbb::tbb_hash_compare< Key ></a>)</td><td><a class="el" href="a00321.html">tbb::tbb_hash_compare< Key ></a></td><td><code> [inline, static]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00013.html b/doc/html/a00013.html
index 58a53a3..8cebf50 100644
--- a/doc/html/a00013.html
+++ b/doc/html/a00013.html
@@ -20,17 +20,70 @@
<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="a00229.html">tbb::combinable< T ></a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>clear</b>() (defined in <a class="el" href="a00229.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00229.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="a00229.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00229.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="a00229.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00229.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="a00229.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00229.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="a00229.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00229.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="a00229.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00229.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="a00229.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00229.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="a00229.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00229.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="a00229.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00229.html">tbb::combinable< T ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00229.html#2c87e79ae98588a5780f708773388843">~combinable</a>()</td><td><a class="el" href="a00229.html">tbb::combinable< T ></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="a00243.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="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00243.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="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00243.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="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00243.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="a00243.html#af34cb91b1d0f36a885a1a3432dd9af1">bucket_count</a>() const </td><td><a class="el" href="a00243.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="a00243.html#220686fe17b197eedf19dd856cd02e36">clear</a>()</td><td><a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00243.html#1ad413f5b666176e7669bf4c87d1ff3f">concurrent_hash_map</a>(const allocator_type &a=allocator_type())</td><td><a class="el" href="a00243.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="a00243.html#46b9896317662c3cfa3c876ad7592a7c">concurrent_hash_map</a>(size_type n, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00243.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="a00243.html#6fb14710893308fb47aaeee55ee30dc3">concurrent_hash_map</a>(const concurrent_hash_map &table, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00243.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="a00243.html#83c40f2053f208861b90390e12a36436">concurrent_hash_map</a>(I first, I last, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00243.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="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00243.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="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00243.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="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00243.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="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00243.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="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00243.html#6968eb6feed2df36be421df0464297af">count</a>(const Key &key) const </td><td><a class="el" href="a00243.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="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00243.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="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00243.html#61ff2e5bb44e5469366fd5295e5d0ebe">empty</a>() const </td><td><a class="el" href="a00243.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="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00243.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="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00243.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="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00243.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="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00243.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="a00243.html#f27802b3a8d1863c29e743e9c6b4e870">erase</a>(const Key &key)</td><td><a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00243.html#e698ef3d70b2d1a29a7a5551784d3653">erase</a>(const_accessor &item_accessor)</td><td><a class="el" href="a00243.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="a00243.html#5f12d150d421420965db07368666a84f">erase</a>(accessor &item_accessor)</td><td><a class="el" href="a00243.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="a00243.html#0c964214eb38f54603aa75fdff6d2709">exclude</a>(const_accessor &item_accessor)</td><td><a class="el" href="a00243.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="a00243.html#2afcc33dade7bb24e008d60c0df38230">find</a>(const_accessor &result, const Key &key) const </td><td><a class="el" href="a00243.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="a00243.html#7bc475d1968f7f0af3d736d7e8a0d7df">find</a>(accessor &result, const Key &key)</td><td><a class="el" href="a00243.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="a00243.html#6cbcacb4a256a85bf89576c101373ca7">get_allocator</a>() const </td><td><a class="el" href="a00243.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="a00243.html#47fe0e60151a9bd7a444db827772a4e6">insert</a>(const_accessor &result, const Key &key)</td><td><a class="el" href="a00243.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="a00243.html#54e0955ecd11575b4c07166838a72893">insert</a>(accessor &result, const Key &key)</td><td><a class="el" href="a00243.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="a00243.html#091efd2d12fdad4fe9e54d9629a9dfc3">insert</a>(const_accessor &result, const value_type &value)</td><td><a class="el" href="a00243.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="a00243.html#39183d78d6e8425917555ab542ab92de">insert</a>(accessor &result, const value_type &value)</td><td><a class="el" href="a00243.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="a00243.html#3f121a316af8135de476a30fae6d7c07">insert</a>(const value_type &value)</td><td><a class="el" href="a00243.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="a00243.html#1dd37fad87e561151ba1e242ca94bcc1">insert</a>(I first, I last)</td><td><a class="el" href="a00243.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="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00243.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="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00243.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="a00243.html#72c9c9e9655fcf096f5f0ed9c8ba6669">internal_copy</a>(const concurrent_hash_map &source)</td><td><a class="el" href="a00243.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="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00243.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="a00243.html#8f5373b8e1864619d1ffcf3bf3f1f13d">internal_equal_range</a>(const Key &key, I end) const </td><td><a class="el" href="a00243.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="a00243.html#2f76ed101a0ccc8875b846c2f747897e">internal_fast_find</a>(const Key &key) const </td><td><a class="el" href="a00243.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="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00243.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="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00243.html#3f3413264a99174a224ef96f6c4ea769">lookup</a>(bool op_insert, const Key &key, const T *t, const_accessor *result, bool write)</td><td><a class="el" href="a00243.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="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00243.html#2bce57fe9b594abe1e6d2568aea8b357">max_size</a>() const </td><td><a class="el" href="a00243.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="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00243.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="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00243.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="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00243.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="a00243.html#088d1aaccc816884a49e38f7065622c8">operator=</a>(const concurrent_hash_map &table)</td><td><a class="el" href="a00243.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="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00243.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="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00243.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="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00243.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="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00243.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="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00243.html#94758113d8993cfe5afdf2d63a728869">rehash</a>(size_type n=0)</td><td><a class="el" href="a00243.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="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00243.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="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00243.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="a00243.html#6aa56a8b5a25e61a97fa0b54fe2b5659">size</a>() const </td><td><a class="el" href="a00243.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="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00243.html#076f8d9e16110aac5f558777aa744eb6">swap</a>(concurrent_hash_map &table)</td><td><a class="el" href="a00243.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="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00243.html#2aa8e2d28d5af1284cf78d20a9c22731">~concurrent_hash_map</a>()</td><td><a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00015.html b/doc/html/a00015.html
index e49596c..ea69dfc 100644
--- a/doc/html/a00015.html
+++ b/doc/html/a00015.html
@@ -20,70 +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::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator > Member List</h1>This is the complete list of members for <a class="el" href="a00231.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="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00231.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="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00231.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="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00231.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="a00231.html#af34cb91b1d0f36a885a1a3432dd9af1">bucket_count</a>() const </td><td><a class="el" href="a00231.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="a00231.html#220686fe17b197eedf19dd856cd02e36">clear</a>()</td><td><a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00231.html#1ad413f5b666176e7669bf4c87d1ff3f">concurrent_hash_map</a>(const allocator_type &a=allocator_type())</td><td><a class="el" href="a00231.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="a00231.html#46b9896317662c3cfa3c876ad7592a7c">concurrent_hash_map</a>(size_type n, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00231.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="a00231.html#6fb14710893308fb47aaeee55ee30dc3">concurrent_hash_map</a>(const concurrent_hash_map &table, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00231.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="a00231.html#83c40f2053f208861b90390e12a36436">concurrent_hash_map</a>(I first, I last, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00231.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="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00231.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="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00231.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="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00231.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="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00231.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="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00231.html#6968eb6feed2df36be421df0464297af">count</a>(const Key &key) const </td><td><a class="el" href="a00231.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="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00231.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="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00231.html#61ff2e5bb44e5469366fd5295e5d0ebe">empty</a>() const </td><td><a class="el" href="a00231.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="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00231.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="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00231.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="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00231.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="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00231.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="a00231.html#f27802b3a8d1863c29e743e9c6b4e870">erase</a>(const Key &key)</td><td><a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00231.html#e698ef3d70b2d1a29a7a5551784d3653">erase</a>(const_accessor &item_accessor)</td><td><a class="el" href="a00231.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="a00231.html#5f12d150d421420965db07368666a84f">erase</a>(accessor &item_accessor)</td><td><a class="el" href="a00231.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="a00231.html#0c964214eb38f54603aa75fdff6d2709">exclude</a>(const_accessor &item_accessor)</td><td><a class="el" href="a00231.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="a00231.html#2afcc33dade7bb24e008d60c0df38230">find</a>(const_accessor &result, const Key &key) const </td><td><a class="el" href="a00231.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="a00231.html#7bc475d1968f7f0af3d736d7e8a0d7df">find</a>(accessor &result, const Key &key)</td><td><a class="el" href="a00231.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="a00231.html#6cbcacb4a256a85bf89576c101373ca7">get_allocator</a>() const </td><td><a class="el" href="a00231.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="a00231.html#47fe0e60151a9bd7a444db827772a4e6">insert</a>(const_accessor &result, const Key &key)</td><td><a class="el" href="a00231.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="a00231.html#54e0955ecd11575b4c07166838a72893">insert</a>(accessor &result, const Key &key)</td><td><a class="el" href="a00231.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="a00231.html#091efd2d12fdad4fe9e54d9629a9dfc3">insert</a>(const_accessor &result, const value_type &value)</td><td><a class="el" href="a00231.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="a00231.html#39183d78d6e8425917555ab542ab92de">insert</a>(accessor &result, const value_type &value)</td><td><a class="el" href="a00231.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="a00231.html#3f121a316af8135de476a30fae6d7c07">insert</a>(const value_type &value)</td><td><a class="el" href="a00231.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="a00231.html#1dd37fad87e561151ba1e242ca94bcc1">insert</a>(I first, I last)</td><td><a class="el" href="a00231.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="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00231.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="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00231.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="a00231.html#72c9c9e9655fcf096f5f0ed9c8ba6669">internal_copy</a>(const concurrent_hash_map &source)</td><td><a class="el" href="a00231.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="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00231.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="a00231.html#8f5373b8e1864619d1ffcf3bf3f1f13d">internal_equal_range</a>(const Key &key, I end) const </td><td><a class="el" href="a00231.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="a00231.html#2f76ed101a0ccc8875b846c2f747897e">internal_fast_find</a>(const Key &key) const </td><td><a class="el" href="a00231.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="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00231.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="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00231.html#3f3413264a99174a224ef96f6c4ea769">lookup</a>(bool op_insert, const Key &key, const T *t, const_accessor *result, bool write)</td><td><a class="el" href="a00231.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="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00231.html#2bce57fe9b594abe1e6d2568aea8b357">max_size</a>() const </td><td><a class="el" href="a00231.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="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00231.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="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00231.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="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00231.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="a00231.html#088d1aaccc816884a49e38f7065622c8">operator=</a>(const concurrent_hash_map &table)</td><td><a class="el" href="a00231.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="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00231.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="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00231.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="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00231.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="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00231.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="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00231.html#94758113d8993cfe5afdf2d63a728869">rehash</a>(size_type n=0)</td><td><a class="el" href="a00231.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="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00231.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="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00231.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="a00231.html#6aa56a8b5a25e61a97fa0b54fe2b5659">size</a>() const </td><td><a class="el" href="a00231.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="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00231.html#076f8d9e16110aac5f558777aa744eb6">swap</a>(concurrent_hash_map &table)</td><td><a class="el" href="a00231.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="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00231.html#2aa8e2d28d5af1284cf78d20a9c22731">~concurrent_hash_map</a>()</td><td><a class="el" href="a00231.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 >::bucket_accessor Member List</h1>This is the complete list of members for <a class="el" href="a00245.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="a00245.html#d11c77f4d70a94d4fb344492bbf18007">acquire</a>(concurrent_hash_map *base, const hashcode_t h, bool writer=false)</td><td><a class="el" href="a00245.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="a00245.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a>)</td><td><a class="el" href="a00245.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="a00245.html#07d958f151a0eaa92f50fd56ad6440e2">is_writer</a>()</td><td><a class="el" href="a00245.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="a00245.html#fa6314b861c574f86ed189b124cf5853">operator()</a>()</td><td><a class="el" href="a00245.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-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00019.html b/doc/html/a00016.html
similarity index 50%
rename from doc/html/a00019.html
rename to doc/html/a00016.html
index 53e07de..59da4fe 100644
--- a/doc/html/a00019.html
+++ b/doc/html/a00016.html
@@ -20,17 +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::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor Member List</h1>This is the complete list of members for <a class="el" href="a00232.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="a00234.html#27399c613eb1aecd4660803955dda09d">const_accessor</a>()</td><td><a class="el" href="a00234.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="a00234.html#84c3080d0c6124d55c8bb4cf6055e65f">empty</a>() const </td><td><a class="el" href="a00234.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="a00234.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a>)</td><td><a class="el" href="a00234.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="a00234.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a>)</td><td><a class="el" href="a00234.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="a00234.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a>)</td><td><a class="el" href="a00234.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="a00232.html#170280ea807a22e742095de3e8c5ea38">operator *</a>() const </td><td><a class="el" href="a00232.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="a00232.html#a807920cdffe3ec5c5e282b4d1ff92a2">operator-></a>() const </td><td><a class="el" href="a00232.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="a00234.html#7db006d41b49dc5f1716a913769d4698">release</a>()</td><td><a class="el" href="a00234.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="a00232.html#0b648be7a95a8fb2971042c15eb112c1">value_type</a> typedef</td><td><a class="el" href="a00232.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00234.html#928769b139d53427e7075c1f86148e4c">~const_accessor</a>()</td><td><a class="el" href="a00234.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="a00246.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="a00246.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a>)</td><td><a class="el" href="a00246.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="a00246.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a>)</td><td><a class="el" href="a00246.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="a00246.html#27399c613eb1aecd4660803955dda09d">const_accessor</a>()</td><td><a class="el" href="a00246.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="a00246.html#84c3080d0c6124d55c8bb4cf6055e65f">empty</a>() const </td><td><a class="el" href="a00246.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="a00246.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a>)</td><td><a class="el" href="a00246.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="a00246.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a>)</td><td><a class="el" href="a00246.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="a00246.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a>)</td><td><a class="el" href="a00246.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="a00246.html#9411df8197ceb4881ec4c7368a0a7f88">operator *</a>() const </td><td><a class="el" href="a00246.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="a00246.html#3d03a48ecb8cd9549bd8be64b09c9b0d">operator-></a>() const </td><td><a class="el" href="a00246.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="a00246.html#7db006d41b49dc5f1716a913769d4698">release</a>()</td><td><a class="el" href="a00246.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="a00246.html#a8e50238483ba451363dccebd981d346">value_type</a> typedef</td><td><a class="el" href="a00246.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="a00246.html#928769b139d53427e7075c1f86148e4c">~const_accessor</a>()</td><td><a class="el" href="a00246.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-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00017.html b/doc/html/a00017.html
index efeeecd..e79a934 100644
--- a/doc/html/a00017.html
+++ b/doc/html/a00017.html
@@ -20,11 +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::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="a00233.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="a00233.html#d11c77f4d70a94d4fb344492bbf18007">acquire</a>(concurrent_hash_map *base, const hashcode_t h, bool writer=false)</td><td><a class="el" href="a00233.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="a00233.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a>)</td><td><a class="el" href="a00233.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="a00233.html#07d958f151a0eaa92f50fd56ad6440e2">is_writer</a>()</td><td><a class="el" href="a00233.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="a00233.html#fa6314b861c574f86ed189b124cf5853">operator()</a>()</td><td><a class="el" href="a00233.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 >::accessor Member List</h1>This is the complete list of members for <a class="el" href="a00244.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="a00246.html#27399c613eb1aecd4660803955dda09d">const_accessor</a>()</td><td><a class="el" href="a00246.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="a00246.html#84c3080d0c6124d55c8bb4cf6055e65f">empty</a>() const </td><td><a class="el" href="a00246.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="a00246.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a>)</td><td><a class="el" href="a00246.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="a00246.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a>)</td><td><a class="el" href="a00246.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="a00246.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a>)</td><td><a class="el" href="a00246.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="a00244.html#170280ea807a22e742095de3e8c5ea38">operator *</a>() const </td><td><a class="el" href="a00244.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="a00244.html#a807920cdffe3ec5c5e282b4d1ff92a2">operator-></a>() const </td><td><a class="el" href="a00244.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="a00246.html#7db006d41b49dc5f1716a913769d4698">release</a>()</td><td><a class="el" href="a00246.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="a00244.html#0b648be7a95a8fb2971042c15eb112c1">value_type</a> typedef</td><td><a class="el" href="a00244.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00246.html#928769b139d53427e7075c1f86148e4c">~const_accessor</a>()</td><td><a class="el" href="a00246.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-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00018.html b/doc/html/a00018.html
index 59becc6..e2ecdf6 100644
--- a/doc/html/a00018.html
+++ b/doc/html/a00018.html
@@ -20,19 +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::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="a00234.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="a00234.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a>)</td><td><a class="el" href="a00234.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="a00234.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a>)</td><td><a class="el" href="a00234.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="a00234.html#27399c613eb1aecd4660803955dda09d">const_accessor</a>()</td><td><a class="el" href="a00234.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="a00234.html#84c3080d0c6124d55c8bb4cf6055e65f">empty</a>() const </td><td><a class="el" href="a00234.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="a00234.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a>)</td><td><a class="el" href="a00234.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="a00234.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a>)</td><td><a class="el" href="a00234.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="a00234.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a>)</td><td><a class="el" href="a00234.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="a00234.html#9411df8197ceb4881ec4c7368a0a7f88">operator *</a>() const </td><td><a class="el" href="a00234.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="a00234.html#3d03a48ecb8cd9549bd8be64b09c9b0d">operator-></a>() const </td><td><a class="el" href="a00234.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="a00234.html#7db006d41b49dc5f1716a913769d4698">release</a>()</td><td><a class="el" href="a00234.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="a00234.html#a8e50238483ba451363dccebd981d346">value_type</a> typedef</td><td><a class="el" href="a00234.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="a00234.html#928769b139d53427e7075c1f86148e4c">~const_accessor</a>()</td><td><a class="el" href="a00234.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [inline]</code></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="a00247.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00247.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a> typedef</td><td><a class="el" href="a00247.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00247.html#0bdcdf7cde9fd369edca845bec34ca94">clear</a>()</td><td><a class="el" href="a00247.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="a00247.html#eefa40599afe00ea393897d8f5662e65">concurrent_priority_queue</a>(const allocator_type &a=allocator_type())</td><td><a class="el" href="a00247.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="a00247.html#4555b4a55415a70024c4004b51e9f385">concurrent_priority_queue</a>(size_type init_capacity, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00247.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="a00247.html#9147cb4207017c260a0c3929c12cd40f">concurrent_priority_queue</a>(InputIterator begin, InputIterator end, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00247.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="a00247.html#509419e320f200456d89dc54a65140b3">concurrent_priority_queue</a>(const concurrent_priority_queue &src)</td><td><a class="el" href="a00247.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="a00247.html#c8b20e7430c5302936030bef59a562be">concurrent_priority_queue</a>(const concurrent_priority_queue &src, const allocator_type &a)</td><td><a class="el" href="a00247.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="a00247.html#a4ded8601a434098605be0dcc4febc60">const_reference</a> typedef</td><td><a class="el" href="a00247.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00247.html#77399bc76b3ecd60e33f7e35a5becd87">difference_type</a> typedef</td><td><a class="el" href="a00247.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00247.html#317c508fa92df218be5d014c26c09bb7">empty</a>() const </td><td><a class="el" href="a00247.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="a00247.html#d545d444fb0d16148f9b61fd89f9a337">get_allocator</a>() const </td><td><a class="el" href="a00247.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="a00247.html#2ab7f7808891027ac0f0f5b3a4be51e9">operator=</a>(const concurrent_priority_queue &src)</td><td><a class="el" href="a00247.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="a00247.html#d905af7b8f6defff562f5ae9c3275763">push</a>(const_reference elem)</td><td><a class="el" href="a00247.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="a00247.html#5804b3c708ef4e50d603f918ef2b9e58">reference</a> typedef</td><td><a class="el" href="a00247.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00247.html#8b2ae25c61338c6fd59e94fe09822ba5">size</a>() const </td><td><a class="el" href="a00247.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="a00247.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a> typedef</td><td><a class="el" href="a00247.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00247.html#0ecdc6a04aa259374425d424ca2a6082">swap</a>(concurrent_priority_queue &q)</td><td><a class="el" href="a00247.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="a00247.html#e036461a29cc40902a2bb79abf9f5146">try_pop</a>(reference elem)</td><td><a class="el" href="a00247.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="a00247.html#7c611a6b5b8f94b0e7f2afc97e31efb1">value_type</a> typedef</td><td><a class="el" href="a00247.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00020.html b/doc/html/a00020.html
deleted file mode 100644
index 8f0af58..0000000
--- a/doc/html/a00020.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::interface5::concurrent_priority_queue< T, Compare, A > Member List</h1>This is the complete list of members for <a class="el" href="a00235.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00235.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a> typedef</td><td><a class="el" href="a00235.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00235.html#e5d6a0aca1579ecebb716bbe53514963">capacity</a>() const </td><td><a class="el" href="a00235.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="a00235.html#0bdcdf7cde9fd369edca845bec34ca94">clear</a>()</td><td><a class="el" href="a00235.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="a00235.html#eefa40599afe00ea393897d8f5662e65">concurrent_priority_queue</a>(const allocator_type &a=allocator_type())</td><td><a class="el" href="a00235.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="a00235.html#4555b4a55415a70024c4004b51e9f385">concurrent_priority_queue</a>(size_type init_capacity, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00235.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="a00235.html#9147cb4207017c260a0c3929c12cd40f">concurrent_priority_queue</a>(InputIterator begin, InputIterator end, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00235.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="a00235.html#509419e320f200456d89dc54a65140b3">concurrent_priority_queue</a>(const concurrent_priority_queue &src)</td><td><a class="el" href="a00235.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td><code> [inline, explicit]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>concurrent_priority_queue</b>(const concurrent_priority_queue &src, const allocator_type &a) (defined in <a class="el" href="a00235.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a>)</td><td><a class="el" href="a00235.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="a00235.html#a4ded8601a434098605be0dcc4febc60">const_reference</a> typedef</td><td><a class="el" href="a00235.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00235.html#77399bc76b3ecd60e33f7e35a5becd87">difference_type</a> typedef</td><td><a class="el" href="a00235.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00235.html#317c508fa92df218be5d014c26c09bb7">empty</a>() const </td><td><a class="el" href="a00235.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="a00235.html#d545d444fb0d16148f9b61fd89f9a337">get_allocator</a>() const </td><td><a class="el" href="a00235.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="a00235.html#2ab7f7808891027ac0f0f5b3a4be51e9">operator=</a>(const concurrent_priority_queue &src)</td><td><a class="el" href="a00235.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="a00235.html#d905af7b8f6defff562f5ae9c3275763">push</a>(const_reference elem)</td><td><a class="el" href="a00235.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="a00235.html#5804b3c708ef4e50d603f918ef2b9e58">reference</a> typedef</td><td><a class="el" href="a00235.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00235.html#e7c59f011c4cca83ff210aefe7c9d868">reserve</a>(size_type new_cap)</td><td><a class="el" href="a00235.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="a00235.html#28d113288fc7e0c04c9053ec7de61368">shrink_to_fit</a>()</td><td><a class="el" href="a00235.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="a00235.html#8b2ae25c61338c6fd59e94fe09822ba5">size</a>() const </td><td><a class="el" href="a00235.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="a00235.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a> typedef</td><td><a class="el" href="a00235.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00235.html#0ecdc6a04aa259374425d424ca2a6082">swap</a>(concurrent_priority_queue &q)</td><td><a class="el" href="a00235.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="a00235.html#e036461a29cc40902a2bb79abf9f5146">try_pop</a>(reference elem)</td><td><a class="el" href="a00235.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="a00235.html#7c611a6b5b8f94b0e7f2afc97e31efb1">value_type</a> typedef</td><td><a class="el" href="a00235.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td></td></tr>
-</table><hr>
-<p></p>
-Copyright © 2005-2011 Intel Corporation. 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/a00024.html b/doc/html/a00022.html
similarity index 59%
rename from doc/html/a00024.html
rename to doc/html/a00022.html
index efbbad4..219c2f7 100644
--- a/doc/html/a00024.html
+++ b/doc/html/a00022.html
@@ -20,30 +20,30 @@
<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="a00236.html">tbb::strict_ppl::concurrent_queue< T, A ></a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00236.html#5a3956341728eaa558d8827063718cac">allocator_type</a> typedef</td><td><a class="el" href="a00236.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00236.html#c32e8e84c0524155133b4aae32d2a827">clear</a>()</td><td><a class="el" href="a00236.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00236.html#7c48a05a94a1f4f98fdfadfbef98ecf6">concurrent_queue</a>(const allocator_type &a=allocator_type())</td><td><a class="el" href="a00236.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="a00236.html#25209656c84f2f9b030e2f9162713341">concurrent_queue</a>(InputIterator begin, InputIterator end, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00236.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00236.html#8a6b98ea11a867db8ac868f0113ca429">concurrent_queue</a>(const concurrent_queue &src, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00236.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="a00236.html">tbb::strict_ppl::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00236.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00236.html#4d48e7ff93f81636bca2c74f7da34750">const_reference</a> typedef</td><td><a class="el" href="a00236.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00236.html#068576d16c7e4e05d52f9db7a45b5b65">difference_type</a> typedef</td><td><a class="el" href="a00236.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00236.html#f3f6fce0cfa2d581d6f3b47e0613ad64">empty</a>() const </td><td><a class="el" href="a00236.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00236.html#f034f70caef445fe8abc9113ec926a8d">get_allocator</a>() const </td><td><a class="el" href="a00236.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="a00236.html">tbb::strict_ppl::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00236.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="a00236.html">tbb::strict_ppl::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00236.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00236.html#73c47563ffcc4c2f6452f25a04ebe2e2">push</a>(const T &source)</td><td><a class="el" href="a00236.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00236.html#a8d725c50a9834bb7af5b67c0aff92b8">reference</a> typedef</td><td><a class="el" href="a00236.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00236.html#8fc30e93f8342a1960357f71e4fe8a2b">size_type</a> typedef</td><td><a class="el" href="a00236.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00236.html#ae31ca0db34ef96ef1e74aa0d28c95f8">try_pop</a>(T &result)</td><td><a class="el" href="a00236.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="a00236.html">tbb::strict_ppl::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00236.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="a00236.html">tbb::strict_ppl::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00236.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="a00236.html">tbb::strict_ppl::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00236.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="a00236.html">tbb::strict_ppl::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00236.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00236.html#eaa35a5274606779802e9a669a706260">unsafe_size</a>() const </td><td><a class="el" href="a00236.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00236.html#682c3978d5cb0620000994f11c44a476">value_type</a> typedef</td><td><a class="el" href="a00236.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00236.html#830b33753d6b149c366344e29b2edd8c">~concurrent_queue</a>()</td><td><a class="el" href="a00236.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="a00248.html">tbb::strict_ppl::concurrent_queue< T, A ></a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00248.html#5a3956341728eaa558d8827063718cac">allocator_type</a> typedef</td><td><a class="el" href="a00248.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00248.html#c32e8e84c0524155133b4aae32d2a827">clear</a>()</td><td><a class="el" href="a00248.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00248.html#7c48a05a94a1f4f98fdfadfbef98ecf6">concurrent_queue</a>(const allocator_type &a=allocator_type())</td><td><a class="el" href="a00248.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="a00248.html#25209656c84f2f9b030e2f9162713341">concurrent_queue</a>(InputIterator begin, InputIterator end, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00248.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00248.html#8a6b98ea11a867db8ac868f0113ca429">concurrent_queue</a>(const concurrent_queue &src, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00248.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="a00248.html">tbb::strict_ppl::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00248.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00248.html#4d48e7ff93f81636bca2c74f7da34750">const_reference</a> typedef</td><td><a class="el" href="a00248.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00248.html#068576d16c7e4e05d52f9db7a45b5b65">difference_type</a> typedef</td><td><a class="el" href="a00248.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00248.html#f3f6fce0cfa2d581d6f3b47e0613ad64">empty</a>() const </td><td><a class="el" href="a00248.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00248.html#f034f70caef445fe8abc9113ec926a8d">get_allocator</a>() const </td><td><a class="el" href="a00248.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="a00248.html">tbb::strict_ppl::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00248.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="a00248.html">tbb::strict_ppl::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00248.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00248.html#73c47563ffcc4c2f6452f25a04ebe2e2">push</a>(const T &source)</td><td><a class="el" href="a00248.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00248.html#a8d725c50a9834bb7af5b67c0aff92b8">reference</a> typedef</td><td><a class="el" href="a00248.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00248.html#8fc30e93f8342a1960357f71e4fe8a2b">size_type</a> typedef</td><td><a class="el" href="a00248.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00248.html#ae31ca0db34ef96ef1e74aa0d28c95f8">try_pop</a>(T &result)</td><td><a class="el" href="a00248.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="a00248.html">tbb::strict_ppl::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00248.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="a00248.html">tbb::strict_ppl::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00248.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="a00248.html">tbb::strict_ppl::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00248.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="a00248.html">tbb::strict_ppl::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00248.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00248.html#eaa35a5274606779802e9a669a706260">unsafe_size</a>() const </td><td><a class="el" href="a00248.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00248.html#682c3978d5cb0620000994f11c44a476">value_type</a> typedef</td><td><a class="el" href="a00248.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00248.html#830b33753d6b149c366344e29b2edd8c">~concurrent_queue</a>()</td><td><a class="el" href="a00248.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00025.html b/doc/html/a00023.html
similarity index 58%
copy from doc/html/a00025.html
copy to doc/html/a00023.html
index 9af2e9f..d95baac 100644
--- a/doc/html/a00025.html
+++ b/doc/html/a00023.html
@@ -20,34 +20,34 @@
<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="a00230.html">tbb::concurrent_bounded_queue< T, A ></a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00230.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a> typedef</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00230.html#b2888b3e4e837d7e03f2c731963a402b">capacity</a>() const </td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00230.html#90b31e2954c6e4596c7900435a5f4bc1">clear</a>()</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00230.html#e3525226732963ff0f13e89d8e6dab5b">concurrent_bounded_queue</a>(const allocator_type &a=allocator_type())</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline, explicit]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00230.html#7b7fb414d2eaa8a7f5d68fc4cd63ac50">concurrent_bounded_queue</a>(const concurrent_bounded_queue &src, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00230.html#a5e04dcd7db9fd9b583b4e7df832246a">concurrent_bounded_queue</a>(InputIterator begin, InputIterator end, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00230.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="a00230.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00230.html#796713d0b9ba93a4721cbe13e4474068">const_reference</a> typedef</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00230.html#4b45c91297e69515d83d5eef85ae1f49">difference_type</a> typedef</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00230.html#f64924f2ee9225c368a270fc3c394db9">empty</a>() const </td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00230.html#415eb87e53b1c6a266de06ecbc490d16">get_allocator</a>() const </td><td><a class="el" href="a00230.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="a00230.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00230.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="a00230.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00230.html#41f4c6bd7a82ab070e840bbf81b0b123">pop</a>(T &destination)</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00230.html#ceb08c743b11ba88c878e73fff8af20b">push</a>(const T &source)</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00230.html#dcd44ca6a88c0dc7a847a47a10811f0c">reference</a> typedef</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00230.html#f3c6c934f85fd02aedbc83a16943193b">set_capacity</a>(size_type new_capacity)</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00230.html#7dc14d1a579a4cccda9f857585e1768d">size</a>() const </td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00230.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> typedef</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00230.html#0ca487019bbb00a196442aff78a1e4f7">try_pop</a>(T &destination)</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00230.html#2bd6232531279fb3ccbd296bea23066b">try_push</a>(const T &source)</td><td><a class="el" href="a00230.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="a00230.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00230.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="a00230.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00230.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="a00230.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00230.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="a00230.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00230.html#98245517a931e5893f6601e66c51fc75">value_type</a> typedef</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00230.html#acaf5b510dc0dfc7780b8c956cf773cf">~concurrent_bounded_queue</a>()</td><td><a class="el" href="a00230.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="a00242.html">tbb::concurrent_bounded_queue< T, A ></a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00242.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a> typedef</td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00242.html#b2888b3e4e837d7e03f2c731963a402b">capacity</a>() const </td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00242.html#90b31e2954c6e4596c7900435a5f4bc1">clear</a>()</td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00242.html#e3525226732963ff0f13e89d8e6dab5b">concurrent_bounded_queue</a>(const allocator_type &a=allocator_type())</td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline, explicit]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00242.html#7b7fb414d2eaa8a7f5d68fc4cd63ac50">concurrent_bounded_queue</a>(const concurrent_bounded_queue &src, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00242.html#a5e04dcd7db9fd9b583b4e7df832246a">concurrent_bounded_queue</a>(InputIterator begin, InputIterator end, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00242.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="a00242.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00242.html#796713d0b9ba93a4721cbe13e4474068">const_reference</a> typedef</td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00242.html#4b45c91297e69515d83d5eef85ae1f49">difference_type</a> typedef</td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00242.html#f64924f2ee9225c368a270fc3c394db9">empty</a>() const </td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00242.html#415eb87e53b1c6a266de06ecbc490d16">get_allocator</a>() const </td><td><a class="el" href="a00242.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="a00242.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00242.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="a00242.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00242.html#41f4c6bd7a82ab070e840bbf81b0b123">pop</a>(T &destination)</td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00242.html#ceb08c743b11ba88c878e73fff8af20b">push</a>(const T &source)</td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00242.html#dcd44ca6a88c0dc7a847a47a10811f0c">reference</a> typedef</td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00242.html#f3c6c934f85fd02aedbc83a16943193b">set_capacity</a>(size_type new_capacity)</td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00242.html#7dc14d1a579a4cccda9f857585e1768d">size</a>() const </td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00242.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> typedef</td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00242.html#0ca487019bbb00a196442aff78a1e4f7">try_pop</a>(T &destination)</td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00242.html#2bd6232531279fb3ccbd296bea23066b">try_push</a>(const T &source)</td><td><a class="el" href="a00242.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="a00242.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00242.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="a00242.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00242.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="a00242.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00242.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="a00242.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00242.html#98245517a931e5893f6601e66c51fc75">value_type</a> typedef</td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00242.html#acaf5b510dc0dfc7780b8c956cf773cf">~concurrent_bounded_queue</a>()</td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00025.html b/doc/html/a00025.html
index 9af2e9f..bec592c 100644
--- a/doc/html/a00025.html
+++ b/doc/html/a00025.html
@@ -20,34 +20,43 @@
<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="a00230.html">tbb::concurrent_bounded_queue< T, A ></a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00230.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a> typedef</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00230.html#b2888b3e4e837d7e03f2c731963a402b">capacity</a>() const </td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00230.html#90b31e2954c6e4596c7900435a5f4bc1">clear</a>()</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00230.html#e3525226732963ff0f13e89d8e6dab5b">concurrent_bounded_queue</a>(const allocator_type &a=allocator_type())</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline, explicit]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00230.html#7b7fb414d2eaa8a7f5d68fc4cd63ac50">concurrent_bounded_queue</a>(const concurrent_bounded_queue &src, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00230.html#a5e04dcd7db9fd9b583b4e7df832246a">concurrent_bounded_queue</a>(InputIterator begin, InputIterator end, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00230.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="a00230.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00230.html#796713d0b9ba93a4721cbe13e4474068">const_reference</a> typedef</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00230.html#4b45c91297e69515d83d5eef85ae1f49">difference_type</a> typedef</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00230.html#f64924f2ee9225c368a270fc3c394db9">empty</a>() const </td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00230.html#415eb87e53b1c6a266de06ecbc490d16">get_allocator</a>() const </td><td><a class="el" href="a00230.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="a00230.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00230.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="a00230.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00230.html#41f4c6bd7a82ab070e840bbf81b0b123">pop</a>(T &destination)</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00230.html#ceb08c743b11ba88c878e73fff8af20b">push</a>(const T &source)</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00230.html#dcd44ca6a88c0dc7a847a47a10811f0c">reference</a> typedef</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00230.html#f3c6c934f85fd02aedbc83a16943193b">set_capacity</a>(size_type new_capacity)</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00230.html#7dc14d1a579a4cccda9f857585e1768d">size</a>() const </td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00230.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> typedef</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00230.html#0ca487019bbb00a196442aff78a1e4f7">try_pop</a>(T &destination)</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00230.html#2bd6232531279fb3ccbd296bea23066b">try_push</a>(const T &source)</td><td><a class="el" href="a00230.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="a00230.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00230.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="a00230.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00230.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="a00230.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00230.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="a00230.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00230.html#98245517a931e5893f6601e66c51fc75">value_type</a> typedef</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00230.html#acaf5b510dc0dfc7780b8c956cf773cf">~concurrent_bounded_queue</a>()</td><td><a class="el" href="a00230.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="a00249.html">tbb::deprecated::concurrent_queue< T, A ></a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00242.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a> typedef</td><td><a class="el" href="a00242.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="a00249.html">tbb::deprecated::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00249.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="a00249.html">tbb::deprecated::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00249.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00242.html#b2888b3e4e837d7e03f2c731963a402b">capacity</a>() const </td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00242.html#90b31e2954c6e4596c7900435a5f4bc1">clear</a>()</td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00242.html#e3525226732963ff0f13e89d8e6dab5b">concurrent_bounded_queue</a>(const allocator_type &a=allocator_type())</td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline, explicit]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00242.html#7b7fb414d2eaa8a7f5d68fc4cd63ac50">concurrent_bounded_queue</a>(const concurrent_bounded_queue &src, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00242.html#a5e04dcd7db9fd9b583b4e7df832246a">concurrent_bounded_queue</a>(InputIterator begin, InputIterator end, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00249.html#aaf19bd7337b72f3131ece60f7315ef7">concurrent_queue</a>(const A &a=A())</td><td><a class="el" href="a00249.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [inline, explicit]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00249.html#fc092b9082f233482f3513fc3bb670f7">concurrent_queue</a>(const concurrent_queue &src, const A &a=A())</td><td><a class="el" href="a00249.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00249.html#9102b897776bd2d9e908e6604ff16b5f">concurrent_queue</a>(InputIterator b, InputIterator e, const A &a=A())</td><td><a class="el" href="a00249.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="a00249.html">tbb::deprecated::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00249.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00242.html#796713d0b9ba93a4721cbe13e4474068">const_reference</a> typedef</td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00242.html#4b45c91297e69515d83d5eef85ae1f49">difference_type</a> typedef</td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00242.html#f64924f2ee9225c368a270fc3c394db9">empty</a>() const </td><td><a class="el" href="a00242.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="a00249.html">tbb::deprecated::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00249.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="a00249.html">tbb::deprecated::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00249.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00242.html#415eb87e53b1c6a266de06ecbc490d16">get_allocator</a>() const </td><td><a class="el" href="a00242.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="a00249.html">tbb::deprecated::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00249.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="a00249.html">tbb::deprecated::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00249.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00242.html#41f4c6bd7a82ab070e840bbf81b0b123">pop</a>(T &destination)</td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00249.html#48da3536245318af6cb5fd58bac78039">pop_if_present</a>(T &destination)</td><td><a class="el" href="a00249.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00242.html#ceb08c743b11ba88c878e73fff8af20b">push</a>(const T &source)</td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00249.html#7c45561bafe71107d09b2bc1b8f4e681">push_if_not_full</a>(const T &source)</td><td><a class="el" href="a00249.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00242.html#dcd44ca6a88c0dc7a847a47a10811f0c">reference</a> typedef</td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00242.html#f3c6c934f85fd02aedbc83a16943193b">set_capacity</a>(size_type new_capacity)</td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00242.html#7dc14d1a579a4cccda9f857585e1768d">size</a>() const </td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00242.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> typedef</td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00242.html#0ca487019bbb00a196442aff78a1e4f7">try_pop</a>(T &destination)</td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00242.html#2bd6232531279fb3ccbd296bea23066b">try_push</a>(const T &source)</td><td><a class="el" href="a00242.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="a00242.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00242.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="a00242.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00242.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="a00242.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00242.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="a00242.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00242.html#98245517a931e5893f6601e66c51fc75">value_type</a> typedef</td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00242.html#acaf5b510dc0dfc7780b8c956cf773cf">~concurrent_bounded_queue</a>()</td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00027.html b/doc/html/a00027.html
deleted file mode 100644
index 73846d5..0000000
--- a/doc/html/a00027.html
+++ /dev/null
@@ -1,68 +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::deprecated::concurrent_queue< T, A > Member List</h1>This is the complete list of members for <a class="el" href="a00237.html">tbb::deprecated::concurrent_queue< T, A ></a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00230.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a> typedef</td><td><a class="el" href="a00230.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="a00237.html">tbb::deprecated::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00237.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="a00237.html">tbb::deprecated::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00230.html#b2888b3e4e837d7e03f2c731963a402b">capacity</a>() const </td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00230.html#90b31e2954c6e4596c7900435a5f4bc1">clear</a>()</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00230.html#e3525226732963ff0f13e89d8e6dab5b">concurrent_bounded_queue</a>(const allocator_type &a=allocator_type())</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline, explicit]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00230.html#7b7fb414d2eaa8a7f5d68fc4cd63ac50">concurrent_bounded_queue</a>(const concurrent_bounded_queue &src, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00230.html#a5e04dcd7db9fd9b583b4e7df832246a">concurrent_bounded_queue</a>(InputIterator begin, InputIterator end, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00237.html#aaf19bd7337b72f3131ece60f7315ef7">concurrent_queue</a>(const A &a=A())</td><td><a class="el" href="a00237.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [inline, explicit]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00237.html#fc092b9082f233482f3513fc3bb670f7">concurrent_queue</a>(const concurrent_queue &src, const A &a=A())</td><td><a class="el" href="a00237.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00237.html#9102b897776bd2d9e908e6604ff16b5f">concurrent_queue</a>(InputIterator b, InputIterator e, const A &a=A())</td><td><a class="el" href="a00237.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="a00237.html">tbb::deprecated::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00230.html#796713d0b9ba93a4721cbe13e4474068">const_reference</a> typedef</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00230.html#4b45c91297e69515d83d5eef85ae1f49">difference_type</a> typedef</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00230.html#f64924f2ee9225c368a270fc3c394db9">empty</a>() const </td><td><a class="el" href="a00230.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="a00237.html">tbb::deprecated::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00237.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="a00237.html">tbb::deprecated::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00230.html#415eb87e53b1c6a266de06ecbc490d16">get_allocator</a>() const </td><td><a class="el" href="a00230.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="a00237.html">tbb::deprecated::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00237.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="a00237.html">tbb::deprecated::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00230.html#41f4c6bd7a82ab070e840bbf81b0b123">pop</a>(T &destination)</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00237.html#48da3536245318af6cb5fd58bac78039">pop_if_present</a>(T &destination)</td><td><a class="el" href="a00237.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00230.html#ceb08c743b11ba88c878e73fff8af20b">push</a>(const T &source)</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00237.html#7c45561bafe71107d09b2bc1b8f4e681">push_if_not_full</a>(const T &source)</td><td><a class="el" href="a00237.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00230.html#dcd44ca6a88c0dc7a847a47a10811f0c">reference</a> typedef</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00230.html#f3c6c934f85fd02aedbc83a16943193b">set_capacity</a>(size_type new_capacity)</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00230.html#7dc14d1a579a4cccda9f857585e1768d">size</a>() const </td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00230.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> typedef</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00230.html#0ca487019bbb00a196442aff78a1e4f7">try_pop</a>(T &destination)</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00230.html#2bd6232531279fb3ccbd296bea23066b">try_push</a>(const T &source)</td><td><a class="el" href="a00230.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="a00230.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00230.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="a00230.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00230.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="a00230.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00230.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="a00230.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00230.html#98245517a931e5893f6601e66c51fc75">value_type</a> typedef</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00230.html#acaf5b510dc0dfc7780b8c956cf773cf">~concurrent_bounded_queue</a>()</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
-</table><hr>
-<p></p>
-Copyright © 2005-2011 Intel Corporation. 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/a00032.html b/doc/html/a00031.html
similarity index 52%
rename from doc/html/a00032.html
rename to doc/html/a00031.html
index ff359bb..accfa82 100644
--- a/doc/html/a00032.html
+++ b/doc/html/a00031.html
@@ -20,77 +20,77 @@
<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="a00238.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="a00238.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00238.html#423e5aa15e0e3309ad86d026fd85f6f6">assign</a>(size_type n, const_reference t)</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00238.html#93a06b3112cb804f42f40efb5e7387b4">assign</a>(I first, I last)</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00238.html#0c073ca43e787c7cbf7b0e26d2221748">at</a>(size_type index)</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00238.html#23e14a38af748edff96a7adc3a0f1c58">at</a>(size_type index) const </td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00238.html#41ce48d6015a1a2812d41cf620ec3476">back</a>()</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00238.html#bd518e204107d07fd08d0ec5bdfd383d">back</a>() const </td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00238.html#730b23a251ecb6d37f692fb22f38e029">begin</a>()</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00238.html#78a06182276ff758788d4c0623ae0d71">begin</a>() const </td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00238.html#3ed6b9ae7217af5103d974045b6f5cd5">capacity</a>() const </td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00238.html#f88fcf1c920693c39bd9709db33c199f">cbegin</a>() const </td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00238.html#0c15a5d0f1cf75d687dabba07da1d46b">cend</a>() const </td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00238.html#26f937a359a66b6aae904c3cd9a3c444">clear</a>()</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00238.html#1693d1da41b1a8235871be9c6633be35">compact</a>()</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00238.html#2c8ca9cabfcd30ad5943324c853664b5">concurrent_vector</a>(const allocator_type &a=allocator_type())</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline, explicit]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00238.html#dd8a200b99a8088435a37934b58fe335">concurrent_vector</a>(const concurrent_vector &vector, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00238.html#64432f13f7b29bfe4acfb5568f34f3a8">concurrent_vector</a>(const concurrent_vector< T, M > &vector, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00238.html#2a2e261dfe1cab3f73f7b1a94137cfca">concurrent_vector</a>(size_type n)</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline, explicit]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00238.html#3883a8a908b44e249a57f454de3f55d8">concurrent_vector</a>(size_type n, const_reference t, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00238.html#4450de83c5862ea4bcd9443fd7e67419">concurrent_vector</a>(I first, I last, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00238.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="a00238.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00238.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="a00238.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00238.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="a00238.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00238.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="a00238.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00238.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="a00238.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00238.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="a00238.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00238.html#db78a1d28c9c966050e8a2926d834a33">crbegin</a>() const </td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00238.html#fff9cece89438587997ebedf93c5e962">crend</a>() const </td><td><a class="el" href="a00238.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="a00238.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00238.html#c6426cb93cf20d3af40f3c90f1f0481a">empty</a>() const </td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00238.html#c0b51160e5a764982ec97a455f94f2c6">end</a>()</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00238.html#1e6aa764ce5a1cbd24526f68bc0a2f6b">end</a>() const </td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00238.html#15181759c0bfa2ddce5d10c7550e0002">front</a>()</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00238.html#502615a858eb9fa0390ee59169065e90">front</a>() const </td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00238.html#2fdba8e90de6a4d2300222236d46758e">get_allocator</a>() const </td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00238.html#30484e3959892fd5392fa93c873c31f0">grow_by</a>(size_type delta)</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00238.html#c8177b1865270ea68aa1ab9148e5e35e">grow_by</a>(size_type delta)</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00238.html#38274ab3f772ecba600c7daca7690102">grow_by</a>(size_type delta, const_reference t)</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00238.html#473a59a4c9308b93411b898b3110d26c">grow_by</a>(size_type delta, const_reference t)</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00238.html#47fe588214dd5fa06ab6e8ab78d83874">grow_to_at_least</a>(size_type n)</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00238.html#a7e3b67c8ccab16d0aecc80899ae799d">grow_to_at_least</a>(size_type n)</td><td><a class="el" href="a00238.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="a00238.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00238.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="a00238.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00238.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="a00238.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00238.html#2c248a017f0576df3e7cd99627836fd6">max_size</a>() const </td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00238.html#691f0f3cda3e489c37a657016e375eaf">operator=</a>(const concurrent_vector &vector)</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00238.html#19f4ab88a01b0fd056af3bba463e7bd6">operator=</a>(const concurrent_vector< T, M > &vector)</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00238.html#4c52f2950bb1832886bd4458eb09d7eb">operator[]</a>(size_type index)</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00238.html#c6fade5c732cc95274d1d8277ea619d1">operator[]</a>(size_type index) const </td><td><a class="el" href="a00238.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="a00238.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00238.html#e94e038f915c0268fdf2d3d7f87d81b8">push_back</a>(const_reference item) iterator push_back(const _reference item)</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00238.html#a4c6ffff3bf08b92939aa2fc516edfba">range</a>(size_t grainsize=1)</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00238.html#3d09ccfb581b879ae64203741035e193">range</a>(size_t grainsize=1) const </td><td><a class="el" href="a00238.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="a00238.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00238.html#5e220926d09236d98f04fe0721e5f9a1">rbegin</a>()</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00238.html#9f9c103e18d5f212703805354074ad44">rbegin</a>() const </td><td><a class="el" href="a00238.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="a00238.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00238.html#290119a4eb43cd6a9e98fa17016ba3c2">rend</a>()</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00238.html#d438b9b32ea3a8ffb703015b6dce055b">rend</a>() const </td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00238.html#5a0ce05026994b010018f72cfdeb72c1">reserve</a>(size_type n)</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00238.html#8dfb0cb0eef96d440b4dcf801807a718">resize</a>(size_type n)</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00238.html#98ce6b2c6d2622f0c030b46dfac3880c">resize</a>(size_type n, const_reference t)</td><td><a class="el" href="a00238.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="a00238.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00238.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="a00238.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00238.html#03c6f4cf66532bf4cc907ee738a9a186">shrink_to_fit</a>()</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00238.html#715fe313c4a9c22731cc404dd80c9ec9">size</a>() const </td><td><a class="el" href="a00238.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="a00238.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00238.html#96c9c4bd968ed3edb8dd276854d2dae0">swap</a>(concurrent_vector &vector)</td><td><a class="el" href="a00238.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="a00238.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00238.html#da2444b28bb840d38f60d0030333a5fc">~concurrent_vector</a>()</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::concurrent_vector< T, A > Member List</h1>This is the complete list of members for <a class="el" href="a00250.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="a00250.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00250.html#423e5aa15e0e3309ad86d026fd85f6f6">assign</a>(size_type n, const_reference t)</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00250.html#93a06b3112cb804f42f40efb5e7387b4">assign</a>(I first, I last)</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00250.html#0c073ca43e787c7cbf7b0e26d2221748">at</a>(size_type index)</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00250.html#23e14a38af748edff96a7adc3a0f1c58">at</a>(size_type index) const </td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00250.html#41ce48d6015a1a2812d41cf620ec3476">back</a>()</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00250.html#bd518e204107d07fd08d0ec5bdfd383d">back</a>() const </td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00250.html#730b23a251ecb6d37f692fb22f38e029">begin</a>()</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00250.html#78a06182276ff758788d4c0623ae0d71">begin</a>() const </td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00250.html#3ed6b9ae7217af5103d974045b6f5cd5">capacity</a>() const </td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00250.html#f88fcf1c920693c39bd9709db33c199f">cbegin</a>() const </td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00250.html#0c15a5d0f1cf75d687dabba07da1d46b">cend</a>() const </td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00250.html#26f937a359a66b6aae904c3cd9a3c444">clear</a>()</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00250.html#1693d1da41b1a8235871be9c6633be35">compact</a>()</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00250.html#2c8ca9cabfcd30ad5943324c853664b5">concurrent_vector</a>(const allocator_type &a=allocator_type())</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline, explicit]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00250.html#dd8a200b99a8088435a37934b58fe335">concurrent_vector</a>(const concurrent_vector &vector, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00250.html#64432f13f7b29bfe4acfb5568f34f3a8">concurrent_vector</a>(const concurrent_vector< T, M > &vector, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00250.html#2a2e261dfe1cab3f73f7b1a94137cfca">concurrent_vector</a>(size_type n)</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline, explicit]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00250.html#3883a8a908b44e249a57f454de3f55d8">concurrent_vector</a>(size_type n, const_reference t, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00250.html#4450de83c5862ea4bcd9443fd7e67419">concurrent_vector</a>(I first, I last, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00250.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="a00250.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00250.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="a00250.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00250.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="a00250.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00250.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="a00250.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00250.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="a00250.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00250.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="a00250.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00250.html#db78a1d28c9c966050e8a2926d834a33">crbegin</a>() const </td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00250.html#fff9cece89438587997ebedf93c5e962">crend</a>() const </td><td><a class="el" href="a00250.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="a00250.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00250.html#c6426cb93cf20d3af40f3c90f1f0481a">empty</a>() const </td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00250.html#c0b51160e5a764982ec97a455f94f2c6">end</a>()</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00250.html#1e6aa764ce5a1cbd24526f68bc0a2f6b">end</a>() const </td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00250.html#15181759c0bfa2ddce5d10c7550e0002">front</a>()</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00250.html#502615a858eb9fa0390ee59169065e90">front</a>() const </td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00250.html#2fdba8e90de6a4d2300222236d46758e">get_allocator</a>() const </td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00250.html#30484e3959892fd5392fa93c873c31f0">grow_by</a>(size_type delta)</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00250.html#c8177b1865270ea68aa1ab9148e5e35e">grow_by</a>(size_type delta)</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00250.html#38274ab3f772ecba600c7daca7690102">grow_by</a>(size_type delta, const_reference t)</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00250.html#473a59a4c9308b93411b898b3110d26c">grow_by</a>(size_type delta, const_reference t)</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00250.html#47fe588214dd5fa06ab6e8ab78d83874">grow_to_at_least</a>(size_type n)</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00250.html#a7e3b67c8ccab16d0aecc80899ae799d">grow_to_at_least</a>(size_type n)</td><td><a class="el" href="a00250.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="a00250.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00250.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="a00250.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00250.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="a00250.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00250.html#2c248a017f0576df3e7cd99627836fd6">max_size</a>() const </td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00250.html#691f0f3cda3e489c37a657016e375eaf">operator=</a>(const concurrent_vector &vector)</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00250.html#19f4ab88a01b0fd056af3bba463e7bd6">operator=</a>(const concurrent_vector< T, M > &vector)</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00250.html#4c52f2950bb1832886bd4458eb09d7eb">operator[]</a>(size_type index)</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00250.html#c6fade5c732cc95274d1d8277ea619d1">operator[]</a>(size_type index) const </td><td><a class="el" href="a00250.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="a00250.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00250.html#e94e038f915c0268fdf2d3d7f87d81b8">push_back</a>(const_reference item) iterator push_back(const _reference item)</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00250.html#a4c6ffff3bf08b92939aa2fc516edfba">range</a>(size_t grainsize=1)</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00250.html#3d09ccfb581b879ae64203741035e193">range</a>(size_t grainsize=1) const </td><td><a class="el" href="a00250.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="a00250.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00250.html#5e220926d09236d98f04fe0721e5f9a1">rbegin</a>()</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00250.html#9f9c103e18d5f212703805354074ad44">rbegin</a>() const </td><td><a class="el" href="a00250.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="a00250.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00250.html#290119a4eb43cd6a9e98fa17016ba3c2">rend</a>()</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00250.html#d438b9b32ea3a8ffb703015b6dce055b">rend</a>() const </td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00250.html#5a0ce05026994b010018f72cfdeb72c1">reserve</a>(size_type n)</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00250.html#8dfb0cb0eef96d440b4dcf801807a718">resize</a>(size_type n)</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00250.html#98ce6b2c6d2622f0c030b46dfac3880c">resize</a>(size_type n, const_reference t)</td><td><a class="el" href="a00250.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="a00250.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00250.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="a00250.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00250.html#03c6f4cf66532bf4cc907ee738a9a186">shrink_to_fit</a>()</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00250.html#715fe313c4a9c22731cc404dd80c9ec9">size</a>() const </td><td><a class="el" href="a00250.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="a00250.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00250.html#96c9c4bd968ed3edb8dd276854d2dae0">swap</a>(concurrent_vector &vector)</td><td><a class="el" href="a00250.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="a00250.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00250.html#da2444b28bb840d38f60d0030333a5fc">~concurrent_vector</a>()</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00037.html b/doc/html/a00036.html
similarity index 64%
rename from doc/html/a00037.html
rename to doc/html/a00036.html
index b44d73e..1fe608e 100644
--- a/doc/html/a00037.html
+++ b/doc/html/a00036.html
@@ -20,41 +20,41 @@
<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="a00243.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="a00243.html#3c03eb40955b933b01987222722ac4bd">allocator_type</a> typedef</td><td><a class="el" href="a00243.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00243.html#01d7baf8e913ab2819e97917a2ac795f">begin</a>()</td><td><a class="el" href="a00243.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="a00243.html#84afb3906a39e399cde1c950d6351300">begin</a>() const </td><td><a class="el" href="a00243.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="a00243.html#a8764176d4b6014c5d65f1051851abc8">clear</a>()</td><td><a class="el" href="a00243.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="a00243.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00243.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="a00243.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00243.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="a00243.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00243.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="a00243.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00243.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="a00243.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00243.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="a00243.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00243.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="a00243.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00243.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00243.html#72595886d0ac8fd0543f90038570510d">empty</a>() const </td><td><a class="el" href="a00243.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="a00243.html#2456ff88252fc921b01cd8907628a4ee">end</a>()</td><td><a class="el" href="a00243.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="a00243.html#cb448bb4977ce366ceb7344085cc7050">end</a>() const </td><td><a class="el" href="a00243.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="a00243.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00243.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="a00243.html#0cfa3a5c8f2be3bbf313d93b1fa8cdb3">enumerable_thread_specific</a>()</td><td><a class="el" href="a00243.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="a00243.html#8d4b456ff9d7b289c73254eccc11db45">enumerable_thread_specific</a>(Finit finit)</td><td><a class="el" href="a00243.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="a00243.html#7bce6829981c9efe3f59cae2355e383e">enumerable_thread_specific</a>(const T &exemplar)</td><td><a class="el" href="a00243.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="a00243.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00243.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="a00243.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00243.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="a00243.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00243.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00243.html#c8d5265ccbd5e4485996b3f3baaa5ba1">local</a>()</td><td><a class="el" href="a00243.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="a00243.html#7dc79058d2832f7447de8e691c3455ea">local</a>(bool &exists)</td><td><a class="el" href="a00243.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="a00243.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00243.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="a00243.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00243.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="a00243.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00243.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00243.html#b22c54990b2362cd93c1a8f73de140bc">range</a>(size_t grainsize=1)</td><td><a class="el" href="a00243.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="a00243.html#3b068000cf4dbf9b40f8bb7e3fc53e0b">range</a>(size_t grainsize=1) const </td><td><a class="el" href="a00243.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="a00243.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00243.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="a00243.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00243.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00243.html#33fd6593da1ed14340f10f67d5a69130">size</a>() const </td><td><a class="el" href="a00243.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="a00243.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00243.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="a00243.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00243.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00243.html#5a7907d9e3e5b18e7a7b55211ef3213f">~enumerable_thread_specific</a>()</td><td><a class="el" href="a00243.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="a00255.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="a00255.html#3c03eb40955b933b01987222722ac4bd">allocator_type</a> typedef</td><td><a class="el" href="a00255.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00255.html#01d7baf8e913ab2819e97917a2ac795f">begin</a>()</td><td><a class="el" href="a00255.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="a00255.html#84afb3906a39e399cde1c950d6351300">begin</a>() const </td><td><a class="el" href="a00255.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="a00255.html#a8764176d4b6014c5d65f1051851abc8">clear</a>()</td><td><a class="el" href="a00255.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="a00255.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00255.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="a00255.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00255.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="a00255.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00255.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="a00255.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00255.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="a00255.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00255.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="a00255.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00255.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="a00255.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00255.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00255.html#72595886d0ac8fd0543f90038570510d">empty</a>() const </td><td><a class="el" href="a00255.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="a00255.html#2456ff88252fc921b01cd8907628a4ee">end</a>()</td><td><a class="el" href="a00255.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="a00255.html#cb448bb4977ce366ceb7344085cc7050">end</a>() const </td><td><a class="el" href="a00255.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="a00255.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00255.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="a00255.html#0cfa3a5c8f2be3bbf313d93b1fa8cdb3">enumerable_thread_specific</a>()</td><td><a class="el" href="a00255.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="a00255.html#8d4b456ff9d7b289c73254eccc11db45">enumerable_thread_specific</a>(Finit finit)</td><td><a class="el" href="a00255.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="a00255.html#7bce6829981c9efe3f59cae2355e383e">enumerable_thread_specific</a>(const T &exemplar)</td><td><a class="el" href="a00255.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="a00255.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00255.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="a00255.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00255.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="a00255.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00255.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00255.html#c8d5265ccbd5e4485996b3f3baaa5ba1">local</a>()</td><td><a class="el" href="a00255.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="a00255.html#7dc79058d2832f7447de8e691c3455ea">local</a>(bool &exists)</td><td><a class="el" href="a00255.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="a00255.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00255.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="a00255.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00255.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="a00255.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00255.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00255.html#b22c54990b2362cd93c1a8f73de140bc">range</a>(size_t grainsize=1)</td><td><a class="el" href="a00255.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="a00255.html#3b068000cf4dbf9b40f8bb7e3fc53e0b">range</a>(size_t grainsize=1) const </td><td><a class="el" href="a00255.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="a00255.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00255.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="a00255.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00255.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00255.html#33fd6593da1ed14340f10f67d5a69130">size</a>() const </td><td><a class="el" href="a00255.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="a00255.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00255.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="a00255.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00255.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00255.html#5a7907d9e3e5b18e7a7b55211ef3213f">~enumerable_thread_specific</a>()</td><td><a class="el" href="a00255.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-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00040.html b/doc/html/a00039.html
similarity index 78%
copy from doc/html/a00040.html
copy to doc/html/a00039.html
index 603513a..70ff349 100644
--- a/doc/html/a00040.html
+++ b/doc/html/a00039.html
@@ -20,8 +20,8 @@
<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::graph_node Member List</h1>This is the complete list of members for <a class="el" href="a00251.html">tbb::graph_node</a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>~graph_node</b>() (defined in <a class="el" href="a00251.html">tbb::graph_node</a>)</td><td><a class="el" href="a00251.html">tbb::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="a00263.html">tbb::flow::interface6::graph_node</a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>~graph_node</b>() (defined in <a class="el" href="a00263.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::graph_node</a></td><td><code> [inline, virtual]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00041.html b/doc/html/a00041.html
new file mode 100644
index 0000000..ec500e6
--- /dev/null
+++ b/doc/html/a00041.html
@@ -0,0 +1,41 @@
+<!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="a00301.html">tbb::flow::interface6::sender< T ></a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00301.html#127af99916cc085cd9dbc09c53299928">output_type</a> typedef</td><td><a class="el" href="a00301.html">tbb::flow::interface6::sender< T ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00301.html#68b8941ad77b9303cf3bcb8cf1f2d28a">register_successor</a>(successor_type &r)=0</td><td><a class="el" href="a00301.html">tbb::flow::interface6::sender< T ></a></td><td><code> [pure virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00301.html#82f363bfb1738bb8789e167590b10ef9">remove_successor</a>(successor_type &r)=0</td><td><a class="el" href="a00301.html">tbb::flow::interface6::sender< T ></a></td><td><code> [pure virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00301.html#d690e8a54e358968f0ee4fdf9ee73068">successor_type</a> typedef</td><td><a class="el" href="a00301.html">tbb::flow::interface6::sender< T ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00301.html#7b840f50da117a0d6848707c1857ea2e">try_consume</a>()</td><td><a class="el" href="a00301.html">tbb::flow::interface6::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00301.html#922fb56b0aad090b90a98b7d56b76a59">try_get</a>(T &)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00301.html#27036b06d6a91e97007e14f400529199">try_release</a>()</td><td><a class="el" href="a00301.html">tbb::flow::interface6::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00301.html#02c05b472271db1b68a48ea2618fa72f">try_reserve</a>(T &)</td><td><a class="el" href="a00301.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="a00301.html">tbb::flow::interface6::sender< T ></a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+</table><hr>
+<p></p>
+Copyright © 2005-2011 Intel Corporation. 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/a00042.html b/doc/html/a00042.html
index bf3347d..70a703c 100644
--- a/doc/html/a00042.html
+++ b/doc/html/a00042.html
@@ -20,16 +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::sender< T > Member List</h1>This is the complete list of members for <a class="el" href="a00282.html">tbb::sender< T ></a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00282.html#d3aa21714dfc464e65a471816e38ea89">output_type</a> typedef</td><td><a class="el" href="a00282.html">tbb::sender< T ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00282.html#be48ac70174cf8e08e2b0279cd6343d3">register_successor</a>(successor_type &r)=0</td><td><a class="el" href="a00282.html">tbb::sender< T ></a></td><td><code> [pure virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00282.html#3f345427e812e8741370308ff88f30bf">remove_successor</a>(successor_type &r)=0</td><td><a class="el" href="a00282.html">tbb::sender< T ></a></td><td><code> [pure virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00282.html#c0746cda7dfd266f01acaf6cd5d4b77d">successor_type</a> typedef</td><td><a class="el" href="a00282.html">tbb::sender< T ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00282.html#add46946c4c7330422733432e4032fac">try_consume</a>()</td><td><a class="el" href="a00282.html">tbb::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00282.html#bf8c9235810354f3353a899c982645de">try_get</a>(T &)</td><td><a class="el" href="a00282.html">tbb::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00282.html#28c41df1c0c7ed485b4a691ec8f30098">try_release</a>()</td><td><a class="el" href="a00282.html">tbb::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00282.html#3506c7275aeeb2fc3ba5d5f10ee0adac">try_reserve</a>(T &)</td><td><a class="el" href="a00282.html">tbb::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>~sender</b>() (defined in <a class="el" href="a00282.html">tbb::sender< T ></a>)</td><td><a class="el" href="a00282.html">tbb::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+<h1>tbb::flow::interface6::receiver< T > Member List</h1>This is the complete list of members for <a class="el" href="a00295.html">tbb::flow::interface6::receiver< T ></a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00295.html#0d0524c99313dedea1e04464bbf2f7ef">input_type</a> typedef</td><td><a class="el" href="a00295.html">tbb::flow::interface6::receiver< T ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00295.html#7fa8cff811e7c1589b805a4bb4c7a74f">predecessor_type</a> typedef</td><td><a class="el" href="a00295.html">tbb::flow::interface6::receiver< T ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00295.html#30e3316466efe3a713c23062b6e806f3">register_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00295.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00295.html#3bc76547b51d3c9b633e3987d22dce95">remove_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00295.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00295.html#c6d5d0cb8ebe5771be91933609fe31b8">try_put</a>(const T &t)=0</td><td><a class="el" href="a00295.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [pure virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00295.html#b00699b235435f7b65b663d5063624a1">~receiver</a>()</td><td><a class="el" href="a00295.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00043.html b/doc/html/a00043.html
index d0426dc..913e4fa 100644
--- a/doc/html/a00043.html
+++ b/doc/html/a00043.html
@@ -20,13 +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::receiver< T > Member List</h1>This is the complete list of members for <a class="el" href="a00277.html">tbb::receiver< T ></a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00277.html#9cfd5ef0d67d5bbfb5f9a76d75e62765">input_type</a> typedef</td><td><a class="el" href="a00277.html">tbb::receiver< T ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00277.html#c802c845b51c6d129153b684d33f7310">predecessor_type</a> typedef</td><td><a class="el" href="a00277.html">tbb::receiver< T ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00277.html#14ae737c8fca4c8bf8e1a736dfbac444">register_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00277.html">tbb::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00277.html#d2f23b40b328dc254a7c2a0a30f408e4">remove_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00277.html">tbb::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00277.html#6e5422b03b4570138f227b3d5d0073b8">try_put</a>(T t)=0</td><td><a class="el" href="a00277.html">tbb::receiver< T ></a></td><td><code> [pure virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00277.html#18f74b83abae0ee1e4ce07942797ef27">~receiver</a>()</td><td><a class="el" href="a00277.html">tbb::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+<h1>tbb::flow::interface6::continue_receiver Member List</h1>This is the complete list of members for <a class="el" href="a00253.html">tbb::flow::interface6::continue_receiver</a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00253.html#177db82d548a1f8471371331890b91a8">continue_receiver</a>(int number_of_predecessors=0)</td><td><a class="el" href="a00253.html">tbb::flow::interface6::continue_receiver</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00253.html#a0b292ed7fa6556b2a735f6d1e82dc74">continue_receiver</a>(const continue_receiver &src)</td><td><a class="el" href="a00253.html">tbb::flow::interface6::continue_receiver</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00253.html#40ca8b7e96c5bc3428b4d1e409725ee5">execute</a>()=0</td><td><a class="el" href="a00253.html">tbb::flow::interface6::continue_receiver</a></td><td><code> [protected, pure virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00253.html#3c43c166af832d9187035985841e0a7f">input_type</a> typedef</td><td><a class="el" href="a00253.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="a00253.html">tbb::flow::interface6::continue_receiver</a>)</td><td><a class="el" href="a00253.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="a00253.html">tbb::flow::interface6::continue_receiver</a>)</td><td><a class="el" href="a00253.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="a00253.html">tbb::flow::interface6::continue_receiver</a>)</td><td><a class="el" href="a00253.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="a00253.html">tbb::flow::interface6::continue_receiver</a>)</td><td><a class="el" href="a00253.html">tbb::flow::interface6::continue_receiver</a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00253.html#f9c58b3e9c46afd2518d0fd8957a5a2f">predecessor_type</a> typedef</td><td><a class="el" href="a00253.html">tbb::flow::interface6::continue_receiver</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00253.html#2fcfa4990a42417bbeb1f3c8b9ac8a22">register_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00253.html">tbb::flow::interface6::continue_receiver</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00295.html#30e3316466efe3a713c23062b6e806f3">tbb::flow::interface6::receiver::register_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00295.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00253.html#cb691b18416d4742265aed84d496ebbd">remove_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00253.html">tbb::flow::interface6::continue_receiver</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00295.html#3bc76547b51d3c9b633e3987d22dce95">tbb::flow::interface6::receiver::remove_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00295.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00253.html#3969c70fb89c0a982f142ae9eb5facae">try_put</a>(const input_type &)</td><td><a class="el" href="a00253.html">tbb::flow::interface6::continue_receiver</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00295.html#c6d5d0cb8ebe5771be91933609fe31b8">tbb::flow::interface6::receiver::try_put</a>(const T &t)=0</td><td><a class="el" href="a00295.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [pure virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00253.html#1e14828fa079b9835ff7267df5ee45d7">~continue_receiver</a>()</td><td><a class="el" href="a00253.html">tbb::flow::interface6::continue_receiver</a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00295.html#b00699b235435f7b65b663d5063624a1">~receiver</a>()</td><td><a class="el" href="a00295.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00044.html b/doc/html/a00044.html
index f3620d7..2e053fe 100644
--- a/doc/html/a00044.html
+++ b/doc/html/a00044.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::continue_receiver Member List</h1>This is the complete list of members for <a class="el" href="a00241.html">tbb::continue_receiver</a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00241.html#799d383813261426d881b10247caadba">continue_receiver</a>(int number_of_predecessors=0)</td><td><a class="el" href="a00241.html">tbb::continue_receiver</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00241.html#e6bf1d21e670b78ea00c71fccbe17c78">execute</a>()=0</td><td><a class="el" href="a00241.html">tbb::continue_receiver</a></td><td><code> [protected, pure virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00241.html#21acef0b97b53d92f637619012837b30">input_type</a> typedef</td><td><a class="el" href="a00241.html">tbb::continue_receiver</a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_current_count</b> (defined in <a class="el" href="a00241.html">tbb::continue_receiver</a>)</td><td><a class="el" href="a00241.html">tbb::continue_receiver</a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_mutex</b> (defined in <a class="el" href="a00241.html">tbb::continue_receiver</a>)</td><td><a class="el" href="a00241.html">tbb::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="a00241.html">tbb::continue_receiver</a>)</td><td><a class="el" href="a00241.html">tbb::continue_receiver</a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00241.html#52fa92968dd48560d59798ca7ba6a3a2">predecessor_type</a> typedef</td><td><a class="el" href="a00241.html">tbb::continue_receiver</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00241.html#b9fa9290cbb871f8780f9d69e1ec3b4e">register_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00241.html">tbb::continue_receiver</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00277.html#14ae737c8fca4c8bf8e1a736dfbac444">tbb::receiver::register_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00277.html">tbb::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00241.html#02411d8d13b380062548aff133752cc5">remove_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00241.html">tbb::continue_receiver</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00277.html#d2f23b40b328dc254a7c2a0a30f408e4">tbb::receiver::remove_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00277.html">tbb::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00241.html#a7f8b9cc6286eb2cd8d429d6279da64d">try_put</a>(input_type)</td><td><a class="el" href="a00241.html">tbb::continue_receiver</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00277.html#6e5422b03b4570138f227b3d5d0073b8">tbb::receiver::try_put</a>(T t)=0</td><td><a class="el" href="a00277.html">tbb::receiver< T ></a></td><td><code> [pure virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00241.html#9a38edb7e1e3c9be4e3848145c51a617">~continue_receiver</a>()</td><td><a class="el" href="a00241.html">tbb::continue_receiver</a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00277.html#18f74b83abae0ee1e4ce07942797ef27">~receiver</a>()</td><td><a class="el" href="a00277.html">tbb::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+<h1>tbb::flow::interface6::graph Member List</h1>This is the complete list of members for <a class="el" href="a00262.html">tbb::flow::interface6::graph</a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00262.html#29b85506870f13a884a21655aec2a65d">decrement_wait_count</a>()</td><td><a class="el" href="a00262.html">tbb::flow::interface6::graph</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00262.html#4ab3d4b5208ece28c4c3ced647e26e12">graph</a>()</td><td><a class="el" href="a00262.html">tbb::flow::interface6::graph</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00262.html#a993b789d1e488e0c3929135beae560e">increment_wait_count</a>()</td><td><a class="el" href="a00262.html">tbb::flow::interface6::graph</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00262.html#7f4e3ae90811a5d8b597146b5b586d10">root_task</a>()</td><td><a class="el" href="a00262.html">tbb::flow::interface6::graph</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00262.html#50a7938df01b6148ab2c0696835f002e">run</a>(Receiver &r, Body body)</td><td><a class="el" href="a00262.html">tbb::flow::interface6::graph</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00262.html#c1145b00e063793a7e7bf994d202c7a0">run</a>(Body body)</td><td><a class="el" href="a00262.html">tbb::flow::interface6::graph</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00262.html#a66b0020f7514b86d030fa8aea073d37">wait_for_all</a>()</td><td><a class="el" href="a00262.html">tbb::flow::interface6::graph</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00262.html#8a7d424c0616a1c37a908ead182e2fe5">~graph</a>()</td><td><a class="el" href="a00262.html">tbb::flow::interface6::graph</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00045.html b/doc/html/a00045.html
deleted file mode 100644
index 6d946c3..0000000
--- a/doc/html/a00045.html
+++ /dev/null
@@ -1,43 +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::graph Member List</h1>This is the complete list of members for <a class="el" href="a00250.html">tbb::graph</a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00250.html#633b9b55e3248b785efd13264261f0e5">concurrency</a> enum name</td><td><a class="el" href="a00250.html">tbb::graph</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00250.html#ff3b6a3ef2ae1e661dcdb398c227b43c">decrement_wait_count</a>()</td><td><a class="el" href="a00250.html">tbb::graph</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00250.html#1ba8311506558a2419101722f5d49ba9">graph</a>()</td><td><a class="el" href="a00250.html">tbb::graph</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00250.html#1e5c5ae6538ec714cee107d1004705b9">increment_wait_count</a>()</td><td><a class="el" href="a00250.html">tbb::graph</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00250.html#34d61d8b6560e5b2eb42e0112701db0f">root_task</a>()</td><td><a class="el" href="a00250.html">tbb::graph</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00250.html#4c5e8dc5a45e641d534d6206838cfa7f">run</a>(Receiver &r, Body body)</td><td><a class="el" href="a00250.html">tbb::graph</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00250.html#71213dd18099298dc74731e293c8286a">run</a>(Body body)</td><td><a class="el" href="a00250.html">tbb::graph</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>serial</b> enum value (defined in <a class="el" href="a00250.html">tbb::graph</a>)</td><td><a class="el" href="a00250.html">tbb::graph</a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>unlimited</b> enum value (defined in <a class="el" href="a00250.html">tbb::graph</a>)</td><td><a class="el" href="a00250.html">tbb::graph</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00250.html#bafd6349fdc6563ffa02746866e30bec">wait_for_all</a>()</td><td><a class="el" href="a00250.html">tbb::graph</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00250.html#55332084e7884a26ff288b8fe960030d">~graph</a>()</td><td><a class="el" href="a00250.html">tbb::graph</a></td><td><code> [inline]</code></td></tr>
-</table><hr>
-<p></p>
-Copyright © 2005-2011 Intel Corporation. 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/a00047.html b/doc/html/a00047.html
new file mode 100644
index 0000000..e533133
--- /dev/null
+++ b/doc/html/a00047.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::flow::interface6::source_node< Output > Member List</h1>This is the complete list of members for <a class="el" href="a00304.html">tbb::flow::interface6::source_node< Output ></a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00304.html#4b647e4a93d08ccdd8d323279e4eaaa6">activate</a>()</td><td><a class="el" href="a00304.html">tbb::flow::interface6::source_node< Output ></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="a00304.html">tbb::flow::interface6::source_node< Output ></a>)</td><td><a class="el" href="a00304.html">tbb::flow::interface6::source_node< Output ></a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00304.html#407533487cc3f6032c1072cba19c609c">output_type</a> typedef</td><td><a class="el" href="a00304.html">tbb::flow::interface6::source_node< Output ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00304.html#22960d499df9f1569a9d8a544e35afe3">register_successor</a>(receiver< output_type > &r)</td><td><a class="el" href="a00304.html">tbb::flow::interface6::source_node< Output ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00304.html#222484bf295f39df36415a29e508e5c9">remove_successor</a>(receiver< output_type > &r)</td><td><a class="el" href="a00304.html">tbb::flow::interface6::source_node< Output ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00304.html#503c3b395c629296bf5cccd96d6388c1">source_node</a>(graph &g, Body body, bool is_active=true)</td><td><a class="el" href="a00304.html">tbb::flow::interface6::source_node< Output ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00304.html#adaac111fbcace95804219a5f2929304">source_node</a>(const source_node &src)</td><td><a class="el" href="a00304.html">tbb::flow::interface6::source_node< Output ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00304.html#dd7b8fe78f0bec9d6b70cbf1018a69fe">successor_type</a> typedef</td><td><a class="el" href="a00304.html">tbb::flow::interface6::source_node< Output ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00304.html#2c7fcc29e2894b29138be3c1edce9bc9">try_consume</a>()</td><td><a class="el" href="a00304.html">tbb::flow::interface6::source_node< Output ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00304.html#41073ad4d3510ed5a8b6bda9c0f58636">try_get</a>(output_type &v)</td><td><a class="el" href="a00304.html">tbb::flow::interface6::source_node< Output ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00304.html#494678baf9096835268736b800824460">try_release</a>()</td><td><a class="el" href="a00304.html">tbb::flow::interface6::source_node< Output ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00304.html#ad459713ff3c1c9ad0f4826daa141f65">try_reserve</a>(output_type &v)</td><td><a class="el" href="a00304.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="a00263.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00263.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="a00301.html">tbb::flow::interface6::sender< Output ></a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::sender< Output ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00304.html#61700b0865fc17188b0abe26bbde65b6">~source_node</a>()</td><td><a class="el" href="a00304.html">tbb::flow::interface6::source_node< Output ></a></td><td><code> [inline]</code></td></tr>
+</table><hr>
+<p></p>
+Copyright © 2005-2011 Intel Corporation. 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/a00048.html b/doc/html/a00048.html
index 93c65e7..8d9aa4c 100644
--- a/doc/html/a00048.html
+++ b/doc/html/a00048.html
@@ -20,21 +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::source_node< Output > Member List</h1>This is the complete list of members for <a class="el" href="a00285.html">tbb::source_node< Output ></a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00285.html#d71ed386c53032463f3435f79a15b6ff">activate</a>()</td><td><a class="el" href="a00285.html">tbb::source_node< Output ></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="a00285.html">tbb::source_node< Output ></a>)</td><td><a class="el" href="a00285.html">tbb::source_node< Output ></a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00285.html#c5a2c6ab64bcd798724976d7d75ba92f">output_type</a> typedef</td><td><a class="el" href="a00285.html">tbb::source_node< Output ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00285.html#ce601874ec5cbb0996f6dcb8e43badb8">register_successor</a>(receiver< output_type > &r)</td><td><a class="el" href="a00285.html">tbb::source_node< Output ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00285.html#de069bfc6fae7ed4e82b2a1fbb58b721">remove_successor</a>(receiver< output_type > &r)</td><td><a class="el" href="a00285.html">tbb::source_node< Output ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00285.html#0513272133a06db6742873671af98f21">source_node</a>(graph &g, Body body, bool is_active=true)</td><td><a class="el" href="a00285.html">tbb::source_node< Output ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00285.html#217d72bbc6e7a4b35ef014dd9a15efca">successor_type</a> typedef</td><td><a class="el" href="a00285.html">tbb::source_node< Output ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00285.html#809f51859ca4dd04204591d76c8572eb">try_consume</a>()</td><td><a class="el" href="a00285.html">tbb::source_node< Output ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00285.html#0434d2933ad082d3c43a4ec774150511">try_get</a>(output_type &v)</td><td><a class="el" href="a00285.html">tbb::source_node< Output ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00285.html#3dd7e998aa3e7258b3b5731307df23a0">try_release</a>()</td><td><a class="el" href="a00285.html">tbb::source_node< Output ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00285.html#ecac0bb52cff61912dcd186647ccd1bf">try_reserve</a>(output_type &v)</td><td><a class="el" href="a00285.html">tbb::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="a00251.html">tbb::graph_node</a>)</td><td><a class="el" href="a00251.html">tbb::graph_node</a></td><td><code> [inline, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>~sender</b>() (defined in <a class="el" href="a00282.html">tbb::sender< Output ></a>)</td><td><a class="el" href="a00282.html">tbb::sender< Output ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00285.html#90c94a8a52cc3d19cf393ce289e80733">~source_node</a>()</td><td><a class="el" href="a00285.html">tbb::source_node< Output ></a></td><td><code> [inline]</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="a00260.html">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>fOutput_type</b> typedef (defined in <a class="el" href="a00260.html">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a>)</td><td><a class="el" href="a00260.html">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00260.html#5c215b40e3daf73d1c6802ecb5aded6c">function_node</a>(graph &g, size_t concurrency, Body body)</td><td><a class="el" href="a00260.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="a00260.html#d5132323fd2ac6a00ea0c78beda78723">function_node</a>(const function_node &src)</td><td><a class="el" href="a00260.html">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>input_type</b> typedef (defined in <a class="el" href="a00260.html">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a>)</td><td><a class="el" href="a00260.html">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>output_type</b> typedef (defined in <a class="el" href="a00260.html">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a>)</td><td><a class="el" href="a00260.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="a00260.html">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a>)</td><td><a class="el" href="a00260.html">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>successor_type</b> typedef (defined in <a class="el" href="a00260.html">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a>)</td><td><a class="el" href="a00260.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="a00260.html">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a>)</td><td><a class="el" href="a00260.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="a00263.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::graph_node</a></td><td><code> [inline, virtual]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00049.html b/doc/html/a00049.html
index 36c6bc3..37090d4 100644
--- a/doc/html/a00049.html
+++ b/doc/html/a00049.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::function_node< Input, Output > Member List</h1>This is the complete list of members for <a class="el" href="a00249.html">tbb::function_node< Input, Output ></a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00249.html#7bde12e8ee43d4cafbdd5b1fc2031e2b">function_node</a>(graph &g, size_t concurrency, Body body)</td><td><a class="el" href="a00249.html">tbb::function_node< Input, Output ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>input_type</b> typedef (defined in <a class="el" href="a00249.html">tbb::function_node< Input, Output ></a>)</td><td><a class="el" href="a00249.html">tbb::function_node< Input, Output ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_successors</b> (defined in <a class="el" href="a00249.html">tbb::function_node< Input, Output ></a>)</td><td><a class="el" href="a00249.html">tbb::function_node< Input, Output ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>output_type</b> typedef (defined in <a class="el" href="a00249.html">tbb::function_node< Input, Output ></a>)</td><td><a class="el" href="a00249.html">tbb::function_node< Input, Output ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>predecessor_type</b> typedef (defined in <a class="el" href="a00249.html">tbb::function_node< Input, Output ></a>)</td><td><a class="el" href="a00249.html">tbb::function_node< Input, Output ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>successor_type</b> typedef (defined in <a class="el" href="a00249.html">tbb::function_node< Input, Output ></a>)</td><td><a class="el" href="a00249.html">tbb::function_node< Input, Output ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>successors</b>() (defined in <a class="el" href="a00249.html">tbb::function_node< Input, Output ></a>)</td><td><a class="el" href="a00249.html">tbb::function_node< Input, Output ></a></td><td><code> [inline, protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>~graph_node</b>() (defined in <a class="el" href="a00251.html">tbb::graph_node</a>)</td><td><a class="el" href="a00251.html">tbb::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="a00261.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="a00261.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a>)</td><td><a class="el" href="a00261.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="a00261.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a>)</td><td><a class="el" href="a00261.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00261.html#5b9019c1e6e9b2c41c986a384bd179db">function_node</a>(graph &g, size_t concurrency, Body body)</td><td><a class="el" href="a00261.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="a00261.html#01055081ed477714503820035db3a965">function_node</a>(const function_node &src)</td><td><a class="el" href="a00261.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>input_type</b> typedef (defined in <a class="el" href="a00261.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a>)</td><td><a class="el" href="a00261.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>output_type</b> typedef (defined in <a class="el" href="a00261.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a>)</td><td><a class="el" href="a00261.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="a00261.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a>)</td><td><a class="el" href="a00261.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>queue_type</b> typedef (defined in <a class="el" href="a00261.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a>)</td><td><a class="el" href="a00261.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="a00261.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a>)</td><td><a class="el" href="a00261.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="a00261.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a>)</td><td><a class="el" href="a00261.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="a00263.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::graph_node</a></td><td><code> [inline, virtual]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00050.html b/doc/html/a00050.html
index 12f826c..2897add 100644
--- a/doc/html/a00050.html
+++ b/doc/html/a00050.html
@@ -20,16 +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::executable_node< Output > Member List</h1>This is the complete list of members for <a class="el" href="a00244.html">tbb::executable_node< Output ></a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00244.html#73d4304b322a25ed0df468e607dd1dac">executable_node</a>(graph &g, Body body)</td><td><a class="el" href="a00244.html">tbb::executable_node< Output ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00244.html#c13030111d34feeafd9cdb1dd21584f1">executable_node</a>(graph &g, int number_of_predecessors, Body body)</td><td><a class="el" href="a00244.html">tbb::executable_node< Output ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>input_type</b> typedef (defined in <a class="el" href="a00244.html">tbb::executable_node< Output ></a>)</td><td><a class="el" href="a00244.html">tbb::executable_node< Output ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_successors</b> (defined in <a class="el" href="a00244.html">tbb::executable_node< Output ></a>)</td><td><a class="el" href="a00244.html">tbb::executable_node< Output ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>output_type</b> typedef (defined in <a class="el" href="a00244.html">tbb::executable_node< Output ></a>)</td><td><a class="el" href="a00244.html">tbb::executable_node< Output ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>predecessor_type</b> typedef (defined in <a class="el" href="a00244.html">tbb::executable_node< Output ></a>)</td><td><a class="el" href="a00244.html">tbb::executable_node< Output ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>successor_type</b> typedef (defined in <a class="el" href="a00244.html">tbb::executable_node< Output ></a>)</td><td><a class="el" href="a00244.html">tbb::executable_node< Output ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>successors</b>() (defined in <a class="el" href="a00244.html">tbb::executable_node< Output ></a>)</td><td><a class="el" href="a00244.html">tbb::executable_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="a00251.html">tbb::graph_node</a>)</td><td><a class="el" href="a00251.html">tbb::graph_node</a></td><td><code> [inline, virtual]</code></td></tr>
+<h1>tbb::flow::interface6::multioutput_function_node< Input, Output,, Allocator > Member List</h1>This is the complete list of members for <a class="el" href="a00274.html">tbb::flow::interface6::multioutput_function_node< Input, Output,, Allocator ></a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>input_type</b> typedef (defined in <a class="el" href="a00274.html">tbb::flow::interface6::multioutput_function_node< Input, Output,, Allocator ></a>)</td><td><a class="el" href="a00274.html">tbb::flow::interface6::multioutput_function_node< Input, Output,, Allocator ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>multioutput_function_node</b>(graph &g, size_t concurrency, Body body) (defined in <a class="el" href="a00274.html">tbb::flow::interface6::multioutput_function_node< Input, Output,, Allocator ></a>)</td><td><a class="el" href="a00274.html">tbb::flow::interface6::multioutput_function_node< Input, Output,, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>multioutput_function_node</b>(const multioutput_function_node &other) (defined in <a class="el" href="a00274.html">tbb::flow::interface6::multioutput_function_node< Input, Output,, Allocator ></a>)</td><td><a class="el" href="a00274.html">tbb::flow::interface6::multioutput_function_node< Input, Output,, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>ports_type</b> typedef (defined in <a class="el" href="a00274.html">tbb::flow::interface6::multioutput_function_node< Input, Output,, Allocator ></a>)</td><td><a class="el" href="a00274.html">tbb::flow::interface6::multioutput_function_node< Input, Output,, Allocator ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>~graph_node</b>() (defined in <a class="el" href="a00263.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::graph_node</a></td><td><code> [inline, virtual]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00052.html b/doc/html/a00052.html
new file mode 100644
index 0000000..9782efb
--- /dev/null
+++ b/doc/html/a00052.html
@@ -0,0 +1,40 @@
+<!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::split_node< TupleType, Allocator > Member List</h1>This is the complete list of members for <a class="el" href="a00310.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="a00310.html">tbb::flow::interface6::split_node< TupleType, Allocator ></a>)</td><td><a class="el" href="a00310.html">tbb::flow::interface6::split_node< TupleType, Allocator ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>input_type</b> typedef (defined in <a class="el" href="a00310.html">tbb::flow::interface6::split_node< TupleType, Allocator ></a>)</td><td><a class="el" href="a00310.html">tbb::flow::interface6::split_node< TupleType, Allocator ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>multioutput_function_node</b>(graph &g, size_t concurrency, Body body) (defined in <a class="el" href="a00274.html">tbb::flow::interface6::multioutput_function_node< TupleType, TupleType, rejecting, Allocator ></a>)</td><td><a class="el" href="a00274.html">tbb::flow::interface6::multioutput_function_node< TupleType, TupleType, rejecting, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>multioutput_function_node</b>(const multioutput_function_node &other) (defined in <a class="el" href="a00274.html">tbb::flow::interface6::multioutput_function_node< TupleType, TupleType, rejecting, Allocator ></a>)</td><td><a class="el" href="a00274.html">tbb::flow::interface6::multioutput_function_node< TupleType, TupleType, rejecting, Allocator ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>ports_type</b> typedef (defined in <a class="el" href="a00310.html">tbb::flow::interface6::split_node< TupleType, Allocator ></a>)</td><td><a class="el" href="a00310.html">tbb::flow::interface6::split_node< TupleType, Allocator ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>split_node</b>(graph &g) (defined in <a class="el" href="a00310.html">tbb::flow::interface6::split_node< TupleType, Allocator ></a>)</td><td><a class="el" href="a00310.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="a00310.html">tbb::flow::interface6::split_node< TupleType, Allocator ></a>)</td><td><a class="el" href="a00310.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="a00263.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::graph_node</a></td><td><code> [inline, virtual]</code></td></tr>
+</table><hr>
+<p></p>
+Copyright © 2005-2011 Intel Corporation. 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/a00053.html b/doc/html/a00053.html
deleted file mode 100644
index 3f4adb8..0000000
--- a/doc/html/a00053.html
+++ /dev/null
@@ -1,42 +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::continue_node Member List</h1>This is the complete list of members for <a class="el" href="a00240.html">tbb::continue_node</a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>continue_node</b>(graph &g) (defined in <a class="el" href="a00240.html">tbb::continue_node</a>)</td><td><a class="el" href="a00240.html">tbb::continue_node</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00244.html#73d4304b322a25ed0df468e607dd1dac">executable_node</a>(graph &g, Body body)</td><td><a class="el" href="a00244.html">tbb::executable_node< Output ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00244.html#c13030111d34feeafd9cdb1dd21584f1">executable_node</a>(graph &g, int number_of_predecessors, Body body)</td><td><a class="el" href="a00244.html">tbb::executable_node< Output ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>input_type</b> typedef (defined in <a class="el" href="a00240.html">tbb::continue_node</a>)</td><td><a class="el" href="a00240.html">tbb::continue_node</a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_successors</b> (defined in <a class="el" href="a00244.html">tbb::executable_node< Output ></a>)</td><td><a class="el" href="a00244.html">tbb::executable_node< Output ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>output_type</b> typedef (defined in <a class="el" href="a00240.html">tbb::continue_node</a>)</td><td><a class="el" href="a00240.html">tbb::continue_node</a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>predecessor_type</b> typedef (defined in <a class="el" href="a00240.html">tbb::continue_node</a>)</td><td><a class="el" href="a00240.html">tbb::continue_node</a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>successor_type</b> typedef (defined in <a class="el" href="a00240.html">tbb::continue_node</a>)</td><td><a class="el" href="a00240.html">tbb::continue_node</a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>successors</b>() (defined in <a class="el" href="a00244.html">tbb::executable_node< Output ></a>)</td><td><a class="el" href="a00244.html">tbb::executable_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="a00251.html">tbb::graph_node</a>)</td><td><a class="el" href="a00251.html">tbb::graph_node</a></td><td><code> [inline, virtual]</code></td></tr>
-</table><hr>
-<p></p>
-Copyright © 2005-2011 Intel Corporation. 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
index ff5451f..a43d8d3 100644
--- a/doc/html/a00054.html
+++ b/doc/html/a00054.html
@@ -20,24 +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::broadcast_node< T > Member List</h1>This is the complete list of members for <a class="el" href="a00224.html">tbb::broadcast_node< T ></a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>broadcast_node</b>() (defined in <a class="el" href="a00224.html">tbb::broadcast_node< T ></a>)</td><td><a class="el" href="a00224.html">tbb::broadcast_node< T ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00224.html#59ea89dbeab816742e6dc6af467e6c3f">input_type</a> typedef</td><td><a class="el" href="a00224.html">tbb::broadcast_node< T ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00224.html#b844ca1ee578a54bc11ff28467b12e7d">output_type</a> typedef</td><td><a class="el" href="a00224.html">tbb::broadcast_node< T ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00224.html#4dd13b81f6361fc244abe7cbcacd048c">predecessor_type</a> typedef</td><td><a class="el" href="a00224.html">tbb::broadcast_node< T ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00277.html#14ae737c8fca4c8bf8e1a736dfbac444">register_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00277.html">tbb::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00224.html#3f4149fa6b984b2138cb5ed40a2ddc6c">register_successor</a>(receiver< T > &r)</td><td><a class="el" href="a00224.html">tbb::broadcast_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00277.html#d2f23b40b328dc254a7c2a0a30f408e4">remove_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00277.html">tbb::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00224.html#eefb3210bb9727765ea7385ba163c2a6">remove_successor</a>(receiver< T > &r)</td><td><a class="el" href="a00224.html">tbb::broadcast_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00224.html#453928c367d813cb481f1b9aa1e1742a">successor_type</a> typedef</td><td><a class="el" href="a00224.html">tbb::broadcast_node< T ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00282.html#add46946c4c7330422733432e4032fac">try_consume</a>()</td><td><a class="el" href="a00282.html">tbb::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00282.html#bf8c9235810354f3353a899c982645de">try_get</a>(T &)</td><td><a class="el" href="a00282.html">tbb::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00224.html#9b211e02554d6b39dc04f7e7f4e00073">try_put</a>(T t)</td><td><a class="el" href="a00224.html">tbb::broadcast_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00282.html#28c41df1c0c7ed485b4a691ec8f30098">try_release</a>()</td><td><a class="el" href="a00282.html">tbb::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00282.html#3506c7275aeeb2fc3ba5d5f10ee0adac">try_reserve</a>(T &)</td><td><a class="el" href="a00282.html">tbb::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="a00251.html">tbb::graph_node</a>)</td><td><a class="el" href="a00251.html">tbb::graph_node</a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00277.html#18f74b83abae0ee1e4ce07942797ef27">~receiver</a>()</td><td><a class="el" href="a00277.html">tbb::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>~sender</b>() (defined in <a class="el" href="a00282.html">tbb::sender< T ></a>)</td><td><a class="el" href="a00282.html">tbb::sender< T ></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="a00252.html">tbb::flow::interface6::continue_node< Output ></a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00252.html#2f200db877d2f80c08d09422e8bffd5a">continue_node</a>(graph &g, Body body)</td><td><a class="el" href="a00252.html">tbb::flow::interface6::continue_node< Output ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00252.html#7817aebf22dd125ca04df53ac488d163">continue_node</a>(graph &g, int number_of_predecessors, Body body)</td><td><a class="el" href="a00252.html">tbb::flow::interface6::continue_node< Output ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00252.html#869562787fcb5c57a90aea120f26d492">continue_node</a>(const continue_node &src)</td><td><a class="el" href="a00252.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="a00252.html">tbb::flow::interface6::continue_node< Output ></a>)</td><td><a class="el" href="a00252.html">tbb::flow::interface6::continue_node< Output ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>input_type</b> typedef (defined in <a class="el" href="a00252.html">tbb::flow::interface6::continue_node< Output ></a>)</td><td><a class="el" href="a00252.html">tbb::flow::interface6::continue_node< Output ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>output_type</b> typedef (defined in <a class="el" href="a00252.html">tbb::flow::interface6::continue_node< Output ></a>)</td><td><a class="el" href="a00252.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="a00252.html">tbb::flow::interface6::continue_node< Output ></a>)</td><td><a class="el" href="a00252.html">tbb::flow::interface6::continue_node< Output ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>successor_type</b> typedef (defined in <a class="el" href="a00252.html">tbb::flow::interface6::continue_node< Output ></a>)</td><td><a class="el" href="a00252.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="a00252.html">tbb::flow::interface6::continue_node< Output ></a>)</td><td><a class="el" href="a00252.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="a00263.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::graph_node</a></td><td><code> [inline, virtual]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00055.html b/doc/html/a00055.html
deleted file mode 100644
index 4316b58..0000000
--- a/doc/html/a00055.html
+++ /dev/null
@@ -1,89 +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::buffer_node< T > Member List</h1>This is the complete list of members for <a class="el" href="a00225.html">tbb::buffer_node< T ></a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00225.html#7360978fa427d054bc6cde05c80e5e9f">buffer_node</a>(graph &g)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>con_res</b> enum value (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>FAILED</b> enum value (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00225.html#3a31b3b55bee417de3af09c7b45b9ad6">forward</a>()</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>forwarder_busy</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00225.html#3ec9d33aa9f1e9292d5952e3eb477ca1">grow_my_array</a>(size_t minimum_size)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>handle_operations</b>(buffer_operation *op_list) (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>initial_buffer_size</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected, static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00225.html#90de308ba6abefb74c537a62ed0f1ca3">input_type</a> typedef</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal::forward_task< buffer_node< T > ></b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< 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="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00225.html#a3cb61d8a98bc4bc860b1cb04944b4f8">internal_forward</a>(buffer_operation *op)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></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="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></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="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00225.html#017f16c8d6e0fb65d0d3a61aec86b3e2">internal_reg_succ</a>(buffer_operation *op)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></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="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00225.html#a75f731cf9fc93f7487eb72de3fcf7b1">internal_rem_succ</a>(buffer_operation *op)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></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="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< 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="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_aggregator</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_array</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_array_size</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_head</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_mutex</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_parent</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_reserved</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_reserved_id</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_successors</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_tail</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>op_stat</b> enum name (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>op_type</b> enum name (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00225.html#28c06a61dbad153f2e989efbf43016c5">output_type</a> typedef</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00225.html#688cf819089ee2fac2b9de2e050adea7">predecessor_type</a> typedef</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>put_item</b> enum value (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>reg_succ</b> enum value (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00277.html#14ae737c8fca4c8bf8e1a736dfbac444">register_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00277.html">tbb::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00225.html#cd2ef588b0ee6eb8d23ee169e00c73a9">register_successor</a>(receiver< output_type > &r)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></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="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>rem_succ</b> enum value (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00277.html#d2f23b40b328dc254a7c2a0a30f408e4">remove_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00277.html">tbb::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00225.html#415428db02e74a479fb056a8ed72ba53">remove_successor</a>(receiver< output_type > &r)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></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="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>res_item</b> enum value (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>size_type</b> typedef (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>SUCCEEDED</b> enum value (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00225.html#5e23f4f377ff4e1f53e71fd909a65771">successor_type</a> typedef</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00225.html#46b8b257a97e2192a2b11743279e8ffe">try_consume</a>()</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></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="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00225.html#b68bdec127703dbfb2d93d685abbfd67">try_get</a>(T &v)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00225.html#f74899ffb67687998168ad428f586b64">try_put</a>(T t)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00225.html#435e29a66f0719d4822a0a8dc78a0405">try_release</a>()</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00225.html#11ebad4c72082a1a03ecccd3afab4ae2">try_reserve</a>(T &v)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>WAIT</b> enum value (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>~buffer_node</b>() (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>~graph_node</b>() (defined in <a class="el" href="a00251.html">tbb::graph_node</a>)</td><td><a class="el" href="a00251.html">tbb::graph_node</a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00277.html#18f74b83abae0ee1e4ce07942797ef27">~receiver</a>()</td><td><a class="el" href="a00277.html">tbb::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>~sender</b>() (defined in <a class="el" href="a00282.html">tbb::sender< T ></a>)</td><td><a class="el" href="a00282.html">tbb::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-</table><hr>
-<p></p>
-Copyright © 2005-2011 Intel Corporation. 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
new file mode 100644
index 0000000..3e8dc08
--- /dev/null
+++ b/doc/html/a00057.html
@@ -0,0 +1,50 @@
+<!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="a00236.html">tbb::flow::interface6::broadcast_node< T ></a>, including all inherited members.<p><table>
+ <tr bgcolor="#f0f0f0"><td><b>broadcast_node</b>() (defined in <a class="el" href="a00236.html">tbb::flow::interface6::broadcast_node< T ></a>)</td><td><a class="el" href="a00236.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 &) (defined in <a class="el" href="a00236.html">tbb::flow::interface6::broadcast_node< T ></a>)</td><td><a class="el" href="a00236.html">tbb::flow::interface6::broadcast_node< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00236.html#43c775d80e98cc601de69764983319f9">input_type</a> typedef</td><td><a class="el" href="a00236.html">tbb::flow::interface6::broadcast_node< T ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00236.html#8fd8d3075823e08b879be46c1215ab0f">output_type</a> typedef</td><td><a class="el" href="a00236.html">tbb::flow::interface6::broadcast_node< T ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00236.html#0e2ad9a121cb286aa0d0142fef33c646">predecessor_type</a> typedef</td><td><a class="el" href="a00236.html">tbb::flow::interface6::broadcast_node< T ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00295.html#30e3316466efe3a713c23062b6e806f3">register_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00295.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00236.html#fd0324c9ddb51fe6f95b3d015d338941">register_successor</a>(receiver< T > &r)</td><td><a class="el" href="a00236.html">tbb::flow::interface6::broadcast_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00295.html#3bc76547b51d3c9b633e3987d22dce95">remove_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00295.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00236.html#366efcc046ec08a104281109801ae629">remove_successor</a>(receiver< T > &r)</td><td><a class="el" href="a00236.html">tbb::flow::interface6::broadcast_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00236.html#cc6a0eb1c4ee65465770628d8366f055">successor_type</a> typedef</td><td><a class="el" href="a00236.html">tbb::flow::interface6::broadcast_node< T ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00301.html#7b840f50da117a0d6848707c1857ea2e">try_consume</a>()</td><td><a class="el" href="a00301.html">tbb::flow::interface6::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00301.html#922fb56b0aad090b90a98b7d56b76a59">try_get</a>(T &)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00236.html#29eb768c10b377880bbf83d31ee49acf">try_put</a>(const T &t)</td><td><a class="el" href="a00236.html">tbb::flow::interface6::broadcast_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00301.html#27036b06d6a91e97007e14f400529199">try_release</a>()</td><td><a class="el" href="a00301.html">tbb::flow::interface6::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00301.html#02c05b472271db1b68a48ea2618fa72f">try_reserve</a>(T &)</td><td><a class="el" href="a00301.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="a00263.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::graph_node</a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00295.html#b00699b235435f7b65b663d5063624a1">~receiver</a>()</td><td><a class="el" href="a00295.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="a00301.html">tbb::flow::interface6::sender< T ></a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+</table><hr>
+<p></p>
+Copyright © 2005-2011 Intel Corporation. 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/a00058.html b/doc/html/a00058.html
index b3d1559..eaca853 100644
--- a/doc/html/a00058.html
+++ b/doc/html/a00058.html
@@ -20,66 +20,58 @@
<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::queue_node< T > Member List</h1>This is the complete list of members for <a class="el" href="a00269.html">tbb::queue_node< T ></a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00225.html#7360978fa427d054bc6cde05c80e5e9f">buffer_node</a>(graph &g)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>con_res</b> enum value (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>FAILED</b> enum value (defined in <a class="el" href="a00269.html">tbb::queue_node< T ></a>)</td><td><a class="el" href="a00269.html">tbb::queue_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00225.html#3a31b3b55bee417de3af09c7b45b9ad6">forward</a>()</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>forwarder_busy</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00225.html#3ec9d33aa9f1e9292d5952e3eb477ca1">grow_my_array</a>(size_t minimum_size)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>handle_operations</b>(buffer_operation *op_list) (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>initial_buffer_size</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected, static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00269.html#27016487003a4ff2908748c3cf11c1fe">input_type</a> typedef</td><td><a class="el" href="a00269.html">tbb::queue_node< T ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal::forward_task< buffer_node< T > ></b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< 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="a00269.html">tbb::queue_node< T ></a>)</td><td><a class="el" href="a00269.html">tbb::queue_node< T ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00269.html#fb58bac5ac355e5134c51125e601fa2a">internal_forward</a>(queue_operation *op)</td><td><a class="el" href="a00269.html">tbb::queue_node< T ></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="a00269.html">tbb::queue_node< T ></a>)</td><td><a class="el" href="a00269.html">tbb::queue_node< T ></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="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00225.html#017f16c8d6e0fb65d0d3a61aec86b3e2">internal_reg_succ</a>(buffer_operation *op)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></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="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00225.html#a75f731cf9fc93f7487eb72de3fcf7b1">internal_rem_succ</a>(buffer_operation *op)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></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="a00269.html">tbb::queue_node< T ></a>)</td><td><a class="el" href="a00269.html">tbb::queue_node< 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="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_aggregator</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_array</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_array_size</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_head</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_mutex</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_parent</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_reserved</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_reserved_id</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_successors</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_tail</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>op_stat</b> enum name (defined in <a class="el" href="a00269.html">tbb::queue_node< T ></a>)</td><td><a class="el" href="a00269.html">tbb::queue_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>op_type</b> enum name (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00269.html#d227f122eebe2f9489ba763ff24fd6fb">output_type</a> typedef</td><td><a class="el" href="a00269.html">tbb::queue_node< T ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00269.html#83bc7308a38f1d205377d78ec14931d1">predecessor_type</a> typedef</td><td><a class="el" href="a00269.html">tbb::queue_node< T ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>put_item</b> enum value (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00269.html#1564c6bf9573b13d6854b0e8f7ce2b68">queue_node</a>(graph &g)</td><td><a class="el" href="a00269.html">tbb::queue_node< T ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>queue_operation</b> typedef (defined in <a class="el" href="a00269.html">tbb::queue_node< T ></a>)</td><td><a class="el" href="a00269.html">tbb::queue_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>reg_succ</b> enum value (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00277.html#14ae737c8fca4c8bf8e1a736dfbac444">register_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00277.html">tbb::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00225.html#cd2ef588b0ee6eb8d23ee169e00c73a9">register_successor</a>(receiver< output_type > &r)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></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="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>rem_succ</b> enum value (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00277.html#d2f23b40b328dc254a7c2a0a30f408e4">remove_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00277.html">tbb::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00225.html#415428db02e74a479fb056a8ed72ba53">remove_successor</a>(receiver< output_type > &r)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></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="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>res_item</b> enum value (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>size_type</b> typedef (defined in <a class="el" href="a00269.html">tbb::queue_node< T ></a>)</td><td><a class="el" href="a00269.html">tbb::queue_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>SUCCEEDED</b> enum value (defined in <a class="el" href="a00269.html">tbb::queue_node< T ></a>)</td><td><a class="el" href="a00269.html">tbb::queue_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00269.html#c3b1d76b66b1292f6a1b6dae52c67a0e">successor_type</a> typedef</td><td><a class="el" href="a00269.html">tbb::queue_node< T ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00225.html#46b8b257a97e2192a2b11743279e8ffe">try_consume</a>()</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></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="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00225.html#b68bdec127703dbfb2d93d685abbfd67">try_get</a>(T &v)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00225.html#f74899ffb67687998168ad428f586b64">try_put</a>(T t)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00225.html#435e29a66f0719d4822a0a8dc78a0405">try_release</a>()</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00225.html#11ebad4c72082a1a03ecccd3afab4ae2">try_reserve</a>(T &v)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>WAIT</b> enum value (defined in <a class="el" href="a00269.html">tbb::queue_node< T ></a>)</td><td><a class="el" href="a00269.html">tbb::queue_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>~buffer_node</b>() (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>~graph_node</b>() (defined in <a class="el" href="a00251.html">tbb::graph_node</a>)</td><td><a class="el" href="a00251.html">tbb::graph_node</a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00277.html#18f74b83abae0ee1e4ce07942797ef27">~receiver</a>()</td><td><a class="el" href="a00277.html">tbb::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>~sender</b>() (defined in <a class="el" href="a00282.html">tbb::sender< T ></a>)</td><td><a class="el" href="a00282.html">tbb::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="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00237.html#5fe4b79f780586ff66e002ce32a5c60d">buffer_node</a>(graph &g)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00237.html#03ad7b85a8341437f584af06ad050cdc">buffer_node</a>(const buffer_node &src)</td><td><a class="el" href="a00237.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="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.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="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00237.html#2648324ce0a38b40132b8502ef250e3a">forward</a>()</td><td><a class="el" href="a00237.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="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>handle_operations</b>(buffer_operation *op_list) (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.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="a00237.html#334efb81b56a2f2b3ae08a16e8d65620">input_type</a> typedef</td><td><a class="el" href="a00237.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="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.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="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.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="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.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="a00237.html#dcbffbae514f4d95205b0845785c0a91">internal_forward</a>(buffer_operation *op)</td><td><a class="el" href="a00237.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="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.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="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.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="a00237.html#df21388252b8963e839dca29d2c67ea5">internal_reg_succ</a>(buffer_operation *op)</td><td><a class="el" href="a00237.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="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.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="a00237.html#6b6cf76dff80fd679251da93351c1291">internal_rem_succ</a>(buffer_operation *op)</td><td><a class="el" href="a00237.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="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.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="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.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="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>my_handler</b> typedef (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.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="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.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="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>op_stat</b> enum name (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.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="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00237.html#089520db81f6a1551dc94c01efbdd7be">output_type</a> typedef</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00237.html#5fb0ad03a822ca0fc34ad5d56a4093a2">predecessor_type</a> typedef</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>put_item</b> enum value (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.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="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00295.html#30e3316466efe3a713c23062b6e806f3">register_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00295.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00237.html#f8bf4944ede4fc106423d67715beb695">register_successor</a>(receiver< output_type > &r)</td><td><a class="el" href="a00237.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="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.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="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00295.html#3bc76547b51d3c9b633e3987d22dce95">remove_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00295.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00237.html#2074da0e39b9477c32897d6e5786196f">remove_successor</a>(receiver< output_type > &r)</td><td><a class="el" href="a00237.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="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.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="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.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="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.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="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00237.html#66f7eda69b75e08f50726e50a11429cd">successor_type</a> typedef</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00237.html#8ef07c434eb763d947a7b4e80c086a49">try_consume</a>()</td><td><a class="el" href="a00237.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="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00237.html#aeb8aec46ca99ca022356a792c46735e">try_get</a>(T &v)</td><td><a class="el" href="a00237.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="a00237.html#2b02fe332e704bbe14f297802298b63a">try_put</a>(const T &t)</td><td><a class="el" href="a00237.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="a00237.html#2c8e8f2f5f4ff5be27136cc1184a3c3e">try_release</a>()</td><td><a class="el" href="a00237.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="a00237.html#1cc889bb6c38bcb81757d0ebbc3a5e64">try_reserve</a>(T &v)</td><td><a class="el" href="a00237.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="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.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="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.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="a00263.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::graph_node</a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00295.html#b00699b235435f7b65b663d5063624a1">~receiver</a>()</td><td><a class="el" href="a00295.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="a00301.html">tbb::flow::interface6::sender< T ></a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00059.html b/doc/html/a00059.html
deleted file mode 100644
index ac0a985..0000000
--- a/doc/html/a00059.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::sequencer_node< T > Member List</h1>This is the complete list of members for <a class="el" href="a00283.html">tbb::sequencer_node< T ></a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00225.html#7360978fa427d054bc6cde05c80e5e9f">buffer_node</a>(graph &g)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>con_res</b> enum value (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>FAILED</b> enum value (defined in <a class="el" href="a00283.html">tbb::sequencer_node< T ></a>)</td><td><a class="el" href="a00283.html">tbb::sequencer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00225.html#3a31b3b55bee417de3af09c7b45b9ad6">forward</a>()</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>forwarder_busy</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00225.html#3ec9d33aa9f1e9292d5952e3eb477ca1">grow_my_array</a>(size_t minimum_size)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>handle_operations</b>(buffer_operation *op_list) (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>initial_buffer_size</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected, static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00283.html#a73e4a3ae6c430281f08226d448ebfc8">input_type</a> typedef</td><td><a class="el" href="a00283.html">tbb::sequencer_node< T ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal::forward_task< buffer_node< T > ></b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< 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="a00269.html">tbb::queue_node< T ></a>)</td><td><a class="el" href="a00269.html">tbb::queue_node< T ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00269.html#fb58bac5ac355e5134c51125e601fa2a">internal_forward</a>(queue_operation *op)</td><td><a class="el" href="a00269.html">tbb::queue_node< T ></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="a00269.html">tbb::queue_node< T ></a>)</td><td><a class="el" href="a00269.html">tbb::queue_node< T ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00225.html#017f16c8d6e0fb65d0d3a61aec86b3e2">internal_reg_succ</a>(buffer_operation *op)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></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="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00225.html#a75f731cf9fc93f7487eb72de3fcf7b1">internal_rem_succ</a>(buffer_operation *op)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></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="a00269.html">tbb::queue_node< T ></a>)</td><td><a class="el" href="a00269.html">tbb::queue_node< 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="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_aggregator</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_array</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_array_size</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_head</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_mutex</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_parent</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_reserved</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_reserved_id</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_successors</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_tail</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>op_stat</b> enum name (defined in <a class="el" href="a00283.html">tbb::sequencer_node< T ></a>)</td><td><a class="el" href="a00283.html">tbb::sequencer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>op_type</b> enum name (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00283.html#0c613bb01103dfcfbc3f9cbe943f95b0">output_type</a> typedef</td><td><a class="el" href="a00283.html">tbb::sequencer_node< T ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00283.html#6581686ef0cf8e13c0270687628af5eb">predecessor_type</a> typedef</td><td><a class="el" href="a00283.html">tbb::sequencer_node< T ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>put_item</b> enum value (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00269.html#1564c6bf9573b13d6854b0e8f7ce2b68">queue_node</a>(graph &g)</td><td><a class="el" href="a00269.html">tbb::queue_node< T ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>queue_operation</b> typedef (defined in <a class="el" href="a00269.html">tbb::queue_node< T ></a>)</td><td><a class="el" href="a00269.html">tbb::queue_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>reg_succ</b> enum value (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00277.html#14ae737c8fca4c8bf8e1a736dfbac444">register_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00277.html">tbb::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00225.html#cd2ef588b0ee6eb8d23ee169e00c73a9">register_successor</a>(receiver< output_type > &r)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></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="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>rem_succ</b> enum value (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00277.html#d2f23b40b328dc254a7c2a0a30f408e4">remove_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00277.html">tbb::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00225.html#415428db02e74a479fb056a8ed72ba53">remove_successor</a>(receiver< output_type > &r)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></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="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>res_item</b> enum value (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00283.html#c3138c1c96b76ae9f13b0abbf7029590">sequencer_node</a>(graph &g, const Sequencer &s)</td><td><a class="el" href="a00283.html">tbb::sequencer_node< T ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>sequencer_operation</b> typedef (defined in <a class="el" href="a00283.html">tbb::sequencer_node< T ></a>)</td><td><a class="el" href="a00283.html">tbb::sequencer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>size_type</b> typedef (defined in <a class="el" href="a00283.html">tbb::sequencer_node< T ></a>)</td><td><a class="el" href="a00283.html">tbb::sequencer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>SUCCEEDED</b> enum value (defined in <a class="el" href="a00283.html">tbb::sequencer_node< T ></a>)</td><td><a class="el" href="a00283.html">tbb::sequencer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00283.html#3591313e30d0f485a09106686067411f">successor_type</a> typedef</td><td><a class="el" href="a00283.html">tbb::sequencer_node< T ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00225.html#46b8b257a97e2192a2b11743279e8ffe">try_consume</a>()</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></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="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00225.html#b68bdec127703dbfb2d93d685abbfd67">try_get</a>(T &v)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00225.html#f74899ffb67687998168ad428f586b64">try_put</a>(T t)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00225.html#435e29a66f0719d4822a0a8dc78a0405">try_release</a>()</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00225.html#11ebad4c72082a1a03ecccd3afab4ae2">try_reserve</a>(T &v)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>WAIT</b> enum value (defined in <a class="el" href="a00283.html">tbb::sequencer_node< T ></a>)</td><td><a class="el" href="a00283.html">tbb::sequencer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>~buffer_node</b>() (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>~graph_node</b>() (defined in <a class="el" href="a00251.html">tbb::graph_node</a>)</td><td><a class="el" href="a00251.html">tbb::graph_node</a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00277.html#18f74b83abae0ee1e4ce07942797ef27">~receiver</a>()</td><td><a class="el" href="a00277.html">tbb::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>~sender</b>() (defined in <a class="el" href="a00282.html">tbb::sender< T ></a>)</td><td><a class="el" href="a00282.html">tbb::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00283.html#c87d80feebaf2bae4af22b5f2459b37e">~sequencer_node</a>()</td><td><a class="el" href="a00283.html">tbb::sequencer_node< T ></a></td><td><code> [inline]</code></td></tr>
-</table><hr>
-<p></p>
-Copyright © 2005-2011 Intel Corporation. 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/a00060.html b/doc/html/a00060.html
index 7aead19..c602c35 100644
--- a/doc/html/a00060.html
+++ b/doc/html/a00060.html
@@ -20,66 +20,61 @@
<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::priority_queue_node< T, Compare > Member List</h1>This is the complete list of members for <a class="el" href="a00268.html">tbb::priority_queue_node< T, Compare ></a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00225.html#7360978fa427d054bc6cde05c80e5e9f">buffer_node</a>(graph &g)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>con_res</b> enum value (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>FAILED</b> enum value (defined in <a class="el" href="a00268.html">tbb::priority_queue_node< T, Compare ></a>)</td><td><a class="el" href="a00268.html">tbb::priority_queue_node< T, Compare ></a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00225.html#3a31b3b55bee417de3af09c7b45b9ad6">forward</a>()</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>forwarder_busy</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00225.html#3ec9d33aa9f1e9292d5952e3eb477ca1">grow_my_array</a>(size_t minimum_size)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>handle_operations</b>(prio_operation *op_list) (defined in <a class="el" href="a00268.html">tbb::priority_queue_node< T, Compare ></a>)</td><td><a class="el" href="a00268.html">tbb::priority_queue_node< T, Compare ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>initial_buffer_size</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected, static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00268.html#40fdedd4829aeae3ebd1a5fdaf39b23d">input_type</a> typedef</td><td><a class="el" href="a00268.html">tbb::priority_queue_node< T, Compare ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal::forward_task< buffer_node< T > ></b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< 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="a00268.html">tbb::priority_queue_node< T, Compare ></a>)</td><td><a class="el" href="a00268.html">tbb::priority_queue_node< T, Compare ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00268.html#79161e73f79cc43b2c2b08367504dfda">internal_forward</a>(prio_operation *op)</td><td><a class="el" href="a00268.html">tbb::priority_queue_node< T, Compare ></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="a00268.html">tbb::priority_queue_node< T, Compare ></a>)</td><td><a class="el" href="a00268.html">tbb::priority_queue_node< T, Compare ></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="a00268.html">tbb::priority_queue_node< T, Compare ></a>)</td><td><a class="el" href="a00268.html">tbb::priority_queue_node< T, Compare ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00225.html#017f16c8d6e0fb65d0d3a61aec86b3e2">internal_reg_succ</a>(buffer_operation *op)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></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="a00268.html">tbb::priority_queue_node< T, Compare ></a>)</td><td><a class="el" href="a00268.html">tbb::priority_queue_node< T, Compare ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00225.html#a75f731cf9fc93f7487eb72de3fcf7b1">internal_rem_succ</a>(buffer_operation *op)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></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="a00268.html">tbb::priority_queue_node< T, Compare ></a>)</td><td><a class="el" href="a00268.html">tbb::priority_queue_node< T, Compare ></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="a00268.html">tbb::priority_queue_node< T, Compare ></a>)</td><td><a class="el" href="a00268.html">tbb::priority_queue_node< T, Compare ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_aggregator</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_array</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_array_size</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_head</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_mutex</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_parent</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_reserved</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_reserved_id</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_successors</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>my_tail</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>op_stat</b> enum name (defined in <a class="el" href="a00268.html">tbb::priority_queue_node< T, Compare ></a>)</td><td><a class="el" href="a00268.html">tbb::priority_queue_node< T, Compare ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>op_type</b> enum name (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00268.html#3b3fa4479416e7cb6d4a6a4b175c2b15">output_type</a> typedef</td><td><a class="el" href="a00268.html">tbb::priority_queue_node< T, Compare ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00268.html#98900a87758cac05500fcbc74113cebf">predecessor_type</a> typedef</td><td><a class="el" href="a00268.html">tbb::priority_queue_node< T, Compare ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>prio_operation</b> typedef (defined in <a class="el" href="a00268.html">tbb::priority_queue_node< T, Compare ></a>)</td><td><a class="el" href="a00268.html">tbb::priority_queue_node< T, Compare ></a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00268.html#1630f68674c4b201346a391b1e8d3f5d">priority_queue_node</a>(graph &g)</td><td><a class="el" href="a00268.html">tbb::priority_queue_node< T, Compare ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>put_item</b> enum value (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>reg_succ</b> enum value (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00277.html#14ae737c8fca4c8bf8e1a736dfbac444">register_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00277.html">tbb::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00225.html#cd2ef588b0ee6eb8d23ee169e00c73a9">register_successor</a>(receiver< output_type > &r)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></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="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>rem_succ</b> enum value (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00277.html#d2f23b40b328dc254a7c2a0a30f408e4">remove_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00277.html">tbb::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00225.html#415428db02e74a479fb056a8ed72ba53">remove_successor</a>(receiver< output_type > &r)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></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="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>res_item</b> enum value (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>size_type</b> typedef (defined in <a class="el" href="a00268.html">tbb::priority_queue_node< T, Compare ></a>)</td><td><a class="el" href="a00268.html">tbb::priority_queue_node< T, Compare ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>SUCCEEDED</b> enum value (defined in <a class="el" href="a00268.html">tbb::priority_queue_node< T, Compare ></a>)</td><td><a class="el" href="a00268.html">tbb::priority_queue_node< T, Compare ></a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00268.html#e01014f2e5ceea292c68f6fe47391c57">successor_type</a> typedef</td><td><a class="el" href="a00268.html">tbb::priority_queue_node< T, Compare ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00225.html#46b8b257a97e2192a2b11743279e8ffe">try_consume</a>()</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></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="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00225.html#b68bdec127703dbfb2d93d685abbfd67">try_get</a>(T &v)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00225.html#f74899ffb67687998168ad428f586b64">try_put</a>(T t)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00225.html#435e29a66f0719d4822a0a8dc78a0405">try_release</a>()</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00225.html#11ebad4c72082a1a03ecccd3afab4ae2">try_reserve</a>(T &v)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>WAIT</b> enum value (defined in <a class="el" href="a00268.html">tbb::priority_queue_node< T, Compare ></a>)</td><td><a class="el" href="a00268.html">tbb::priority_queue_node< T, Compare ></a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>~buffer_node</b>() (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>~graph_node</b>() (defined in <a class="el" href="a00251.html">tbb::graph_node</a>)</td><td><a class="el" href="a00251.html">tbb::graph_node</a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00277.html#18f74b83abae0ee1e4ce07942797ef27">~receiver</a>()</td><td><a class="el" href="a00277.html">tbb::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>~sender</b>() (defined in <a class="el" href="a00282.html">tbb::sender< T ></a>)</td><td><a class="el" href="a00282.html">tbb::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="a00287.html">tbb::flow::interface6::queue_node< T, A ></a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00237.html#5fe4b79f780586ff66e002ce32a5c60d">buffer_node</a>(graph &g)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00237.html#03ad7b85a8341437f584af06ad050cdc">buffer_node</a>(const buffer_node &src)</td><td><a class="el" href="a00237.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="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.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="a00287.html">tbb::flow::interface6::queue_node< T, A ></a>)</td><td><a class="el" href="a00287.html">tbb::flow::interface6::queue_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00237.html#2648324ce0a38b40132b8502ef250e3a">forward</a>()</td><td><a class="el" href="a00237.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="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>handle_operations</b>(buffer_operation *op_list) (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.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="a00287.html#1e71030845210b6c4c7380eb9e11a2ac">input_type</a> typedef</td><td><a class="el" href="a00287.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="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.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="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.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="a00287.html">tbb::flow::interface6::queue_node< T, A ></a>)</td><td><a class="el" href="a00287.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="a00287.html#eadcbbb81f9a9d223afabe0f40e77ecb">internal_forward</a>(queue_operation *op)</td><td><a class="el" href="a00287.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="a00287.html">tbb::flow::interface6::queue_node< T, A ></a>)</td><td><a class="el" href="a00287.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="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.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="a00237.html#df21388252b8963e839dca29d2c67ea5">internal_reg_succ</a>(buffer_operation *op)</td><td><a class="el" href="a00237.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="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.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="a00237.html#6b6cf76dff80fd679251da93351c1291">internal_rem_succ</a>(buffer_operation *op)</td><td><a class="el" href="a00237.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="a00287.html">tbb::flow::interface6::queue_node< T, A ></a>)</td><td><a class="el" href="a00287.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="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.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="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>my_handler</b> typedef (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.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="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.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="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>op_stat</b> enum name (defined in <a class="el" href="a00287.html">tbb::flow::interface6::queue_node< T, A ></a>)</td><td><a class="el" href="a00287.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="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00287.html#25b5a53ab1f9a342644fa3759bc0b1ad">output_type</a> typedef</td><td><a class="el" href="a00287.html">tbb::flow::interface6::queue_node< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00287.html#5e2fdd33c45d44549dee9c1638e19898">predecessor_type</a> typedef</td><td><a class="el" href="a00287.html">tbb::flow::interface6::queue_node< T, A ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>put_item</b> enum value (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00287.html#c716593a92448b0f429d1f3a38e67996">queue_node</a>(graph &g)</td><td><a class="el" href="a00287.html">tbb::flow::interface6::queue_node< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00287.html#0226762d9ebba28311b7b1518d948ab1">queue_node</a>(const queue_node &src)</td><td><a class="el" href="a00287.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="a00287.html">tbb::flow::interface6::queue_node< T, A ></a>)</td><td><a class="el" href="a00287.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="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00295.html#30e3316466efe3a713c23062b6e806f3">register_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00295.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00237.html#f8bf4944ede4fc106423d67715beb695">register_successor</a>(receiver< output_type > &r)</td><td><a class="el" href="a00237.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="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.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="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00295.html#3bc76547b51d3c9b633e3987d22dce95">remove_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00295.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00237.html#2074da0e39b9477c32897d6e5786196f">remove_successor</a>(receiver< output_type > &r)</td><td><a class="el" href="a00237.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="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.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="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.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="a00287.html">tbb::flow::interface6::queue_node< T, A ></a>)</td><td><a class="el" href="a00287.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="a00287.html">tbb::flow::interface6::queue_node< T, A ></a>)</td><td><a class="el" href="a00287.html">tbb::flow::interface6::queue_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00287.html#f35076a19f256f9e7a61bed77ca1ccc5">successor_type</a> typedef</td><td><a class="el" href="a00287.html">tbb::flow::interface6::queue_node< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00237.html#8ef07c434eb763d947a7b4e80c086a49">try_consume</a>()</td><td><a class="el" href="a00237.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="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00237.html#aeb8aec46ca99ca022356a792c46735e">try_get</a>(T &v)</td><td><a class="el" href="a00237.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="a00237.html#2b02fe332e704bbe14f297802298b63a">try_put</a>(const T &t)</td><td><a class="el" href="a00237.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="a00237.html#2c8e8f2f5f4ff5be27136cc1184a3c3e">try_release</a>()</td><td><a class="el" href="a00237.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="a00237.html#1cc889bb6c38bcb81757d0ebbc3a5e64">try_reserve</a>(T &v)</td><td><a class="el" href="a00237.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="a00287.html">tbb::flow::interface6::queue_node< T, A ></a>)</td><td><a class="el" href="a00287.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="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.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="a00263.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::graph_node</a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00295.html#b00699b235435f7b65b663d5063624a1">~receiver</a>()</td><td><a class="el" href="a00295.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="a00301.html">tbb::flow::interface6::sender< T ></a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00061.html b/doc/html/a00061.html
index cb52008..f27772f 100644
--- a/doc/html/a00061.html
+++ b/doc/html/a00061.html
@@ -20,29 +20,64 @@
<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::limiter_node< T > Member List</h1>This is the complete list of members for <a class="el" href="a00255.html">tbb::limiter_node< T ></a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00255.html#181fa37d3e3c68ec3819ea46beed79a2">decrement</a></td><td><a class="el" href="a00255.html">tbb::limiter_node< T ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00255.html#f654b8974c613e8fd3de5a40e181d5ff">input_type</a> typedef</td><td><a class="el" href="a00255.html">tbb::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="a00255.html">tbb::limiter_node< T ></a>)</td><td><a class="el" href="a00255.html">tbb::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="a00255.html">tbb::limiter_node< T ></a>)</td><td><a class="el" href="a00255.html">tbb::limiter_node< T ></a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00255.html#f0139fc645a51ce30b7aebb59c38a4ed">limiter_node</a>(graph &g, size_t threshold, int number_of_decrement_predecessors=0)</td><td><a class="el" href="a00255.html">tbb::limiter_node< T ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00255.html#370f88278dec6f584c1d08a375f9b4cd">output_type</a> typedef</td><td><a class="el" href="a00255.html">tbb::limiter_node< T ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00255.html#fd88ce7670e7107aef2161b45f156185">predecessor_type</a> typedef</td><td><a class="el" href="a00255.html">tbb::limiter_node< T ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00255.html#fb9909b87538f5c881c7cb7577436d14">register_predecessor</a>(predecessor_type &src)</td><td><a class="el" href="a00255.html">tbb::limiter_node< T ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00277.html#14ae737c8fca4c8bf8e1a736dfbac444">tbb::receiver::register_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00277.html">tbb::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00255.html#b8b9dbfbfc52750fa0c6bb8849681e86">register_successor</a>(receiver< output_type > &r)</td><td><a class="el" href="a00255.html">tbb::limiter_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00255.html#a05cf39b2825183e9c0393890fbbbb41">remove_predecessor</a>(predecessor_type &src)</td><td><a class="el" href="a00255.html">tbb::limiter_node< T ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00277.html#d2f23b40b328dc254a7c2a0a30f408e4">tbb::receiver::remove_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00277.html">tbb::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00255.html#047d77f583e789e6d3ac6a52aba3168b">remove_successor</a>(receiver< output_type > &r)</td><td><a class="el" href="a00255.html">tbb::limiter_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00255.html#754182cc1e5b403201495bc1fd45674b">successor_type</a> typedef</td><td><a class="el" href="a00255.html">tbb::limiter_node< T ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00282.html#add46946c4c7330422733432e4032fac">try_consume</a>()</td><td><a class="el" href="a00282.html">tbb::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00282.html#bf8c9235810354f3353a899c982645de">try_get</a>(T &)</td><td><a class="el" href="a00282.html">tbb::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00255.html#a38facb46cde854cb7408bf9f3bf8999">try_put</a>(T t)</td><td><a class="el" href="a00255.html">tbb::limiter_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00282.html#28c41df1c0c7ed485b4a691ec8f30098">try_release</a>()</td><td><a class="el" href="a00282.html">tbb::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00282.html#3506c7275aeeb2fc3ba5d5f10ee0adac">try_reserve</a>(T &)</td><td><a class="el" href="a00282.html">tbb::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="a00251.html">tbb::graph_node</a>)</td><td><a class="el" href="a00251.html">tbb::graph_node</a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00277.html#18f74b83abae0ee1e4ce07942797ef27">~receiver</a>()</td><td><a class="el" href="a00277.html">tbb::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>~sender</b>() (defined in <a class="el" href="a00282.html">tbb::sender< T ></a>)</td><td><a class="el" href="a00282.html">tbb::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="a00302.html">tbb::flow::interface6::sequencer_node< T, A ></a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00237.html#5fe4b79f780586ff66e002ce32a5c60d">buffer_node</a>(graph &g)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00237.html#03ad7b85a8341437f584af06ad050cdc">buffer_node</a>(const buffer_node &src)</td><td><a class="el" href="a00237.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="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.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="a00302.html">tbb::flow::interface6::sequencer_node< T, A ></a>)</td><td><a class="el" href="a00302.html">tbb::flow::interface6::sequencer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00237.html#2648324ce0a38b40132b8502ef250e3a">forward</a>()</td><td><a class="el" href="a00237.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="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>handle_operations</b>(buffer_operation *op_list) (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.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="a00302.html#af629f26832ff4e476e240637a78bc0c">input_type</a> typedef</td><td><a class="el" href="a00302.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="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.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="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.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="a00287.html">tbb::flow::interface6::queue_node< T, A ></a>)</td><td><a class="el" href="a00287.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="a00287.html#eadcbbb81f9a9d223afabe0f40e77ecb">internal_forward</a>(queue_operation *op)</td><td><a class="el" href="a00287.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="a00287.html">tbb::flow::interface6::queue_node< T, A ></a>)</td><td><a class="el" href="a00287.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="a00237.html#df21388252b8963e839dca29d2c67ea5">internal_reg_succ</a>(buffer_operation *op)</td><td><a class="el" href="a00237.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="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.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="a00237.html#6b6cf76dff80fd679251da93351c1291">internal_rem_succ</a>(buffer_operation *op)</td><td><a class="el" href="a00237.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="a00287.html">tbb::flow::interface6::queue_node< T, A ></a>)</td><td><a class="el" href="a00287.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="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.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="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>my_handler</b> typedef (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.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="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.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="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>op_stat</b> enum name (defined in <a class="el" href="a00302.html">tbb::flow::interface6::sequencer_node< T, A ></a>)</td><td><a class="el" href="a00302.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="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00302.html#ca026eaef70e35791c407323199031a7">output_type</a> typedef</td><td><a class="el" href="a00302.html">tbb::flow::interface6::sequencer_node< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00302.html#8127e36811832563fe1e9bc3ba391f79">predecessor_type</a> typedef</td><td><a class="el" href="a00302.html">tbb::flow::interface6::sequencer_node< T, A ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>put_item</b> enum value (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00287.html#c716593a92448b0f429d1f3a38e67996">queue_node</a>(graph &g)</td><td><a class="el" href="a00287.html">tbb::flow::interface6::queue_node< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00287.html#0226762d9ebba28311b7b1518d948ab1">queue_node</a>(const queue_node &src)</td><td><a class="el" href="a00287.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="a00287.html">tbb::flow::interface6::queue_node< T, A ></a>)</td><td><a class="el" href="a00287.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="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00295.html#30e3316466efe3a713c23062b6e806f3">register_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00295.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00237.html#f8bf4944ede4fc106423d67715beb695">register_successor</a>(receiver< output_type > &r)</td><td><a class="el" href="a00237.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="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.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="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00295.html#3bc76547b51d3c9b633e3987d22dce95">remove_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00295.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00237.html#2074da0e39b9477c32897d6e5786196f">remove_successor</a>(receiver< output_type > &r)</td><td><a class="el" href="a00237.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="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.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="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00302.html#7e71cbdf78f989091bc162b89bee7e66">sequencer_node</a>(graph &g, const Sequencer &s)</td><td><a class="el" href="a00302.html">tbb::flow::interface6::sequencer_node< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00302.html#b38e7a070552960384bcc1d91af13a5c">sequencer_node</a>(const sequencer_node &src)</td><td><a class="el" href="a00302.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="a00302.html">tbb::flow::interface6::sequencer_node< T, A ></a>)</td><td><a class="el" href="a00302.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="a00302.html">tbb::flow::interface6::sequencer_node< T, A ></a>)</td><td><a class="el" href="a00302.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="a00302.html">tbb::flow::interface6::sequencer_node< T, A ></a>)</td><td><a class="el" href="a00302.html">tbb::flow::interface6::sequencer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00302.html#795f3ee75f133b9d3b159172fc4a197f">successor_type</a> typedef</td><td><a class="el" href="a00302.html">tbb::flow::interface6::sequencer_node< T, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00237.html#8ef07c434eb763d947a7b4e80c086a49">try_consume</a>()</td><td><a class="el" href="a00237.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="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00237.html#aeb8aec46ca99ca022356a792c46735e">try_get</a>(T &v)</td><td><a class="el" href="a00237.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="a00237.html#2b02fe332e704bbe14f297802298b63a">try_put</a>(const T &t)</td><td><a class="el" href="a00237.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="a00237.html#2c8e8f2f5f4ff5be27136cc1184a3c3e">try_release</a>()</td><td><a class="el" href="a00237.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="a00237.html#1cc889bb6c38bcb81757d0ebbc3a5e64">try_reserve</a>(T &v)</td><td><a class="el" href="a00237.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="a00302.html">tbb::flow::interface6::sequencer_node< T, A ></a>)</td><td><a class="el" href="a00302.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="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.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="a00263.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::graph_node</a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00295.html#b00699b235435f7b65b663d5063624a1">~receiver</a>()</td><td><a class="el" href="a00295.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="a00301.html">tbb::flow::interface6::sender< T ></a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00302.html#93d3d8f6a72b3e1387047282116ed6ee">~sequencer_node</a>()</td><td><a class="el" href="a00302.html">tbb::flow::interface6::sequencer_node< T, A ></a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00062.html b/doc/html/a00062.html
new file mode 100644
index 0000000..732e8c7
--- /dev/null
+++ b/doc/html/a00062.html
@@ -0,0 +1,87 @@
+<!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="a00286.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="a00237.html#5fe4b79f780586ff66e002ce32a5c60d">buffer_node</a>(graph &g)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00237.html#03ad7b85a8341437f584af06ad050cdc">buffer_node</a>(const buffer_node &src)</td><td><a class="el" href="a00237.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="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.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="a00286.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>)</td><td><a class="el" href="a00286.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="a00237.html#2648324ce0a38b40132b8502ef250e3a">forward</a>()</td><td><a class="el" href="a00237.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="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>handle_operations</b>(prio_operation *op_list) (defined in <a class="el" href="a00286.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>)</td><td><a class="el" href="a00286.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="a00286.html#b2829b518979874ad3d2a939e14ae7bd">input_type</a> typedef</td><td><a class="el" href="a00286.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="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.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="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.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="a00286.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>)</td><td><a class="el" href="a00286.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="a00286.html#ed2d8dc0a9c1c2571e4a69df2f2209e5">internal_forward</a>(prio_operation *op)</td><td><a class="el" href="a00286.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="a00286.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>)</td><td><a class="el" href="a00286.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="a00286.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>)</td><td><a class="el" href="a00286.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="a00237.html#df21388252b8963e839dca29d2c67ea5">internal_reg_succ</a>(buffer_operation *op)</td><td><a class="el" href="a00237.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="a00286.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>)</td><td><a class="el" href="a00286.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="a00237.html#6b6cf76dff80fd679251da93351c1291">internal_rem_succ</a>(buffer_operation *op)</td><td><a class="el" href="a00237.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="a00286.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>)</td><td><a class="el" href="a00286.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="a00286.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>)</td><td><a class="el" href="a00286.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="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.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="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>my_handler</b> typedef (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.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="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.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="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>op_stat</b> enum name (defined in <a class="el" href="a00286.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>)</td><td><a class="el" href="a00286.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="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00286.html#2cb099b590246b6bc93cc15e78c6ee5c">output_type</a> typedef</td><td><a class="el" href="a00286.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00286.html#fdea783bf9d5a4c98e794ac7e0f84ccf">predecessor_type</a> typedef</td><td><a class="el" href="a00286.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>prio_operation</b> typedef (defined in <a class="el" href="a00286.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>)</td><td><a class="el" href="a00286.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="a00286.html#497ec2612615249bf5a294eb1b7b93b3">priority_queue_node</a>(graph &g)</td><td><a class="el" href="a00286.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="a00286.html#17a4f66e23d54100b64805405e905d62">priority_queue_node</a>(const priority_queue_node &src)</td><td><a class="el" href="a00286.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="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.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="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00295.html#30e3316466efe3a713c23062b6e806f3">register_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00295.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00237.html#f8bf4944ede4fc106423d67715beb695">register_successor</a>(receiver< output_type > &r)</td><td><a class="el" href="a00237.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="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.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="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00295.html#3bc76547b51d3c9b633e3987d22dce95">remove_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00295.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00237.html#2074da0e39b9477c32897d6e5786196f">remove_successor</a>(receiver< output_type > &r)</td><td><a class="el" href="a00237.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="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.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="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.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="a00286.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>)</td><td><a class="el" href="a00286.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="a00286.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>)</td><td><a class="el" href="a00286.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="a00286.html#09ab5064ca8192e68c03da47603e68eb">successor_type</a> typedef</td><td><a class="el" href="a00286.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00237.html#8ef07c434eb763d947a7b4e80c086a49">try_consume</a>()</td><td><a class="el" href="a00237.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="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00237.html#aeb8aec46ca99ca022356a792c46735e">try_get</a>(T &v)</td><td><a class="el" href="a00237.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="a00237.html#2b02fe332e704bbe14f297802298b63a">try_put</a>(const T &t)</td><td><a class="el" href="a00237.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="a00237.html#2c8e8f2f5f4ff5be27136cc1184a3c3e">try_release</a>()</td><td><a class="el" href="a00237.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="a00237.html#1cc889bb6c38bcb81757d0ebbc3a5e64">try_reserve</a>(T &v)</td><td><a class="el" href="a00237.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="a00286.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>)</td><td><a class="el" href="a00286.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="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.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="a00263.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::graph_node</a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00295.html#b00699b235435f7b65b663d5063624a1">~receiver</a>()</td><td><a class="el" href="a00295.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="a00301.html">tbb::flow::interface6::sender< T ></a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+</table><hr>
+<p></p>
+Copyright © 2005-2011 Intel Corporation. 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/a00063.html b/doc/html/a00063.html
new file mode 100644
index 0000000..f2b4661
--- /dev/null
+++ b/doc/html/a00063.html
@@ -0,0 +1,55 @@
+<!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="a00266.html">tbb::flow::interface6::limiter_node< T ></a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00266.html#a3344b2461966631b6ee34b79fb105c7">decrement</a></td><td><a class="el" href="a00266.html">tbb::flow::interface6::limiter_node< T ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00266.html#035196d3c9240ef041f528ebcde8baa7">input_type</a> typedef</td><td><a class="el" href="a00266.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="a00266.html">tbb::flow::interface6::limiter_node< T ></a>)</td><td><a class="el" href="a00266.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="a00266.html">tbb::flow::interface6::limiter_node< T ></a>)</td><td><a class="el" href="a00266.html">tbb::flow::interface6::limiter_node< T ></a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00266.html#831b06576f46fe2bf3ed0f86b793c1b2">limiter_node</a>(graph &g, size_t threshold, int num_decrement_predecessors=0)</td><td><a class="el" href="a00266.html">tbb::flow::interface6::limiter_node< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00266.html#83d3ab884543b070ee5b345a87f241fa">limiter_node</a>(const limiter_node &src)</td><td><a class="el" href="a00266.html">tbb::flow::interface6::limiter_node< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00266.html#6e67fc480147c0b88a483b85db6457b0">output_type</a> typedef</td><td><a class="el" href="a00266.html">tbb::flow::interface6::limiter_node< T ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00266.html#f89fcf44f38eb33f965ee5362d3e68e9">predecessor_type</a> typedef</td><td><a class="el" href="a00266.html">tbb::flow::interface6::limiter_node< T ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00266.html#de70a0e88ce7655d8c14b6af57f7496f">register_predecessor</a>(predecessor_type &src)</td><td><a class="el" href="a00266.html">tbb::flow::interface6::limiter_node< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00295.html#30e3316466efe3a713c23062b6e806f3">tbb::flow::interface6::receiver::register_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00295.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00266.html#c76561d8d871b4769876988a4de12a9b">register_successor</a>(receiver< output_type > &r)</td><td><a class="el" href="a00266.html">tbb::flow::interface6::limiter_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00266.html#c530e7b469454e2340460795f2da3317">remove_predecessor</a>(predecessor_type &src)</td><td><a class="el" href="a00266.html">tbb::flow::interface6::limiter_node< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00295.html#3bc76547b51d3c9b633e3987d22dce95">tbb::flow::interface6::receiver::remove_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00295.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00266.html#275e328063c121b3e506ccef2a825d28">remove_successor</a>(receiver< output_type > &r)</td><td><a class="el" href="a00266.html">tbb::flow::interface6::limiter_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00266.html#e8945e4dd6ea759ff9e4735da13f12ef">successor_type</a> typedef</td><td><a class="el" href="a00266.html">tbb::flow::interface6::limiter_node< T ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00301.html#7b840f50da117a0d6848707c1857ea2e">try_consume</a>()</td><td><a class="el" href="a00301.html">tbb::flow::interface6::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00301.html#922fb56b0aad090b90a98b7d56b76a59">try_get</a>(T &)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00266.html#55a02d458a4d8ffa6accd7a70605da2f">try_put</a>(const T &t)</td><td><a class="el" href="a00266.html">tbb::flow::interface6::limiter_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00301.html#27036b06d6a91e97007e14f400529199">try_release</a>()</td><td><a class="el" href="a00301.html">tbb::flow::interface6::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00301.html#02c05b472271db1b68a48ea2618fa72f">try_reserve</a>(T &)</td><td><a class="el" href="a00301.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="a00263.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::graph_node</a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00295.html#b00699b235435f7b65b663d5063624a1">~receiver</a>()</td><td><a class="el" href="a00295.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="a00301.html">tbb::flow::interface6::sender< T ></a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+</table><hr>
+<p></p>
+Copyright © 2005-2011 Intel Corporation. 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/a00065.html b/doc/html/a00065.html
deleted file mode 100644
index f9800d9..0000000
--- a/doc/html/a00065.html
+++ /dev/null
@@ -1,44 +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::two_phase_port< T > Member List</h1>This is the complete list of members for <a class="el" href="a00304.html">tbb::internal::two_phase_port< T ></a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00304.html#684f6bbc3290270ed43cb34ffd273f71">consume</a>()</td><td><a class="el" href="a00304.html">tbb::internal::two_phase_port< T ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00304.html#0f464d59e15941d6d625e8c7d634e26b">input_type</a> typedef</td><td><a class="el" href="a00304.html">tbb::internal::two_phase_port< T ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00304.html#37ee9b5320b631c39bccc0b4745d88d1">predecessor_type</a> typedef</td><td><a class="el" href="a00304.html">tbb::internal::two_phase_port< T ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00304.html#6dc1f9bf02109c7f6fe4cc58bc31a00c">register_predecessor</a>(sender< T > &src)</td><td><a class="el" href="a00304.html">tbb::internal::two_phase_port< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00304.html#091f6efffaadbbeca6cf23483dabd891">release</a>()</td><td><a class="el" href="a00304.html">tbb::internal::two_phase_port< T ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00304.html#a734a55289804ff34ce1c6ac4c5075e4">remove_predecessor</a>(sender< T > &src)</td><td><a class="el" href="a00304.html">tbb::internal::two_phase_port< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00304.html#1d7399cfc77fca8878d8d16049ce4e7e">reserve</a>(T &v)</td><td><a class="el" href="a00304.html">tbb::internal::two_phase_port< T ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>set_join_node_pointer</b>(forwarding_base *join) (defined in <a class="el" href="a00304.html">tbb::internal::two_phase_port< T ></a>)</td><td><a class="el" href="a00304.html">tbb::internal::two_phase_port< T ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00304.html#f316c0d5ff67068ff23b684accbe87f4">try_put</a>(T)</td><td><a class="el" href="a00304.html">tbb::internal::two_phase_port< T ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00304.html#60e17ef935031c86c4a288eafab5c066">two_phase_port</a>()</td><td><a class="el" href="a00304.html">tbb::internal::two_phase_port< T ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>two_phase_port</b>(const two_phase_port &) (defined in <a class="el" href="a00304.html">tbb::internal::two_phase_port< T ></a>)</td><td><a class="el" href="a00304.html">tbb::internal::two_phase_port< T ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00277.html#18f74b83abae0ee1e4ce07942797ef27">~receiver</a>()</td><td><a class="el" href="a00277.html">tbb::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-</table><hr>
-<p></p>
-Copyright © 2005-2011 Intel Corporation. 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/a00067.html b/doc/html/a00067.html
deleted file mode 100644
index 6b72233..0000000
--- a/doc/html/a00067.html
+++ /dev/null
@@ -1,48 +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::join_node_base< JP, InputTuple, OutputTuple > Member List</h1>This is the complete list of members for <a class="el" href="a00254.html">tbb::internal::join_node_base< JP, InputTuple, OutputTuple ></a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>forward_task< join_node_base< JP, InputTuple, OutputTuple > ></b> (defined in <a class="el" href="a00254.html">tbb::internal::join_node_base< JP, InputTuple, OutputTuple ></a>)</td><td><a class="el" href="a00254.html">tbb::internal::join_node_base< JP, InputTuple, OutputTuple ></a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>input_port</b>(void) (defined in <a class="el" href="a00254.html">tbb::internal::join_node_base< JP, InputTuple, OutputTuple ></a>)</td><td><a class="el" href="a00254.html">tbb::internal::join_node_base< JP, InputTuple, OutputTuple ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>input_ports_type</b> typedef (defined in <a class="el" href="a00254.html">tbb::internal::join_node_base< JP, InputTuple, OutputTuple ></a>)</td><td><a class="el" href="a00254.html">tbb::internal::join_node_base< JP, InputTuple, OutputTuple ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>join_node_base</b>(graph &g) (defined in <a class="el" href="a00254.html">tbb::internal::join_node_base< JP, InputTuple, OutputTuple ></a>)</td><td><a class="el" href="a00254.html">tbb::internal::join_node_base< JP, InputTuple, OutputTuple ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00254.html#578893d923f91b7e44a15dea8b0d7082">output_type</a> typedef</td><td><a class="el" href="a00254.html">tbb::internal::join_node_base< JP, InputTuple, OutputTuple ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>register_successor</b>(successor_type &r) (defined in <a class="el" href="a00254.html">tbb::internal::join_node_base< JP, InputTuple, OutputTuple ></a>)</td><td><a class="el" href="a00254.html">tbb::internal::join_node_base< JP, InputTuple, OutputTuple ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00282.html#be48ac70174cf8e08e2b0279cd6343d3">tbb::sender< OutputTuple >::register_successor</a>(successor_type &r)=0</td><td><a class="el" href="a00282.html">tbb::sender< OutputTuple ></a></td><td><code> [pure virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>remove_successor</b>(successor_type &r) (defined in <a class="el" href="a00254.html">tbb::internal::join_node_base< JP, InputTuple, OutputTuple ></a>)</td><td><a class="el" href="a00254.html">tbb::internal::join_node_base< JP, InputTuple, OutputTuple ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00282.html#3f345427e812e8741370308ff88f30bf">tbb::sender< OutputTuple >::remove_successor</a>(successor_type &r)=0</td><td><a class="el" href="a00282.html">tbb::sender< OutputTuple ></a></td><td><code> [pure virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00254.html#1212cbaa293a93c3bf334da1539556bd">successor_type</a> typedef</td><td><a class="el" href="a00254.html">tbb::internal::join_node_base< JP, InputTuple, OutputTuple ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00282.html#add46946c4c7330422733432e4032fac">try_consume</a>()</td><td><a class="el" href="a00282.html">tbb::sender< OutputTuple ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00254.html#50c0e6465ac929a2e94d4e62a13ebeff">try_get</a>(output_type &v)</td><td><a class="el" href="a00254.html">tbb::internal::join_node_base< JP, InputTuple, OutputTuple ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00282.html#28c41df1c0c7ed485b4a691ec8f30098">try_release</a>()</td><td><a class="el" href="a00282.html">tbb::sender< OutputTuple ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00282.html#3506c7275aeeb2fc3ba5d5f10ee0adac">try_reserve</a>(OutputTuple &)</td><td><a class="el" href="a00282.html">tbb::sender< OutputTuple ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>~graph_node</b>() (defined in <a class="el" href="a00251.html">tbb::graph_node</a>)</td><td><a class="el" href="a00251.html">tbb::graph_node</a></td><td><code> [inline, virtual]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>~sender</b>() (defined in <a class="el" href="a00282.html">tbb::sender< OutputTuple ></a>)</td><td><a class="el" href="a00282.html">tbb::sender< OutputTuple ></a></td><td><code> [inline, virtual]</code></td></tr>
-</table><hr>
-<p></p>
-Copyright © 2005-2011 Intel Corporation. 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/a00068.html b/doc/html/a00068.html
new file mode 100644
index 0000000..16915ab
--- /dev/null
+++ b/doc/html/a00068.html
@@ -0,0 +1,54 @@
+<!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="a00270.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="a00270.html">tbb::interface6::memory_pool_allocator< T, P ></a>)</td><td><a class="el" href="a00270.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="a00270.html">tbb::interface6::memory_pool_allocator< T, P ></a>)</td><td><a class="el" href="a00270.html">tbb::interface6::memory_pool_allocator< T, P ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00270.html#365bd64d284c80d85bb2149a12681526">allocate</a>(size_type n, const void *=0)</td><td><a class="el" href="a00270.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="a00270.html">tbb::interface6::memory_pool_allocator< T, P ></a>)</td><td><a class="el" href="a00270.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="a00270.html">tbb::interface6::memory_pool_allocator< T, P ></a>)</td><td><a class="el" href="a00270.html">tbb::interface6::memory_pool_allocator< T, P ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00270.html#c7e1671b725894b94ce9a6ac544e24f2">construct</a>(pointer p, const value_type &value)</td><td><a class="el" href="a00270.html">tbb::interface6::memory_pool_allocator< T, P ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00270.html#4e24a03de38638af07548383024c54ab">deallocate</a>(pointer p, size_type)</td><td><a class="el" href="a00270.html">tbb::interface6::memory_pool_allocator< T, P ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00270.html#a3af27e1f8535cc512134ec9a82ff4fc">destroy</a>(pointer p)</td><td><a class="el" href="a00270.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="a00270.html">tbb::interface6::memory_pool_allocator< T, P ></a>)</td><td><a class="el" href="a00270.html">tbb::interface6::memory_pool_allocator< T, P ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00270.html#beebdb6144df8ba219fadfad4de866ea">max_size</a>() const </td><td><a class="el" href="a00270.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="a00270.html">tbb::interface6::memory_pool_allocator< T, P ></a>)</td><td><a class="el" href="a00270.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="a00270.html">tbb::interface6::memory_pool_allocator< T, P ></a>)</td><td><a class="el" href="a00270.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="a00270.html">tbb::interface6::memory_pool_allocator< T, P ></a>)</td><td><a class="el" href="a00270.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="a00270.html">tbb::interface6::memory_pool_allocator< T, P ></a>)</td><td><a class="el" href="a00270.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="a00270.html">tbb::interface6::memory_pool_allocator< T, P ></a>)</td><td><a class="el" href="a00270.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="a00270.html">tbb::interface6::memory_pool_allocator< T, P ></a>)</td><td><a class="el" href="a00270.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="a00270.html">tbb::interface6::memory_pool_allocator< T, P ></a>)</td><td><a class="el" href="a00270.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="a00270.html">tbb::interface6::memory_pool_allocator< T, P ></a>)</td><td><a class="el" href="a00270.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="a00270.html">tbb::interface6::memory_pool_allocator< T, P ></a>)</td><td><a class="el" href="a00270.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="a00270.html">tbb::interface6::memory_pool_allocator< T, P ></a>)</td><td><a class="el" href="a00270.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="a00270.html">tbb::interface6::memory_pool_allocator< T, P ></a>)</td><td><a class="el" href="a00270.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="a00270.html">tbb::interface6::memory_pool_allocator< T, P ></a>)</td><td><a class="el" href="a00270.html">tbb::interface6::memory_pool_allocator< T, P ></a></td><td></td></tr>
+</table><hr>
+<p></p>
+Copyright © 2005-2011 Intel Corporation. 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/a00070.html b/doc/html/a00070.html
new file mode 100644
index 0000000..d0209ee
--- /dev/null
+++ b/doc/html/a00070.html
@@ -0,0 +1,43 @@
+<!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< void, P > Member List</h1>This is the complete list of members for <a class="el" href="a00271.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="a00271.html">tbb::interface6::memory_pool_allocator< void, P ></a>)</td><td><a class="el" href="a00271.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="a00271.html">tbb::interface6::memory_pool_allocator< void, P ></a>)</td><td><a class="el" href="a00271.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="a00271.html">tbb::interface6::memory_pool_allocator< void, P ></a>)</td><td><a class="el" href="a00271.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="a00271.html">tbb::interface6::memory_pool_allocator< void, P ></a>)</td><td><a class="el" href="a00271.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="a00271.html">tbb::interface6::memory_pool_allocator< void, P ></a>)</td><td><a class="el" href="a00271.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="a00271.html">tbb::interface6::memory_pool_allocator< void, P ></a>)</td><td><a class="el" href="a00271.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="a00271.html">tbb::interface6::memory_pool_allocator< void, P ></a>)</td><td><a class="el" href="a00271.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="a00271.html">tbb::interface6::memory_pool_allocator< void, P ></a>)</td><td><a class="el" href="a00271.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="a00271.html">tbb::interface6::memory_pool_allocator< void, P ></a>)</td><td><a class="el" href="a00271.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="a00271.html">tbb::interface6::memory_pool_allocator< void, P ></a>)</td><td><a class="el" href="a00271.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="a00271.html">tbb::interface6::memory_pool_allocator< void, P ></a>)</td><td><a class="el" href="a00271.html">tbb::interface6::memory_pool_allocator< void, P ></a></td><td></td></tr>
+</table><hr>
+<p></p>
+Copyright © 2005-2011 Intel Corporation. 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/a00040.html b/doc/html/a00072.html
similarity index 66%
rename from doc/html/a00040.html
rename to doc/html/a00072.html
index 603513a..13cb414 100644
--- a/doc/html/a00040.html
+++ b/doc/html/a00072.html
@@ -20,8 +20,9 @@
<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::graph_node Member List</h1>This is the complete list of members for <a class="el" href="a00251.html">tbb::graph_node</a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>~graph_node</b>() (defined in <a class="el" href="a00251.html">tbb::graph_node</a>)</td><td><a class="el" href="a00251.html">tbb::graph_node</a></td><td><code> [inline, virtual]</code></td></tr>
+<h1>tbb::interface6::memory_pool< Alloc > Member List</h1>This is the complete list of members for <a class="el" href="a00269.html">tbb::interface6::memory_pool< Alloc ></a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00269.html#2822528265718a4c779591fc37c02ca8">memory_pool</a>(const Alloc &src=Alloc())</td><td><a class="el" href="a00269.html">tbb::interface6::memory_pool< Alloc ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00269.html#fdad7c4ed08332ec384491a71b721957">~memory_pool</a>()</td><td><a class="el" href="a00269.html">tbb::interface6::memory_pool< Alloc ></a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00078.html b/doc/html/a00074.html
similarity index 55%
copy from doc/html/a00078.html
copy to doc/html/a00074.html
index 575a53d..1a4425d 100644
--- a/doc/html/a00078.html
+++ b/doc/html/a00074.html
@@ -20,24 +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::mutex Member List</h1>This is the complete list of members for <a class="el" href="a00258.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="a00258.html">tbb::mutex</a>)</td><td><a class="el" href="a00258.html">tbb::mutex</a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>HELD</b> enum value (defined in <a class="el" href="a00258.html">tbb::mutex</a>)</td><td><a class="el" href="a00258.html">tbb::mutex</a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>INITIALIZED</b> enum value (defined in <a class="el" href="a00258.html">tbb::mutex</a>)</td><td><a class="el" href="a00258.html">tbb::mutex</a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>is_fair_mutex</b> (defined in <a class="el" href="a00258.html">tbb::mutex</a>)</td><td><a class="el" href="a00258.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="a00258.html">tbb::mutex</a>)</td><td><a class="el" href="a00258.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="a00258.html">tbb::mutex</a>)</td><td><a class="el" href="a00258.html">tbb::mutex</a></td><td><code> [static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00258.html#4470e61c24c129a0299ca6c17240adbb">lock</a>()</td><td><a class="el" href="a00258.html">tbb::mutex</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00258.html#05313cb77d4f85213103d4dab74ed454">mutex</a>()</td><td><a class="el" href="a00258.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="a00258.html">tbb::mutex</a>)</td><td><a class="el" href="a00258.html">tbb::mutex</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00258.html#9f1ec84d5815263ceae853f06ddb4cac">native_handle_type</a> typedef</td><td><a class="el" href="a00258.html">tbb::mutex</a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>native_handle_type</b> typedef (defined in <a class="el" href="a00258.html">tbb::mutex</a>)</td><td><a class="el" href="a00258.html">tbb::mutex</a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>scoped_lock</b> (defined in <a class="el" href="a00258.html">tbb::mutex</a>)</td><td><a class="el" href="a00258.html">tbb::mutex</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00258.html#795649a185b0d6af6dc81c5f378616dd">set_state</a>(state_t to)</td><td><a class="el" href="a00258.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="a00258.html">tbb::mutex</a>)</td><td><a class="el" href="a00258.html">tbb::mutex</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00258.html#4331652c79dea1c1131bd59ab161b234">try_lock</a>()</td><td><a class="el" href="a00258.html">tbb::mutex</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00258.html#5fc9ef443ae75d966695546be399cc6b">unlock</a>()</td><td><a class="el" href="a00258.html">tbb::mutex</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>~mutex</b>() (defined in <a class="el" href="a00258.html">tbb::mutex</a>)</td><td><a class="el" href="a00258.html">tbb::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="a00275.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="a00275.html">tbb::mutex</a>)</td><td><a class="el" href="a00275.html">tbb::mutex</a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>HELD</b> enum value (defined in <a class="el" href="a00275.html">tbb::mutex</a>)</td><td><a class="el" href="a00275.html">tbb::mutex</a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>INITIALIZED</b> enum value (defined in <a class="el" href="a00275.html">tbb::mutex</a>)</td><td><a class="el" href="a00275.html">tbb::mutex</a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>is_fair_mutex</b> (defined in <a class="el" href="a00275.html">tbb::mutex</a>)</td><td><a class="el" href="a00275.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="a00275.html">tbb::mutex</a>)</td><td><a class="el" href="a00275.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="a00275.html">tbb::mutex</a>)</td><td><a class="el" href="a00275.html">tbb::mutex</a></td><td><code> [static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00275.html#4470e61c24c129a0299ca6c17240adbb">lock</a>()</td><td><a class="el" href="a00275.html">tbb::mutex</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00275.html#05313cb77d4f85213103d4dab74ed454">mutex</a>()</td><td><a class="el" href="a00275.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="a00275.html">tbb::mutex</a>)</td><td><a class="el" href="a00275.html">tbb::mutex</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00275.html#9f1ec84d5815263ceae853f06ddb4cac">native_handle_type</a> typedef</td><td><a class="el" href="a00275.html">tbb::mutex</a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>native_handle_type</b> typedef (defined in <a class="el" href="a00275.html">tbb::mutex</a>)</td><td><a class="el" href="a00275.html">tbb::mutex</a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>scoped_lock</b> (defined in <a class="el" href="a00275.html">tbb::mutex</a>)</td><td><a class="el" href="a00275.html">tbb::mutex</a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00275.html#795649a185b0d6af6dc81c5f378616dd">set_state</a>(state_t to)</td><td><a class="el" href="a00275.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="a00275.html">tbb::mutex</a>)</td><td><a class="el" href="a00275.html">tbb::mutex</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00275.html#4331652c79dea1c1131bd59ab161b234">try_lock</a>()</td><td><a class="el" href="a00275.html">tbb::mutex</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00275.html#5fc9ef443ae75d966695546be399cc6b">unlock</a>()</td><td><a class="el" href="a00275.html">tbb::mutex</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>~mutex</b>() (defined in <a class="el" href="a00275.html">tbb::mutex</a>)</td><td><a class="el" href="a00275.html">tbb::mutex</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00079.html b/doc/html/a00075.html
similarity index 69%
copy from doc/html/a00079.html
copy to doc/html/a00075.html
index 57a201f..10c39e2 100644
--- a/doc/html/a00079.html
+++ b/doc/html/a00075.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::mutex::scoped_lock Member List</h1>This is the complete list of members for <a class="el" href="a00259.html">tbb::mutex::scoped_lock</a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00259.html#862e022841cdc522e4296a5533b22efd">acquire</a>(mutex &mutex)</td><td><a class="el" href="a00259.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="a00259.html">tbb::mutex::scoped_lock</a>)</td><td><a class="el" href="a00259.html">tbb::mutex::scoped_lock</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00259.html#0d51d18cd99df3b2e93bf07378d0992c">release</a>()</td><td><a class="el" href="a00259.html">tbb::mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00259.html#1d403ae51b484df5d86d85ae38f11e6e">scoped_lock</a>()</td><td><a class="el" href="a00259.html">tbb::mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00259.html#605a6b9af0f8cdabdf81825e0de99600">scoped_lock</a>(mutex &mutex)</td><td><a class="el" href="a00259.html">tbb::mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00259.html#591e0c49b82bcedffcbe0923f1b915ec">try_acquire</a>(mutex &mutex)</td><td><a class="el" href="a00259.html">tbb::mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00259.html#0ebbbecaf4311e9df7362cb76ceaa368">~scoped_lock</a>()</td><td><a class="el" href="a00259.html">tbb::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="a00276.html">tbb::mutex::scoped_lock</a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00276.html#862e022841cdc522e4296a5533b22efd">acquire</a>(mutex &mutex)</td><td><a class="el" href="a00276.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="a00276.html">tbb::mutex::scoped_lock</a>)</td><td><a class="el" href="a00276.html">tbb::mutex::scoped_lock</a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00276.html#0d51d18cd99df3b2e93bf07378d0992c">release</a>()</td><td><a class="el" href="a00276.html">tbb::mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00276.html#1d403ae51b484df5d86d85ae38f11e6e">scoped_lock</a>()</td><td><a class="el" href="a00276.html">tbb::mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00276.html#605a6b9af0f8cdabdf81825e0de99600">scoped_lock</a>(mutex &mutex)</td><td><a class="el" href="a00276.html">tbb::mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00276.html#591e0c49b82bcedffcbe0923f1b915ec">try_acquire</a>(mutex &mutex)</td><td><a class="el" href="a00276.html">tbb::mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00276.html#0ebbbecaf4311e9df7362cb76ceaa368">~scoped_lock</a>()</td><td><a class="el" href="a00276.html">tbb::mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00080.html b/doc/html/a00076.html
similarity index 76%
copy from doc/html/a00080.html
copy to doc/html/a00076.html
index 641ac00..b744120 100644
--- a/doc/html/a00080.html
+++ b/doc/html/a00076.html
@@ -20,11 +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::null_mutex Member List</h1>This is the complete list of members for <a class="el" href="a00260.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="a00260.html">tbb::null_mutex</a>)</td><td><a class="el" href="a00260.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="a00260.html">tbb::null_mutex</a>)</td><td><a class="el" href="a00260.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="a00260.html">tbb::null_mutex</a>)</td><td><a class="el" href="a00260.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="a00260.html">tbb::null_mutex</a>)</td><td><a class="el" href="a00260.html">tbb::null_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="a00277.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="a00277.html">tbb::null_mutex</a>)</td><td><a class="el" href="a00277.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="a00277.html">tbb::null_mutex</a>)</td><td><a class="el" href="a00277.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="a00277.html">tbb::null_mutex</a>)</td><td><a class="el" href="a00277.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="a00277.html">tbb::null_mutex</a>)</td><td><a class="el" href="a00277.html">tbb::null_mutex</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00081.html b/doc/html/a00077.html
similarity index 73%
rename from doc/html/a00081.html
rename to doc/html/a00077.html
index d215285..b6e3d9d 100644
--- a/doc/html/a00081.html
+++ b/doc/html/a00077.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::null_mutex::scoped_lock Member List</h1>This is the complete list of members for <a class="el" href="a00261.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="a00261.html">tbb::null_mutex::scoped_lock</a>)</td><td><a class="el" href="a00261.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="a00261.html">tbb::null_mutex::scoped_lock</a>)</td><td><a class="el" href="a00261.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="a00261.html">tbb::null_mutex::scoped_lock</a>)</td><td><a class="el" href="a00261.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="a00261.html">tbb::null_mutex::scoped_lock</a>)</td><td><a class="el" href="a00261.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="a00261.html">tbb::null_mutex::scoped_lock</a>)</td><td><a class="el" href="a00261.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="a00261.html">tbb::null_mutex::scoped_lock</a>)</td><td><a class="el" href="a00261.html">tbb::null_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="a00278.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="a00278.html">tbb::null_mutex::scoped_lock</a>)</td><td><a class="el" href="a00278.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="a00278.html">tbb::null_mutex::scoped_lock</a>)</td><td><a class="el" href="a00278.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="a00278.html">tbb::null_mutex::scoped_lock</a>)</td><td><a class="el" href="a00278.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="a00278.html">tbb::null_mutex::scoped_lock</a>)</td><td><a class="el" href="a00278.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="a00278.html">tbb::null_mutex::scoped_lock</a>)</td><td><a class="el" href="a00278.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="a00278.html">tbb::null_mutex::scoped_lock</a>)</td><td><a class="el" href="a00278.html">tbb::null_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00078.html b/doc/html/a00078.html
index 575a53d..6a7c81a 100644
--- a/doc/html/a00078.html
+++ b/doc/html/a00078.html
@@ -20,24 +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::mutex Member List</h1>This is the complete list of members for <a class="el" href="a00258.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="a00258.html">tbb::mutex</a>)</td><td><a class="el" href="a00258.html">tbb::mutex</a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>HELD</b> enum value (defined in <a class="el" href="a00258.html">tbb::mutex</a>)</td><td><a class="el" href="a00258.html">tbb::mutex</a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>INITIALIZED</b> enum value (defined in <a class="el" href="a00258.html">tbb::mutex</a>)</td><td><a class="el" href="a00258.html">tbb::mutex</a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>is_fair_mutex</b> (defined in <a class="el" href="a00258.html">tbb::mutex</a>)</td><td><a class="el" href="a00258.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="a00258.html">tbb::mutex</a>)</td><td><a class="el" href="a00258.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="a00258.html">tbb::mutex</a>)</td><td><a class="el" href="a00258.html">tbb::mutex</a></td><td><code> [static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00258.html#4470e61c24c129a0299ca6c17240adbb">lock</a>()</td><td><a class="el" href="a00258.html">tbb::mutex</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00258.html#05313cb77d4f85213103d4dab74ed454">mutex</a>()</td><td><a class="el" href="a00258.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="a00258.html">tbb::mutex</a>)</td><td><a class="el" href="a00258.html">tbb::mutex</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00258.html#9f1ec84d5815263ceae853f06ddb4cac">native_handle_type</a> typedef</td><td><a class="el" href="a00258.html">tbb::mutex</a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>native_handle_type</b> typedef (defined in <a class="el" href="a00258.html">tbb::mutex</a>)</td><td><a class="el" href="a00258.html">tbb::mutex</a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>scoped_lock</b> (defined in <a class="el" href="a00258.html">tbb::mutex</a>)</td><td><a class="el" href="a00258.html">tbb::mutex</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00258.html#795649a185b0d6af6dc81c5f378616dd">set_state</a>(state_t to)</td><td><a class="el" href="a00258.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="a00258.html">tbb::mutex</a>)</td><td><a class="el" href="a00258.html">tbb::mutex</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00258.html#4331652c79dea1c1131bd59ab161b234">try_lock</a>()</td><td><a class="el" href="a00258.html">tbb::mutex</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00258.html#5fc9ef443ae75d966695546be399cc6b">unlock</a>()</td><td><a class="el" href="a00258.html">tbb::mutex</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>~mutex</b>() (defined in <a class="el" href="a00258.html">tbb::mutex</a>)</td><td><a class="el" href="a00258.html">tbb::mutex</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::null_rw_mutex Member List</h1>This is the complete list of members for <a class="el" href="a00279.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="a00279.html">tbb::null_rw_mutex</a>)</td><td><a class="el" href="a00279.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="a00279.html">tbb::null_rw_mutex</a>)</td><td><a class="el" href="a00279.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="a00279.html">tbb::null_rw_mutex</a>)</td><td><a class="el" href="a00279.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="a00279.html">tbb::null_rw_mutex</a>)</td><td><a class="el" href="a00279.html">tbb::null_rw_mutex</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00079.html b/doc/html/a00079.html
index 57a201f..6c44c19 100644
--- a/doc/html/a00079.html
+++ b/doc/html/a00079.html
@@ -20,14 +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::mutex::scoped_lock Member List</h1>This is the complete list of members for <a class="el" href="a00259.html">tbb::mutex::scoped_lock</a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00259.html#862e022841cdc522e4296a5533b22efd">acquire</a>(mutex &mutex)</td><td><a class="el" href="a00259.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="a00259.html">tbb::mutex::scoped_lock</a>)</td><td><a class="el" href="a00259.html">tbb::mutex::scoped_lock</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00259.html#0d51d18cd99df3b2e93bf07378d0992c">release</a>()</td><td><a class="el" href="a00259.html">tbb::mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00259.html#1d403ae51b484df5d86d85ae38f11e6e">scoped_lock</a>()</td><td><a class="el" href="a00259.html">tbb::mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00259.html#605a6b9af0f8cdabdf81825e0de99600">scoped_lock</a>(mutex &mutex)</td><td><a class="el" href="a00259.html">tbb::mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00259.html#591e0c49b82bcedffcbe0923f1b915ec">try_acquire</a>(mutex &mutex)</td><td><a class="el" href="a00259.html">tbb::mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00259.html#0ebbbecaf4311e9df7362cb76ceaa368">~scoped_lock</a>()</td><td><a class="el" href="a00259.html">tbb::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="a00280.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="a00280.html">tbb::null_rw_mutex::scoped_lock</a>)</td><td><a class="el" href="a00280.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="a00280.html">tbb::null_rw_mutex::scoped_lock</a>)</td><td><a class="el" href="a00280.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="a00280.html">tbb::null_rw_mutex::scoped_lock</a>)</td><td><a class="el" href="a00280.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="a00280.html">tbb::null_rw_mutex::scoped_lock</a>)</td><td><a class="el" href="a00280.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="a00280.html">tbb::null_rw_mutex::scoped_lock</a>)</td><td><a class="el" href="a00280.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="a00280.html">tbb::null_rw_mutex::scoped_lock</a>)</td><td><a class="el" href="a00280.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="a00280.html">tbb::null_rw_mutex::scoped_lock</a>)</td><td><a class="el" href="a00280.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="a00280.html">tbb::null_rw_mutex::scoped_lock</a>)</td><td><a class="el" href="a00280.html">tbb::null_rw_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00080.html b/doc/html/a00080.html
index 641ac00..67469ea 100644
--- a/doc/html/a00080.html
+++ b/doc/html/a00080.html
@@ -20,11 +20,9 @@
<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="a00260.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="a00260.html">tbb::null_mutex</a>)</td><td><a class="el" href="a00260.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="a00260.html">tbb::null_mutex</a>)</td><td><a class="el" href="a00260.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="a00260.html">tbb::null_mutex</a>)</td><td><a class="el" href="a00260.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="a00260.html">tbb::null_mutex</a>)</td><td><a class="el" href="a00260.html">tbb::null_mutex</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::parallel_do_feeder< Item > Member List</h1>This is the complete list of members for <a class="el" href="a00281.html">tbb::parallel_do_feeder< Item ></a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00281.html#40baaf0f6856f4491dd0adf896c93516">add</a>(const Item &item)</td><td><a class="el" href="a00281.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="a00281.html">tbb::parallel_do_feeder< Item ></a>)</td><td><a class="el" href="a00281.html">tbb::parallel_do_feeder< Item ></a></td><td><code> [friend]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00082.html b/doc/html/a00082.html
index e55d066..9b0ca91 100644
--- a/doc/html/a00082.html
+++ b/doc/html/a00082.html
@@ -20,11 +20,8 @@
<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="a00262.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="a00262.html">tbb::null_rw_mutex</a>)</td><td><a class="el" href="a00262.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="a00262.html">tbb::null_rw_mutex</a>)</td><td><a class="el" href="a00262.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="a00262.html">tbb::null_rw_mutex</a>)</td><td><a class="el" href="a00262.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="a00262.html">tbb::null_rw_mutex</a>)</td><td><a class="el" href="a00262.html">tbb::null_rw_mutex</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="a00285.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="a00285.html">tbb::pre_scan_tag</a>)</td><td><a class="el" href="a00285.html">tbb::pre_scan_tag</a></td><td><code> [inline, static]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00083.html b/doc/html/a00083.html
index a4c376f..5614da5 100644
--- a/doc/html/a00083.html
+++ b/doc/html/a00083.html
@@ -20,15 +20,8 @@
<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="a00263.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="a00263.html">tbb::null_rw_mutex::scoped_lock</a>)</td><td><a class="el" href="a00263.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="a00263.html">tbb::null_rw_mutex::scoped_lock</a>)</td><td><a class="el" href="a00263.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="a00263.html">tbb::null_rw_mutex::scoped_lock</a>)</td><td><a class="el" href="a00263.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="a00263.html">tbb::null_rw_mutex::scoped_lock</a>)</td><td><a class="el" href="a00263.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="a00263.html">tbb::null_rw_mutex::scoped_lock</a>)</td><td><a class="el" href="a00263.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="a00263.html">tbb::null_rw_mutex::scoped_lock</a>)</td><td><a class="el" href="a00263.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="a00263.html">tbb::null_rw_mutex::scoped_lock</a>)</td><td><a class="el" href="a00263.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="a00263.html">tbb::null_rw_mutex::scoped_lock</a>)</td><td><a class="el" href="a00263.html">tbb::null_rw_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::final_scan_tag Member List</h1>This is the complete list of members for <a class="el" href="a00258.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="a00258.html">tbb::final_scan_tag</a>)</td><td><a class="el" href="a00258.html">tbb::final_scan_tag</a></td><td><code> [inline, static]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00084.html b/doc/html/a00084.html
index b59c34f..0923278 100644
--- a/doc/html/a00084.html
+++ b/doc/html/a00084.html
@@ -20,9 +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::parallel_do_feeder< Item > Member List</h1>This is the complete list of members for <a class="el" href="a00264.html">tbb::parallel_do_feeder< Item ></a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00264.html#40baaf0f6856f4491dd0adf896c93516">add</a>(const Item &item)</td><td><a class="el" href="a00264.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="a00264.html">tbb::parallel_do_feeder< Item ></a>)</td><td><a class="el" href="a00264.html">tbb::parallel_do_feeder< Item ></a></td><td><code> [friend]</code></td></tr>
+<h1>tbb::parallel_while< Body > Member List</h1>This is the complete list of members for <a class="el" href="a00282.html">tbb::parallel_while< Body ></a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00282.html#e131c560057a58229992b61eb8dba4c6">add</a>(const value_type &item)</td><td><a class="el" href="a00282.html">tbb::parallel_while< Body ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00282.html#36e26ba3880c7bcf804a97ba0cbe133f">parallel_while</a>()</td><td><a class="el" href="a00282.html">tbb::parallel_while< Body ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00282.html#b32a0a6e5e09ebb7fad3e6652c19afe5">run</a>(Stream &stream, const Body &body)</td><td><a class="el" href="a00282.html">tbb::parallel_while< Body ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00282.html#fa297e53d3af2a101e712bc200233e9c">value_type</a> typedef</td><td><a class="el" href="a00282.html">tbb::parallel_while< Body ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00282.html#6fcfc973cc56b79c6d0fbb8a31be7e84">~parallel_while</a>()</td><td><a class="el" href="a00282.html">tbb::parallel_while< Body ></a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00085.html b/doc/html/a00085.html
index 8db8eb1..ace4663 100644
--- a/doc/html/a00085.html
+++ b/doc/html/a00085.html
@@ -20,8 +20,9 @@
<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="a00267.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="a00267.html">tbb::pre_scan_tag</a>)</td><td><a class="el" href="a00267.html">tbb::pre_scan_tag</a></td><td><code> [inline, static]</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="a00226.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="a00226.html">tbb::internal::affinity_partitioner_base_v3</a>)</td><td><a class="el" href="a00226.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="a00226.html">tbb::internal::affinity_partitioner_base_v3</a>)</td><td><a class="el" href="a00226.html">tbb::internal::affinity_partitioner_base_v3</a></td><td><code> [friend]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00086.html b/doc/html/a00086.html
index 5893606..1e29984 100644
--- a/doc/html/a00086.html
+++ b/doc/html/a00086.html
@@ -20,8 +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::final_scan_tag Member List</h1>This is the complete list of members for <a class="el" href="a00247.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="a00247.html">tbb::final_scan_tag</a>)</td><td><a class="el" href="a00247.html">tbb::final_scan_tag</a></td><td><code> [inline, static]</code></td></tr>
+<h1>tbb::internal::partition_type_base Member List</h1>This is the complete list of members for <a class="el" href="a00283.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="a00283.html">tbb::internal::partition_type_base</a>)</td><td><a class="el" href="a00283.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="a00283.html">tbb::internal::partition_type_base</a>)</td><td><a class="el" href="a00283.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="a00283.html">tbb::internal::partition_type_base</a>)</td><td><a class="el" href="a00283.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="a00283.html">tbb::internal::partition_type_base</a>)</td><td><a class="el" href="a00283.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="a00283.html">tbb::internal::partition_type_base</a>)</td><td><a class="el" href="a00283.html">tbb::internal::partition_type_base</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00087.html b/doc/html/a00087.html
index f84857d..1c2fb62 100644
--- a/doc/html/a00087.html
+++ b/doc/html/a00087.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::parallel_while< Body > Member List</h1>This is the complete list of members for <a class="el" href="a00265.html">tbb::parallel_while< Body ></a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00265.html#e131c560057a58229992b61eb8dba4c6">add</a>(const value_type &item)</td><td><a class="el" href="a00265.html">tbb::parallel_while< Body ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00265.html#36e26ba3880c7bcf804a97ba0cbe133f">parallel_while</a>()</td><td><a class="el" href="a00265.html">tbb::parallel_while< Body ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00265.html#b32a0a6e5e09ebb7fad3e6652c19afe5">run</a>(Stream &stream, const Body &body)</td><td><a class="el" href="a00265.html">tbb::parallel_while< Body ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00265.html#fa297e53d3af2a101e712bc200233e9c">value_type</a> typedef</td><td><a class="el" href="a00265.html">tbb::parallel_while< Body ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00265.html#6fcfc973cc56b79c6d0fbb8a31be7e84">~parallel_while</a>()</td><td><a class="el" href="a00265.html">tbb::parallel_while< Body ></a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::simple_partitioner Member List</h1>This is the complete list of members for <a class="el" href="a00303.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="a00303.html">tbb::simple_partitioner</a>)</td><td><a class="el" href="a00303.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="a00303.html">tbb::simple_partitioner</a>)</td><td><a class="el" href="a00303.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="a00303.html">tbb::simple_partitioner</a>)</td><td><a class="el" href="a00303.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="a00303.html">tbb::simple_partitioner</a>)</td><td><a class="el" href="a00303.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="a00303.html">tbb::simple_partitioner</a>)</td><td><a class="el" href="a00303.html">tbb::simple_partitioner</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00088.html b/doc/html/a00089.html
similarity index 52%
rename from doc/html/a00088.html
rename to doc/html/a00089.html
index 742a894..24f6586 100644
--- a/doc/html/a00088.html
+++ b/doc/html/a00089.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::simple_partitioner Member List</h1>This is the complete list of members for <a class="el" href="a00284.html">tbb::simple_partitioner</a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>internal::start_for</b> (defined in <a class="el" href="a00284.html">tbb::simple_partitioner</a>)</td><td><a class="el" href="a00284.html">tbb::simple_partitioner</a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal::start_reduce</b> (defined in <a class="el" href="a00284.html">tbb::simple_partitioner</a>)</td><td><a class="el" href="a00284.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="a00284.html">tbb::simple_partitioner</a>)</td><td><a class="el" href="a00284.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="a00284.html">tbb::simple_partitioner</a>)</td><td><a class="el" href="a00284.html">tbb::simple_partitioner</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::auto_partitioner Member List</h1>This is the complete list of members for <a class="el" href="a00231.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="a00231.html">tbb::auto_partitioner</a>)</td><td><a class="el" href="a00231.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="a00231.html">tbb::auto_partitioner</a>)</td><td><a class="el" href="a00231.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="a00231.html">tbb::auto_partitioner</a>)</td><td><a class="el" href="a00231.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="a00231.html">tbb::auto_partitioner</a>)</td><td><a class="el" href="a00231.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="a00231.html">tbb::auto_partitioner</a>)</td><td><a class="el" href="a00231.html">tbb::auto_partitioner</a></td><td><code> [friend]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00090.html b/doc/html/a00090.html
index e7dad3a..205ab74 100644
--- a/doc/html/a00090.html
+++ b/doc/html/a00090.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::auto_partitioner Member List</h1>This is the complete list of members for <a class="el" href="a00219.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="a00219.html">tbb::auto_partitioner</a>)</td><td><a class="el" href="a00219.html">tbb::auto_partitioner</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal::start_for</b> (defined in <a class="el" href="a00219.html">tbb::auto_partitioner</a>)</td><td><a class="el" href="a00219.html">tbb::auto_partitioner</a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal::start_reduce</b> (defined in <a class="el" href="a00219.html">tbb::auto_partitioner</a>)</td><td><a class="el" href="a00219.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="a00219.html">tbb::auto_partitioner</a>)</td><td><a class="el" href="a00219.html">tbb::auto_partitioner</a></td><td><code> [friend]</code></td></tr>
+<h1>tbb::affinity_partitioner Member List</h1>This is the complete list of members for <a class="el" href="a00225.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="a00225.html">tbb::affinity_partitioner</a>)</td><td><a class="el" href="a00225.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="a00225.html">tbb::affinity_partitioner</a>)</td><td><a class="el" href="a00225.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="a00225.html">tbb::affinity_partitioner</a>)</td><td><a class="el" href="a00225.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="a00225.html">tbb::affinity_partitioner</a>)</td><td><a class="el" href="a00225.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="a00225.html">tbb::affinity_partitioner</a>)</td><td><a class="el" href="a00225.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="a00226.html">tbb::internal::affinity_partitioner_base_v3</a>)</td><td><a class="el" href="a00226.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="a00226.html">tbb::internal::affinity_partitioner_base_v3</a>)</td><td><a class="el" href="a00226.html">tbb::internal::affinity_partitioner_base_v3</a></td><td><code> [friend]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00093.html b/doc/html/a00091.html
similarity index 55%
copy from doc/html/a00093.html
copy to doc/html/a00091.html
index 79f7e4a..498cfc2 100644
--- a/doc/html/a00093.html
+++ b/doc/html/a00091.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::filter Member List</h1>This is the complete list of members for <a class="el" href="a00245.html">tbb::filter</a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00245.html#f17200974c33be21f42a5f00893de028">exact_exception_propagation</a></td><td><a class="el" href="a00245.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="a00245.html">tbb::filter</a>)</td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [inline, protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00245.html#dd6a6e7210efc9bcaf2c5e08767d92b5">filter_is_bound</a></td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [protected, static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00245.html#2e5eb65f95d8050186278077e433c5b1">filter_is_out_of_order</a></td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [protected, static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00245.html#4b7de3a76e744f3d9c1bc5d437ea851d">filter_is_serial</a></td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [protected, static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00245.html#bdd02a434a6e7499dd1e8f43aae96793">filter_may_emit_null</a></td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [protected, static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00245.html#56275eb889c77c4807967133e21401bd">finalize</a>(void *)</td><td><a class="el" href="a00245.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="a00245.html">tbb::filter</a>)</td><td><a class="el" href="a00245.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="a00245.html">tbb::filter</a>)</td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00245.html#15c29cae5d237e6d63dbfe5c94af89d5">is_bound</a>() const </td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00245.html#cd53206c4795ef2df5df26b795caf692">is_ordered</a>() const </td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00245.html#fcfec27656a69ff2072802ac001e936f">is_serial</a>() const </td><td><a class="el" href="a00245.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="a00245.html">tbb::filter</a>)</td><td><a class="el" href="a00245.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="a00245.html">tbb::filter</a>)</td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [inline, protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00245.html#8ec4dfe053e94a2349d56781ddea8477">object_may_be_null</a>()</td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00245.html#fa1b3dc1f4f47563ccab7f4d92f5b543">operator()</a>(void *item)=0</td><td><a class="el" href="a00245.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="a00245.html">tbb::filter</a>)</td><td><a class="el" href="a00245.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="a00245.html">tbb::filter</a>)</td><td><a class="el" href="a00245.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="a00245.html">tbb::filter</a>)</td><td><a class="el" href="a00245.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="a00245.html">tbb::filter</a>)</td><td><a class="el" href="a00245.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="a00245.html">tbb::filter</a>)</td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00245.html#66d159f362293e3964ba3da8bc1d2604">~filter</a>()</td><td><a class="el" href="a00245.html">tbb::filter</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="a00256.html">tbb::filter</a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00256.html#f17200974c33be21f42a5f00893de028">exact_exception_propagation</a></td><td><a class="el" href="a00256.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="a00256.html">tbb::filter</a>)</td><td><a class="el" href="a00256.html">tbb::filter</a></td><td><code> [inline, protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00256.html#dd6a6e7210efc9bcaf2c5e08767d92b5">filter_is_bound</a></td><td><a class="el" href="a00256.html">tbb::filter</a></td><td><code> [protected, static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00256.html#2e5eb65f95d8050186278077e433c5b1">filter_is_out_of_order</a></td><td><a class="el" href="a00256.html">tbb::filter</a></td><td><code> [protected, static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00256.html#4b7de3a76e744f3d9c1bc5d437ea851d">filter_is_serial</a></td><td><a class="el" href="a00256.html">tbb::filter</a></td><td><code> [protected, static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00256.html#bdd02a434a6e7499dd1e8f43aae96793">filter_may_emit_null</a></td><td><a class="el" href="a00256.html">tbb::filter</a></td><td><code> [protected, static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00256.html#56275eb889c77c4807967133e21401bd">finalize</a>(void *)</td><td><a class="el" href="a00256.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="a00256.html">tbb::filter</a>)</td><td><a class="el" href="a00256.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="a00256.html">tbb::filter</a>)</td><td><a class="el" href="a00256.html">tbb::filter</a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00256.html#15c29cae5d237e6d63dbfe5c94af89d5">is_bound</a>() const </td><td><a class="el" href="a00256.html">tbb::filter</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00256.html#cd53206c4795ef2df5df26b795caf692">is_ordered</a>() const </td><td><a class="el" href="a00256.html">tbb::filter</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00256.html#fcfec27656a69ff2072802ac001e936f">is_serial</a>() const </td><td><a class="el" href="a00256.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="a00256.html">tbb::filter</a>)</td><td><a class="el" href="a00256.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="a00256.html">tbb::filter</a>)</td><td><a class="el" href="a00256.html">tbb::filter</a></td><td><code> [inline, protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00256.html#8ec4dfe053e94a2349d56781ddea8477">object_may_be_null</a>()</td><td><a class="el" href="a00256.html">tbb::filter</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00256.html#fa1b3dc1f4f47563ccab7f4d92f5b543">operator()</a>(void *item)=0</td><td><a class="el" href="a00256.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="a00256.html">tbb::filter</a>)</td><td><a class="el" href="a00256.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="a00256.html">tbb::filter</a>)</td><td><a class="el" href="a00256.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="a00256.html">tbb::filter</a>)</td><td><a class="el" href="a00256.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="a00256.html">tbb::filter</a>)</td><td><a class="el" href="a00256.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="a00256.html">tbb::filter</a>)</td><td><a class="el" href="a00256.html">tbb::filter</a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00256.html#66d159f362293e3964ba3da8bc1d2604">~filter</a>()</td><td><a class="el" href="a00256.html">tbb::filter</a></td><td><code> [virtual]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00092.html b/doc/html/a00092.html
index 3780df9..f345406 100644
--- a/doc/html/a00092.html
+++ b/doc/html/a00092.html
@@ -20,12 +20,34 @@
<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="a00212.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="a00212.html">tbb::affinity_partitioner</a>)</td><td><a class="el" href="a00212.html">tbb::affinity_partitioner</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal::affinity_partition_type</b> (defined in <a class="el" href="a00212.html">tbb::affinity_partitioner</a>)</td><td><a class="el" href="a00212.html">tbb::affinity_partitioner</a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal::start_for</b> (defined in <a class="el" href="a00212.html">tbb::affinity_partitioner</a>)</td><td><a class="el" href="a00212.html">tbb::affinity_partitioner</a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal::start_reduce</b> (defined in <a class="el" href="a00212.html">tbb::affinity_partitioner</a>)</td><td><a class="el" href="a00212.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="a00212.html">tbb::affinity_partitioner</a>)</td><td><a class="el" href="a00212.html">tbb::affinity_partitioner</a></td><td><code> [friend]</code></td></tr>
+<h1>tbb::thread_bound_filter Member List</h1>This is the complete list of members for <a class="el" href="a00322.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="a00322.html">tbb::thread_bound_filter</a>)</td><td><a class="el" href="a00322.html">tbb::thread_bound_filter</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00256.html#f17200974c33be21f42a5f00893de028">exact_exception_propagation</a></td><td><a class="el" href="a00256.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="a00256.html">tbb::filter</a>)</td><td><a class="el" href="a00256.html">tbb::filter</a></td><td><code> [inline, protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00256.html#dd6a6e7210efc9bcaf2c5e08767d92b5">filter_is_bound</a></td><td><a class="el" href="a00256.html">tbb::filter</a></td><td><code> [protected, static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00256.html#2e5eb65f95d8050186278077e433c5b1">filter_is_out_of_order</a></td><td><a class="el" href="a00256.html">tbb::filter</a></td><td><code> [protected, static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00256.html#4b7de3a76e744f3d9c1bc5d437ea851d">filter_is_serial</a></td><td><a class="el" href="a00256.html">tbb::filter</a></td><td><code> [protected, static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00256.html#bdd02a434a6e7499dd1e8f43aae96793">filter_may_emit_null</a></td><td><a class="el" href="a00256.html">tbb::filter</a></td><td><code> [protected, static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00256.html#56275eb889c77c4807967133e21401bd">finalize</a>(void *)</td><td><a class="el" href="a00256.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="a00256.html">tbb::filter</a>)</td><td><a class="el" href="a00256.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="a00256.html">tbb::filter</a>)</td><td><a class="el" href="a00256.html">tbb::filter</a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00256.html#15c29cae5d237e6d63dbfe5c94af89d5">is_bound</a>() const </td><td><a class="el" href="a00256.html">tbb::filter</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00256.html#cd53206c4795ef2df5df26b795caf692">is_ordered</a>() const </td><td><a class="el" href="a00256.html">tbb::filter</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00256.html#fcfec27656a69ff2072802ac001e936f">is_serial</a>() const </td><td><a class="el" href="a00256.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="a00322.html">tbb::thread_bound_filter</a>)</td><td><a class="el" href="a00322.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="a00256.html">tbb::filter</a>)</td><td><a class="el" href="a00256.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="a00256.html">tbb::filter</a>)</td><td><a class="el" href="a00256.html">tbb::filter</a></td><td><code> [inline, protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00256.html#8ec4dfe053e94a2349d56781ddea8477">object_may_be_null</a>()</td><td><a class="el" href="a00256.html">tbb::filter</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00256.html#fa1b3dc1f4f47563ccab7f4d92f5b543">operator()</a>(void *item)=0</td><td><a class="el" href="a00256.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="a00256.html">tbb::filter</a>)</td><td><a class="el" href="a00256.html">tbb::filter</a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00322.html#5e726bdc7fbd924c0b07bd558b1d4d5d">process_item</a>()</td><td><a class="el" href="a00322.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="a00322.html">tbb::thread_bound_filter</a>)</td><td><a class="el" href="a00322.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="a00256.html">tbb::filter</a>)</td><td><a class="el" href="a00256.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="a00322.html">tbb::thread_bound_filter</a>)</td><td><a class="el" href="a00322.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="a00322.html">tbb::thread_bound_filter</a>)</td><td><a class="el" href="a00322.html">tbb::thread_bound_filter</a></td><td><code> [inline, protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00322.html#c4f90f2c771bce748beb9be734fa286c">try_process_item</a>()</td><td><a class="el" href="a00322.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="a00256.html">tbb::filter</a>)</td><td><a class="el" href="a00256.html">tbb::filter</a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00256.html#66d159f362293e3964ba3da8bc1d2604">~filter</a>()</td><td><a class="el" href="a00256.html">tbb::filter</a></td><td><code> [virtual]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00093.html b/doc/html/a00093.html
index 79f7e4a..1d47b8b 100644
--- a/doc/html/a00093.html
+++ b/doc/html/a00093.html
@@ -20,29 +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::filter Member List</h1>This is the complete list of members for <a class="el" href="a00245.html">tbb::filter</a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00245.html#f17200974c33be21f42a5f00893de028">exact_exception_propagation</a></td><td><a class="el" href="a00245.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="a00245.html">tbb::filter</a>)</td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [inline, protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00245.html#dd6a6e7210efc9bcaf2c5e08767d92b5">filter_is_bound</a></td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [protected, static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00245.html#2e5eb65f95d8050186278077e433c5b1">filter_is_out_of_order</a></td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [protected, static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00245.html#4b7de3a76e744f3d9c1bc5d437ea851d">filter_is_serial</a></td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [protected, static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00245.html#bdd02a434a6e7499dd1e8f43aae96793">filter_may_emit_null</a></td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [protected, static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00245.html#56275eb889c77c4807967133e21401bd">finalize</a>(void *)</td><td><a class="el" href="a00245.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="a00245.html">tbb::filter</a>)</td><td><a class="el" href="a00245.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="a00245.html">tbb::filter</a>)</td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00245.html#15c29cae5d237e6d63dbfe5c94af89d5">is_bound</a>() const </td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00245.html#cd53206c4795ef2df5df26b795caf692">is_ordered</a>() const </td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00245.html#fcfec27656a69ff2072802ac001e936f">is_serial</a>() const </td><td><a class="el" href="a00245.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="a00245.html">tbb::filter</a>)</td><td><a class="el" href="a00245.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="a00245.html">tbb::filter</a>)</td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [inline, protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00245.html#8ec4dfe053e94a2349d56781ddea8477">object_may_be_null</a>()</td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00245.html#fa1b3dc1f4f47563ccab7f4d92f5b543">operator()</a>(void *item)=0</td><td><a class="el" href="a00245.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="a00245.html">tbb::filter</a>)</td><td><a class="el" href="a00245.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="a00245.html">tbb::filter</a>)</td><td><a class="el" href="a00245.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="a00245.html">tbb::filter</a>)</td><td><a class="el" href="a00245.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="a00245.html">tbb::filter</a>)</td><td><a class="el" href="a00245.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="a00245.html">tbb::filter</a>)</td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00245.html#66d159f362293e3964ba3da8bc1d2604">~filter</a>()</td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [virtual]</code></td></tr>
+<h1>tbb::pipeline Member List</h1>This is the complete list of members for <a class="el" href="a00284.html">tbb::pipeline</a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00284.html#38fb5c9c8395dd6f89a4ae2011a83e0d">add_filter</a>(filter &filter_)</td><td><a class="el" href="a00284.html">tbb::pipeline</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00284.html#2c84aef5b834b555ee220b176e25931e">clear</a>()</td><td><a class="el" href="a00284.html">tbb::pipeline</a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>filter</b> (defined in <a class="el" href="a00284.html">tbb::pipeline</a>)</td><td><a class="el" href="a00284.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="a00284.html">tbb::pipeline</a>)</td><td><a class="el" href="a00284.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="a00284.html">tbb::pipeline</a>)</td><td><a class="el" href="a00284.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="a00284.html">tbb::pipeline</a>)</td><td><a class="el" href="a00284.html">tbb::pipeline</a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00284.html#596dc3beba27099c4c8581cb419e1a59">pipeline</a>()</td><td><a class="el" href="a00284.html">tbb::pipeline</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00284.html#f627616049b3fe36801f37ee40403ef8">run</a>(size_t max_number_of_live_tokens)</td><td><a class="el" href="a00284.html">tbb::pipeline</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00284.html#93d7fec8cd607b803dd2d79fb46bd260">run</a>(size_t max_number_of_live_tokens, tbb::task_group_context &context)</td><td><a class="el" href="a00284.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="a00284.html">tbb::pipeline</a>)</td><td><a class="el" href="a00284.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="a00284.html">tbb::pipeline</a>)</td><td><a class="el" href="a00284.html">tbb::pipeline</a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00284.html#49513c6c24f9d5bbbb27edca5efe01c9">~pipeline</a>()</td><td><a class="el" href="a00284.html">tbb::pipeline</a></td><td><code> [virtual]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00094.html b/doc/html/a00094.html
index a370a16..94889c4 100644
--- a/doc/html/a00094.html
+++ b/doc/html/a00094.html
@@ -20,34 +20,9 @@
<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="a00301.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="a00301.html">tbb::thread_bound_filter</a>)</td><td><a class="el" href="a00301.html">tbb::thread_bound_filter</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00245.html#f17200974c33be21f42a5f00893de028">exact_exception_propagation</a></td><td><a class="el" href="a00245.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="a00245.html">tbb::filter</a>)</td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [inline, protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00245.html#dd6a6e7210efc9bcaf2c5e08767d92b5">filter_is_bound</a></td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [protected, static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00245.html#2e5eb65f95d8050186278077e433c5b1">filter_is_out_of_order</a></td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [protected, static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00245.html#4b7de3a76e744f3d9c1bc5d437ea851d">filter_is_serial</a></td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [protected, static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00245.html#bdd02a434a6e7499dd1e8f43aae96793">filter_may_emit_null</a></td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [protected, static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00245.html#56275eb889c77c4807967133e21401bd">finalize</a>(void *)</td><td><a class="el" href="a00245.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="a00245.html">tbb::filter</a>)</td><td><a class="el" href="a00245.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="a00245.html">tbb::filter</a>)</td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00245.html#15c29cae5d237e6d63dbfe5c94af89d5">is_bound</a>() const </td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00245.html#cd53206c4795ef2df5df26b795caf692">is_ordered</a>() const </td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00245.html#fcfec27656a69ff2072802ac001e936f">is_serial</a>() const </td><td><a class="el" href="a00245.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="a00301.html">tbb::thread_bound_filter</a>)</td><td><a class="el" href="a00301.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="a00245.html">tbb::filter</a>)</td><td><a class="el" href="a00245.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="a00245.html">tbb::filter</a>)</td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [inline, protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00245.html#8ec4dfe053e94a2349d56781ddea8477">object_may_be_null</a>()</td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00245.html#fa1b3dc1f4f47563ccab7f4d92f5b543">operator()</a>(void *item)=0</td><td><a class="el" href="a00245.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="a00245.html">tbb::filter</a>)</td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00301.html#5e726bdc7fbd924c0b07bd558b1d4d5d">process_item</a>()</td><td><a class="el" href="a00301.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="a00301.html">tbb::thread_bound_filter</a>)</td><td><a class="el" href="a00301.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="a00245.html">tbb::filter</a>)</td><td><a class="el" href="a00245.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="a00301.html">tbb::thread_bound_filter</a>)</td><td><a class="el" href="a00301.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="a00301.html">tbb::thread_bound_filter</a>)</td><td><a class="el" href="a00301.html">tbb::thread_bound_filter</a></td><td><code> [inline, protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00301.html#c4f90f2c771bce748beb9be734fa286c">try_process_item</a>()</td><td><a class="el" href="a00301.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="a00245.html">tbb::filter</a>)</td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00245.html#66d159f362293e3964ba3da8bc1d2604">~filter</a>()</td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [virtual]</code></td></tr>
+<h1>tbb::interface6::flow_control Member List</h1>This is the complete list of members for <a class="el" href="a00259.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="a00259.html">tbb::interface6::flow_control</a>)</td><td><a class="el" href="a00259.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="a00259.html">tbb::interface6::flow_control</a>)</td><td><a class="el" href="a00259.html">tbb::interface6::flow_control</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00095.html b/doc/html/a00095.html
index 26972b3..2672779 100644
--- a/doc/html/a00095.html
+++ b/doc/html/a00095.html
@@ -20,19 +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::pipeline Member List</h1>This is the complete list of members for <a class="el" href="a00266.html">tbb::pipeline</a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00266.html#38fb5c9c8395dd6f89a4ae2011a83e0d">add_filter</a>(filter &filter_)</td><td><a class="el" href="a00266.html">tbb::pipeline</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00266.html#2c84aef5b834b555ee220b176e25931e">clear</a>()</td><td><a class="el" href="a00266.html">tbb::pipeline</a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>filter</b> (defined in <a class="el" href="a00266.html">tbb::pipeline</a>)</td><td><a class="el" href="a00266.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="a00266.html">tbb::pipeline</a>)</td><td><a class="el" href="a00266.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="a00266.html">tbb::pipeline</a>)</td><td><a class="el" href="a00266.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="a00266.html">tbb::pipeline</a>)</td><td><a class="el" href="a00266.html">tbb::pipeline</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00266.html#596dc3beba27099c4c8581cb419e1a59">pipeline</a>()</td><td><a class="el" href="a00266.html">tbb::pipeline</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00266.html#f627616049b3fe36801f37ee40403ef8">run</a>(size_t max_number_of_live_tokens)</td><td><a class="el" href="a00266.html">tbb::pipeline</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00266.html#93d7fec8cd607b803dd2d79fb46bd260">run</a>(size_t max_number_of_live_tokens, tbb::task_group_context &context)</td><td><a class="el" href="a00266.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="a00266.html">tbb::pipeline</a>)</td><td><a class="el" href="a00266.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="a00266.html">tbb::pipeline</a>)</td><td><a class="el" href="a00266.html">tbb::pipeline</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00266.html#49513c6c24f9d5bbbb27edca5efe01c9">~pipeline</a>()</td><td><a class="el" href="a00266.html">tbb::pipeline</a></td><td><code> [virtual]</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="a00257.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="a00257.html">tbb::interface6::filter_t< T, U ></a>)</td><td><a class="el" href="a00257.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="a00257.html">tbb::interface6::filter_t< T, U ></a>)</td><td><a class="el" href="a00257.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="a00257.html">tbb::interface6::filter_t< T, U ></a>)</td><td><a class="el" href="a00257.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="a00257.html">tbb::interface6::filter_t< T, U ></a>)</td><td><a class="el" href="a00257.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="a00257.html">tbb::interface6::filter_t< T, U ></a>)</td><td><a class="el" href="a00257.html">tbb::interface6::filter_t< T, U ></a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00257.html#85c2892eff1fddcd06e28911e75838bd">make_filter</a>(tbb::filter::mode, const Body &)</td><td><a class="el" href="a00257.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="a00257.html">tbb::interface6::filter_t< T, U ></a>)</td><td><a class="el" href="a00257.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="a00257.html">tbb::interface6::filter_t< T, U ></a>)</td><td><a class="el" href="a00257.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="a00257.html">tbb::interface6::filter_t< T, U ></a>)</td><td><a class="el" href="a00257.html">tbb::interface6::filter_t< T, U ></a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00096.html b/doc/html/a00096.html
index b7dad10..abb4614 100644
--- a/doc/html/a00096.html
+++ b/doc/html/a00096.html
@@ -20,9 +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::interface6::flow_control Member List</h1>This is the complete list of members for <a class="el" href="a00248.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="a00248.html">tbb::interface6::flow_control</a>)</td><td><a class="el" href="a00248.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="a00248.html">tbb::interface6::flow_control</a>)</td><td><a class="el" href="a00248.html">tbb::interface6::flow_control</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="a00288.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="a00288.html">tbb::queuing_mutex</a>)</td><td><a class="el" href="a00288.html">tbb::queuing_mutex</a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>is_fair_mutex</b> (defined in <a class="el" href="a00288.html">tbb::queuing_mutex</a>)</td><td><a class="el" href="a00288.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="a00288.html">tbb::queuing_mutex</a>)</td><td><a class="el" href="a00288.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="a00288.html">tbb::queuing_mutex</a>)</td><td><a class="el" href="a00288.html">tbb::queuing_mutex</a></td><td><code> [static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00288.html#b389ad9c4db7293e4bdb5b8cda69ec04">queuing_mutex</a>()</td><td><a class="el" href="a00288.html">tbb::queuing_mutex</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00097.html b/doc/html/a00097.html
index 2bdd71f..4b6b3a3 100644
--- a/doc/html/a00097.html
+++ b/doc/html/a00097.html
@@ -20,16 +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::filter_t< T, U > Member List</h1>This is the complete list of members for <a class="el" href="a00246.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="a00246.html">tbb::interface6::filter_t< T, U ></a>)</td><td><a class="el" href="a00246.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="a00246.html">tbb::interface6::filter_t< T, U ></a>)</td><td><a class="el" href="a00246.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="a00246.html">tbb::interface6::filter_t< T, U ></a>)</td><td><a class="el" href="a00246.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="a00246.html">tbb::interface6::filter_t< T, U ></a>)</td><td><a class="el" href="a00246.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="a00246.html">tbb::interface6::filter_t< T, U ></a>)</td><td><a class="el" href="a00246.html">tbb::interface6::filter_t< T, U ></a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00246.html#85c2892eff1fddcd06e28911e75838bd">make_filter</a>(tbb::filter::mode, const Body &)</td><td><a class="el" href="a00246.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="a00246.html">tbb::interface6::filter_t< T, U ></a>)</td><td><a class="el" href="a00246.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="a00246.html">tbb::interface6::filter_t< T, U ></a>)</td><td><a class="el" href="a00246.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="a00246.html">tbb::interface6::filter_t< T, U ></a>)</td><td><a class="el" href="a00246.html">tbb::interface6::filter_t< T, U ></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="a00289.html">tbb::queuing_mutex::scoped_lock</a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00289.html#533e4fc8355ee321206a0609c42d909d">acquire</a>(queuing_mutex &m)</td><td><a class="el" href="a00289.html">tbb::queuing_mutex::scoped_lock</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00289.html#3bf2b8c87ff22115be9b2eac179f2d30">release</a>()</td><td><a class="el" href="a00289.html">tbb::queuing_mutex::scoped_lock</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00289.html#db0fa3967491014572e24d6607bdc971">scoped_lock</a>()</td><td><a class="el" href="a00289.html">tbb::queuing_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00289.html#9b51ef972f5618ac17caadb58841ab6d">scoped_lock</a>(queuing_mutex &m)</td><td><a class="el" href="a00289.html">tbb::queuing_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00289.html#e5a014fb817599386a87170cf2cf51a9">try_acquire</a>(queuing_mutex &m)</td><td><a class="el" href="a00289.html">tbb::queuing_mutex::scoped_lock</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00289.html#ac2c576a93570957d694192a5f491443">~scoped_lock</a>()</td><td><a class="el" href="a00289.html">tbb::queuing_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00098.html b/doc/html/a00098.html
index 0ee16d9..ab2a755 100644
--- a/doc/html/a00098.html
+++ b/doc/html/a00098.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::queuing_mutex Member List</h1>This is the complete list of members for <a class="el" href="a00270.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="a00270.html">tbb::queuing_mutex</a>)</td><td><a class="el" href="a00270.html">tbb::queuing_mutex</a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>is_fair_mutex</b> (defined in <a class="el" href="a00270.html">tbb::queuing_mutex</a>)</td><td><a class="el" href="a00270.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="a00270.html">tbb::queuing_mutex</a>)</td><td><a class="el" href="a00270.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="a00270.html">tbb::queuing_mutex</a>)</td><td><a class="el" href="a00270.html">tbb::queuing_mutex</a></td><td><code> [static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00270.html#b389ad9c4db7293e4bdb5b8cda69ec04">queuing_mutex</a>()</td><td><a class="el" href="a00270.html">tbb::queuing_mutex</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>scoped_lock</b> (defined in <a class="el" href="a00270.html">tbb::queuing_mutex</a>)</td><td><a class="el" href="a00270.html">tbb::queuing_mutex</a></td><td><code> [friend]</code></td></tr>
+<h1>tbb::queuing_rw_mutex Member List</h1>This is the complete list of members for <a class="el" href="a00290.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="a00290.html">tbb::queuing_rw_mutex</a>)</td><td><a class="el" href="a00290.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="a00290.html">tbb::queuing_rw_mutex</a>)</td><td><a class="el" href="a00290.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="a00290.html">tbb::queuing_rw_mutex</a>)</td><td><a class="el" href="a00290.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="a00290.html">tbb::queuing_rw_mutex</a>)</td><td><a class="el" href="a00290.html">tbb::queuing_rw_mutex</a></td><td><code> [static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00290.html#85c90877c3447690ac4e2ac4ff8dea5e">queuing_rw_mutex</a>()</td><td><a class="el" href="a00290.html">tbb::queuing_rw_mutex</a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>scoped_lock</b> (defined in <a class="el" href="a00290.html">tbb::queuing_rw_mutex</a>)</td><td><a class="el" href="a00290.html">tbb::queuing_rw_mutex</a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00290.html#1ba73e3d95cfdf8323880bc623af9099">~queuing_rw_mutex</a>()</td><td><a class="el" href="a00290.html">tbb::queuing_rw_mutex</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00099.html b/doc/html/a00099.html
index 8311748..edde6aa 100644
--- a/doc/html/a00099.html
+++ b/doc/html/a00099.html
@@ -20,13 +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_mutex::scoped_lock Member List</h1>This is the complete list of members for <a class="el" href="a00271.html">tbb::queuing_mutex::scoped_lock</a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00271.html#533e4fc8355ee321206a0609c42d909d">acquire</a>(queuing_mutex &m)</td><td><a class="el" href="a00271.html">tbb::queuing_mutex::scoped_lock</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00271.html#3bf2b8c87ff22115be9b2eac179f2d30">release</a>()</td><td><a class="el" href="a00271.html">tbb::queuing_mutex::scoped_lock</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00271.html#db0fa3967491014572e24d6607bdc971">scoped_lock</a>()</td><td><a class="el" href="a00271.html">tbb::queuing_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00271.html#9b51ef972f5618ac17caadb58841ab6d">scoped_lock</a>(queuing_mutex &m)</td><td><a class="el" href="a00271.html">tbb::queuing_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00271.html#e5a014fb817599386a87170cf2cf51a9">try_acquire</a>(queuing_mutex &m)</td><td><a class="el" href="a00271.html">tbb::queuing_mutex::scoped_lock</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00271.html#ac2c576a93570957d694192a5f491443">~scoped_lock</a>()</td><td><a class="el" href="a00271.html">tbb::queuing_mutex::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="a00291.html">tbb::queuing_rw_mutex::scoped_lock</a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00291.html#a8dd5ab8686e76de21587544dbb681e0">acquire</a>(queuing_rw_mutex &m, bool write=true)</td><td><a class="el" href="a00291.html">tbb::queuing_rw_mutex::scoped_lock</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00291.html#0d2f93edf7b15ec4bcee138823220c52">downgrade_to_reader</a>()</td><td><a class="el" href="a00291.html">tbb::queuing_rw_mutex::scoped_lock</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00291.html#67ae221109ddc69510ab593874e435d4">release</a>()</td><td><a class="el" href="a00291.html">tbb::queuing_rw_mutex::scoped_lock</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00291.html#c62e365be7bcbba091c9ea7454a4d22c">scoped_lock</a>()</td><td><a class="el" href="a00291.html">tbb::queuing_rw_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00291.html#fbb8798792d3aebb136c46fc63d2529e">scoped_lock</a>(queuing_rw_mutex &m, bool write=true)</td><td><a class="el" href="a00291.html">tbb::queuing_rw_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00291.html#2e4ff6c9ec2fee6682f95290d1f42baa">try_acquire</a>(queuing_rw_mutex &m, bool write=true)</td><td><a class="el" href="a00291.html">tbb::queuing_rw_mutex::scoped_lock</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00291.html#11ba1da4a722c9e6f73339a52c487e82">upgrade_to_writer</a>()</td><td><a class="el" href="a00291.html">tbb::queuing_rw_mutex::scoped_lock</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00291.html#32c7d67a660d23ebbaab1a1d2826d31a">~scoped_lock</a>()</td><td><a class="el" href="a00291.html">tbb::queuing_rw_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00100.html b/doc/html/a00100.html
index 652f520..758acaa 100644
--- a/doc/html/a00100.html
+++ b/doc/html/a00100.html
@@ -20,14 +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::queuing_rw_mutex Member List</h1>This is the complete list of members for <a class="el" href="a00272.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="a00272.html">tbb::queuing_rw_mutex</a>)</td><td><a class="el" href="a00272.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="a00272.html">tbb::queuing_rw_mutex</a>)</td><td><a class="el" href="a00272.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="a00272.html">tbb::queuing_rw_mutex</a>)</td><td><a class="el" href="a00272.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="a00272.html">tbb::queuing_rw_mutex</a>)</td><td><a class="el" href="a00272.html">tbb::queuing_rw_mutex</a></td><td><code> [static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00272.html#85c90877c3447690ac4e2ac4ff8dea5e">queuing_rw_mutex</a>()</td><td><a class="el" href="a00272.html">tbb::queuing_rw_mutex</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>scoped_lock</b> (defined in <a class="el" href="a00272.html">tbb::queuing_rw_mutex</a>)</td><td><a class="el" href="a00272.html">tbb::queuing_rw_mutex</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00272.html#1ba73e3d95cfdf8323880bc623af9099">~queuing_rw_mutex</a>()</td><td><a class="el" href="a00272.html">tbb::queuing_rw_mutex</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="a00292.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="a00292.html">tbb::interface5::reader_writer_lock</a>)</td><td><a class="el" href="a00292.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="a00292.html">tbb::interface5::reader_writer_lock</a>)</td><td><a class="el" href="a00292.html">tbb::interface5::reader_writer_lock</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00292.html#2653d1a2d560059a51219a8ceab3ade9">lock</a>()</td><td><a class="el" href="a00292.html">tbb::interface5::reader_writer_lock</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00292.html#d9d16a24d9f6c3dada73c6b9ff214f5b">lock_read</a>()</td><td><a class="el" href="a00292.html">tbb::interface5::reader_writer_lock</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00292.html#c1431c4293e777efd9aab9a95c2a46e1">reader_writer_lock</a>()</td><td><a class="el" href="a00292.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="a00292.html">tbb::interface5::reader_writer_lock</a>)</td><td><a class="el" href="a00292.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="a00292.html">tbb::interface5::reader_writer_lock</a>)</td><td><a class="el" href="a00292.html">tbb::interface5::reader_writer_lock</a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00292.html#6f921f0d7c1812ceb5674418c8b6ccaf">status_t</a> enum name</td><td><a class="el" href="a00292.html">tbb::interface5::reader_writer_lock</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00292.html#721eb173e154ab38292273e9266a9b07">try_lock</a>()</td><td><a class="el" href="a00292.html">tbb::interface5::reader_writer_lock</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00292.html#595fb23952e3b89426b1f7938dea9b11">try_lock_read</a>()</td><td><a class="el" href="a00292.html">tbb::interface5::reader_writer_lock</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00292.html#5113b32689305599b2c36b5831547704">unlock</a>()</td><td><a class="el" href="a00292.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="a00292.html">tbb::interface5::reader_writer_lock</a>)</td><td><a class="el" href="a00292.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="a00292.html">tbb::interface5::reader_writer_lock</a>)</td><td><a class="el" href="a00292.html">tbb::interface5::reader_writer_lock</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00292.html#5135f64f7b7339017f33d956445edbee">~reader_writer_lock</a>()</td><td><a class="el" href="a00292.html">tbb::interface5::reader_writer_lock</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00101.html b/doc/html/a00101.html
index f5f0e2d..3cd86c0 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::queuing_rw_mutex::scoped_lock Member List</h1>This is the complete list of members for <a class="el" href="a00273.html">tbb::queuing_rw_mutex::scoped_lock</a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00273.html#a8dd5ab8686e76de21587544dbb681e0">acquire</a>(queuing_rw_mutex &m, bool write=true)</td><td><a class="el" href="a00273.html">tbb::queuing_rw_mutex::scoped_lock</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00273.html#0d2f93edf7b15ec4bcee138823220c52">downgrade_to_reader</a>()</td><td><a class="el" href="a00273.html">tbb::queuing_rw_mutex::scoped_lock</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00273.html#67ae221109ddc69510ab593874e435d4">release</a>()</td><td><a class="el" href="a00273.html">tbb::queuing_rw_mutex::scoped_lock</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00273.html#c62e365be7bcbba091c9ea7454a4d22c">scoped_lock</a>()</td><td><a class="el" href="a00273.html">tbb::queuing_rw_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00273.html#fbb8798792d3aebb136c46fc63d2529e">scoped_lock</a>(queuing_rw_mutex &m, bool write=true)</td><td><a class="el" href="a00273.html">tbb::queuing_rw_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00273.html#2e4ff6c9ec2fee6682f95290d1f42baa">try_acquire</a>(queuing_rw_mutex &m, bool write=true)</td><td><a class="el" href="a00273.html">tbb::queuing_rw_mutex::scoped_lock</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00273.html#11ba1da4a722c9e6f73339a52c487e82">upgrade_to_writer</a>()</td><td><a class="el" href="a00273.html">tbb::queuing_rw_mutex::scoped_lock</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00273.html#32c7d67a660d23ebbaab1a1d2826d31a">~scoped_lock</a>()</td><td><a class="el" href="a00273.html">tbb::queuing_rw_mutex::scoped_lock</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="a00293.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="a00293.html">tbb::interface5::reader_writer_lock::scoped_lock</a>)</td><td><a class="el" href="a00293.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="a00293.html">tbb::interface5::reader_writer_lock::scoped_lock</a>)</td><td><a class="el" href="a00293.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="a00293.html">tbb::interface5::reader_writer_lock::scoped_lock</a>)</td><td><a class="el" href="a00293.html">tbb::interface5::reader_writer_lock::scoped_lock</a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00293.html#cf19f20e082887c1bb0ba6b0911c3583">scoped_lock</a>(reader_writer_lock &lock)</td><td><a class="el" href="a00293.html">tbb::interface5::reader_writer_lock::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00293.html#70246e0260493625ff956fa5926fc71f">~scoped_lock</a>()</td><td><a class="el" href="a00293.html">tbb::interface5::reader_writer_lock::scoped_lock</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00102.html b/doc/html/a00102.html
index e67c1de..a02433b 100644
--- a/doc/html/a00102.html
+++ b/doc/html/a00102.html
@@ -20,21 +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::interface5::reader_writer_lock Member List</h1>This is the complete list of members for <a class="el" href="a00274.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="a00274.html">tbb::interface5::reader_writer_lock</a>)</td><td><a class="el" href="a00274.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="a00274.html">tbb::interface5::reader_writer_lock</a>)</td><td><a class="el" href="a00274.html">tbb::interface5::reader_writer_lock</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00274.html#2653d1a2d560059a51219a8ceab3ade9">lock</a>()</td><td><a class="el" href="a00274.html">tbb::interface5::reader_writer_lock</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00274.html#d9d16a24d9f6c3dada73c6b9ff214f5b">lock_read</a>()</td><td><a class="el" href="a00274.html">tbb::interface5::reader_writer_lock</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00274.html#c1431c4293e777efd9aab9a95c2a46e1">reader_writer_lock</a>()</td><td><a class="el" href="a00274.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="a00274.html">tbb::interface5::reader_writer_lock</a>)</td><td><a class="el" href="a00274.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="a00274.html">tbb::interface5::reader_writer_lock</a>)</td><td><a class="el" href="a00274.html">tbb::interface5::reader_writer_lock</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00274.html#6f921f0d7c1812ceb5674418c8b6ccaf">status_t</a> enum name</td><td><a class="el" href="a00274.html">tbb::interface5::reader_writer_lock</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00274.html#721eb173e154ab38292273e9266a9b07">try_lock</a>()</td><td><a class="el" href="a00274.html">tbb::interface5::reader_writer_lock</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00274.html#595fb23952e3b89426b1f7938dea9b11">try_lock_read</a>()</td><td><a class="el" href="a00274.html">tbb::interface5::reader_writer_lock</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00274.html#5113b32689305599b2c36b5831547704">unlock</a>()</td><td><a class="el" href="a00274.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="a00274.html">tbb::interface5::reader_writer_lock</a>)</td><td><a class="el" href="a00274.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="a00274.html">tbb::interface5::reader_writer_lock</a>)</td><td><a class="el" href="a00274.html">tbb::interface5::reader_writer_lock</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00274.html#5135f64f7b7339017f33d956445edbee">~reader_writer_lock</a>()</td><td><a class="el" href="a00274.html">tbb::interface5::reader_writer_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="a00294.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="a00294.html">tbb::interface5::reader_writer_lock::scoped_lock_read</a>)</td><td><a class="el" href="a00294.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="a00294.html">tbb::interface5::reader_writer_lock::scoped_lock_read</a>)</td><td><a class="el" href="a00294.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="a00294.html">tbb::interface5::reader_writer_lock::scoped_lock_read</a>)</td><td><a class="el" href="a00294.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="a00294.html#87ab0dc8f7216e6ba0f7acd6aec33064">scoped_lock_read</a>(reader_writer_lock &lock)</td><td><a class="el" href="a00294.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="a00294.html#bd21c5f3d555d64d1de8658e15bf4966">~scoped_lock_read</a>()</td><td><a class="el" href="a00294.html">tbb::interface5::reader_writer_lock::scoped_lock_read</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00103.html b/doc/html/a00103.html
index 5800849..b32866d 100644
--- a/doc/html/a00103.html
+++ b/doc/html/a00103.html
@@ -20,12 +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::interface5::reader_writer_lock::scoped_lock Member List</h1>This is the complete list of members for <a class="el" href="a00275.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="a00275.html">tbb::interface5::reader_writer_lock::scoped_lock</a>)</td><td><a class="el" href="a00275.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="a00275.html">tbb::interface5::reader_writer_lock::scoped_lock</a>)</td><td><a class="el" href="a00275.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="a00275.html">tbb::interface5::reader_writer_lock::scoped_lock</a>)</td><td><a class="el" href="a00275.html">tbb::interface5::reader_writer_lock::scoped_lock</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00275.html#cf19f20e082887c1bb0ba6b0911c3583">scoped_lock</a>(reader_writer_lock &lock)</td><td><a class="el" href="a00275.html">tbb::interface5::reader_writer_lock::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00275.html#70246e0260493625ff956fa5926fc71f">~scoped_lock</a>()</td><td><a class="el" href="a00275.html">tbb::interface5::reader_writer_lock::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::recursive_mutex Member List</h1>This is the complete list of members for <a class="el" href="a00296.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="a00296.html">tbb::recursive_mutex</a>)</td><td><a class="el" href="a00296.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="a00296.html">tbb::recursive_mutex</a>)</td><td><a class="el" href="a00296.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="a00296.html">tbb::recursive_mutex</a>)</td><td><a class="el" href="a00296.html">tbb::recursive_mutex</a></td><td><code> [static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00296.html#4c342c69d47f4bb0b393535dee4015d6">lock</a>()</td><td><a class="el" href="a00296.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="a00296.html">tbb::recursive_mutex</a>)</td><td><a class="el" href="a00296.html">tbb::recursive_mutex</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00296.html#889fa8cc32dd707eef7c0f52dda09c0d">native_handle_type</a> typedef</td><td><a class="el" href="a00296.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="a00296.html">tbb::recursive_mutex</a>)</td><td><a class="el" href="a00296.html">tbb::recursive_mutex</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00296.html#d2fceb7f95c24a8cd1457d4527e4b8c6">recursive_mutex</a>()</td><td><a class="el" href="a00296.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="a00296.html">tbb::recursive_mutex</a>)</td><td><a class="el" href="a00296.html">tbb::recursive_mutex</a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00296.html#86e719b0afee25704af11ab97694d240">try_lock</a>()</td><td><a class="el" href="a00296.html">tbb::recursive_mutex</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00296.html#f0a96e26b7f074588dc31e32524856ae">unlock</a>()</td><td><a class="el" href="a00296.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="a00296.html">tbb::recursive_mutex</a>)</td><td><a class="el" href="a00296.html">tbb::recursive_mutex</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00104.html b/doc/html/a00104.html
index ed68e97..fc62e2c 100644
--- a/doc/html/a00104.html
+++ b/doc/html/a00104.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::interface5::reader_writer_lock::scoped_lock_read Member List</h1>This is the complete list of members for <a class="el" href="a00276.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="a00276.html">tbb::interface5::reader_writer_lock::scoped_lock_read</a>)</td><td><a class="el" href="a00276.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="a00276.html">tbb::interface5::reader_writer_lock::scoped_lock_read</a>)</td><td><a class="el" href="a00276.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="a00276.html">tbb::interface5::reader_writer_lock::scoped_lock_read</a>)</td><td><a class="el" href="a00276.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="a00276.html#87ab0dc8f7216e6ba0f7acd6aec33064">scoped_lock_read</a>(reader_writer_lock &lock)</td><td><a class="el" href="a00276.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="a00276.html#bd21c5f3d555d64d1de8658e15bf4966">~scoped_lock_read</a>()</td><td><a class="el" href="a00276.html">tbb::interface5::reader_writer_lock::scoped_lock_read</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="a00297.html">tbb::recursive_mutex::scoped_lock</a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00297.html#7fb04da37cccf8c99b1f9102d9074f9a">acquire</a>(recursive_mutex &mutex)</td><td><a class="el" href="a00297.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="a00297.html">tbb::recursive_mutex::scoped_lock</a>)</td><td><a class="el" href="a00297.html">tbb::recursive_mutex::scoped_lock</a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00297.html#ac480ea0e9d5ea0345a67d57008b6263">release</a>()</td><td><a class="el" href="a00297.html">tbb::recursive_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00297.html#d82d4d36fbf9727a493d26ae50855fe7">scoped_lock</a>()</td><td><a class="el" href="a00297.html">tbb::recursive_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00297.html#dec17713c4c1321ac8fec66816d0c602">scoped_lock</a>(recursive_mutex &mutex)</td><td><a class="el" href="a00297.html">tbb::recursive_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00297.html#36bfc3e93e3ef6340abef4901444d340">try_acquire</a>(recursive_mutex &mutex)</td><td><a class="el" href="a00297.html">tbb::recursive_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00297.html#c1197ffb8f3cd9d4fed71d7e06265b7c">~scoped_lock</a>()</td><td><a class="el" href="a00297.html">tbb::recursive_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00105.html b/doc/html/a00105.html
index 59ca4f2..83bdf57 100644
--- a/doc/html/a00105.html
+++ b/doc/html/a00105.html
@@ -20,19 +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::recursive_mutex Member List</h1>This is the complete list of members for <a class="el" href="a00278.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="a00278.html">tbb::recursive_mutex</a>)</td><td><a class="el" href="a00278.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="a00278.html">tbb::recursive_mutex</a>)</td><td><a class="el" href="a00278.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="a00278.html">tbb::recursive_mutex</a>)</td><td><a class="el" href="a00278.html">tbb::recursive_mutex</a></td><td><code> [static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00278.html#4c342c69d47f4bb0b393535dee4015d6">lock</a>()</td><td><a class="el" href="a00278.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="a00278.html">tbb::recursive_mutex</a>)</td><td><a class="el" href="a00278.html">tbb::recursive_mutex</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00278.html#889fa8cc32dd707eef7c0f52dda09c0d">native_handle_type</a> typedef</td><td><a class="el" href="a00278.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="a00278.html">tbb::recursive_mutex</a>)</td><td><a class="el" href="a00278.html">tbb::recursive_mutex</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00278.html#d2fceb7f95c24a8cd1457d4527e4b8c6">recursive_mutex</a>()</td><td><a class="el" href="a00278.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="a00278.html">tbb::recursive_mutex</a>)</td><td><a class="el" href="a00278.html">tbb::recursive_mutex</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00278.html#86e719b0afee25704af11ab97694d240">try_lock</a>()</td><td><a class="el" href="a00278.html">tbb::recursive_mutex</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00278.html#f0a96e26b7f074588dc31e32524856ae">unlock</a>()</td><td><a class="el" href="a00278.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="a00278.html">tbb::recursive_mutex</a>)</td><td><a class="el" href="a00278.html">tbb::recursive_mutex</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::interface6::runtime_loader Member List</h1>This is the complete list of members for <a class="el" href="a00298.html">tbb::interface6::runtime_loader</a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00298.html#6831be91cdc64e57e565ce0dde01878927e94a7b173bb8d0623bf48aad8fc703">ec_bad_arg</a> enum value</td><td><a class="el" href="a00298.html">tbb::interface6::runtime_loader</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00298.html#6831be91cdc64e57e565ce0dde018789e6ce2b091083b80878cbb70cd00782a1">ec_bad_call</a> enum value</td><td><a class="el" href="a00298.html">tbb::interface6::runtime_loader</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00298.html#6831be91cdc64e57e565ce0dde01878903ee81d8c05966bc1125666713dee5f6">ec_bad_lib</a> enum value</td><td><a class="el" href="a00298.html">tbb::interface6::runtime_loader</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00298.html#6831be91cdc64e57e565ce0dde01878907790f32918e60d670a96c1f0349e8d6">ec_bad_ver</a> enum value</td><td><a class="el" href="a00298.html">tbb::interface6::runtime_loader</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00298.html#6831be91cdc64e57e565ce0dde01878902acc03ebfcdb16e3e26b24f64da2bdb">ec_no_lib</a> enum value</td><td><a class="el" href="a00298.html">tbb::interface6::runtime_loader</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00298.html#6831be91cdc64e57e565ce0dde0187891e3a364f63f419e5ea2f1d1e52289b27">ec_ok</a> enum value</td><td><a class="el" href="a00298.html">tbb::interface6::runtime_loader</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00298.html#bb0130fe0f596399707e61431231ebcb630dd30c9ba61d5ab187e80313bbad94">em_abort</a> enum value</td><td><a class="el" href="a00298.html">tbb::interface6::runtime_loader</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00298.html#bb0130fe0f596399707e61431231ebcbdb47fe5ffbd2eaf47e6de0af433ada38">em_status</a> enum value</td><td><a class="el" href="a00298.html">tbb::interface6::runtime_loader</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00298.html#bb0130fe0f596399707e61431231ebcbdeb59ca2912432b47fd3ec831574653b">em_throw</a> enum value</td><td><a class="el" href="a00298.html">tbb::interface6::runtime_loader</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00298.html#6831be91cdc64e57e565ce0dde018789">error_code</a> enum name</td><td><a class="el" href="a00298.html">tbb::interface6::runtime_loader</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00298.html#bb0130fe0f596399707e61431231ebcb">error_mode</a> enum name</td><td><a class="el" href="a00298.html">tbb::interface6::runtime_loader</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00298.html#5f3f6f1683386705a6931acae45f0862">load</a>(char const *path[], int min_ver=TBB_INTERFACE_VERSION, int max_ver=INT_MAX)</td><td><a class="el" href="a00298.html">tbb::interface6::runtime_loader</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00298.html#7caa4ff6e44c2348e67f601cc5d97c34">runtime_loader</a>(error_mode mode=em_abort)</td><td><a class="el" href="a00298.html">tbb::interface6::runtime_loader</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00298.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="a00298.html">tbb::interface6::runtime_loader</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00298.html#78d938ed2e54d38dd38d6609e6c60389">status</a>()</td><td><a class="el" href="a00298.html">tbb::interface6::runtime_loader</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00298.html#c25fec923a751a3e03f5cbe969f1f0c5">~runtime_loader</a>()</td><td><a class="el" href="a00298.html">tbb::interface6::runtime_loader</a></td><td></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00106.html b/doc/html/a00106.html
deleted file mode 100644
index 9320470..0000000
--- a/doc/html/a00106.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::recursive_mutex::scoped_lock Member List</h1>This is the complete list of members for <a class="el" href="a00279.html">tbb::recursive_mutex::scoped_lock</a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00279.html#7fb04da37cccf8c99b1f9102d9074f9a">acquire</a>(recursive_mutex &mutex)</td><td><a class="el" href="a00279.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="a00279.html">tbb::recursive_mutex::scoped_lock</a>)</td><td><a class="el" href="a00279.html">tbb::recursive_mutex::scoped_lock</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00279.html#ac480ea0e9d5ea0345a67d57008b6263">release</a>()</td><td><a class="el" href="a00279.html">tbb::recursive_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00279.html#d82d4d36fbf9727a493d26ae50855fe7">scoped_lock</a>()</td><td><a class="el" href="a00279.html">tbb::recursive_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00279.html#dec17713c4c1321ac8fec66816d0c602">scoped_lock</a>(recursive_mutex &mutex)</td><td><a class="el" href="a00279.html">tbb::recursive_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00279.html#36bfc3e93e3ef6340abef4901444d340">try_acquire</a>(recursive_mutex &mutex)</td><td><a class="el" href="a00279.html">tbb::recursive_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00279.html#c1197ffb8f3cd9d4fed71d7e06265b7c">~scoped_lock</a>()</td><td><a class="el" href="a00279.html">tbb::recursive_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
-</table><hr>
-<p></p>
-Copyright © 2005-2011 Intel Corporation. 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/a00107.html b/doc/html/a00107.html
index bbf4347..c8878d4 100644
--- a/doc/html/a00107.html
+++ b/doc/html/a00107.html
@@ -20,24 +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::scalable_allocator< T > Member List</h1>This is the complete list of members for <a class="el" href="a00280.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="a00280.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00280.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="a00280.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00280.html">tbb::scalable_allocator< T ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00280.html#726b1586d05d44665a36e1c7b2699bfd">allocate</a>(size_type n, const void *=0)</td><td><a class="el" href="a00280.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="a00280.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00280.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="a00280.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00280.html">tbb::scalable_allocator< T ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>construct</b>(pointer p, const value_type &value) (defined in <a class="el" href="a00280.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00280.html">tbb::scalable_allocator< T ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00280.html#f806a238c18cbcfb531e1e0a0d2ec59d">deallocate</a>(pointer p, size_type)</td><td><a class="el" href="a00280.html">tbb::scalable_allocator< T ></a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>destroy</b>(pointer p) (defined in <a class="el" href="a00280.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00280.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="a00280.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00280.html">tbb::scalable_allocator< T ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00280.html#880e766f1d913988c21973dbdd874fd5">max_size</a>() const </td><td><a class="el" href="a00280.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="a00280.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00280.html">tbb::scalable_allocator< T ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>reference</b> typedef (defined in <a class="el" href="a00280.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00280.html">tbb::scalable_allocator< T ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>scalable_allocator</b>() (defined in <a class="el" href="a00280.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00280.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="a00280.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00280.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="a00280.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00280.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="a00280.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00280.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="a00280.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00280.html">tbb::scalable_allocator< T ></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="a00299.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="a00299.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00299.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="a00299.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00299.html">tbb::scalable_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00299.html#726b1586d05d44665a36e1c7b2699bfd">allocate</a>(size_type n, const void *=0)</td><td><a class="el" href="a00299.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="a00299.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00299.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="a00299.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00299.html">tbb::scalable_allocator< T ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>construct</b>(pointer p, const value_type &value) (defined in <a class="el" href="a00299.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00299.html">tbb::scalable_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00299.html#f806a238c18cbcfb531e1e0a0d2ec59d">deallocate</a>(pointer p, size_type)</td><td><a class="el" href="a00299.html">tbb::scalable_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>destroy</b>(pointer p) (defined in <a class="el" href="a00299.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00299.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="a00299.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00299.html">tbb::scalable_allocator< T ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00299.html#880e766f1d913988c21973dbdd874fd5">max_size</a>() const </td><td><a class="el" href="a00299.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="a00299.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00299.html">tbb::scalable_allocator< T ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>reference</b> typedef (defined in <a class="el" href="a00299.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00299.html">tbb::scalable_allocator< T ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>scalable_allocator</b>() (defined in <a class="el" href="a00299.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00299.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="a00299.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00299.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="a00299.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00299.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="a00299.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00299.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="a00299.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00299.html">tbb::scalable_allocator< T ></a></td><td></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00109.html b/doc/html/a00109.html
index 76982cc..38d7564 100644
--- a/doc/html/a00109.html
+++ b/doc/html/a00109.html
@@ -20,10 +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::scalable_allocator< void > Member List</h1>This is the complete list of members for <a class="el" href="a00281.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="a00281.html">tbb::scalable_allocator< void ></a>)</td><td><a class="el" href="a00281.html">tbb::scalable_allocator< void ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>pointer</b> typedef (defined in <a class="el" href="a00281.html">tbb::scalable_allocator< void ></a>)</td><td><a class="el" href="a00281.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="a00281.html">tbb::scalable_allocator< void ></a>)</td><td><a class="el" href="a00281.html">tbb::scalable_allocator< void ></a></td><td></td></tr>
+<h1>tbb::scalable_allocator< void > Member List</h1>This is the complete list of members for <a class="el" href="a00300.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="a00300.html">tbb::scalable_allocator< void ></a>)</td><td><a class="el" href="a00300.html">tbb::scalable_allocator< void ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>pointer</b> typedef (defined in <a class="el" href="a00300.html">tbb::scalable_allocator< void ></a>)</td><td><a class="el" href="a00300.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="a00300.html">tbb::scalable_allocator< void ></a>)</td><td><a class="el" href="a00300.html">tbb::scalable_allocator< void ></a></td><td></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00111.html b/doc/html/a00111.html
index 34e8215..b36c110 100644
--- a/doc/html/a00111.html
+++ b/doc/html/a00111.html
@@ -20,16 +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::spin_mutex Member List</h1>This is the complete list of members for <a class="el" href="a00286.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="a00286.html">tbb::spin_mutex</a>)</td><td><a class="el" href="a00286.html">tbb::spin_mutex</a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>is_fair_mutex</b> (defined in <a class="el" href="a00286.html">tbb::spin_mutex</a>)</td><td><a class="el" href="a00286.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="a00286.html">tbb::spin_mutex</a>)</td><td><a class="el" href="a00286.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="a00286.html">tbb::spin_mutex</a>)</td><td><a class="el" href="a00286.html">tbb::spin_mutex</a></td><td><code> [static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00286.html#4f748989e19b6045e3a2d2ee73626a28">lock</a>()</td><td><a class="el" href="a00286.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="a00286.html">tbb::spin_mutex</a>)</td><td><a class="el" href="a00286.html">tbb::spin_mutex</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00286.html#3d8fb44644fd8d41ada1fbeba7409be3">spin_mutex</a>()</td><td><a class="el" href="a00286.html">tbb::spin_mutex</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00286.html#8f9a58fb56a2b4c5efe1a7f7c1ae2074">try_lock</a>()</td><td><a class="el" href="a00286.html">tbb::spin_mutex</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00286.html#0e843ee6265f57f27d228ba91e7308ef">unlock</a>()</td><td><a class="el" href="a00286.html">tbb::spin_mutex</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="a00305.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="a00305.html">tbb::spin_mutex</a>)</td><td><a class="el" href="a00305.html">tbb::spin_mutex</a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>is_fair_mutex</b> (defined in <a class="el" href="a00305.html">tbb::spin_mutex</a>)</td><td><a class="el" href="a00305.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="a00305.html">tbb::spin_mutex</a>)</td><td><a class="el" href="a00305.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="a00305.html">tbb::spin_mutex</a>)</td><td><a class="el" href="a00305.html">tbb::spin_mutex</a></td><td><code> [static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00305.html#4f748989e19b6045e3a2d2ee73626a28">lock</a>()</td><td><a class="el" href="a00305.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="a00305.html">tbb::spin_mutex</a>)</td><td><a class="el" href="a00305.html">tbb::spin_mutex</a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00305.html#3d8fb44644fd8d41ada1fbeba7409be3">spin_mutex</a>()</td><td><a class="el" href="a00305.html">tbb::spin_mutex</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00305.html#8f9a58fb56a2b4c5efe1a7f7c1ae2074">try_lock</a>()</td><td><a class="el" href="a00305.html">tbb::spin_mutex</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00305.html#0e843ee6265f57f27d228ba91e7308ef">unlock</a>()</td><td><a class="el" href="a00305.html">tbb::spin_mutex</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00112.html b/doc/html/a00112.html
index 04418b4..27d1506 100644
--- a/doc/html/a00112.html
+++ b/doc/html/a00112.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::spin_mutex::scoped_lock Member List</h1>This is the complete list of members for <a class="el" href="a00287.html">tbb::spin_mutex::scoped_lock</a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00287.html#3ee3c338732b1f64b0b32a757807a30d">acquire</a>(spin_mutex &m)</td><td><a class="el" href="a00287.html">tbb::spin_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00287.html#eeb615e68e963e6bf8d9c11402d0ce8e">release</a>()</td><td><a class="el" href="a00287.html">tbb::spin_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00287.html#29ae680ae7f5e685c2e15535b9c855b3">scoped_lock</a>()</td><td><a class="el" href="a00287.html">tbb::spin_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00287.html#5ce6807050a9e8f87bcb4a65dccb12ef">scoped_lock</a>(spin_mutex &m)</td><td><a class="el" href="a00287.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="a00287.html">tbb::spin_mutex::scoped_lock</a>)</td><td><a class="el" href="a00287.html">tbb::spin_mutex::scoped_lock</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00287.html#9297ec188534b45dc0ca48f2f39a0501">try_acquire</a>(spin_mutex &m)</td><td><a class="el" href="a00287.html">tbb::spin_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00287.html#ac6fa425d1f06c56d8b70abc51aac844">~scoped_lock</a>()</td><td><a class="el" href="a00287.html">tbb::spin_mutex::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="a00306.html">tbb::spin_mutex::scoped_lock</a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00306.html#3ee3c338732b1f64b0b32a757807a30d">acquire</a>(spin_mutex &m)</td><td><a class="el" href="a00306.html">tbb::spin_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00306.html#eeb615e68e963e6bf8d9c11402d0ce8e">release</a>()</td><td><a class="el" href="a00306.html">tbb::spin_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00306.html#29ae680ae7f5e685c2e15535b9c855b3">scoped_lock</a>()</td><td><a class="el" href="a00306.html">tbb::spin_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00306.html#5ce6807050a9e8f87bcb4a65dccb12ef">scoped_lock</a>(spin_mutex &m)</td><td><a class="el" href="a00306.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="a00306.html">tbb::spin_mutex::scoped_lock</a>)</td><td><a class="el" href="a00306.html">tbb::spin_mutex::scoped_lock</a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00306.html#9297ec188534b45dc0ca48f2f39a0501">try_acquire</a>(spin_mutex &m)</td><td><a class="el" href="a00306.html">tbb::spin_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00306.html#ac6fa425d1f06c56d8b70abc51aac844">~scoped_lock</a>()</td><td><a class="el" href="a00306.html">tbb::spin_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00113.html b/doc/html/a00113.html
index 2dcf573..8c9a5ce 100644
--- a/doc/html/a00113.html
+++ b/doc/html/a00113.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::spin_rw_mutex_v3 Member List</h1>This is the complete list of members for <a class="el" href="a00288.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="a00288.html">tbb::spin_rw_mutex_v3</a>)</td><td><a class="el" href="a00288.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="a00288.html">tbb::spin_rw_mutex_v3</a>)</td><td><a class="el" href="a00288.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="a00288.html">tbb::spin_rw_mutex_v3</a>)</td><td><a class="el" href="a00288.html">tbb::spin_rw_mutex_v3</a></td><td><code> [static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00288.html#4007d6e1523dbc3c2bb7f889ab789a8a">lock</a>()</td><td><a class="el" href="a00288.html">tbb::spin_rw_mutex_v3</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00288.html#13f799708ac4ca437a16be202e263e18">lock_read</a>()</td><td><a class="el" href="a00288.html">tbb::spin_rw_mutex_v3</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00288.html#61332b2756de89f3f5f69310cbb6e70c">spin_rw_mutex_v3</a>()</td><td><a class="el" href="a00288.html">tbb::spin_rw_mutex_v3</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00288.html#088bb256be794cc47d3b83791632fdfc">try_lock</a>()</td><td><a class="el" href="a00288.html">tbb::spin_rw_mutex_v3</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00288.html#b8667415869013f840d976aa406d385a">try_lock_read</a>()</td><td><a class="el" href="a00288.html">tbb::spin_rw_mutex_v3</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00288.html#f9f52ead2098eb5fb12da59d5ae53b55">unlock</a>()</td><td><a class="el" href="a00288.html">tbb::spin_rw_mutex_v3</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00288.html#9a815fb2759e55072ed413f1b6970cf3">~spin_rw_mutex_v3</a>()</td><td><a class="el" href="a00288.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="a00307.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="a00307.html">tbb::spin_rw_mutex_v3</a>)</td><td><a class="el" href="a00307.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="a00307.html">tbb::spin_rw_mutex_v3</a>)</td><td><a class="el" href="a00307.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="a00307.html">tbb::spin_rw_mutex_v3</a>)</td><td><a class="el" href="a00307.html">tbb::spin_rw_mutex_v3</a></td><td><code> [static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00307.html#4007d6e1523dbc3c2bb7f889ab789a8a">lock</a>()</td><td><a class="el" href="a00307.html">tbb::spin_rw_mutex_v3</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00307.html#13f799708ac4ca437a16be202e263e18">lock_read</a>()</td><td><a class="el" href="a00307.html">tbb::spin_rw_mutex_v3</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00307.html#61332b2756de89f3f5f69310cbb6e70c">spin_rw_mutex_v3</a>()</td><td><a class="el" href="a00307.html">tbb::spin_rw_mutex_v3</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00307.html#088bb256be794cc47d3b83791632fdfc">try_lock</a>()</td><td><a class="el" href="a00307.html">tbb::spin_rw_mutex_v3</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00307.html#b8667415869013f840d976aa406d385a">try_lock_read</a>()</td><td><a class="el" href="a00307.html">tbb::spin_rw_mutex_v3</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00307.html#f9f52ead2098eb5fb12da59d5ae53b55">unlock</a>()</td><td><a class="el" href="a00307.html">tbb::spin_rw_mutex_v3</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00307.html#9a815fb2759e55072ed413f1b6970cf3">~spin_rw_mutex_v3</a>()</td><td><a class="el" href="a00307.html">tbb::spin_rw_mutex_v3</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00114.html b/doc/html/a00114.html
index 563ff24..541405c 100644
--- a/doc/html/a00114.html
+++ b/doc/html/a00114.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::spin_rw_mutex_v3::scoped_lock Member List</h1>This is the complete list of members for <a class="el" href="a00289.html">tbb::spin_rw_mutex_v3::scoped_lock</a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00289.html#b0b646ec5be02a127d159bbb7ca65353">acquire</a>(spin_rw_mutex &m, bool write=true)</td><td><a class="el" href="a00289.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00289.html#c2c2c38a08cb9080e87099fac3e5bc94">downgrade_to_reader</a>()</td><td><a class="el" href="a00289.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00289.html#6b5a7c3c67a36b05c4df8410d32627d8">is_writer</a></td><td><a class="el" href="a00289.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00289.html#d96d1a1fcc3d79ef3e5c06a53b8ffeaa">mutex</a></td><td><a class="el" href="a00289.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00289.html#61b14d00a78185c9b2d206ebfc379124">release</a>()</td><td><a class="el" href="a00289.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00289.html#d6ea60dee5563f702379bf5e51aa8806">scoped_lock</a>()</td><td><a class="el" href="a00289.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00289.html#42a92d4f8fdde425b111cfa8a9228071">scoped_lock</a>(spin_rw_mutex &m, bool write=true)</td><td><a class="el" href="a00289.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00289.html#9879626968d9b9a04cd2ec0fb2e84ae1">try_acquire</a>(spin_rw_mutex &m, bool write=true)</td><td><a class="el" href="a00289.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00289.html#3f0b1e3f2efab63336400348bd070226">upgrade_to_writer</a>()</td><td><a class="el" href="a00289.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00289.html#d7eaaa3f2e2c5dc11e7005811b1bdd04">~scoped_lock</a>()</td><td><a class="el" href="a00289.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::spin_rw_mutex_v3::scoped_lock Member List</h1>This is the complete list of members for <a class="el" href="a00308.html">tbb::spin_rw_mutex_v3::scoped_lock</a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00308.html#b0b646ec5be02a127d159bbb7ca65353">acquire</a>(spin_rw_mutex &m, bool write=true)</td><td><a class="el" href="a00308.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00308.html#c2c2c38a08cb9080e87099fac3e5bc94">downgrade_to_reader</a>()</td><td><a class="el" href="a00308.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00308.html#6b5a7c3c67a36b05c4df8410d32627d8">is_writer</a></td><td><a class="el" href="a00308.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00308.html#d96d1a1fcc3d79ef3e5c06a53b8ffeaa">mutex</a></td><td><a class="el" href="a00308.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00308.html#61b14d00a78185c9b2d206ebfc379124">release</a>()</td><td><a class="el" href="a00308.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00308.html#d6ea60dee5563f702379bf5e51aa8806">scoped_lock</a>()</td><td><a class="el" href="a00308.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00308.html#42a92d4f8fdde425b111cfa8a9228071">scoped_lock</a>(spin_rw_mutex &m, bool write=true)</td><td><a class="el" href="a00308.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00308.html#9879626968d9b9a04cd2ec0fb2e84ae1">try_acquire</a>(spin_rw_mutex &m, bool write=true)</td><td><a class="el" href="a00308.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00308.html#3f0b1e3f2efab63336400348bd070226">upgrade_to_writer</a>()</td><td><a class="el" href="a00308.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00308.html#d7eaaa3f2e2c5dc11e7005811b1bdd04">~scoped_lock</a>()</td><td><a class="el" href="a00308.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00116.html b/doc/html/a00116.html
index 7b83c00..78a43a7 100644
--- a/doc/html/a00116.html
+++ b/doc/html/a00116.html
@@ -20,7 +20,7 @@
<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="a00292.html">tbb::interface5::internal::task_base</a>, including all inherited members.<p><table>
+<h1>tbb::interface5::internal::task_base Member List</h1>This is the complete list of members for <a class="el" href="a00312.html">tbb::interface5::internal::task_base</a>, including all inherited members.<p><table>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00117.html b/doc/html/a00117.html
deleted file mode 100644
index 90456af..0000000
--- a/doc/html/a00117.html
+++ /dev/null
@@ -1,52 +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_group_context Member List</h1>This is the complete list of members for <a class="el" href="a00293.html">tbb::task_group_context</a>, including all inherited members.<p><table>
- <tr bgcolor="#f0f0f0"><td><b>bound</b> enum value (defined in <a class="el" href="a00293.html">tbb::task_group_context</a>)</td><td><a class="el" href="a00293.html">tbb::task_group_context</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00293.html#8bcdfdf4e6bfb76125b6de15c00b571d">cancel_group_execution</a>()</td><td><a class="el" href="a00293.html">tbb::task_group_context</a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>concurrent_wait</b> enum value (defined in <a class="el" href="a00293.html">tbb::task_group_context</a>)</td><td><a class="el" href="a00293.html">tbb::task_group_context</a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>default_traits</b> enum value (defined in <a class="el" href="a00293.html">tbb::task_group_context</a>)</td><td><a class="el" href="a00293.html">tbb::task_group_context</a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>exact_exception</b> enum value (defined in <a class="el" href="a00293.html">tbb::task_group_context</a>)</td><td><a class="el" href="a00293.html">tbb::task_group_context</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00293.html#49a55352084fd44b8863d182e839e6dc">init</a>()</td><td><a class="el" href="a00293.html">tbb::task_group_context</a></td><td><code> [protected]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal::allocate_root_with_context_proxy</b> (defined in <a class="el" href="a00293.html">tbb::task_group_context</a>)</td><td><a class="el" href="a00293.html">tbb::task_group_context</a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>internal::generic_scheduler</b> (defined in <a class="el" href="a00293.html">tbb::task_group_context</a>)</td><td><a class="el" href="a00293.html">tbb::task_group_context</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00293.html#4db72f16210b0a991b2c134d6763a4cc">is_group_execution_cancelled</a>() const </td><td><a class="el" href="a00293.html">tbb::task_group_context</a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>isolated</b> enum value (defined in <a class="el" href="a00293.html">tbb::task_group_context</a>)</td><td><a class="el" href="a00293.html">tbb::task_group_context</a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>kind_type</b> enum name (defined in <a class="el" href="a00293.html">tbb::task_group_context</a>)</td><td><a class="el" href="a00293.html">tbb::task_group_context</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00293.html#2f2342b9e6c9c03703248ac13ad0271d">priority</a>() const </td><td><a class="el" href="a00293.html">tbb::task_group_context</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00293.html#d97c8a03615594b71b4ef06ff75cf561">register_pending_exception</a>()</td><td><a class="el" href="a00293.html">tbb::task_group_context</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00293.html#6d30d16bf1cd22f86c6afaf29c2b430c">reset</a>()</td><td><a class="el" href="a00293.html">tbb::task_group_context</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00293.html#c4272d4d9ab65d600ca70fc2c8c4b039">set_priority</a>(priority_t)</td><td><a class="el" href="a00293.html">tbb::task_group_context</a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>task</b> (defined in <a class="el" href="a00293.html">tbb::task_group_context</a>)</td><td><a class="el" href="a00293.html">tbb::task_group_context</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00293.html#19fee08fb8ac98adccfe69c1aa63c491">task_group_context</a>(kind_type relation_with_parent=bound, uintptr_t traits=default_traits)</td><td><a class="el" href="a00293.html">tbb::task_group_context</a></td><td><code> [inline]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>task_scheduler_init</b> (defined in <a class="el" href="a00293.html">tbb::task_group_context</a>)</td><td><a class="el" href="a00293.html">tbb::task_group_context</a></td><td><code> [friend]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>traits_type</b> enum name (defined in <a class="el" href="a00293.html">tbb::task_group_context</a>)</td><td><a class="el" href="a00293.html">tbb::task_group_context</a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>~task_group_context</b>() (defined in <a class="el" href="a00293.html">tbb::task_group_context</a>)</td><td><a class="el" href="a00293.html">tbb::task_group_context</a></td><td></td></tr>
-</table><hr>
-<p></p>
-Copyright © 2005-2011 Intel Corporation. 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/a00119.html b/doc/html/a00119.html
index 6bac6a7..300283a 100644
--- a/doc/html/a00119.html
+++ b/doc/html/a00119.html
@@ -20,64 +20,65 @@
<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="a00291.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="a00291.html">tbb::task</a>)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#3a920a56b0bcf2801518fb45b2c9d2be">affinity</a>() const </td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#d61bb32389d3857bf7511d69beaafb76">affinity_id</a> typedef</td><td><a class="el" href="a00291.html">tbb::task</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#1ff794f7053cd9148d5f280fbf07377f">allocate_child</a>()</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#1434c79a5138993269d034008bff7329">allocate_continuation</a>()</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#23acb0da0afd690da797f9f882027d34">allocate_root</a>()</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#8ccc518caf31075a3e073996d2d240a4">allocate_root</a>(task_group_context &ctx)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293ebe94d3348dd038e41107819f00c1884c">allocated</a> enum value</td><td><a class="el" href="a00291.html">tbb::task</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#0f3fb4aac549ab642022450a4bd13326">cancel_group_execution</a>()</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#62247be9a637a814c8e8f4bcfb3a1908">change_group</a>(task_group_context &ctx)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#d8c36a93f3972590fbb65ff1cef3173b">context</a>()</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#ef4680f5c148020c5e7e43ddef44cd5d">decrement_ref_count</a>()</td><td><a class="el" href="a00291.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="a00291.html">tbb::task</a>)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#dfaacf92685e5f86393bf657b2853bf8">destroy</a>(task &t)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#8365d063c0cc9d7bd616bca47256b93c">enqueue</a>(task &t)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#fe6bf6aaf84e664134fabb6c4f409ea9">enqueue</a>(task &t, priority_t p)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#22c298cd40937a431a06777423f002f6">execute</a>()=0</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [pure virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293ead0fe2302ccc360923f738c2ed7ec1b9">executing</a> enum value</td><td><a class="el" href="a00291.html">tbb::task</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293ecc67ca92bd6f1ce9738a1e9e7206b735">freed</a> enum value</td><td><a class="el" href="a00291.html">tbb::task</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#5987123486afca36ddebb9e2a8b7779a">group</a>()</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#e1d969a1ccab6796e3b8b2c1a5be33d2">group_priority</a>() const </td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#f5fb43c7ad0de5a4b95703cebc39e345">increment_ref_count</a>()</td><td><a class="el" href="a00291.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="a00291.html">tbb::task</a>)</td><td><a class="el" href="a00291.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="a00291.html">tbb::task</a>)</td><td><a class="el" href="a00291.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="a00291.html">tbb::task</a>)</td><td><a class="el" href="a00291.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="a00291.html">tbb::task</a>)</td><td><a class="el" href="a00291.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="a00291.html">tbb::task</a>)</td><td><a class="el" href="a00291.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="a00291.html">tbb::task</a>)</td><td><a class="el" href="a00291.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="a00291.html">tbb::task</a>)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#025f18118c057c4c8db87ff2ce8df975">is_cancelled</a>() const </td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#c26718b3b247cd13deb1a741902e7105">is_owned_by_current_thread</a>() const </td><td><a class="el" href="a00291.html">tbb::task</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#f9169402702f56bf519448aaf34450aa">is_stolen_task</a>() const </td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#713c338c8eeaebdc5a6b10a69c039b06">note_affinity</a>(affinity_id id)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#314e98ee4347ccec83efcb9ee22e8596">parent</a>() const </td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293e0841dcf1c2a96dee9aa7b69f636cb81a">ready</a> enum value</td><td><a class="el" href="a00291.html">tbb::task</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293e58debec6ab130290640d0cc2eedba35d">recycle</a> enum value</td><td><a class="el" href="a00291.html">tbb::task</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#db399855177438bbc9cc61d508dae8d2">recycle_as_child_of</a>(task &new_parent)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#a67a79e18f62b43a623a00cfbd76db4c">recycle_as_continuation</a>()</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#3b290d14109704e2b69dc1ac980a7a76">recycle_as_safe_continuation</a>()</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#4f1be9bbcdb487830dbe298b68d85144">recycle_to_reexecute</a>()</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293e3bf499aa6e6487cd1ace883a63100513">reexecute</a> enum value</td><td><a class="el" href="a00291.html">tbb::task</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#ad774f55eaec008ae02b236423209ced">ref_count</a>() const </td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#bd43e8d6249738efafd12d6a4c72c5e3">self</a>()</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#dca19d7a45487a7d67a0db517e2b57c9">set_affinity</a>(affinity_id id)</td><td><a class="el" href="a00291.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="a00291.html">tbb::task</a>)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#9ac8d1542d67d9d80121ff986801ac26">set_group_priority</a>(priority_t p)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#06a4206a57e8e12a439b14d6d41cfd92">set_ref_count</a>(int count)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#3ce28ca9baa771cfc37ecd72e69c4f3c">spawn_and_wait_for_all</a>(task &child)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#894ab68378e502776d8220eea7ce9fa1">spawn_and_wait_for_all</a>(task_list &list)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#ce8ce689c26a4ddf343829bc3c73290a">spawn_root_and_wait</a>(task &root)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#c33c7edbaec67aa8a56f48986a9dc69f">spawn_root_and_wait</a>(task_list &root_list)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#0af7b2d7e6e8b4333b2accfce3dfb374">state</a>() const </td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293e">state_type</a> enum name</td><td><a class="el" href="a00291.html">tbb::task</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#2bce8ec6e44706e70128f5cf91b76e67">task</a>()</td><td><a class="el" href="a00291.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="a00291.html">tbb::task</a>)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#53d2615ad9c38859b4c8080936600283">wait_for_all</a>()</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#98245ee0473f84cb19dbbf8c81134908">~task</a>()</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline, virtual]</code></td></tr>
+<h1>tbb::task Member List</h1>This is the complete list of members for <a class="el" href="a00311.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="a00311.html">tbb::task</a>)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#3a920a56b0bcf2801518fb45b2c9d2be">affinity</a>() const </td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#d61bb32389d3857bf7511d69beaafb76">affinity_id</a> typedef</td><td><a class="el" href="a00311.html">tbb::task</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#1ff794f7053cd9148d5f280fbf07377f">allocate_child</a>()</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#1434c79a5138993269d034008bff7329">allocate_continuation</a>()</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#23acb0da0afd690da797f9f882027d34">allocate_root</a>()</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#8ccc518caf31075a3e073996d2d240a4">allocate_root</a>(task_group_context &ctx)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#4a3c415562d17905390ea5b49d12293ebe94d3348dd038e41107819f00c1884c">allocated</a> enum value</td><td><a class="el" href="a00311.html">tbb::task</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#0f3fb4aac549ab642022450a4bd13326">cancel_group_execution</a>()</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#62247be9a637a814c8e8f4bcfb3a1908">change_group</a>(task_group_context &ctx)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#d8c36a93f3972590fbb65ff1cef3173b">context</a>()</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#ef4680f5c148020c5e7e43ddef44cd5d">decrement_ref_count</a>()</td><td><a class="el" href="a00311.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="a00311.html">tbb::task</a>)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#dfaacf92685e5f86393bf657b2853bf8">destroy</a>(task &t)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#8365d063c0cc9d7bd616bca47256b93c">enqueue</a>(task &t)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#fe6bf6aaf84e664134fabb6c4f409ea9">enqueue</a>(task &t, priority_t p)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#22c298cd40937a431a06777423f002f6">execute</a>()=0</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [pure virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#4a3c415562d17905390ea5b49d12293ead0fe2302ccc360923f738c2ed7ec1b9">executing</a> enum value</td><td><a class="el" href="a00311.html">tbb::task</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#4a3c415562d17905390ea5b49d12293ecc67ca92bd6f1ce9738a1e9e7206b735">freed</a> enum value</td><td><a class="el" href="a00311.html">tbb::task</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#5987123486afca36ddebb9e2a8b7779a">group</a>()</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#e1d969a1ccab6796e3b8b2c1a5be33d2">group_priority</a>() const </td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#f5fb43c7ad0de5a4b95703cebc39e345">increment_ref_count</a>()</td><td><a class="el" href="a00311.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="a00311.html">tbb::task</a>)</td><td><a class="el" href="a00311.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="a00311.html">tbb::task</a>)</td><td><a class="el" href="a00311.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="a00311.html">tbb::task</a>)</td><td><a class="el" href="a00311.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="a00311.html">tbb::task</a>)</td><td><a class="el" href="a00311.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="a00311.html">tbb::task</a>)</td><td><a class="el" href="a00311.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="a00311.html">tbb::task</a>)</td><td><a class="el" href="a00311.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="a00311.html">tbb::task</a>)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#025f18118c057c4c8db87ff2ce8df975">is_cancelled</a>() const </td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#c26718b3b247cd13deb1a741902e7105">is_owned_by_current_thread</a>() const </td><td><a class="el" href="a00311.html">tbb::task</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#f9169402702f56bf519448aaf34450aa">is_stolen_task</a>() const </td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#713c338c8eeaebdc5a6b10a69c039b06">note_affinity</a>(affinity_id id)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#314e98ee4347ccec83efcb9ee22e8596">parent</a>() const </td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#4a3c415562d17905390ea5b49d12293e0841dcf1c2a96dee9aa7b69f636cb81a">ready</a> enum value</td><td><a class="el" href="a00311.html">tbb::task</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#4a3c415562d17905390ea5b49d12293e58debec6ab130290640d0cc2eedba35d">recycle</a> enum value</td><td><a class="el" href="a00311.html">tbb::task</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#db399855177438bbc9cc61d508dae8d2">recycle_as_child_of</a>(task &new_parent)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#a67a79e18f62b43a623a00cfbd76db4c">recycle_as_continuation</a>()</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#3b290d14109704e2b69dc1ac980a7a76">recycle_as_safe_continuation</a>()</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#4f1be9bbcdb487830dbe298b68d85144">recycle_to_reexecute</a>()</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#4a3c415562d17905390ea5b49d12293e3bf499aa6e6487cd1ace883a63100513">reexecute</a> enum value</td><td><a class="el" href="a00311.html">tbb::task</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#ad774f55eaec008ae02b236423209ced">ref_count</a>() const </td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#bd43e8d6249738efafd12d6a4c72c5e3">self</a>()</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#dca19d7a45487a7d67a0db517e2b57c9">set_affinity</a>(affinity_id id)</td><td><a class="el" href="a00311.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="a00311.html">tbb::task</a>)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#9ac8d1542d67d9d80121ff986801ac26">set_group_priority</a>(priority_t p)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#d2eaf79fcaa3ae473e3bd3f44bd8a464">set_parent</a>(task *p)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#06a4206a57e8e12a439b14d6d41cfd92">set_ref_count</a>(int count)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#3ce28ca9baa771cfc37ecd72e69c4f3c">spawn_and_wait_for_all</a>(task &child)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#894ab68378e502776d8220eea7ce9fa1">spawn_and_wait_for_all</a>(task_list &list)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#ce8ce689c26a4ddf343829bc3c73290a">spawn_root_and_wait</a>(task &root)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#c33c7edbaec67aa8a56f48986a9dc69f">spawn_root_and_wait</a>(task_list &root_list)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#0af7b2d7e6e8b4333b2accfce3dfb374">state</a>() const </td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#4a3c415562d17905390ea5b49d12293e">state_type</a> enum name</td><td><a class="el" href="a00311.html">tbb::task</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#2bce8ec6e44706e70128f5cf91b76e67">task</a>()</td><td><a class="el" href="a00311.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="a00311.html">tbb::task</a>)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#53d2615ad9c38859b4c8080936600283">wait_for_all</a>()</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#98245ee0473f84cb19dbbf8c81134908">~task</a>()</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline, virtual]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00120.html b/doc/html/a00120.html
index 4781215..ef1bb92 100644
--- a/doc/html/a00120.html
+++ b/doc/html/a00120.html
@@ -20,62 +20,63 @@
<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="a00242.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="a00291.html">tbb::task</a>)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#3a920a56b0bcf2801518fb45b2c9d2be">affinity</a>() const </td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#d61bb32389d3857bf7511d69beaafb76">affinity_id</a> typedef</td><td><a class="el" href="a00291.html">tbb::task</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#1ff794f7053cd9148d5f280fbf07377f">allocate_child</a>()</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#1434c79a5138993269d034008bff7329">allocate_continuation</a>()</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#23acb0da0afd690da797f9f882027d34">allocate_root</a>()</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#8ccc518caf31075a3e073996d2d240a4">allocate_root</a>(task_group_context &ctx)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293ebe94d3348dd038e41107819f00c1884c">allocated</a> enum value</td><td><a class="el" href="a00291.html">tbb::task</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#0f3fb4aac549ab642022450a4bd13326">cancel_group_execution</a>()</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#62247be9a637a814c8e8f4bcfb3a1908">change_group</a>(task_group_context &ctx)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#d8c36a93f3972590fbb65ff1cef3173b">context</a>()</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#ef4680f5c148020c5e7e43ddef44cd5d">decrement_ref_count</a>()</td><td><a class="el" href="a00291.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="a00291.html">tbb::task</a>)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#dfaacf92685e5f86393bf657b2853bf8">destroy</a>(task &t)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#8365d063c0cc9d7bd616bca47256b93c">enqueue</a>(task &t)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#fe6bf6aaf84e664134fabb6c4f409ea9">enqueue</a>(task &t, priority_t p)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293ead0fe2302ccc360923f738c2ed7ec1b9">executing</a> enum value</td><td><a class="el" href="a00291.html">tbb::task</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293ecc67ca92bd6f1ce9738a1e9e7206b735">freed</a> enum value</td><td><a class="el" href="a00291.html">tbb::task</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#5987123486afca36ddebb9e2a8b7779a">group</a>()</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#e1d969a1ccab6796e3b8b2c1a5be33d2">group_priority</a>() const </td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#f5fb43c7ad0de5a4b95703cebc39e345">increment_ref_count</a>()</td><td><a class="el" href="a00291.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="a00291.html">tbb::task</a>)</td><td><a class="el" href="a00291.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="a00291.html">tbb::task</a>)</td><td><a class="el" href="a00291.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="a00291.html">tbb::task</a>)</td><td><a class="el" href="a00291.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="a00291.html">tbb::task</a>)</td><td><a class="el" href="a00291.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="a00291.html">tbb::task</a>)</td><td><a class="el" href="a00291.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="a00291.html">tbb::task</a>)</td><td><a class="el" href="a00291.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="a00291.html">tbb::task</a>)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#025f18118c057c4c8db87ff2ce8df975">is_cancelled</a>() const </td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#c26718b3b247cd13deb1a741902e7105">is_owned_by_current_thread</a>() const </td><td><a class="el" href="a00291.html">tbb::task</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#f9169402702f56bf519448aaf34450aa">is_stolen_task</a>() const </td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#713c338c8eeaebdc5a6b10a69c039b06">note_affinity</a>(affinity_id id)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#314e98ee4347ccec83efcb9ee22e8596">parent</a>() const </td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293e0841dcf1c2a96dee9aa7b69f636cb81a">ready</a> enum value</td><td><a class="el" href="a00291.html">tbb::task</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293e58debec6ab130290640d0cc2eedba35d">recycle</a> enum value</td><td><a class="el" href="a00291.html">tbb::task</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#db399855177438bbc9cc61d508dae8d2">recycle_as_child_of</a>(task &new_parent)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#a67a79e18f62b43a623a00cfbd76db4c">recycle_as_continuation</a>()</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#3b290d14109704e2b69dc1ac980a7a76">recycle_as_safe_continuation</a>()</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#4f1be9bbcdb487830dbe298b68d85144">recycle_to_reexecute</a>()</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293e3bf499aa6e6487cd1ace883a63100513">reexecute</a> enum value</td><td><a class="el" href="a00291.html">tbb::task</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#ad774f55eaec008ae02b236423209ced">ref_count</a>() const </td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#bd43e8d6249738efafd12d6a4c72c5e3">self</a>()</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#dca19d7a45487a7d67a0db517e2b57c9">set_affinity</a>(affinity_id id)</td><td><a class="el" href="a00291.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="a00291.html">tbb::task</a>)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#9ac8d1542d67d9d80121ff986801ac26">set_group_priority</a>(priority_t p)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#06a4206a57e8e12a439b14d6d41cfd92">set_ref_count</a>(int count)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#3ce28ca9baa771cfc37ecd72e69c4f3c">spawn_and_wait_for_all</a>(task &child)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#894ab68378e502776d8220eea7ce9fa1">spawn_and_wait_for_all</a>(task_list &list)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#ce8ce689c26a4ddf343829bc3c73290a">spawn_root_and_wait</a>(task &root)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#c33c7edbaec67aa8a56f48986a9dc69f">spawn_root_and_wait</a>(task_list &root_list)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#0af7b2d7e6e8b4333b2accfce3dfb374">state</a>() const </td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293e">state_type</a> enum name</td><td><a class="el" href="a00291.html">tbb::task</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#2bce8ec6e44706e70128f5cf91b76e67">task</a>()</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline, protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#53d2615ad9c38859b4c8080936600283">wait_for_all</a>()</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00291.html#98245ee0473f84cb19dbbf8c81134908">~task</a>()</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline, virtual]</code></td></tr>
+<h1>tbb::empty_task Member List</h1>This is the complete list of members for <a class="el" href="a00254.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="a00311.html">tbb::task</a>)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#3a920a56b0bcf2801518fb45b2c9d2be">affinity</a>() const </td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#d61bb32389d3857bf7511d69beaafb76">affinity_id</a> typedef</td><td><a class="el" href="a00311.html">tbb::task</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#1ff794f7053cd9148d5f280fbf07377f">allocate_child</a>()</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#1434c79a5138993269d034008bff7329">allocate_continuation</a>()</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#23acb0da0afd690da797f9f882027d34">allocate_root</a>()</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#8ccc518caf31075a3e073996d2d240a4">allocate_root</a>(task_group_context &ctx)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#4a3c415562d17905390ea5b49d12293ebe94d3348dd038e41107819f00c1884c">allocated</a> enum value</td><td><a class="el" href="a00311.html">tbb::task</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#0f3fb4aac549ab642022450a4bd13326">cancel_group_execution</a>()</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#62247be9a637a814c8e8f4bcfb3a1908">change_group</a>(task_group_context &ctx)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#d8c36a93f3972590fbb65ff1cef3173b">context</a>()</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#ef4680f5c148020c5e7e43ddef44cd5d">decrement_ref_count</a>()</td><td><a class="el" href="a00311.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="a00311.html">tbb::task</a>)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#dfaacf92685e5f86393bf657b2853bf8">destroy</a>(task &t)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#8365d063c0cc9d7bd616bca47256b93c">enqueue</a>(task &t)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#fe6bf6aaf84e664134fabb6c4f409ea9">enqueue</a>(task &t, priority_t p)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#4a3c415562d17905390ea5b49d12293ead0fe2302ccc360923f738c2ed7ec1b9">executing</a> enum value</td><td><a class="el" href="a00311.html">tbb::task</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#4a3c415562d17905390ea5b49d12293ecc67ca92bd6f1ce9738a1e9e7206b735">freed</a> enum value</td><td><a class="el" href="a00311.html">tbb::task</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#5987123486afca36ddebb9e2a8b7779a">group</a>()</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#e1d969a1ccab6796e3b8b2c1a5be33d2">group_priority</a>() const </td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#f5fb43c7ad0de5a4b95703cebc39e345">increment_ref_count</a>()</td><td><a class="el" href="a00311.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="a00311.html">tbb::task</a>)</td><td><a class="el" href="a00311.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="a00311.html">tbb::task</a>)</td><td><a class="el" href="a00311.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="a00311.html">tbb::task</a>)</td><td><a class="el" href="a00311.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="a00311.html">tbb::task</a>)</td><td><a class="el" href="a00311.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="a00311.html">tbb::task</a>)</td><td><a class="el" href="a00311.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="a00311.html">tbb::task</a>)</td><td><a class="el" href="a00311.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="a00311.html">tbb::task</a>)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#025f18118c057c4c8db87ff2ce8df975">is_cancelled</a>() const </td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#c26718b3b247cd13deb1a741902e7105">is_owned_by_current_thread</a>() const </td><td><a class="el" href="a00311.html">tbb::task</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#f9169402702f56bf519448aaf34450aa">is_stolen_task</a>() const </td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#713c338c8eeaebdc5a6b10a69c039b06">note_affinity</a>(affinity_id id)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#314e98ee4347ccec83efcb9ee22e8596">parent</a>() const </td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#4a3c415562d17905390ea5b49d12293e0841dcf1c2a96dee9aa7b69f636cb81a">ready</a> enum value</td><td><a class="el" href="a00311.html">tbb::task</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#4a3c415562d17905390ea5b49d12293e58debec6ab130290640d0cc2eedba35d">recycle</a> enum value</td><td><a class="el" href="a00311.html">tbb::task</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#db399855177438bbc9cc61d508dae8d2">recycle_as_child_of</a>(task &new_parent)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#a67a79e18f62b43a623a00cfbd76db4c">recycle_as_continuation</a>()</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#3b290d14109704e2b69dc1ac980a7a76">recycle_as_safe_continuation</a>()</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#4f1be9bbcdb487830dbe298b68d85144">recycle_to_reexecute</a>()</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#4a3c415562d17905390ea5b49d12293e3bf499aa6e6487cd1ace883a63100513">reexecute</a> enum value</td><td><a class="el" href="a00311.html">tbb::task</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#ad774f55eaec008ae02b236423209ced">ref_count</a>() const </td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#bd43e8d6249738efafd12d6a4c72c5e3">self</a>()</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#dca19d7a45487a7d67a0db517e2b57c9">set_affinity</a>(affinity_id id)</td><td><a class="el" href="a00311.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="a00311.html">tbb::task</a>)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#9ac8d1542d67d9d80121ff986801ac26">set_group_priority</a>(priority_t p)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#d2eaf79fcaa3ae473e3bd3f44bd8a464">set_parent</a>(task *p)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#06a4206a57e8e12a439b14d6d41cfd92">set_ref_count</a>(int count)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#3ce28ca9baa771cfc37ecd72e69c4f3c">spawn_and_wait_for_all</a>(task &child)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#894ab68378e502776d8220eea7ce9fa1">spawn_and_wait_for_all</a>(task_list &list)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#ce8ce689c26a4ddf343829bc3c73290a">spawn_root_and_wait</a>(task &root)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#c33c7edbaec67aa8a56f48986a9dc69f">spawn_root_and_wait</a>(task_list &root_list)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#0af7b2d7e6e8b4333b2accfce3dfb374">state</a>() const </td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#4a3c415562d17905390ea5b49d12293e">state_type</a> enum name</td><td><a class="el" href="a00311.html">tbb::task</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#2bce8ec6e44706e70128f5cf91b76e67">task</a>()</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline, protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#53d2615ad9c38859b4c8080936600283">wait_for_all</a>()</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00311.html#98245ee0473f84cb19dbbf8c81134908">~task</a>()</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline, virtual]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00121.html b/doc/html/a00121.html
index 5f217df..efe208d 100644
--- a/doc/html/a00121.html
+++ b/doc/html/a00121.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::task_list Member List</h1>This is the complete list of members for <a class="el" href="a00294.html">tbb::task_list</a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00294.html#fce446ee13e025969945328f3ff59b95">clear</a>()</td><td><a class="el" href="a00294.html">tbb::task_list</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00294.html#f3ac31e092814b90929f81bb30441959">empty</a>() const </td><td><a class="el" href="a00294.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="a00294.html">tbb::task_list</a>)</td><td><a class="el" href="a00294.html">tbb::task_list</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00294.html#5fe85df5ed524418389d34051750347d">pop_front</a>()</td><td><a class="el" href="a00294.html">tbb::task_list</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00294.html#4cd34756bc4763dafb8c84838a0124ff">push_back</a>(task &task)</td><td><a class="el" href="a00294.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="a00294.html">tbb::task_list</a>)</td><td><a class="el" href="a00294.html">tbb::task_list</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00294.html#416341c2047eaef50417b41eaf7e9de6">task_list</a>()</td><td><a class="el" href="a00294.html">tbb::task_list</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00294.html#6d438f1499a02db1e59c24ab6043e5ba">~task_list</a>()</td><td><a class="el" href="a00294.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="a00315.html">tbb::task_list</a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00315.html#fce446ee13e025969945328f3ff59b95">clear</a>()</td><td><a class="el" href="a00315.html">tbb::task_list</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00315.html#f3ac31e092814b90929f81bb30441959">empty</a>() const </td><td><a class="el" href="a00315.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="a00315.html">tbb::task_list</a>)</td><td><a class="el" href="a00315.html">tbb::task_list</a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00315.html#5fe85df5ed524418389d34051750347d">pop_front</a>()</td><td><a class="el" href="a00315.html">tbb::task_list</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00315.html#4cd34756bc4763dafb8c84838a0124ff">push_back</a>(task &task)</td><td><a class="el" href="a00315.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="a00315.html">tbb::task_list</a>)</td><td><a class="el" href="a00315.html">tbb::task_list</a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00315.html#416341c2047eaef50417b41eaf7e9de6">task_list</a>()</td><td><a class="el" href="a00315.html">tbb::task_list</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00315.html#6d438f1499a02db1e59c24ab6043e5ba">~task_list</a>()</td><td><a class="el" href="a00315.html">tbb::task_list</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00128.html b/doc/html/a00128.html
index 471ab26..81613ed 100644
--- a/doc/html/a00128.html
+++ b/doc/html/a00128.html
@@ -20,16 +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::task_scheduler_init Member List</h1>This is the complete list of members for <a class="el" href="a00295.html">tbb::task_scheduler_init</a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00295.html#8f5988e2b0fbb2d533fcbb7f2583743f">automatic</a></td><td><a class="el" href="a00295.html">tbb::task_scheduler_init</a></td><td><code> [static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00295.html#ba00714c33a41a3c2216f48613971cab">default_num_threads</a>()</td><td><a class="el" href="a00295.html">tbb::task_scheduler_init</a></td><td><code> [static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00295.html#e6c860f1e559026ff3ef4599c0d6c514">deferred</a></td><td><a class="el" href="a00295.html">tbb::task_scheduler_init</a></td><td><code> [static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00295.html#d476053cc712e572554823492a5229ce">initialize</a>(int number_of_threads=automatic)</td><td><a class="el" href="a00295.html">tbb::task_scheduler_init</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00295.html#d5ed214a8bb53b0466ed91ff4734b9a3">initialize</a>(int number_of_threads, stack_size_type thread_stack_size)</td><td><a class="el" href="a00295.html">tbb::task_scheduler_init</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00295.html#12752282977029f23416642bc03e8b74">is_active</a>() const </td><td><a class="el" href="a00295.html">tbb::task_scheduler_init</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00295.html#421600bf9bf9338bcf937063f2ff0e90">task_scheduler_init</a>(int number_of_threads=automatic, stack_size_type thread_stack_size=0)</td><td><a class="el" href="a00295.html">tbb::task_scheduler_init</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00295.html#f73257e04cb7fb9bd5be2b635d9016f1">terminate</a>()</td><td><a class="el" href="a00295.html">tbb::task_scheduler_init</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00295.html#4da6c86292d80c703a66c1f6f5299488">~task_scheduler_init</a>()</td><td><a class="el" href="a00295.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="a00316.html">tbb::task_scheduler_init</a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00316.html#8f5988e2b0fbb2d533fcbb7f2583743f">automatic</a></td><td><a class="el" href="a00316.html">tbb::task_scheduler_init</a></td><td><code> [static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00316.html#ba00714c33a41a3c2216f48613971cab">default_num_threads</a>()</td><td><a class="el" href="a00316.html">tbb::task_scheduler_init</a></td><td><code> [static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00316.html#e6c860f1e559026ff3ef4599c0d6c514">deferred</a></td><td><a class="el" href="a00316.html">tbb::task_scheduler_init</a></td><td><code> [static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00316.html#d476053cc712e572554823492a5229ce">initialize</a>(int number_of_threads=automatic)</td><td><a class="el" href="a00316.html">tbb::task_scheduler_init</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00316.html#d5ed214a8bb53b0466ed91ff4734b9a3">initialize</a>(int number_of_threads, stack_size_type thread_stack_size)</td><td><a class="el" href="a00316.html">tbb::task_scheduler_init</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00316.html#12752282977029f23416642bc03e8b74">is_active</a>() const </td><td><a class="el" href="a00316.html">tbb::task_scheduler_init</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00316.html#421600bf9bf9338bcf937063f2ff0e90">task_scheduler_init</a>(int number_of_threads=automatic, stack_size_type thread_stack_size=0)</td><td><a class="el" href="a00316.html">tbb::task_scheduler_init</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00316.html#f73257e04cb7fb9bd5be2b635d9016f1">terminate</a>()</td><td><a class="el" href="a00316.html">tbb::task_scheduler_init</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00316.html#4da6c86292d80c703a66c1f6f5299488">~task_scheduler_init</a>()</td><td><a class="el" href="a00316.html">tbb::task_scheduler_init</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00130.html b/doc/html/a00130.html
index 57505e7..f0a0855 100644
--- a/doc/html/a00130.html
+++ b/doc/html/a00130.html
@@ -20,28 +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::tbb_allocator< T > Member List</h1>This is the complete list of members for <a class="el" href="a00296.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="a00296.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00296.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="a00296.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00296.html">tbb::tbb_allocator< T ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00296.html#f6cb487b1bdce0b581f265a77dca6d53">allocate</a>(size_type n, const void *=0)</td><td><a class="el" href="a00296.html">tbb::tbb_allocator< T ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00296.html#78701e7454ef8e1a25b5acd364367080">allocator_type</a>()</td><td><a class="el" href="a00296.html">tbb::tbb_allocator< T ></a></td><td><code> [inline, static]</code></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>const_pointer</b> typedef (defined in <a class="el" href="a00296.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00296.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="a00296.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00296.html">tbb::tbb_allocator< T ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00296.html#ab228ab9e324ed041c2226e1d717df5f">construct</a>(pointer p, const value_type &value)</td><td><a class="el" href="a00296.html">tbb::tbb_allocator< T ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00296.html#fdd011fdf2f9ad07006dc7c0a7ec1da2">deallocate</a>(pointer p, size_type)</td><td><a class="el" href="a00296.html">tbb::tbb_allocator< T ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00296.html#ef133522bf55f05a605bee0763208281">destroy</a>(pointer p)</td><td><a class="el" href="a00296.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="a00296.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00296.html">tbb::tbb_allocator< T ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00296.html#09a7f81fb2c3055aaecf058b11538544">malloc_type</a> enum name</td><td><a class="el" href="a00296.html">tbb::tbb_allocator< T ></a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00296.html#f059ca2c96243024f0d562ee3a87a3a5">max_size</a>() const </td><td><a class="el" href="a00296.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="a00296.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00296.html">tbb::tbb_allocator< T ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>reference</b> typedef (defined in <a class="el" href="a00296.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00296.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="a00296.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00296.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="a00296.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00296.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="a00296.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00296.html">tbb::tbb_allocator< T ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>tbb_allocator</b>() (defined in <a class="el" href="a00296.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00296.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="a00296.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00296.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="a00296.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00296.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="a00296.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00296.html">tbb::tbb_allocator< T ></a></td><td></td></tr>
+<h1>tbb::tbb_allocator< T > Member List</h1>This is the complete list of members for <a class="el" href="a00317.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="a00317.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00317.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="a00317.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00317.html">tbb::tbb_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00317.html#f6cb487b1bdce0b581f265a77dca6d53">allocate</a>(size_type n, const void *=0)</td><td><a class="el" href="a00317.html">tbb::tbb_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00317.html#78701e7454ef8e1a25b5acd364367080">allocator_type</a>()</td><td><a class="el" href="a00317.html">tbb::tbb_allocator< T ></a></td><td><code> [inline, static]</code></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>const_pointer</b> typedef (defined in <a class="el" href="a00317.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00317.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="a00317.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00317.html">tbb::tbb_allocator< T ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00317.html#ab228ab9e324ed041c2226e1d717df5f">construct</a>(pointer p, const value_type &value)</td><td><a class="el" href="a00317.html">tbb::tbb_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00317.html#fdd011fdf2f9ad07006dc7c0a7ec1da2">deallocate</a>(pointer p, size_type)</td><td><a class="el" href="a00317.html">tbb::tbb_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00317.html#ef133522bf55f05a605bee0763208281">destroy</a>(pointer p)</td><td><a class="el" href="a00317.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="a00317.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00317.html">tbb::tbb_allocator< T ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00317.html#09a7f81fb2c3055aaecf058b11538544">malloc_type</a> enum name</td><td><a class="el" href="a00317.html">tbb::tbb_allocator< T ></a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00317.html#f059ca2c96243024f0d562ee3a87a3a5">max_size</a>() const </td><td><a class="el" href="a00317.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="a00317.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00317.html">tbb::tbb_allocator< T ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>reference</b> typedef (defined in <a class="el" href="a00317.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00317.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="a00317.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00317.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="a00317.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00317.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="a00317.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00317.html">tbb::tbb_allocator< T ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>tbb_allocator</b>() (defined in <a class="el" href="a00317.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00317.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="a00317.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00317.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="a00317.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00317.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="a00317.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00317.html">tbb::tbb_allocator< T ></a></td><td></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00132.html b/doc/html/a00132.html
index be7e3bd..ee3501e 100644
--- a/doc/html/a00132.html
+++ b/doc/html/a00132.html
@@ -20,10 +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::tbb_allocator< void > Member List</h1>This is the complete list of members for <a class="el" href="a00297.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="a00297.html">tbb::tbb_allocator< void ></a>)</td><td><a class="el" href="a00297.html">tbb::tbb_allocator< void ></a></td><td></td></tr>
- <tr bgcolor="#f0f0f0"><td><b>pointer</b> typedef (defined in <a class="el" href="a00297.html">tbb::tbb_allocator< void ></a>)</td><td><a class="el" href="a00297.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="a00297.html">tbb::tbb_allocator< void ></a>)</td><td><a class="el" href="a00297.html">tbb::tbb_allocator< void ></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="a00318.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="a00318.html">tbb::tbb_allocator< void ></a>)</td><td><a class="el" href="a00318.html">tbb::tbb_allocator< void ></a></td><td></td></tr>
+ <tr bgcolor="#f0f0f0"><td><b>pointer</b> typedef (defined in <a class="el" href="a00318.html">tbb::tbb_allocator< void ></a>)</td><td><a class="el" href="a00318.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="a00318.html">tbb::tbb_allocator< void ></a>)</td><td><a class="el" href="a00318.html">tbb::tbb_allocator< void ></a></td><td></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00134.html b/doc/html/a00134.html
index 4814540..8c3578f 100644
--- a/doc/html/a00134.html
+++ b/doc/html/a00134.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::zero_allocator< T, Allocator > Member List</h1>This is the complete list of members for <a class="el" href="a00306.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="a00306.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00306.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="a00306.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00306.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="a00306.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00306.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="a00306.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00306.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="a00306.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00306.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="a00306.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00306.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="a00306.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00306.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="a00306.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00306.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="a00306.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00306.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="a00306.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00306.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="a00306.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00306.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="a00306.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00306.html">tbb::zero_allocator< T, Allocator ></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="a00326.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="a00326.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00326.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="a00326.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00326.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="a00326.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00326.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="a00326.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00326.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="a00326.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00326.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="a00326.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00326.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="a00326.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00326.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="a00326.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00326.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="a00326.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00326.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="a00326.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00326.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="a00326.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00326.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="a00326.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00326.html">tbb::zero_allocator< T, Allocator ></a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00136.html b/doc/html/a00136.html
index 7ee6ceb..cf60dcf 100644
--- a/doc/html/a00136.html
+++ b/doc/html/a00136.html
@@ -20,11 +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::zero_allocator< void, Allocator > Member List</h1>This is the complete list of members for <a class="el" href="a00307.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="a00307.html">tbb::zero_allocator< void, Allocator ></a>)</td><td><a class="el" href="a00307.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="a00307.html">tbb::zero_allocator< void, Allocator ></a>)</td><td><a class="el" href="a00307.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="a00307.html">tbb::zero_allocator< void, Allocator ></a>)</td><td><a class="el" href="a00307.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="a00307.html">tbb::zero_allocator< void, Allocator ></a>)</td><td><a class="el" href="a00307.html">tbb::zero_allocator< void, Allocator ></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="a00327.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="a00327.html">tbb::zero_allocator< void, Allocator ></a>)</td><td><a class="el" href="a00327.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="a00327.html">tbb::zero_allocator< void, Allocator ></a>)</td><td><a class="el" href="a00327.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="a00327.html">tbb::zero_allocator< void, Allocator ></a>)</td><td><a class="el" href="a00327.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="a00327.html">tbb::zero_allocator< void, Allocator ></a>)</td><td><a class="el" href="a00327.html">tbb::zero_allocator< void, Allocator ></a></td><td></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00138.html b/doc/html/a00138.html
index d775f50..b80dde6 100644
--- a/doc/html/a00138.html
+++ b/doc/html/a00138.html
@@ -20,9 +20,9 @@
<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="a00220.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="a00220.html">tbb::bad_last_alloc</a>)</td><td><a class="el" href="a00220.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="a00220.html">tbb::bad_last_alloc</a>)</td><td><a class="el" href="a00220.html">tbb::bad_last_alloc</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::bad_last_alloc Member List</h1>This is the complete list of members for <a class="el" href="a00232.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="a00232.html">tbb::bad_last_alloc</a>)</td><td><a class="el" href="a00232.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="a00232.html">tbb::bad_last_alloc</a>)</td><td><a class="el" href="a00232.html">tbb::bad_last_alloc</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00139.html b/doc/html/a00139.html
index 8bf5c2b..5c917c6 100644
--- a/doc/html/a00139.html
+++ b/doc/html/a00139.html
@@ -20,8 +20,8 @@
<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="a00252.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="a00252.html">tbb::improper_lock</a>)</td><td><a class="el" href="a00252.html">tbb::improper_lock</a></td><td></td></tr>
+<h1>tbb::improper_lock Member List</h1>This is the complete list of members for <a class="el" href="a00264.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="a00264.html">tbb::improper_lock</a>)</td><td><a class="el" href="a00264.html">tbb::improper_lock</a></td><td></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00140.html b/doc/html/a00140.html
index 74f9a7c..cc64dd3 100644
--- a/doc/html/a00140.html
+++ b/doc/html/a00140.html
@@ -20,8 +20,8 @@
<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="a00256.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="a00256.html">tbb::missing_wait</a>)</td><td><a class="el" href="a00256.html">tbb::missing_wait</a></td><td></td></tr>
+<h1>tbb::missing_wait Member List</h1>This is the complete list of members for <a class="el" href="a00272.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="a00272.html">tbb::missing_wait</a>)</td><td><a class="el" href="a00272.html">tbb::missing_wait</a></td><td></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00141.html b/doc/html/a00141.html
index 1437180..19cbf87 100644
--- a/doc/html/a00141.html
+++ b/doc/html/a00141.html
@@ -20,8 +20,8 @@
<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="a00253.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="a00253.html">tbb::invalid_multiple_scheduling</a>)</td><td><a class="el" href="a00253.html">tbb::invalid_multiple_scheduling</a></td><td></td></tr>
+<h1>tbb::invalid_multiple_scheduling Member List</h1>This is the complete list of members for <a class="el" href="a00265.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="a00265.html">tbb::invalid_multiple_scheduling</a>)</td><td><a class="el" href="a00265.html">tbb::invalid_multiple_scheduling</a></td><td></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00142.html b/doc/html/a00142.html
index 5b13d33..bcac7fb 100644
--- a/doc/html/a00142.html
+++ b/doc/html/a00142.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::tbb_exception Member List</h1>This is the complete list of members for <a class="el" href="a00298.html">tbb::tbb_exception</a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00298.html#66c94938eca8bf88b76f3eccaaf215d8">destroy</a>()=0</td><td><a class="el" href="a00298.html">tbb::tbb_exception</a></td><td><code> [pure virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00298.html#3e3482bf264d4ca4dde046cd9c02c766">move</a>()=0</td><td><a class="el" href="a00298.html">tbb::tbb_exception</a></td><td><code> [pure virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00298.html#d00f6497e552fee978a02bfcbebf46e2">name</a>() const =0</td><td><a class="el" href="a00298.html">tbb::tbb_exception</a></td><td><code> [pure virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00298.html#3f2da7f3d8a6e4c1df522af1213afb5a">operator delete</a>(void *p)</td><td><a class="el" href="a00298.html">tbb::tbb_exception</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00298.html#8588e07fa49692f4d734e4f2e4f048f4">throw_self</a>()=0</td><td><a class="el" href="a00298.html">tbb::tbb_exception</a></td><td><code> [pure virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00298.html#e8157689ecb66bc6c72d3618bf3cc371">what</a>() const =0</td><td><a class="el" href="a00298.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="a00319.html">tbb::tbb_exception</a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00319.html#66c94938eca8bf88b76f3eccaaf215d8">destroy</a>()=0</td><td><a class="el" href="a00319.html">tbb::tbb_exception</a></td><td><code> [pure virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00319.html#3e3482bf264d4ca4dde046cd9c02c766">move</a>()=0</td><td><a class="el" href="a00319.html">tbb::tbb_exception</a></td><td><code> [pure virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00319.html#d00f6497e552fee978a02bfcbebf46e2">name</a>() const =0</td><td><a class="el" href="a00319.html">tbb::tbb_exception</a></td><td><code> [pure virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00319.html#3f2da7f3d8a6e4c1df522af1213afb5a">operator delete</a>(void *p)</td><td><a class="el" href="a00319.html">tbb::tbb_exception</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00319.html#8588e07fa49692f4d734e4f2e4f048f4">throw_self</a>()=0</td><td><a class="el" href="a00319.html">tbb::tbb_exception</a></td><td><code> [pure virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00319.html#e8157689ecb66bc6c72d3618bf3cc371">what</a>() const =0</td><td><a class="el" href="a00319.html">tbb::tbb_exception</a></td><td><code> [pure virtual]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00143.html b/doc/html/a00143.html
index ca4d66e..4ef88eb 100644
--- a/doc/html/a00143.html
+++ b/doc/html/a00143.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::captured_exception Member List</h1>This is the complete list of members for <a class="el" href="a00228.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="a00228.html">tbb::captured_exception</a>)</td><td><a class="el" href="a00228.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="a00228.html">tbb::captured_exception</a>)</td><td><a class="el" href="a00228.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="a00228.html">tbb::captured_exception</a>)</td><td><a class="el" href="a00228.html">tbb::captured_exception</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00228.html#93d875d3555502ff6f18513525de204c">destroy</a>()</td><td><a class="el" href="a00228.html">tbb::captured_exception</a></td><td><code> [virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00228.html#837a50b8f6a800bda225c39d1699643f">move</a>()</td><td><a class="el" href="a00228.html">tbb::captured_exception</a></td><td><code> [virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00228.html#5af82fd677449c5ca727fa1d7e16f9f5">name</a>() const </td><td><a class="el" href="a00228.html">tbb::captured_exception</a></td><td><code> [virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00298.html#3f2da7f3d8a6e4c1df522af1213afb5a">operator delete</a>(void *p)</td><td><a class="el" href="a00298.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="a00228.html">tbb::captured_exception</a>)</td><td><a class="el" href="a00228.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="a00228.html">tbb::captured_exception</a>)</td><td><a class="el" href="a00228.html">tbb::captured_exception</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00228.html#2dd1be66ab32fa27e0ddef5707fa67ef">throw_self</a>()</td><td><a class="el" href="a00228.html">tbb::captured_exception</a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00228.html#6b5988ef74a1fe2a58998d110b3633e0">what</a>() const </td><td><a class="el" href="a00228.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="a00228.html">tbb::captured_exception</a>)</td><td><a class="el" href="a00228.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="a00240.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="a00240.html">tbb::captured_exception</a>)</td><td><a class="el" href="a00240.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="a00240.html">tbb::captured_exception</a>)</td><td><a class="el" href="a00240.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="a00240.html">tbb::captured_exception</a>)</td><td><a class="el" href="a00240.html">tbb::captured_exception</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00240.html#93d875d3555502ff6f18513525de204c">destroy</a>()</td><td><a class="el" href="a00240.html">tbb::captured_exception</a></td><td><code> [virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00240.html#837a50b8f6a800bda225c39d1699643f">move</a>()</td><td><a class="el" href="a00240.html">tbb::captured_exception</a></td><td><code> [virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00240.html#5af82fd677449c5ca727fa1d7e16f9f5">name</a>() const </td><td><a class="el" href="a00240.html">tbb::captured_exception</a></td><td><code> [virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00319.html#3f2da7f3d8a6e4c1df522af1213afb5a">operator delete</a>(void *p)</td><td><a class="el" href="a00319.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="a00240.html">tbb::captured_exception</a>)</td><td><a class="el" href="a00240.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="a00240.html">tbb::captured_exception</a>)</td><td><a class="el" href="a00240.html">tbb::captured_exception</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00240.html#2dd1be66ab32fa27e0ddef5707fa67ef">throw_self</a>()</td><td><a class="el" href="a00240.html">tbb::captured_exception</a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00240.html#6b5988ef74a1fe2a58998d110b3633e0">what</a>() const </td><td><a class="el" href="a00240.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="a00240.html">tbb::captured_exception</a>)</td><td><a class="el" href="a00240.html">tbb::captured_exception</a></td><td></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00144.html b/doc/html/a00144.html
index 4340eee..69ac6fd 100644
--- a/doc/html/a00144.html
+++ b/doc/html/a00144.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::movable_exception< ExceptionData > Member List</h1>This is the complete list of members for <a class="el" href="a00257.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="a00257.html">tbb::movable_exception< ExceptionData ></a>)</td><td><a class="el" href="a00257.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="a00257.html">tbb::movable_exception< ExceptionData ></a>)</td><td><a class="el" href="a00257.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00257.html#7a46873119d9f85a7b0009c13e41a258">destroy</a>()</td><td><a class="el" href="a00257.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="a00257.html">tbb::movable_exception< ExceptionData ></a>)</td><td><a class="el" href="a00257.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="a00257.html">tbb::movable_exception< ExceptionData ></a>)</td><td><a class="el" href="a00257.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00257.html#1aea0ad179d6f0481fe7f3495f66adf9">move</a>()</td><td><a class="el" href="a00257.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00257.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a></td><td><a class="el" href="a00257.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00257.html#bc5f5c4739b17ac5211ac58226c2f5a5">name</a>() const </td><td><a class="el" href="a00257.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00298.html#3f2da7f3d8a6e4c1df522af1213afb5a">operator delete</a>(void *p)</td><td><a class="el" href="a00298.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="a00257.html">tbb::movable_exception< ExceptionData ></a>)</td><td><a class="el" href="a00257.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00257.html#17cffba35811c92b7e65d63506b69602">throw_self</a>()</td><td><a class="el" href="a00257.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [inline, virtual]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00257.html#b33a89bccf0c63106f1270c7bfaaf54f">what</a>() const </td><td><a class="el" href="a00257.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="a00257.html">tbb::movable_exception< ExceptionData ></a>)</td><td><a class="el" href="a00257.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="a00273.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="a00273.html">tbb::movable_exception< ExceptionData ></a>)</td><td><a class="el" href="a00273.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="a00273.html">tbb::movable_exception< ExceptionData ></a>)</td><td><a class="el" href="a00273.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00273.html#7a46873119d9f85a7b0009c13e41a258">destroy</a>()</td><td><a class="el" href="a00273.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="a00273.html">tbb::movable_exception< ExceptionData ></a>)</td><td><a class="el" href="a00273.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="a00273.html">tbb::movable_exception< ExceptionData ></a>)</td><td><a class="el" href="a00273.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00273.html#1aea0ad179d6f0481fe7f3495f66adf9">move</a>()</td><td><a class="el" href="a00273.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00273.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a></td><td><a class="el" href="a00273.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [protected]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00273.html#bc5f5c4739b17ac5211ac58226c2f5a5">name</a>() const </td><td><a class="el" href="a00273.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00319.html#3f2da7f3d8a6e4c1df522af1213afb5a">operator delete</a>(void *p)</td><td><a class="el" href="a00319.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="a00273.html">tbb::movable_exception< ExceptionData ></a>)</td><td><a class="el" href="a00273.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00273.html#17cffba35811c92b7e65d63506b69602">throw_self</a>()</td><td><a class="el" href="a00273.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [inline, virtual]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00273.html#b33a89bccf0c63106f1270c7bfaaf54f">what</a>() const </td><td><a class="el" href="a00273.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="a00273.html">tbb::movable_exception< ExceptionData ></a>)</td><td><a class="el" href="a00273.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00145.html b/doc/html/a00145.html
index 0ccbfcf..2a193ac 100644
--- a/doc/html/a00145.html
+++ b/doc/html/a00145.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::tbb_exception_ptr Member List</h1>This is the complete list of members for <a class="el" href="a00299.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="a00299.html">tbb::internal::tbb_exception_ptr</a>)</td><td><a class="el" href="a00299.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="a00299.html">tbb::internal::tbb_exception_ptr</a>)</td><td><a class="el" href="a00299.html">tbb::internal::tbb_exception_ptr</a></td><td><code> [static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00299.html#c35e5db8e9cdff5d1387db5b0bad2e4a">allocate</a>(captured_exception &src)</td><td><a class="el" href="a00299.html">tbb::internal::tbb_exception_ptr</a></td><td><code> [static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00299.html#921875bbacd2c8a5f324c7da7a415262">destroy</a>()</td><td><a class="el" href="a00299.html">tbb::internal::tbb_exception_ptr</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="a00299.html#292832fd5c523e3d8081a22247840a1d">throw_self</a>()</td><td><a class="el" href="a00299.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="a00320.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="a00320.html">tbb::internal::tbb_exception_ptr</a>)</td><td><a class="el" href="a00320.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="a00320.html">tbb::internal::tbb_exception_ptr</a>)</td><td><a class="el" href="a00320.html">tbb::internal::tbb_exception_ptr</a></td><td><code> [static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00320.html#c35e5db8e9cdff5d1387db5b0bad2e4a">allocate</a>(captured_exception &src)</td><td><a class="el" href="a00320.html">tbb::internal::tbb_exception_ptr</a></td><td><code> [static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00320.html#921875bbacd2c8a5f324c7da7a415262">destroy</a>()</td><td><a class="el" href="a00320.html">tbb::internal::tbb_exception_ptr</a></td><td></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00320.html#292832fd5c523e3d8081a22247840a1d">throw_self</a>()</td><td><a class="el" href="a00320.html">tbb::internal::tbb_exception_ptr</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00146.html b/doc/html/a00150.html
similarity index 77%
rename from doc/html/a00146.html
rename to doc/html/a00150.html
index 3ee0912..e038e06 100644
--- a/doc/html/a00146.html
+++ b/doc/html/a00150.html
@@ -20,11 +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::atomic_backoff Member List</h1>This is the complete list of members for <a class="el" href="a00218.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="a00218.html">tbb::internal::atomic_backoff</a>)</td><td><a class="el" href="a00218.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="a00218.html">tbb::internal::atomic_backoff</a>)</td><td><a class="el" href="a00218.html">tbb::internal::atomic_backoff</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00218.html#a174ea93e3bd3d5cce82389c2f28d037">pause</a>()</td><td><a class="el" href="a00218.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="a00218.html">tbb::internal::atomic_backoff</a>)</td><td><a class="el" href="a00218.html">tbb::internal::atomic_backoff</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::internal::atomic_backoff Member List</h1>This is the complete list of members for <a class="el" href="a00230.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="a00230.html">tbb::internal::atomic_backoff</a>)</td><td><a class="el" href="a00230.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="a00230.html">tbb::internal::atomic_backoff</a>)</td><td><a class="el" href="a00230.html">tbb::internal::atomic_backoff</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00230.html#a174ea93e3bd3d5cce82389c2f28d037">pause</a>()</td><td><a class="el" href="a00230.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="a00230.html">tbb::internal::atomic_backoff</a>)</td><td><a class="el" href="a00230.html">tbb::internal::atomic_backoff</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00014.html b/doc/html/a00154.html
similarity index 60%
copy from doc/html/a00014.html
copy to doc/html/a00154.html
index 0d81875..83999d8 100644
--- a/doc/html/a00014.html
+++ b/doc/html/a00154.html
@@ -20,9 +20,9 @@
<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="a00300.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="a00300.html">tbb::tbb_hash_compare< Key ></a>)</td><td><a class="el" href="a00300.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="a00300.html">tbb::tbb_hash_compare< Key ></a>)</td><td><a class="el" href="a00300.html">tbb::tbb_hash_compare< Key ></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="a00268.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="a00268.html">tbb::internal::machine_load_store_seq_cst< T, 8 ></a>)</td><td><a class="el" href="a00268.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="a00268.html">tbb::internal::machine_load_store_seq_cst< T, 8 ></a>)</td><td><a class="el" href="a00268.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-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00014.html b/doc/html/a00155.html
similarity index 60%
rename from doc/html/a00014.html
rename to doc/html/a00155.html
index 0d81875..c9b6f5b 100644
--- a/doc/html/a00014.html
+++ b/doc/html/a00155.html
@@ -20,9 +20,9 @@
<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="a00300.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="a00300.html">tbb::tbb_hash_compare< Key ></a>)</td><td><a class="el" href="a00300.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="a00300.html">tbb::tbb_hash_compare< Key ></a>)</td><td><a class="el" href="a00300.html">tbb::tbb_hash_compare< Key ></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="a00267.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="a00267.html">tbb::internal::machine_load_store_relaxed< T, S ></a>)</td><td><a class="el" href="a00267.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="a00267.html">tbb::internal::machine_load_store_relaxed< T, S ></a>)</td><td><a class="el" href="a00267.html">tbb::internal::machine_load_store_relaxed< T, S ></a></td><td><code> [inline, static]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00153.html b/doc/html/a00164.html
similarity index 90%
rename from doc/html/a00153.html
rename to doc/html/a00164.html
index 0f8bd97..65afe3d 100644
--- a/doc/html/a00153.html
+++ b/doc/html/a00164.html
@@ -20,8 +20,8 @@
<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="a00305.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="a00305.html">tbb::internal::work_around_alignment_bug< Size, T ></a>)</td><td><a class="el" href="a00305.html">tbb::internal::work_around_alignment_bug< Size, T ></a></td><td><code> [static]</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="a00325.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="a00325.html">tbb::internal::work_around_alignment_bug< Size, T ></a>)</td><td><a class="el" href="a00325.html">tbb::internal::work_around_alignment_bug< Size, T ></a></td><td><code> [static]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00159.html b/doc/html/a00168.html
similarity index 80%
rename from doc/html/a00159.html
rename to doc/html/a00168.html
index 39fd259..4f4d44d 100644
--- a/doc/html/a00159.html
+++ b/doc/html/a00168.html
@@ -20,10 +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::tick_count Member List</h1>This is the complete list of members for <a class="el" href="a00302.html">tbb::tick_count</a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00302.html#fb7f78ca61cf28398645ace66e284473">now</a>()</td><td><a class="el" href="a00302.html">tbb::tick_count</a></td><td><code> [inline, static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00302.html#09dde78a4100800c11bb883d6204b586">operator-</a>(const tick_count &t1, const tick_count &t0)</td><td><a class="el" href="a00302.html">tbb::tick_count</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00302.html#34593326ae4191e02a13c7cbdab9de4c">tick_count</a>()</td><td><a class="el" href="a00302.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="a00323.html">tbb::tick_count</a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00323.html#fb7f78ca61cf28398645ace66e284473">now</a>()</td><td><a class="el" href="a00323.html">tbb::tick_count</a></td><td><code> [inline, static]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00323.html#09dde78a4100800c11bb883d6204b586">operator-</a>(const tick_count &t1, const tick_count &t0)</td><td><a class="el" href="a00323.html">tbb::tick_count</a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00323.html#34593326ae4191e02a13c7cbdab9de4c">tick_count</a>()</td><td><a class="el" href="a00323.html">tbb::tick_count</a></td><td><code> [inline]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00160.html b/doc/html/a00169.html
similarity index 68%
rename from doc/html/a00160.html
rename to doc/html/a00169.html
index 29ad763..3d6774f 100644
--- a/doc/html/a00160.html
+++ b/doc/html/a00169.html
@@ -20,16 +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::tick_count::interval_t Member List</h1>This is the complete list of members for <a class="el" href="a00303.html">tbb::tick_count::interval_t</a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="a00303.html#75a9a0949f8a8a84d6758835f1b48dad">interval_t</a>()</td><td><a class="el" href="a00303.html">tbb::tick_count::interval_t</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00303.html#1a21a428e00cced2e6a49e0f5f2258bf">interval_t</a>(double sec)</td><td><a class="el" href="a00303.html">tbb::tick_count::interval_t</a></td><td><code> [inline, explicit]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00303.html#5871ead1ca230efbe52a5008470e6428">operator+</a>(const interval_t &i, const interval_t &j)</td><td><a class="el" href="a00303.html">tbb::tick_count::interval_t</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00303.html#cd9814947902e26463a69a111530f81b">operator+=</a>(const interval_t &i)</td><td><a class="el" href="a00303.html">tbb::tick_count::interval_t</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00303.html#09dde78a4100800c11bb883d6204b586">operator-</a>(const tick_count &t1, const tick_count &t0)</td><td><a class="el" href="a00303.html">tbb::tick_count::interval_t</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00303.html#fa509691e1d689830931e36edd274f76">operator-</a>(const interval_t &i, const interval_t &j)</td><td><a class="el" href="a00303.html">tbb::tick_count::interval_t</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00303.html#35ff7eaf7c2031b4a991402ac9ecb940">operator-=</a>(const interval_t &i)</td><td><a class="el" href="a00303.html">tbb::tick_count::interval_t</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="a00303.html#d5d8429c0bc59cf6131b2abc7929fa59">seconds</a>() const </td><td><a class="el" href="a00303.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="a00303.html">tbb::tick_count::interval_t</a>)</td><td><a class="el" href="a00303.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="a00324.html">tbb::tick_count::interval_t</a>, including all inherited members.<p><table>
+ <tr class="memlist"><td><a class="el" href="a00324.html#75a9a0949f8a8a84d6758835f1b48dad">interval_t</a>()</td><td><a class="el" href="a00324.html">tbb::tick_count::interval_t</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00324.html#1a21a428e00cced2e6a49e0f5f2258bf">interval_t</a>(double sec)</td><td><a class="el" href="a00324.html">tbb::tick_count::interval_t</a></td><td><code> [inline, explicit]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00324.html#5871ead1ca230efbe52a5008470e6428">operator+</a>(const interval_t &i, const interval_t &j)</td><td><a class="el" href="a00324.html">tbb::tick_count::interval_t</a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00324.html#cd9814947902e26463a69a111530f81b">operator+=</a>(const interval_t &i)</td><td><a class="el" href="a00324.html">tbb::tick_count::interval_t</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00324.html#09dde78a4100800c11bb883d6204b586">operator-</a>(const tick_count &t1, const tick_count &t0)</td><td><a class="el" href="a00324.html">tbb::tick_count::interval_t</a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00324.html#fa509691e1d689830931e36edd274f76">operator-</a>(const interval_t &i, const interval_t &j)</td><td><a class="el" href="a00324.html">tbb::tick_count::interval_t</a></td><td><code> [friend]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00324.html#35ff7eaf7c2031b4a991402ac9ecb940">operator-=</a>(const interval_t &i)</td><td><a class="el" href="a00324.html">tbb::tick_count::interval_t</a></td><td><code> [inline]</code></td></tr>
+ <tr class="memlist"><td><a class="el" href="a00324.html#d5d8429c0bc59cf6131b2abc7929fa59">seconds</a>() const </td><td><a class="el" href="a00324.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="a00324.html">tbb::tick_count::interval_t</a>)</td><td><a class="el" href="a00324.html">tbb::tick_count::interval_t</a></td><td><code> [friend]</code></td></tr>
</table><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00212.html b/doc/html/a00212.html
deleted file mode 100644
index 227c7e5..0000000
--- a/doc/html/a00212.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::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="a00362.html">tbb</a>::<a class="el" href="a00212.html">affinity_partitioner</a></div>
-<h1>tbb::affinity_partitioner Class Reference</h1><!-- doxytag: class="tbb::affinity_partitioner" -->An affinity partitioner.
-<a href="#_details">More...</a>
-<p>
-<code>#include <<a class="el" href="a00541.html">partitioner.h</a>></code>
-<p>
-<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>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a47f7e0208a2bf68f35b51b27d2ddf2a"></a><!-- doxytag: member="tbb::affinity_partitioner::internal::start_for" ref="a47f7e0208a2bf68f35b51b27d2ddf2a" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::start_for</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e8f710e431b62c2a48914bd99d0fe034"></a><!-- doxytag: member="tbb::affinity_partitioner::internal::start_reduce" ref="e8f710e431b62c2a48914bd99d0fe034" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>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>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e9575467e391b90e0703fadf573dbad7"></a><!-- doxytag: member="tbb::affinity_partitioner::internal::affinity_partition_type" ref="e9575467e391b90e0703fadf573dbad7" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::affinity_partition_type</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="a00541.html">partitioner.h</a></ul>
-<hr>
-<p></p>
-Copyright © 2005-2011 Intel Corporation. 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/a00213.html b/doc/html/a00213.html
deleted file mode 100644
index e204096..0000000
--- a/doc/html/a00213.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::interface6::internal::aggregated_operation< Derived > 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="a00362.html">tbb</a>::<b>interface6</b>::<b>internal</b>::<a class="el" href="a00213.html">aggregated_operation</a></div>
-<h1>tbb::interface6::internal::aggregated_operation< Derived > Class Template Reference</h1><!-- doxytag: class="tbb::interface6::internal::aggregated_operation" --><a class="el" href="a00213.html">aggregated_operation</a> base class
-<a href="#_details">More...</a>
-<p>
-<code>#include <<a class="el" href="a00377.html">_aggregator_internal.h</a>></code>
-<p>
-<a href="a00001.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
-<tr><td></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="57a1b5d43be94cd9e4c3c59081736638"></a><!-- doxytag: member="tbb::interface6::internal::aggregated_operation::status" ref="57a1b5d43be94cd9e4c3c59081736638" args="" -->
-uintptr_t </td><td class="memItemRight" valign="bottom"><b>status</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0bd4c85d1b47b2a410bfe1a266f22dee"></a><!-- doxytag: member="tbb::interface6::internal::aggregated_operation::next" ref="0bd4c85d1b47b2a410bfe1a266f22dee" args="" -->
-Derived * </td><td class="memItemRight" valign="bottom"><b>next</b></td></tr>
-
-</table>
-<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename Derived><br>
- class tbb::interface6::internal::aggregated_operation< Derived ></h3>
-
-<a class="el" href="a00213.html">aggregated_operation</a> base class
-<p>
-<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00377.html">_aggregator_internal.h</a></ul>
-<hr>
-<p></p>
-Copyright © 2005-2011 Intel Corporation. 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/a00214.html b/doc/html/a00214.html
deleted file mode 100644
index a01624b..0000000
--- a/doc/html/a00214.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>tbb::interface6::internal::aggregator< handler_type, operation_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="a00362.html">tbb</a>::<b>interface6</b>::<b>internal</b>::<a class="el" href="a00214.html">aggregator</a></div>
-<h1>tbb::interface6::internal::aggregator< handler_type, operation_type > Class Template Reference</h1><!-- doxytag: class="tbb::interface6::internal::aggregator" -->Aggregator base class.
-<a href="#_details">More...</a>
-<p>
-<code>#include <<a class="el" href="a00377.html">_aggregator_internal.h</a>></code>
-<p>
-<a href="a00002.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="1893fb7ba6824ca9b135d2ef005f97bb"></a><!-- doxytag: member="tbb::interface6::internal::aggregator::initialize_handler" ref="1893fb7ba6824ca9b135d2ef005f97bb" args="(handler_type h)" -->
-void </td><td class="memItemRight" valign="bottom"><b>initialize_handler</b> (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="a00214.html#282d5a2f1216b185c91ed23d00119481">execute</a> (operation_type *op)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Place operation in list. <a href="#282d5a2f1216b185c91ed23d00119481"></a><br></td></tr>
-</table>
-<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename handler_type, typename operation_type><br>
- class tbb::interface6::internal::aggregator< handler_type, operation_type ></h3>
-
-Aggregator base class.
-<p>
-An aggregator for collecting operations coming from multiple sources and executing them serially on a single thread. operation_type must be derived from <a class="el" href="a00213.html">aggregated_operation</a>. The parameter handler_type is a functor that will be passed the list of operations and is expected to handle each operation appropriately, setting the status of each operation to non-zero.
-<p>
-<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="282d5a2f1216b185c91ed23d00119481"></a><!-- doxytag: member="tbb::interface6::internal::aggregator::execute" ref="282d5a2f1216b185c91ed23d00119481" args="(operation_type *op)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename handler_type, typename operation_type> </div>
- <table class="memname">
- <tr>
- <td class="memname">void <a class="el" href="a00214.html">tbb::interface6::internal::aggregator</a>< handler_type, operation_type >::execute </td>
- <td>(</td>
- <td class="paramtype">operation_type * </td>
- <td class="paramname"> <em>op</em> </td>
- <td> ) </td>
- <td width="100%"><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Place operation in list.
-<p>
-Place operation in list and either handle list or wait for operation to complete.
-</div>
-</div><p>
-<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00377.html">_aggregator_internal.h</a></ul>
-<hr>
-<p></p>
-Copyright © 2005-2011 Intel Corporation. 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/a00215.html b/doc/html/a00215.html
deleted file mode 100644
index 2af4a45..0000000
--- a/doc/html/a00215.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="a00362.html">tbb</a>::<a class="el" href="a00215.html">aligned_space</a></div>
-<h1>tbb::aligned_space< T, N > Class Template Reference<br>
-<small>
-[<a class="el" href="a00373.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="a00409.html">aligned_space.h</a>></code>
-<p>
-<a href="a00003.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="a00215.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="a00215.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="a00409.html">aligned_space.h</a></ul>
-<hr>
-<p></p>
-Copyright © 2005-2011 Intel Corporation. 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/a00217.html b/doc/html/a00217.html
deleted file mode 100644
index 336e89d..0000000
--- a/doc/html/a00217.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="a00362.html">tbb</a>::<a class="el" href="a00217.html">atomic< void * ></a></div>
-<h1>tbb::atomic< void * > Struct Template Reference</h1><!-- doxytag: class="tbb::atomic< void * >" -->Specialization for <a class="el" href="a00217.html">atomic<void*></a>, for sake of not allowing arithmetic or operator->.
-<a href="#_details">More...</a>
-<p>
-<code>#include <<a class="el" href="a00410.html">atomic.h</a>></code>
-<p>
-<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="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="a00216.html">atomic</a>< void * > & </td><td class="memItemRight" valign="bottom"><b>operator=</b> (const <a class="el" href="a00216.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="a00217.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="a00410.html">atomic.h</a></ul>
-<hr>
-<p></p>
-Copyright © 2005-2011 Intel Corporation. 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/a00218.html b/doc/html/a00218.html
deleted file mode 100644
index 1187034..0000000
--- a/doc/html/a00218.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="a00362.html">tbb</a>::<b>internal</b>::<a class="el" href="a00218.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="a00594.html">tbb_machine.h</a>></code>
-<p>
-<a href="a00146.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="a00218.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="a00594.html">tbb_machine.h</a></ul>
-<hr>
-<p></p>
-Copyright © 2005-2011 Intel Corporation. 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/a00219.html b/doc/html/a00219.html
deleted file mode 100644
index 672c260..0000000
--- a/doc/html/a00219.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="a00362.html">tbb</a>::<a class="el" href="a00219.html">auto_partitioner</a></div>
-<h1>tbb::auto_partitioner Class Reference<br>
-<small>
-[<a class="el" href="a00371.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="a00541.html">partitioner.h</a>></code>
-<p>
-<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>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a47f7e0208a2bf68f35b51b27d2ddf2a"></a><!-- doxytag: member="tbb::auto_partitioner::internal::start_for" ref="a47f7e0208a2bf68f35b51b27d2ddf2a" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::start_for</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e8f710e431b62c2a48914bd99d0fe034"></a><!-- doxytag: member="tbb::auto_partitioner::internal::start_reduce" ref="e8f710e431b62c2a48914bd99d0fe034" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>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>
-
-<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>
-An auto partitioner.
-<p>
-The range is initial divided into several large chunks. Chunks are further subdivided into VICTIM_CHUNKS pieces if they are stolen and divisible.
-<p>
-<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00541.html">partitioner.h</a></ul>
-<hr>
-<p></p>
-Copyright © 2005-2011 Intel Corporation. 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/a00220.html b/doc/html/a00220.html
deleted file mode 100644
index f9c96cb..0000000
--- a/doc/html/a00220.html
+++ /dev/null
@@ -1,50 +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::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>
-<!-- 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="a00362.html">tbb</a>::<a class="el" href="a00220.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="a00593.html">tbb_exception.h</a>></code>
-<p>
-<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="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>
-
-</table>
-<hr><a name="_details"></a><h2>Detailed Description</h2>
-Exception for concurrent containers.
-<p>
-<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00593.html">tbb_exception.h</a></ul>
-<hr>
-<p></p>
-Copyright © 2005-2011 Intel Corporation. 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/a00221.html b/doc/html/a00221.html
deleted file mode 100644
index e1f320b..0000000
--- a/doc/html/a00221.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="a00362.html">tbb</a>::<a class="el" href="a00221.html">blocked_range</a></div>
-<h1>tbb::blocked_range< Value > Class Template Reference<br>
-<small>
-[<a class="el" href="a00371.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="a00418.html">blocked_range.h</a>></code>
-<p>
-<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">typedef Value </td><td class="memItemRight" valign="bottom"><a class="el" href="a00221.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="a00221.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="a00221.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="a00221.html#14795a36ead1414b4371dbe1a4656359">blocked_range</a> (Value begin_, Value end_, <a class="el" href="a00221.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="a00221.html#1a8d05842c2b3dfc177bc4d347e4cef7">const_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00221.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="a00221.html#1a8d05842c2b3dfc177bc4d347e4cef7">const_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00221.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="a00221.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00221.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="a00221.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00221.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="a00221.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="a00221.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="a00221.html#4c0efd2be3f96a0ab3ba5085e8b3fcc7">blocked_range</a> (<a class="el" href="a00221.html">blocked_range</a> &r, <a class="el" href="a00290.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="a00221.html">tbb::blocked_range</a>< Value >::<a class="el" href="a00221.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="a00221.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="a00221.html">tbb::blocked_range</a>< Value >::<a class="el" href="a00221.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="a00221.html">tbb::blocked_range</a>< Value >::<a class="el" href="a00221.html">blocked_range</a> </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="a00221.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="a00290.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="a00221.html#8b929d93ddc13f148b11bceef3a3bdf8">end()</a><<a class="el" href="a00221.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="a00221.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="a00221.html#8b929d93ddc13f148b11bceef3a3bdf8">end()</a><<a class="el" href="a00221.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="a00221.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> <a class="el" href="a00221.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="a00221.html#8b929d93ddc13f148b11bceef3a3bdf8">end()</a><<a class="el" href="a00221.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="a00418.html">blocked_range.h</a></ul>
-<hr>
-<p></p>
-Copyright © 2005-2011 Intel Corporation. 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/a00222.html b/doc/html/a00222.html
deleted file mode 100644
index 6d70406..0000000
--- a/doc/html/a00222.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="a00362.html">tbb</a>::<a class="el" href="a00222.html">blocked_range2d</a></div>
-<h1>tbb::blocked_range2d< RowValue, ColValue > Class Template Reference<br>
-<small>
-[<a class="el" href="a00371.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="a00419.html">blocked_range2d.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 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="a00221.html">blocked_range</a>< RowValue > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00222.html#a807a22fe658ec38b8edfd69521d0383">row_range_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Type for size of an iteation 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="a00221.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="a00221.html#f5707bffea38eee5c9680f37358afb8e">row_range_type::size_type</a> row_grainsize, ColValue col_begin, ColValue col_end, typename <a class="el" href="a00221.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="a00222.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="a00222.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="a00222.html">blocked_range2d</a> &r, <a class="el" href="a00290.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="a00221.html">row_range_type</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00222.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="a00221.html">col_range_type</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00222.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="a00419.html">blocked_range2d.h</a></ul>
-<hr>
-<p></p>
-Copyright © 2005-2011 Intel Corporation. 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/a00223.html b/doc/html/a00223.html
deleted file mode 100644
index 26f7ea9..0000000
--- a/doc/html/a00223.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>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>
-<!-- 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="a00362.html">tbb</a>::<a class="el" href="a00223.html">blocked_range3d</a></div>
-<h1>tbb::blocked_range3d< PageValue, RowValue, ColValue > Class Template Reference<br>
-<small>
-[<a class="el" href="a00371.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="a00420.html">blocked_range3d.h</a>></code>
-<p>
-<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 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="a00221.html">blocked_range</a>< PageValue > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00223.html#b8ebf17a552ba47825e9b3887855b719">page_range_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Type for size of an iteation 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="a00221.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="02229b59d4dc5437bf5fbe72acca7f66"></a><!-- doxytag: member="tbb::blocked_range3d::col_range_type" ref="02229b59d4dc5437bf5fbe72acca7f66" args="" -->
-typedef <a class="el" href="a00221.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="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="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="a00221.html#f5707bffea38eee5c9680f37358afb8e">page_range_type::size_type</a> page_grainsize, RowValue row_begin, RowValue row_end, typename <a class="el" href="a00221.html#f5707bffea38eee5c9680f37358afb8e">row_range_type::size_type</a> row_grainsize, ColValue col_begin, ColValue col_end, typename <a class="el" href="a00221.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="a00223.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="a00223.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="a00223.html">blocked_range3d</a> &r, <a class="el" href="a00290.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="a00221.html">page_range_type</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00223.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="a00221.html">row_range_type</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00223.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="a00221.html">col_range_type</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00223.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.
-<p>
-<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00420.html">blocked_range3d.h</a></ul>
-<hr>
-<p></p>
-Copyright © 2005-2011 Intel Corporation. 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/a00224.html b/doc/html/a00224.html
deleted file mode 100644
index 439fab8..0000000
--- a/doc/html/a00224.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::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>
-<!-- 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="a00362.html">tbb</a>::<a class="el" href="a00224.html">broadcast_node</a></div>
-<h1>tbb::broadcast_node< T > Class Template Reference</h1><!-- doxytag: class="tbb::broadcast_node" --><!-- doxytag: inherits="tbb::graph_node,tbb::receiver,tbb::sender" -->Forwards messages of type T to all successors.
-<a href="#_details">More...</a>
-<p>
-<code>#include <<a class="el" href="a00466.html">graph.h</a>></code>
-<p>
-<p>Inheritance diagram for tbb::broadcast_node< T >:
-<p><center><img src="a00224.png" usemap="#tbb::broadcast_node< T >_map" border="0" alt=""></center>
-<map name="tbb::broadcast_node< T >_map">
-<area href="a00251.html" alt="tbb::graph_node" shape="rect" coords="0,0,157,24">
-<area href="a00277.html" alt="tbb::receiver< T >" shape="rect" coords="167,0,324,24">
-<area href="a00282.html" alt="tbb::sender< T >" shape="rect" coords="334,0,491,24">
-</map>
-<a href="a00054.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="59ea89dbeab816742e6dc6af467e6c3f"></a><!-- doxytag: member="tbb::broadcast_node::input_type" ref="59ea89dbeab816742e6dc6af467e6c3f" args="" -->
-typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00224.html#59ea89dbeab816742e6dc6af467e6c3f">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="b844ca1ee578a54bc11ff28467b12e7d"></a><!-- doxytag: member="tbb::broadcast_node::output_type" ref="b844ca1ee578a54bc11ff28467b12e7d" args="" -->
-typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00224.html#b844ca1ee578a54bc11ff28467b12e7d">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="4dd13b81f6361fc244abe7cbcacd048c"></a><!-- doxytag: member="tbb::broadcast_node::predecessor_type" ref="4dd13b81f6361fc244abe7cbcacd048c" args="" -->
-typedef <a class="el" href="a00282.html">sender</a>< <a class="el" href="a00224.html#59ea89dbeab816742e6dc6af467e6c3f">input_type</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00224.html#4dd13b81f6361fc244abe7cbcacd048c">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="453928c367d813cb481f1b9aa1e1742a"></a><!-- doxytag: member="tbb::broadcast_node::successor_type" ref="453928c367d813cb481f1b9aa1e1742a" args="" -->
-typedef <a class="el" href="a00277.html">receiver</a>< <a class="el" href="a00224.html#b844ca1ee578a54bc11ff28467b12e7d">output_type</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00224.html#453928c367d813cb481f1b9aa1e1742a">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="3f4149fa6b984b2138cb5ed40a2ddc6c"></a><!-- doxytag: member="tbb::broadcast_node::register_successor" ref="3f4149fa6b984b2138cb5ed40a2ddc6c" args="(receiver< T > &r)" -->
-virtual bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00224.html#3f4149fa6b984b2138cb5ed40a2ddc6c">register_successor</a> (<a class="el" href="a00277.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="eefb3210bb9727765ea7385ba163c2a6"></a><!-- doxytag: member="tbb::broadcast_node::remove_successor" ref="eefb3210bb9727765ea7385ba163c2a6" args="(receiver< T > &r)" -->
-virtual bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00224.html#eefb3210bb9727765ea7385ba163c2a6">remove_successor</a> (<a class="el" href="a00277.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="9b211e02554d6b39dc04f7e7f4e00073"></a><!-- doxytag: member="tbb::broadcast_node::try_put" ref="9b211e02554d6b39dc04f7e7f4e00073" args="(T t)" -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00224.html#9b211e02554d6b39dc04f7e7f4e00073">try_put</a> (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::broadcast_node< T ></h3>
-
-Forwards messages of type T to all successors.
-<p>
-<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00466.html">graph.h</a></ul>
-<hr>
-<p></p>
-Copyright © 2005-2011 Intel Corporation. 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/a00224.png b/doc/html/a00224.png
deleted file mode 100644
index 820bcba..0000000
Binary files a/doc/html/a00224.png and /dev/null differ
diff --git a/doc/html/a00225.html b/doc/html/a00225.html
index fae9f13..74166b2 100644
--- a/doc/html/a00225.html
+++ b/doc/html/a00225.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::buffer_node< T > 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,405 +21,38 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00225.html">buffer_node</a></div>
-<h1>tbb::buffer_node< T > Class Template Reference</h1><!-- doxytag: class="tbb::buffer_node" --><!-- doxytag: inherits="tbb::graph_node,tbb::receiver,tbb::sender" -->Forwards messages in arbitrary order.
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00225.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="a00466.html">graph.h</a>></code>
+<code>#include <<a class="el" href="a00531.html">partitioner.h</a>></code>
<p>
-<p>Inheritance diagram for tbb::buffer_node< T >:
-<p><center><img src="a00225.png" usemap="#tbb::buffer_node< T >_map" border="0" alt=""></center>
-<map name="tbb::buffer_node< T >_map">
-<area href="a00251.html" alt="tbb::graph_node" shape="rect" coords="0,0,242,24">
-<area href="a00277.html" alt="tbb::receiver< T >" shape="rect" coords="252,0,494,24">
-<area href="a00282.html" alt="tbb::sender< T >" shape="rect" coords="504,0,746,24">
-<area href="a00268.html" alt="tbb::priority_queue_node< T, Compare >" shape="rect" coords="126,112,368,136">
-<area href="a00269.html" alt="tbb::queue_node< T >" shape="rect" coords="378,112,620,136">
-<area href="a00283.html" alt="tbb::sequencer_node< T >" shape="rect" coords="378,168,620,192">
+<p>Inheritance diagram for tbb::affinity_partitioner:
+<p><center><img src="a00225.png" usemap="#tbb::affinity_partitioner_map" border="0" alt=""></center>
+<map name="tbb::affinity_partitioner_map">
+<area href="a00226.html" alt="tbb::internal::affinity_partitioner_base_v3" shape="rect" coords="0,0,240,24">
</map>
-<a href="a00055.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="90de308ba6abefb74c537a62ed0f1ca3"></a><!-- doxytag: member="tbb::buffer_node::input_type" ref="90de308ba6abefb74c537a62ed0f1ca3" args="" -->
-typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00225.html#90de308ba6abefb74c537a62ed0f1ca3">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="28c06a61dbad153f2e989efbf43016c5"></a><!-- doxytag: member="tbb::buffer_node::output_type" ref="28c06a61dbad153f2e989efbf43016c5" args="" -->
-typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00225.html#28c06a61dbad153f2e989efbf43016c5">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="688cf819089ee2fac2b9de2e050adea7"></a><!-- doxytag: member="tbb::buffer_node::predecessor_type" ref="688cf819089ee2fac2b9de2e050adea7" args="" -->
-typedef <a class="el" href="a00282.html">sender</a>< <a class="el" href="a00225.html#90de308ba6abefb74c537a62ed0f1ca3">input_type</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00225.html#688cf819089ee2fac2b9de2e050adea7">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="5e23f4f377ff4e1f53e71fd909a65771"></a><!-- doxytag: member="tbb::buffer_node::successor_type" ref="5e23f4f377ff4e1f53e71fd909a65771" args="" -->
-typedef <a class="el" href="a00277.html">receiver</a>< <a class="el" href="a00225.html#28c06a61dbad153f2e989efbf43016c5">output_type</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00225.html#5e23f4f377ff4e1f53e71fd909a65771">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="7360978fa427d054bc6cde05c80e5e9f"></a><!-- doxytag: member="tbb::buffer_node::buffer_node" ref="7360978fa427d054bc6cde05c80e5e9f" args="(graph &g)" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00225.html#7360978fa427d054bc6cde05c80e5e9f">buffer_node</a> (<a class="el" href="a00250.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">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00225.html#cd2ef588b0ee6eb8d23ee169e00c73a9">register_successor</a> (<a class="el" href="a00277.html">receiver</a>< <a class="el" href="a00225.html#28c06a61dbad153f2e989efbf43016c5">output_type</a> > &r)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Adds a new successor. <a href="#cd2ef588b0ee6eb8d23ee169e00c73a9"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00225.html#415428db02e74a479fb056a8ed72ba53">remove_successor</a> (<a class="el" href="a00277.html">receiver</a>< <a class="el" href="a00225.html#28c06a61dbad153f2e989efbf43016c5">output_type</a> > &r)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Removes a successor. <a href="#415428db02e74a479fb056a8ed72ba53"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00225.html#b68bdec127703dbfb2d93d685abbfd67">try_get</a> (T &v)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Request an item from the <a class="el" href="a00225.html">buffer_node</a>. <a href="#b68bdec127703dbfb2d93d685abbfd67"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00225.html#11ebad4c72082a1a03ecccd3afab4ae2">try_reserve</a> (T &v)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Reserves an item. <a href="#11ebad4c72082a1a03ecccd3afab4ae2"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00225.html#435e29a66f0719d4822a0a8dc78a0405">try_release</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Release a reserved item. <a href="#435e29a66f0719d4822a0a8dc78a0405"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00225.html#46b8b257a97e2192a2b11743279e8ffe">try_consume</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Consumes a reserved item. <a href="#46b8b257a97e2192a2b11743279e8ffe"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00225.html#f74899ffb67687998168ad428f586b64">try_put</a> (T t)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Receive an item. <a href="#f74899ffb67687998168ad428f586b64"></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="7650a28da77a86b18e91510023475192"></a><!-- doxytag: member="tbb::buffer_node::size_type" ref="7650a28da77a86b18e91510023475192" 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="ad0e26a3248e66762998ff71b759df9f"></a><!-- doxytag: member="tbb::buffer_node::item_type" ref="ad0e26a3248e66762998ff71b759df9f" args="" -->
-typedef std::pair< T, bool > </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="4560fc3c7118b2520aa1bc5f62dd60e036bd5780cc2e6c71263d7926c5e631a7"></a><!-- doxytag: member="tbb::buffer_node::reg_succ" ref="4560fc3c7118b2520aa1bc5f62dd60e036bd5780cc2e6c71263d7926c5e631a7" 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="4560fc3c7118b2520aa1bc5f62dd60e0b1c420e37f5e6aa824a5c553352485cb"></a><!-- doxytag: member="tbb::buffer_node::rem_succ" ref="4560fc3c7118b2520aa1bc5f62dd60e0b1c420e37f5e6aa824a5c553352485cb" 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="4560fc3c7118b2520aa1bc5f62dd60e05c53e265b1aab0b49efbe9be4963a6fe"></a><!-- doxytag: member="tbb::buffer_node::req_item" ref="4560fc3c7118b2520aa1bc5f62dd60e05c53e265b1aab0b49efbe9be4963a6fe" 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="4560fc3c7118b2520aa1bc5f62dd60e021f5de223fc34b414c41c8f2a4c2c376"></a><!-- doxytag: member="tbb::buffer_node::res_item" ref="4560fc3c7118b2520aa1bc5f62dd60e021f5de223fc34b414c41c8f2a4c2c376" 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="4560fc3c7118b2520aa1bc5f62dd60e012dafb1a5c2d5073b11845440100e3bf"></a><!-- doxytag: member="tbb::buffer_node::rel_res" ref="4560fc3c7118b2520aa1bc5f62dd60e012dafb1a5c2d5073b11845440100e3bf" 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="4560fc3c7118b2520aa1bc5f62dd60e0b1a6a5c39512d70a4458dabbbf677267"></a><!-- doxytag: member="tbb::buffer_node::con_res" ref="4560fc3c7118b2520aa1bc5f62dd60e0b1a6a5c39512d70a4458dabbbf677267" 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="4560fc3c7118b2520aa1bc5f62dd60e021a9fe988ff484f1033a739cde97eb9d"></a><!-- doxytag: member="tbb::buffer_node::put_item" ref="4560fc3c7118b2520aa1bc5f62dd60e021a9fe988ff484f1033a739cde97eb9d" 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="4560fc3c7118b2520aa1bc5f62dd60e0ec6665fcffc5a6c0f658baad182f52c5"></a><!-- doxytag: member="tbb::buffer_node::try_fwd" ref="4560fc3c7118b2520aa1bc5f62dd60e0ec6665fcffc5a6c0f658baad182f52c5" 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="5d9b0dd3eb6f5fb930ef9c831fc2687b94f11e3700304f854a3981371820c9bf"></a><!-- doxytag: member="tbb::buffer_node::WAIT" ref="5d9b0dd3eb6f5fb930ef9c831fc2687b94f11e3700304f854a3981371820c9bf" 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="5d9b0dd3eb6f5fb930ef9c831fc2687bca6c186a8b172a894745873277f103d2"></a><!-- doxytag: member="tbb::buffer_node::SUCCEEDED" ref="5d9b0dd3eb6f5fb930ef9c831fc2687bca6c186a8b172a894745873277f103d2" 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="5d9b0dd3eb6f5fb930ef9c831fc2687b1f741448d944a5fbe12628a89ffab06f"></a><!-- doxytag: member="tbb::buffer_node::FAILED" ref="5d9b0dd3eb6f5fb930ef9c831fc2687b1f741448d944a5fbe12628a89ffab06f" 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="fe41bdb6b830ffec654561414a6f96f9"></a><!-- doxytag: member="tbb::buffer_node::handle_operations" ref="fe41bdb6b830ffec654561414a6f96f9" 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="3a31b3b55bee417de3af09c7b45b9ad6"></a><!-- doxytag: member="tbb::buffer_node::forward" ref="3a31b3b55bee417de3af09c7b45b9ad6" args="()" -->
-virtual void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00225.html#3a31b3b55bee417de3af09c7b45b9ad6">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="017f16c8d6e0fb65d0d3a61aec86b3e2"></a><!-- doxytag: member="tbb::buffer_node::internal_reg_succ" ref="017f16c8d6e0fb65d0d3a61aec86b3e2" args="(buffer_operation *op)" -->
-virtual void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00225.html#017f16c8d6e0fb65d0d3a61aec86b3e2">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="a75f731cf9fc93f7487eb72de3fcf7b1"></a><!-- doxytag: member="tbb::buffer_node::internal_rem_succ" ref="a75f731cf9fc93f7487eb72de3fcf7b1" args="(buffer_operation *op)" -->
-virtual void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00225.html#a75f731cf9fc93f7487eb72de3fcf7b1">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="a3cb61d8a98bc4bc860b1cb04944b4f8"></a><!-- doxytag: member="tbb::buffer_node::internal_forward" ref="a3cb61d8a98bc4bc860b1cb04944b4f8" args="(buffer_operation *op)" -->
-virtual void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00225.html#a3cb61d8a98bc4bc860b1cb04944b4f8">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="fac0c0e9be7255747118f126dd9f6d39"></a><!-- doxytag: member="tbb::buffer_node::internal_push" ref="fac0c0e9be7255747118f126dd9f6d39" 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="e4cf171d5bcf707786ef6a51977e2601"></a><!-- doxytag: member="tbb::buffer_node::internal_pop" ref="e4cf171d5bcf707786ef6a51977e2601" 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="263221e903d306c9b411c87a2f558a02"></a><!-- doxytag: member="tbb::buffer_node::internal_reserve" ref="263221e903d306c9b411c87a2f558a02" 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="81321b083181f57543c8ce3f61da9777"></a><!-- doxytag: member="tbb::buffer_node::internal_consume" ref="81321b083181f57543c8ce3f61da9777" 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="153ec83b01b797aabc13599c57effc01"></a><!-- doxytag: member="tbb::buffer_node::internal_release" ref="153ec83b01b797aabc13599c57effc01" 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="3ec9d33aa9f1e9292d5952e3eb477ca1"></a><!-- doxytag: member="tbb::buffer_node::grow_my_array" ref="3ec9d33aa9f1e9292d5952e3eb477ca1" args="(size_t minimum_size)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00225.html#3ec9d33aa9f1e9292d5952e3eb477ca1">grow_my_array</a> (size_t minimum_size)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Grows the internal array. <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="3cd68b585af1cba2311322a1cc008f0f"></a><!-- doxytag: member="tbb::buffer_node::my_successors" ref="3cd68b585af1cba2311322a1cc008f0f" args="" -->
-internal::round_robin_cache<<br>
- T, <a class="el" href="a00262.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="a4cb1a21519885a4709af34e889d7cc7"></a><!-- doxytag: member="tbb::buffer_node::my_parent" ref="a4cb1a21519885a4709af34e889d7cc7" args="" -->
-<a class="el" href="a00291.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="c746e9fd9b31e8554ac8edd4a8a4a55e"></a><!-- doxytag: member="tbb::buffer_node::my_array" ref="c746e9fd9b31e8554ac8edd4a8a4a55e" args="" -->
-item_type * </td><td class="memItemRight" valign="bottom"><b>my_array</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7218ccd1547224f4025b43b66f00072f"></a><!-- doxytag: member="tbb::buffer_node::my_array_size" ref="7218ccd1547224f4025b43b66f00072f" args="" -->
-size_type </td><td class="memItemRight" valign="bottom"><b>my_array_size</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="41e23e9ab9deb975d1abaf62dd8f28e1"></a><!-- doxytag: member="tbb::buffer_node::my_head" ref="41e23e9ab9deb975d1abaf62dd8f28e1" args="" -->
-size_type </td><td class="memItemRight" valign="bottom"><b>my_head</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="bf042c91faf597e80867449bff116037"></a><!-- doxytag: member="tbb::buffer_node::my_tail" ref="bf042c91faf597e80867449bff116037" args="" -->
-size_type </td><td class="memItemRight" valign="bottom"><b>my_tail</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="26778eaf1e96a93141f704eb66a40a27"></a><!-- doxytag: member="tbb::buffer_node::my_mutex" ref="26778eaf1e96a93141f704eb66a40a27" args="" -->
-<a class="el" href="a00286.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="4014dadf54bae347d8b72201abdac680"></a><!-- doxytag: member="tbb::buffer_node::my_reserved" ref="4014dadf54bae347d8b72201abdac680" args="" -->
-bool </td><td class="memItemRight" valign="bottom"><b>my_reserved</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2278ecdc5a18582a2b50759b16430480"></a><!-- doxytag: member="tbb::buffer_node::my_reserved_id" ref="2278ecdc5a18582a2b50759b16430480" args="" -->
-size_type </td><td class="memItemRight" valign="bottom"><b>my_reserved_id</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e8ab9d2d97b1fd58aec401243a1dc4cd"></a><!-- doxytag: member="tbb::buffer_node::forwarder_busy" ref="e8ab9d2d97b1fd58aec401243a1dc4cd" 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="480281137c9d1ecfbb2e2cdacdafd4f5"></a><!-- doxytag: member="tbb::buffer_node::my_aggregator" ref="480281137c9d1ecfbb2e2cdacdafd4f5" args="" -->
-internal::aggregator< my_functor_t,<br>
- buffer_operation > </td><td class="memItemRight" valign="bottom"><b>my_aggregator</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="f4390dbfe8bf638d6b279bd67e687a8c"></a><!-- doxytag: member="tbb::buffer_node::initial_buffer_size" ref="f4390dbfe8bf638d6b279bd67e687a8c" args="" -->
-static const size_type </td><td class="memItemRight" valign="bottom"><b>initial_buffer_size</b> = 4</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="b8d43e5c9a739e9493cf9581ac80a363"></a><!-- doxytag: member="tbb::buffer_node::internal::forward_task< buffer_node< T > >" ref="b8d43e5c9a739e9493cf9581ac80a363" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::forward_task< buffer_node< T > ></b></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 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="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">class </td><td class="memItemRight" valign="bottom"><b>my_functor_t</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>
-<h3>template<typename T><br>
- class tbb::buffer_node< T ></h3>
-
-Forwards messages in arbitrary order.
-<p>
-<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="cd2ef588b0ee6eb8d23ee169e00c73a9"></a><!-- doxytag: member="tbb::buffer_node::register_successor" ref="cd2ef588b0ee6eb8d23ee169e00c73a9" 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="a00225.html">tbb::buffer_node</a>< T >::register_successor </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="a00277.html">receiver</a>< <a class="el" href="a00225.html#28c06a61dbad153f2e989efbf43016c5">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="a00282.html#be48ac70174cf8e08e2b0279cd6343d3">tbb::sender< T ></a>.
-</div>
-</div><p>
-<a class="anchor" name="415428db02e74a479fb056a8ed72ba53"></a><!-- doxytag: member="tbb::buffer_node::remove_successor" ref="415428db02e74a479fb056a8ed72ba53" 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="a00225.html">tbb::buffer_node</a>< T >::remove_successor </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="a00277.html">receiver</a>< <a class="el" href="a00225.html#28c06a61dbad153f2e989efbf43016c5">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="a00282.html#3f345427e812e8741370308ff88f30bf">tbb::sender< T ></a>.
-</div>
-</div><p>
-<a class="anchor" name="46b8b257a97e2192a2b11743279e8ffe"></a><!-- doxytag: member="tbb::buffer_node::try_consume" ref="46b8b257a97e2192a2b11743279e8ffe" args="()" -->
-<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="a00225.html">tbb::buffer_node</a>< T >::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="a00282.html#add46946c4c7330422733432e4032fac">tbb::sender< T ></a>.
-</div>
-</div><p>
-<a class="anchor" name="b68bdec127703dbfb2d93d685abbfd67"></a><!-- doxytag: member="tbb::buffer_node::try_get" ref="b68bdec127703dbfb2d93d685abbfd67" args="(T &v)" -->
-<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="a00225.html">tbb::buffer_node</a>< T >::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="a00225.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="a00282.html#bf8c9235810354f3353a899c982645de">tbb::sender< T ></a>.
-</div>
-</div><p>
-<a class="anchor" name="f74899ffb67687998168ad428f586b64"></a><!-- doxytag: member="tbb::buffer_node::try_put" ref="f74899ffb67687998168ad428f586b64" args="(T t)" -->
-<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="a00225.html">tbb::buffer_node</a>< T >::try_put </td>
- <td>(</td>
- <td class="paramtype">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="a00277.html#6e5422b03b4570138f227b3d5d0073b8">tbb::receiver< T ></a>.
-</div>
-</div><p>
-<a class="anchor" name="435e29a66f0719d4822a0a8dc78a0405"></a><!-- doxytag: member="tbb::buffer_node::try_release" ref="435e29a66f0719d4822a0a8dc78a0405" args="()" -->
-<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="a00225.html">tbb::buffer_node</a>< T >::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="a00282.html#28c41df1c0c7ed485b4a691ec8f30098">tbb::sender< T ></a>.
-</div>
-</div><p>
-<a class="anchor" name="11ebad4c72082a1a03ecccd3afab4ae2"></a><!-- doxytag: member="tbb::buffer_node::try_reserve" ref="11ebad4c72082a1a03ecccd3afab4ae2" args="(T &v)" -->
-<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="a00225.html">tbb::buffer_node</a>< T >::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
+An affinity partitioner.
<p>
-Reimplemented from <a class="el" href="a00282.html#3506c7275aeeb2fc3ba5d5f10ee0adac">tbb::sender< T ></a>.
-</div>
-</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00466.html">graph.h</a></ul>
+<li><a class="el" href="a00531.html">partitioner.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00225.png b/doc/html/a00225.png
index db5c56e..31d2cc3 100644
Binary files a/doc/html/a00225.png and b/doc/html/a00225.png differ
diff --git a/doc/html/a00226.html b/doc/html/a00226.html
index 80abee9..07b5814 100644
--- a/doc/html/a00226.html
+++ b/doc/html/a00226.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::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,88 +21,32 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00226.html">cache_aligned_allocator</a></div>
-<h1>tbb::cache_aligned_allocator< T > Class Template Reference<br>
-<small>
-[<a class="el" href="a00373.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="a00383.html">tbb</a>::<b>internal</b>::<a class="el" href="a00226.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="a00421.html">cache_aligned_allocator.h</a>></code>
+<code>#include <<a class="el" href="a00531.html">partitioner.h</a>></code>
<p>
-<a href="a00009.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<p>Inheritance diagram for tbb::internal::affinity_partitioner_base_v3:
+<p><center><img src="a00226.png" usemap="#tbb::internal::affinity_partitioner_base_v3_map" border="0" alt=""></center>
+<map name="tbb::internal::affinity_partitioner_base_v3_map">
+<area href="a00225.html" alt="tbb::affinity_partitioner" shape="rect" coords="0,56,240,80">
+</map>
+<a href="a00085.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 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="a00226.html#fa554f840d8ef010ff2650bac032ec01">tbb::affinity_partitioner</a></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="a00226.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="a00226.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="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"><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="a00226.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="a00226.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="a00226.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="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="958ee8745c86c275bfc9533af565e017"></a><!-- doxytag: member="tbb::cache_aligned_allocator::construct" ref="958ee8745c86c275bfc9533af565e017" args="(pointer p, const value_type &value)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00226.html#958ee8745c86c275bfc9533af565e017">construct</a> (pointer p, const value_type &value)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Copy-construct value at location pointed to by p. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="cd298895a4f1654b5149ec84b591ecb5"></a><!-- doxytag: member="tbb::cache_aligned_allocator::destroy" ref="cd298895a4f1654b5149ec84b591ecb5" args="(pointer p)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00226.html#cd298895a4f1654b5149ec84b591ecb5">destroy</a> (pointer p)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroy 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"><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>
-<h3>template<typename T><br>
- class tbb::cache_aligned_allocator< T ></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.
+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="a00421.html">cache_aligned_allocator.h</a></ul>
+<li><a class="el" href="a00531.html">partitioner.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00226.png b/doc/html/a00226.png
new file mode 100644
index 0000000..18c7d58
Binary files /dev/null and b/doc/html/a00226.png differ
diff --git a/doc/html/a00227.html b/doc/html/a00227.html
index 039cc2c..406807c 100644
--- a/doc/html/a00227.html
+++ b/doc/html/a00227.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,39 +21,37 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00227.html">cache_aligned_allocator< void ></a></div>
-<h1>tbb::cache_aligned_allocator< void > Class Template Reference<br>
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00227.html">aligned_space</a></div>
+<h1>tbb::aligned_space< T, N > Class Template Reference<br>
<small>
-[<a class="el" href="a00373.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="a00397.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="a00421.html">cache_aligned_allocator.h</a>></code>
+<code>#include <<a class="el" href="a00401.html">aligned_space.h</a>></code>
<p>
-<a href="a00011.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00001.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="a00227.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="a00227.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="a00421.html">cache_aligned_allocator.h</a></ul>
+<li><a class="el" href="a00401.html">aligned_space.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00228.html b/doc/html/a00228.html
index 90a926d..dd91709 100644
--- a/doc/html/a00228.html
+++ b/doc/html/a00228.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,131 +21,35 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00228.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="a00383.html">tbb</a>::<a class="el" href="a00228.html">atomic</a></div>
+<h1>tbb::atomic< T > Struct Template Reference<br>
+<small>
+[<a class="el" href="a00398.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="a00593.html">tbb_exception.h</a>></code>
+<code>#include <<a class="el" href="a00403.html">atomic.h</a>></code>
<p>
-<p>Inheritance diagram for tbb::captured_exception:
-<p><center><img src="a00228.png" usemap="#tbb::captured_exception_map" border="0" alt=""></center>
-<map name="tbb::captured_exception_map">
-<area href="a00298.html" alt="tbb::tbb_exception" shape="rect" coords="0,0,146,24">
-</map>
-<a href="a00143.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00002.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="a00228.html">captured_exception</a> &src)</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="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="e95b8eb99ec9dea22934ac528a08654c"></a><!-- doxytag: member="tbb::captured_exception::operator=" ref="e95b8eb99ec9dea22934ac528a08654c" args="(const captured_exception &src)" -->
-<a class="el" href="a00228.html">captured_exception</a> & </td><td class="memItemRight" valign="bottom"><b>operator=</b> (const <a class="el" href="a00228.html">captured_exception</a> &src)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="a00228.html">captured_exception</a> *__TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00228.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="a00228.html#93d875d3555502ff6f18513525de204c">destroy</a> () throw ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroys objects created by the <a class="el" href="a00228.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="a00228.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="a00228.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="a00228.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="a00228.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="a00228.html">atomic</a>< T > & </td><td class="memItemRight" valign="bottom"><b>operator=</b> (const <a class="el" href="a00228.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="a00298.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">
-
-<p>
-Destroys objects created by the <a class="el" href="a00228.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="a00298.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="a00228.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">
+<h3>template<typename T><br>
+ struct tbb::atomic< T ></h3>
+Primary template for atomic.
<p>
-Creates and returns pointer to the deep copy of this exception object.
-<p>
-Move semantics is allowed.
-<p>
-Implements <a class="el" href="a00298.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="a00298.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="a00593.html">tbb_exception.h</a></ul>
+<hr>The documentation for this struct was generated from the following file:<ul>
+<li><a class="el" href="a00403.html">atomic.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00228.png b/doc/html/a00228.png
deleted file mode 100644
index 2470bea..0000000
Binary files a/doc/html/a00228.png and /dev/null differ
diff --git a/doc/html/a00229.html b/doc/html/a00229.html
index a728010..279fa06 100644
--- a/doc/html/a00229.html
+++ b/doc/html/a00229.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,58 +21,30 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00229.html">combinable</a></div>
-<h1>tbb::combinable< T > Class Template Reference<br>
-<small>
-[<a class="el" href="a00372.html">Containers</a>]</small>
-</h1><!-- doxytag: class="tbb::combinable" -->Thread-local storage with optional reduction.
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00229.html">atomic< void * ></a></div>
+<h1>tbb::atomic< void * > Struct Template Reference</h1><!-- doxytag: class="tbb::atomic< void * >" -->Specialization for <a class="el" href="a00229.html">atomic<void*></a>, for sake of not allowing arithmetic or operator->.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00423.html">combinable.h</a>></code>
+<code>#include <<a class="el" href="a00403.html">atomic.h</a>></code>
<p>
-<a href="a00013.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00003.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="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="2c87e79ae98588a5780f708773388843"></a><!-- doxytag: member="tbb::combinable::~combinable" ref="2c87e79ae98588a5780f708773388843" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00229.html#2c87e79ae98588a5780f708773388843">~combinable</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="a00229.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="a00229.html">combinable</a> & </td><td class="memItemRight" valign="bottom"><b>operator=</b> (const <a class="el" href="a00229.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="a00228.html">atomic</a>< void * > & </td><td class="memItemRight" valign="bottom"><b>operator=</b> (const <a class="el" href="a00228.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="a00229.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="a00423.html">combinable.h</a></ul>
+<hr>The documentation for this struct was generated from the following file:<ul>
+<li><a class="el" href="a00403.html">atomic.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00230.html b/doc/html/a00230.html
index ca39e2d..d491137 100644
--- a/doc/html/a00230.html
+++ b/doc/html/a00230.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,280 +21,33 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00230.html">concurrent_bounded_queue</a></div>
-<h1>tbb::concurrent_bounded_queue< T, A > Class Template Reference<br>
-<small>
-[<a class="el" href="a00372.html">Containers</a>]</small>
-</h1><!-- doxytag: class="tbb::concurrent_bounded_queue" -->A high-performance thread-safe blocking concurrent bounded queue.
+<a class="el" href="a00383.html">tbb</a>::<b>internal</b>::<a class="el" href="a00230.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="a00436.html">concurrent_queue.h</a>></code>
+<code>#include <<a class="el" href="a00594.html">tbb_machine.h</a>></code>
<p>
-<p>Inheritance diagram for tbb::concurrent_bounded_queue< T, A >:
-<p><center><img src="a00230.png" usemap="#tbb::concurrent_bounded_queue< T, A >_map" border="0" alt=""></center>
-<map name="tbb::concurrent_bounded_queue< T, A >_map">
-<area href="a00237.html" alt="tbb::deprecated::concurrent_queue< T, A >" shape="rect" coords="0,56,257,80">
-</map>
-<a href="a00025.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="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="a00230.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="a00230.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="a00230.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="a00230.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="a00230.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="a00230.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="a00230.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="a00230.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="a00230.html#e3525226732963ff0f13e89d8e6dab5b">concurrent_bounded_queue</a> (const <a class="el" href="a00230.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a> &a=<a class="el" href="a00230.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="a00230.html#7b7fb414d2eaa8a7f5d68fc4cd63ac50">concurrent_bounded_queue</a> (const <a class="el" href="a00230.html">concurrent_bounded_queue</a> &src, const <a class="el" href="a00230.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a> &a=<a class="el" href="a00230.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="a00230.html#a5e04dcd7db9fd9b583b4e7df832246a">concurrent_bounded_queue</a> (InputIterator begin, InputIterator end, const <a class="el" href="a00230.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a> &a=<a class="el" href="a00230.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="a00230.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="a00230.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="a00230.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">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00230.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="a00230.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="a00230.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00230.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="a00230.html#f64924f2ee9225c368a270fc3c394db9">empty</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Equivalent to <a class="el" href="a00230.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="a00230.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00230.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="a00230.html#f3c6c934f85fd02aedbc83a16943193b">set_capacity</a> (<a class="el" href="a00230.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="a00230.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00230.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="a00230.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="a00230.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="a00230.html">tbb::concurrent_bounded_queue</a>< T, A >::<a class="el" href="a00230.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="a00230.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="a00230.html">tbb::concurrent_bounded_queue</a>< T, A >::set_capacity </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="a00230.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="a00230.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> <a class="el" href="a00230.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="a00230.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="a00230.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="a00230.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="a00436.html">concurrent_queue.h</a></ul>
+<li><a class="el" href="a00594.html">tbb_machine.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00230.png b/doc/html/a00230.png
deleted file mode 100644
index e9d90a2..0000000
Binary files a/doc/html/a00230.png and /dev/null differ
diff --git a/doc/html/a00231.html b/doc/html/a00231.html
index ba8315f..ad994ed 100644
--- a/doc/html/a00231.html
+++ b/doc/html/a00231.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,620 +21,38 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<b>interface5</b>::<a class="el" href="a00231.html">concurrent_hash_map</a></div>
-<h1>tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator > Class Template Reference<br>
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00231.html">auto_partitioner</a></div>
+<h1>tbb::auto_partitioner Class Reference<br>
<small>
-[<a class="el" href="a00372.html">Containers</a>]</small>
-</h1><!-- doxytag: class="tbb::interface5::concurrent_hash_map" -->Unordered map from Key to T.
+[<a class="el" href="a00395.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="a00424.html">concurrent_hash_map.h</a>></code>
+<code>#include <<a class="el" href="a00531.html">partitioner.h</a>></code>
<p>
-<a href="a00015.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00089.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="a00231.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="a00231.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="a00231.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="a00231.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="a00231.html#6fb14710893308fb47aaeee55ee30dc3">concurrent_hash_map</a> (const <a class="el" href="a00231.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="a00231.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="a00231.html">concurrent_hash_map</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00231.html#088d1aaccc816884a49e38f7065622c8">operator=</a> (const <a class="el" href="a00231.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="a00231.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="a00231.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="a00231.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="a00231.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="a00231.html#61ff2e5bb44e5469366fd5295e5d0ebe">empty</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">True if <a class="el" href="a00231.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="a00231.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="a00231.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="a00231.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="a00231.html#076f8d9e16110aac5f558777aa744eb6">swap</a> (<a class="el" href="a00231.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="a00231.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="a00231.html#2afcc33dade7bb24e008d60c0df38230">find</a> (<a class="el" href="a00234.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="a00231.html#7bc475d1968f7f0af3d736d7e8a0d7df">find</a> (<a class="el" href="a00232.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="a00231.html#47fe0e60151a9bd7a444db827772a4e6">insert</a> (<a class="el" href="a00234.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="a00231.html#54e0955ecd11575b4c07166838a72893">insert</a> (<a class="el" href="a00232.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="a00231.html#091efd2d12fdad4fe9e54d9629a9dfc3">insert</a> (<a class="el" href="a00234.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="a00231.html#39183d78d6e8425917555ab542ab92de">insert</a> (<a class="el" href="a00232.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="a00231.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="a00231.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="a00231.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="a00231.html#e698ef3d70b2d1a29a7a5551784d3653">erase</a> (<a class="el" href="a00234.html">const_accessor</a> &item_accessor)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Erase item by <a class="el" href="a00234.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="a00231.html#5f12d150d421420965db07368666a84f">erase</a> (<a class="el" href="a00232.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="a00231.html#3f3413264a99174a224ef96f6c4ea769">lookup</a> (bool op_insert, const Key &key, const T *t, <a class="el" href="a00234.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="a00231.html#0c964214eb38f54603aa75fdff6d2709">exclude</a> (<a class="el" href="a00234.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="a00231.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="a00231.html#72c9c9e9655fcf096f5f0ed9c8ba6669">internal_copy</a> (const <a class="el" href="a00231.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="a00231.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="a00232.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="a00232.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="a00233.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="a00233.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="a00234.html">const_accessor</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Combines data access, locking, and garbage collection. <a href="a00234.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="a00231.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="a00231.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="a00231.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="a00231.html#47fe0e60151a9bd7a444db827772a4e6">insert()</a> methods</li><li>Added <a class="el" href="a00231.html#6cbcacb4a256a85bf89576c101373ca7">get_allocator()</a></li><li>Added <a class="el" href="a00231.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="a00231.html">tbb::interface5::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::erase </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="a00232.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="a00231.html">tbb::interface5::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::erase </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="a00234.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="a00234.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="a00231.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="a00231.html">tbb::interface5::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::find </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="a00232.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="a00231.html">tbb::interface5::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::find </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="a00234.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="a00231.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="a00231.html">tbb::interface5::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::insert </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="a00232.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="a00231.html">tbb::interface5::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::insert </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="a00234.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="a00231.html">tbb::interface5::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::insert </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="a00232.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="a00231.html">tbb::interface5::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::insert </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="a00234.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="a00231.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="a00231.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="a00231.html#2afcc33dade7bb24e008d60c0df38230">find()</a> and <a class="el" href="a00231.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="a00424.html">concurrent_hash_map.h</a></ul>
+<li><a class="el" href="a00531.html">partitioner.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00232.html b/doc/html/a00232.html
index b32b01b..837ad06 100644
--- a/doc/html/a00232.html
+++ b/doc/html/a00232.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,42 +21,24 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<b>interface5</b>::<a class="el" href="a00231.html">concurrent_hash_map</a>::<a class="el" href="a00232.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="a00383.html">tbb</a>::<a class="el" href="a00232.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="a00424.html">concurrent_hash_map.h</a>></code>
+<code>#include <<a class="el" href="a00593.html">tbb_exception.h</a>></code>
<p>
-<p>Inheritance diagram for tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor:
-<p><center><img src="a00232.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="a00234.html" alt="tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor" shape="rect" coords="0,0,530,24">
-</map>
-<a href="a00019.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 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="a00232.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="a00232.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="a00232.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="a00424.html">concurrent_hash_map.h</a></ul>
+<li><a class="el" href="a00593.html">tbb_exception.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00232.png b/doc/html/a00232.png
deleted file mode 100644
index 9fd6a57..0000000
Binary files a/doc/html/a00232.png and /dev/null differ
diff --git a/doc/html/a00233.html b/doc/html/a00233.html
index 797a6fb..0d961f0 100644
--- a/doc/html/a00233.html
+++ b/doc/html/a00233.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,39 +21,198 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<b>interface5</b>::<a class="el" href="a00231.html">concurrent_hash_map</a>::<a class="el" href="a00233.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="a00383.html">tbb</a>::<a class="el" href="a00233.html">blocked_range</a></div>
+<h1>tbb::blocked_range< Value > Class Template Reference<br>
+<small>
+[<a class="el" href="a00395.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="a00424.html">concurrent_hash_map.h</a>></code>
+<code>#include <<a class="el" href="a00412.html">blocked_range.h</a>></code>
<p>
-<a href="a00017.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00004.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="a00233.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="a00233.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="a00231.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="a00233.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="a00233.html#14795a36ead1414b4371dbe1a4656359">blocked_range</a> (Value begin_, Value end_, <a class="el" href="a00233.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="a00233.html#1a8d05842c2b3dfc177bc4d347e4cef7">const_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00233.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="a00233.html#1a8d05842c2b3dfc177bc4d347e4cef7">const_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00233.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="a00233.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00233.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="a00233.html#d11c77f4d70a94d4fb344492bbf18007">acquire</a> (<a class="el" href="a00231.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="a00233.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00233.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="a00233.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="a00233.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="a00233.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="a00233.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="a00233.html#4c0efd2be3f96a0ab3ba5085e8b3fcc7">blocked_range</a> (<a class="el" href="a00233.html">blocked_range</a> &r, <a class="el" href="a00309.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="a00233.html">tbb::blocked_range</a>< Value >::<a class="el" href="a00233.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="a00233.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="a00233.html">tbb::blocked_range</a>< Value >::<a class="el" href="a00233.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="a00233.html">tbb::blocked_range</a>< Value >::<a class="el" href="a00233.html">blocked_range</a> </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="a00233.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="a00309.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="a00233.html#8b929d93ddc13f148b11bceef3a3bdf8">end()</a><<a class="el" href="a00233.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="a00233.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="a00233.html#8b929d93ddc13f148b11bceef3a3bdf8">end()</a><<a class="el" href="a00233.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="a00233.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> <a class="el" href="a00233.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="a00233.html#8b929d93ddc13f148b11bceef3a3bdf8">end()</a><<a class="el" href="a00233.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="a00424.html">concurrent_hash_map.h</a></ul>
+<li><a class="el" href="a00412.html">blocked_range.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00234.html b/doc/html/a00234.html
index 769ef55..7cea8ee 100644
--- a/doc/html/a00234.html
+++ b/doc/html/a00234.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,76 +21,60 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<b>interface5</b>::<a class="el" href="a00231.html">concurrent_hash_map</a>::<a class="el" href="a00234.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="a00383.html">tbb</a>::<a class="el" href="a00234.html">blocked_range2d</a></div>
+<h1>tbb::blocked_range2d< RowValue, ColValue > Class Template Reference<br>
+<small>
+[<a class="el" href="a00395.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="a00424.html">concurrent_hash_map.h</a>></code>
+<code>#include <<a class="el" href="a00413.html">blocked_range2d.h</a>></code>
<p>
-<p>Inheritance diagram for tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor:
-<p><center><img src="a00234.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="a00232.html" alt="tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor" shape="rect" coords="0,56,530,80">
-</map>
-<a href="a00018.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<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="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="a00234.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="a00233.html">blocked_range</a>< RowValue > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00234.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="a00234.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="a00234.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="a00234.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="a00233.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="a00234.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="a00234.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="a00233.html#f5707bffea38eee5c9680f37358afb8e">row_range_type::size_type</a> row_grainsize, ColValue col_begin, ColValue col_end, typename <a class="el" href="a00233.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="a00234.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="a00234.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="a00234.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="a00234.html">blocked_range2d</a> &r, <a class="el" href="a00309.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="a00233.html">row_range_type</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00234.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="a00233.html">col_range_type</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00234.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="a00424.html">concurrent_hash_map.h</a></ul>
+<li><a class="el" href="a00413.html">blocked_range2d.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00235.html b/doc/html/a00235.html
index 5091712..06958fb 100644
--- a/doc/html/a00235.html
+++ b/doc/html/a00235.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,277 +21,67 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<b>interface5</b>::<a class="el" href="a00235.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="a00383.html">tbb</a>::<a class="el" href="a00235.html">blocked_range3d</a></div>
+<h1>tbb::blocked_range3d< PageValue, RowValue, ColValue > Class Template Reference<br>
+<small>
+[<a class="el" href="a00395.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="a00433.html">concurrent_priority_queue.h</a>></code>
+<code>#include <<a class="el" href="a00414.html">blocked_range3d.h</a>></code>
<p>
-<a href="a00020.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="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="a00235.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="a00233.html">blocked_range</a>< PageValue > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00235.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="a00235.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="a00233.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="a00235.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="a00233.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="a00235.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="a00235.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="a00235.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="a00235.html#eefa40599afe00ea393897d8f5662e65">concurrent_priority_queue</a> (const <a class="el" href="a00235.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a> &a=<a class="el" href="a00235.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a>())</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Constructs a new <a class="el" href="a00235.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="a00235.html#4555b4a55415a70024c4004b51e9f385">concurrent_priority_queue</a> (<a class="el" href="a00235.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a> init_capacity, const <a class="el" href="a00235.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a> &a=<a class="el" href="a00235.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a>())</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Constructs a new <a class="el" href="a00235.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="a00235.html#9147cb4207017c260a0c3929c12cd40f">concurrent_priority_queue</a> (InputIterator begin, InputIterator end, const <a class="el" href="a00235.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a> &a=<a class="el" href="a00235.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="a00235.html#509419e320f200456d89dc54a65140b3">concurrent_priority_queue</a> (const <a class="el" href="a00235.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"><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)" -->
- </td><td class="memItemRight" valign="bottom"><b>concurrent_priority_queue</b> (const <a class="el" href="a00235.html">concurrent_priority_queue</a> &src, const <a class="el" href="a00235.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a> &a)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="a00235.html">concurrent_priority_queue</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00235.html#2ab7f7808891027ac0f0f5b3a4be51e9">operator=</a> (const <a class="el" href="a00235.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="a00235.html#317c508fa92df218be5d014c26c09bb7">empty</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 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="a00235.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00235.html#8b2ae25c61338c6fd59e94fe09822ba5">size</a> () const </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="a00233.html#f5707bffea38eee5c9680f37358afb8e">page_range_type::size_type</a> page_grainsize, RowValue row_begin, RowValue row_end, typename <a class="el" href="a00233.html#f5707bffea38eee5c9680f37358afb8e">row_range_type::size_type</a> row_grainsize, ColValue col_begin, ColValue col_end, typename <a class="el" href="a00233.html#f5707bffea38eee [...]
-<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"><a class="el" href="a00235.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00235.html#e5d6a0aca1579ecebb716bbe53514963">capacity</a> () const </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="a00235.html#356860e1c977d91711e8216bd55c0b25">empty</a> () const </td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns the current capacity (i.e. allocated storage) of the queue. <a href="#e5d6a0aca1579ecebb716bbe53514963"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d905af7b8f6defff562f5ae9c3275763"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::push" ref="d905af7b8f6defff562f5ae9c3275763" args="(const_reference elem)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00235.html#d905af7b8f6defff562f5ae9c3275763">push</a> (<a class="el" href="a00235.html#a4ded8601a434098605be0dcc4febc60">const_reference</a> elem)</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="a00235.html#39d69191721c488e737ae5d9c5336b9c">is_divisible</a> () const </td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Pushes elem onto the queue, increasing capacity of queue if necessary. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00235.html#e036461a29cc40902a2bb79abf9f5146">try_pop</a> (<a class="el" href="a00235.html#5804b3c708ef4e50d603f918ef2b9e58">reference</a> elem)</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="a00235.html">blocked_range3d</a> &r, <a class="el" href="a00309.html">split</a>)</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"><a class="anchor" name="e7c59f011c4cca83ff210aefe7c9d868"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::reserve" ref="e7c59f011c4cca83ff210aefe7c9d868" args="(size_type new_cap)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00235.html#e7c59f011c4cca83ff210aefe7c9d868">reserve</a> (<a class="el" href="a00235.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a> new_cap)</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="a00233.html">page_range_type</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00235.html#cf971430aa12361d3ed245344b7c6764">pages</a> () const </td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">If current capacity is less than new_cap, increases capacity to new_cap. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00235.html#0bdcdf7cde9fd369edca845bec34ca94">clear</a> ()</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="a00233.html">row_range_type</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00235.html#1584623e59ff32a8aa82006827508be4">rows</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"><a class="anchor" name="28d113288fc7e0c04c9053ec7de61368"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::shrink_to_fit" ref="28d113288fc7e0c04c9053ec7de61368" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00235.html#28d113288fc7e0c04c9053ec7de61368">shrink_to_fit</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Shrink queue capacity to current contents; not thread-safe. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0ecdc6a04aa259374425d424ca2a6082"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::swap" ref="0ecdc6a04aa259374425d424ca2a6082" args="(concurrent_priority_queue &q)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00235.html#0ecdc6a04aa259374425d424ca2a6082">swap</a> (<a class="el" href="a00235.html">concurrent_priority_queue</a> &q)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Swap this queue with another; not thread-safe. <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="a00235.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00235.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>
+<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="a00233.html">col_range_type</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00235.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>
-
-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="a00235.html">tbb::interface5::concurrent_priority_queue</a>< T, Compare, A >::<a class="el" href="a00235.html">concurrent_priority_queue</a> </td>
- <td>(</td>
- <td class="paramtype">const <a class="el" href="a00235.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>
-State of this queue may not reflect results of pending operations on the copied queue.
-</div>
-</div><p>
-<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="e5d6a0aca1579ecebb716bbe53514963"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::capacity" ref="e5d6a0aca1579ecebb716bbe53514963" 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="a00235.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a> <a class="el" href="a00235.html">tbb::interface5::concurrent_priority_queue</a>< T, Compare, A >::capacity </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td> ) </td>
- <td width="100%"> const<code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
+<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.
<p>
-Returns the current capacity (i.e. allocated storage) of the queue.
-<p>
-Returned value may not reflect results of pending operations.
-</div>
-</div><p>
-<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="a00235.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>
-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="a00235.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.
-</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="a00235.html">concurrent_priority_queue</a>& <a class="el" href="a00235.html">tbb::interface5::concurrent_priority_queue</a>< T, Compare, A >::operator= </td>
- <td>(</td>
- <td class="paramtype">const <a class="el" href="a00235.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>
-State of this queue may not reflect results of pending operations on the copied queue.
-</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="a00235.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a> <a class="el" href="a00235.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.
-</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="a00235.html">tbb::interface5::concurrent_priority_queue</a>< T, Compare, A >::try_pop </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="a00235.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.
-</div>
-</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00433.html">concurrent_priority_queue.h</a></ul>
+<li><a class="el" href="a00414.html">blocked_range3d.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00236.html b/doc/html/a00236.html
index dcd1fc8..3bc8c2b 100644
--- a/doc/html/a00236.html
+++ b/doc/html/a00236.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,143 +21,63 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00370.html">strict_ppl</a>::<a class="el" href="a00236.html">concurrent_queue</a></div>
-<h1>tbb::strict_ppl::concurrent_queue< T, A > Class Template Reference<br>
-<small>
-[<a class="el" href="a00372.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="a00383.html">tbb</a>::<b>flow</b>::<b>interface6</b>::<a class="el" href="a00236.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="a00436.html">concurrent_queue.h</a>></code>
+<code>#include <<a class="el" href="a00468.html">flow_graph.h</a>></code>
<p>
-<a href="a00024.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="a00236.png" usemap="#tbb::flow::interface6::broadcast_node< T >_map" border="0" alt=""></center>
+<map name="tbb::flow::interface6::broadcast_node< T >_map">
+<area href="a00263.html" alt="tbb::flow::interface6::graph_node" shape="rect" coords="0,0,249,24">
+<area href="a00295.html" alt="tbb::flow::interface6::receiver< T >" shape="rect" coords="259,0,508,24">
+<area href="a00301.html" alt="tbb::flow::interface6::sender< T >" shape="rect" coords="518,0,767,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="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="a00236.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="a00236.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="a00236.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="a00236.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="a00236.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="a00301.html">sender</a>< <a class="el" href="a00236.html#43c775d80e98cc601de69764983319f9">input_type</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00236.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="a00236.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="a00236.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="a00236.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="a00236.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="a00236.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="a00295.html">receiver</a>< <a class="el" href="a00236.html#8fd8d3075823e08b879be46c1215ab0f">output_type</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00236.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="a00236.html#7c48a05a94a1f4f98fdfadfbef98ecf6">concurrent_queue</a> (const <a class="el" href="a00236.html#5a3956341728eaa558d8827063718cac">allocator_type</a> &a=<a class="el" href="a00236.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="a00236.html#25209656c84f2f9b030e2f9162713341">concurrent_queue</a> (InputIterator begin, InputIterator end, const <a class="el" href="a00236.html#5a3956341728eaa558d8827063718cac">allocator_type</a> &a=<a class="el" href="a00236.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="a00236.html#8a6b98ea11a867db8ac868f0113ca429">concurrent_queue</a> (const <a class="el" href="a00236.html">concurrent_queue</a> &src, const <a class="el" href="a00236.html#5a3956341728eaa558d8827063718cac">allocator_type</a> &a=<a class="el" href="a00236.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="a00236.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="a00236.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="a00236.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="a00236.html#8fc30e93f8342a1960357f71e4fe8a2b">size_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00236.html#eaa35a5274606779802e9a669a706260">unsafe_size</a> () const </td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e446eb80aa9ac9bc1ab8f9c0ffc582cd"></a><!-- doxytag: member="tbb::flow::interface6::broadcast_node::broadcast_node" ref="e446eb80aa9ac9bc1ab8f9c0ffc582cd" args="(const broadcast_node &)" -->
+ </td><td class="memItemRight" valign="bottom"><b>broadcast_node</b> (const <a class="el" href="a00236.html">broadcast_node</a> &)</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="a00236.html#f3f6fce0cfa2d581d6f3b47e0613ad64">empty</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="a00236.html#fd0324c9ddb51fe6f95b3d015d338941">register_successor</a> (<a class="el" href="a00295.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="a00236.html#c32e8e84c0524155133b4aae32d2a827">clear</a> ()</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="a00236.html#366efcc046ec08a104281109801ae629">remove_successor</a> (<a class="el" href="a00295.html">receiver</a>< T > &r)</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="a00236.html#5a3956341728eaa558d8827063718cac">allocator_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00236.html#f034f70caef445fe8abc9113ec926a8d">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="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>
+<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="a00236.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, 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="a00236.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="a00436.html">concurrent_queue.h</a></ul>
+<li><a class="el" href="a00468.html">flow_graph.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00236.png b/doc/html/a00236.png
new file mode 100644
index 0000000..5a7b1d5
Binary files /dev/null and b/doc/html/a00236.png differ
diff --git a/doc/html/a00237.html b/doc/html/a00237.html
index 8c3ddb9..cfd40a8 100644
--- a/doc/html/a00237.html
+++ b/doc/html/a00237.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,128 +21,385 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<b>deprecated</b>::<a class="el" href="a00237.html">concurrent_queue</a></div>
-<h1>tbb::deprecated::concurrent_queue< T, A > Class Template Reference<br>
-<small>
-[<a class="el" href="a00372.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="a00383.html">tbb</a>::<b>flow</b>::<b>interface6</b>::<a class="el" href="a00237.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="a00436.html">concurrent_queue.h</a>></code>
+<code>#include <<a class="el" href="a00468.html">flow_graph.h</a>></code>
<p>
-<p>Inheritance diagram for tbb::deprecated::concurrent_queue< T, A >:
-<p><center><img src="a00237.png" usemap="#tbb::deprecated::concurrent_queue< T, A >_map" border="0" alt=""></center>
-<map name="tbb::deprecated::concurrent_queue< T, A >_map">
-<area href="a00230.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="a00237.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="a00263.html" alt="tbb::flow::interface6::graph_node" shape="rect" coords="0,0,352,24">
+<area href="a00295.html" alt="tbb::flow::interface6::receiver< T >" shape="rect" coords="362,0,714,24">
+<area href="a00301.html" alt="tbb::flow::interface6::sender< T >" shape="rect" coords="724,0,1076,24">
+<area href="a00286.html" alt="tbb::flow::interface6::priority_queue_node< T, Compare, A >" shape="rect" coords="181,112,533,136">
+<area href="a00287.html" alt="tbb::flow::interface6::queue_node< T, A >" shape="rect" coords="543,112,895,136">
+<area href="a00302.html" alt="tbb::flow::interface6::sequencer_node< T, A >" shape="rect" coords="543,168,895,192">
</map>
-<a href="a00027.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00058.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="a00230.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="a00237.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="a00230.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="a00237.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="a00301.html">sender</a>< <a class="el" href="a00237.html#334efb81b56a2f2b3ae08a16e8d65620">input_type</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00237.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="a00295.html">receiver</a>< <a class="el" href="a00237.html#089520db81f6a1551dc94c01efbdd7be">output_type</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00237.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="a00237.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="a00237.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="a00237.html#5fe4b79f780586ff66e002ce32a5c60d">buffer_node</a> (<a class="el" href="a00262.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="a00237.html#fc092b9082f233482f3513fc3bb670f7">concurrent_queue</a> (const <a class="el" href="a00237.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="a00237.html#03ad7b85a8341437f584af06ad050cdc">buffer_node</a> (const <a class="el" href="a00237.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="a00237.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="a00237.html#f8bf4944ede4fc106423d67715beb695">register_successor</a> (<a class="el" href="a00295.html">receiver</a>< <a class="el" href="a00237.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="a00237.html#2074da0e39b9477c32897d6e5786196f">remove_successor</a> (<a class="el" href="a00295.html">receiver</a>< <a class="el" href="a00237.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="a00237.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="a00237.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="a00237.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="a00237.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="a00237.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="a00237.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="a00237.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="a00237.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="a00237.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="a00237.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="a00237.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="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="a00237.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="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="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="a00237.html#48da3536245318af6cb5fd58bac78039">pop_if_present</a> (T &destination)</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="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="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="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 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="a00279.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="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="b569eeae467185c45ea78ee1ab41a215"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::my_parent" ref="b569eeae467185c45ea78ee1ab41a215" args="" -->
+<a class="el" href="a00311.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="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="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="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>
</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, 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="a00237.html">tbb::deprecated::concurrent_queue</a>< T, A >::pop_if_present </td>
+ <td class="memname">bool <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node</a>< T, A >::register_successor </td>
<td>(</td>
- <td class="paramtype">T & </td>
- <td class="paramname"> <em>destination</em> </td>
+ <td class="paramtype"><a class="el" href="a00295.html">receiver</a>< <a class="el" href="a00237.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="a00301.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="a00237.html">tbb::flow::interface6::buffer_node</a>< T, A >::remove_successor </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="a00295.html">receiver</a>< <a class="el" href="a00237.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="a00301.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="a00237.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]</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.
+Consumes a reserved item.
<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="a00230.html#0ca487019bbb00a196442aff78a1e4f7">try_pop()</a> </dd></dl>
+true = item is removed from sender and reservation removed
+<p>
+Reimplemented from <a class="el" href="a00301.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="a00237.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="a00237.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="a00301.html#922fb56b0aad090b90a98b7d56b76a59">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="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, 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="a00237.html">tbb::deprecated::concurrent_queue</a>< T, A >::push_if_not_full </td>
+ <td class="memname">bool <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node</a>< T, A >::try_put </td>
<td>(</td>
<td class="paramtype">const T & </td>
- <td class="paramname"> <em>source</em> </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="a00295.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="a00237.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]</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.
+Release a reserved item.
+<p>
+true = item has been released and so remains in sender
+<p>
+Reimplemented from <a class="el" href="a00301.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="a00237.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
<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="a00301.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="a00436.html">concurrent_queue.h</a></ul>
+<li><a class="el" href="a00468.html">flow_graph.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00237.png b/doc/html/a00237.png
index 6aac5a0..425350b 100644
Binary files a/doc/html/a00237.png and b/doc/html/a00237.png differ
diff --git a/doc/html/a00238.html b/doc/html/a00238.html
index fccb7a7..a7fef17 100644
--- a/doc/html/a00238.html
+++ b/doc/html/a00238.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,570 +21,88 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00238.html">concurrent_vector</a></div>
-<h1>tbb::concurrent_vector< T, A > Class Template Reference<br>
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00238.html">cache_aligned_allocator</a></div>
+<h1>tbb::cache_aligned_allocator< T > Class Template Reference<br>
<small>
-[<a class="el" href="a00372.html">Containers</a>]</small>
-</h1><!-- doxytag: class="tbb::concurrent_vector" -->Concurrent vector container.
+[<a class="el" href="a00397.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="a00442.html">concurrent_vector.h</a>></code>
+<code>#include <<a class="el" href="a00415.html">cache_aligned_allocator.h</a>></code>
<p>
-<a href="a00032.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="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="a00238.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="a00238.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="a00238.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="a00238.html#dd8a200b99a8088435a37934b58fe335">concurrent_vector</a> (const <a class="el" href="a00238.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="a00238.html#64432f13f7b29bfe4acfb5568f34f3a8">concurrent_vector</a> (const <a class="el" href="a00238.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="a00238.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="a00238.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="a00238.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="a00238.html">concurrent_vector</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00238.html#691f0f3cda3e489c37a657016e375eaf">operator=</a> (const <a class="el" href="a00238.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="a00238.html">concurrent_vector</a> & </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00238.html#19f4ab88a01b0fd056af3bba463e7bd6">operator=</a> (const <a class="el" href="a00238.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="a00238.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="a00238.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="a00238.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 constuctor. <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="a00238.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="a00238.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="a00238.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="a00238.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="a00238.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="a00238.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="a00238.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="a00238.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="a00238.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="a00238.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="a00238.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="a00238.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="a00238.html#c6426cb93cf20d3af40f3c90f1f0481a">empty</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Return true 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="a00238.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="a00238.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="a00238.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="a00238.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="a00238.html#1693d1da41b1a8235871be9c6633be35">compact</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">An alias for <a class="el" href="a00238.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="a00238.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="a00238.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="a00238.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="a00238.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="a00238.html#78a06182276ff758788d4c0623ae0d71">begin</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="a00238.html">cache_aligned_allocator</a> &) 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="1e6aa764ce5a1cbd24526f68bc0a2f6b"></a><!-- doxytag: member="tbb::concurrent_vector::end" ref="1e6aa764ce5a1cbd24526f68bc0a2f6b" args="() const " -->
-const_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00238.html#1e6aa764ce5a1cbd24526f68bc0a2f6b">end</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="a00238.html">cache_aligned_allocator</a>< U > &) 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="a00238.html#f88fcf1c920693c39bd9709db33c199f">cbegin</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">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="a00238.html#0c15a5d0f1cf75d687dabba07da1d46b">cend</a> () const </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">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="a00238.html#5e220926d09236d98f04fe0721e5f9a1">rbegin</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="a00238.html#4cdeea67af6c1fcd8f1d5e9c4cab61e8">allocate</a> (size_type n, const void *hint=0)</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="a00238.html#290119a4eb43cd6a9e98fa17016ba3c2">rend</a> ()</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="a00238.html#3d4eadf188f7d85d3805ae534e0b8e1c">deallocate</a> (pointer p, size_type)</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="a00238.html#9f9c103e18d5f212703805354074ad44">rbegin</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="a00238.html#fb23b687b4c0429dab4c7f8017266cf0">max_size</a> () const throw ()</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="a00238.html#d438b9b32ea3a8ffb703015b6dce055b">rend</a> () const </td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Largest value for which method allocate might succeed. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="958ee8745c86c275bfc9533af565e017"></a><!-- doxytag: member="tbb::cache_aligned_allocator::construct" ref="958ee8745c86c275bfc9533af565e017" args="(pointer p, const value_type &value)" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00238.html#958ee8745c86c275bfc9533af565e017">construct</a> (pointer p, const value_type &value)</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="a00238.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="a00238.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="a00238.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="a00238.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="a00238.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="a00238.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="a00238.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="a00238.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="a00238.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="a00238.html#96c9c4bd968ed3edb8dd276854d2dae0">swap</a> (<a class="el" href="a00238.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="a00238.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="a00238.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">Copy-construct value at location pointed to by p. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="cd298895a4f1654b5149ec84b591ecb5"></a><!-- doxytag: member="tbb::cache_aligned_allocator::destroy" ref="cd298895a4f1654b5149ec84b591ecb5" args="(pointer p)" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00238.html#cd298895a4f1654b5149ec84b591ecb5">destroy</a> (pointer p)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroy 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="a00238.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 guaranties 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="a00238.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="a00238.html#715fe313c4a9c22731cc404dd80c9ec9">concurrent_vector::size()</a> and <a class="el" href="a00238.html#47fe588214dd5fa06ab6e8ab78d83874">grow_to_at_least()</a> methods to assure elements are allocated.</li><li>Methods <a class="el" href="a00238.html#c0b51160e5a764982ec97a455f94f2c6">end()</a>/rbegin()/back() are partly thread-safe since they use <a class="el" href="a00238.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 guaranties</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="a00238.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="a00238.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="a00238.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="a00238.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="a00238.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 constuctor.
-<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="a00238.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="a00238.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="a00238.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="a00238.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="a00238.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="a00238.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="a00238.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="a00238.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="a00238.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="a00442.html">concurrent_vector.h</a></ul>
+<li><a class="el" href="a00415.html">cache_aligned_allocator.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00239.html b/doc/html/a00239.html
index 76b45e0..e966827 100644
--- a/doc/html/a00239.html
+++ b/doc/html/a00239.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::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,20 +21,39 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00239.html">continue_msg</a></div>
-<h1>tbb::continue_msg Class Reference</h1><!-- doxytag: class="tbb::continue_msg" -->An empty class used for messages that mean "I'm done".
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00239.html">cache_aligned_allocator< void ></a></div>
+<h1>tbb::cache_aligned_allocator< void > Class Template Reference<br>
+<small>
+[<a class="el" href="a00397.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="a00466.html">graph.h</a>></code>
+<code>#include <<a class="el" href="a00415.html">cache_aligned_allocator.h</a>></code>
<p>
-<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 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="a00466.html">graph.h</a></ul>
+<li><a class="el" href="a00415.html">cache_aligned_allocator.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00240.html b/doc/html/a00240.html
index 91b7c12..47fbf40 100644
--- a/doc/html/a00240.html
+++ b/doc/html/a00240.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::continue_node Class 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,45 +21,131 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00240.html">continue_node</a></div>
-<h1>tbb::continue_node Class Reference</h1><!-- doxytag: class="tbb::continue_node" --><!-- doxytag: inherits="tbb::executable_node" -->Broadcasts completion message when it receives completion messages from all predecessors. Then resets.
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00240.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="a00466.html">graph.h</a>></code>
+<code>#include <<a class="el" href="a00593.html">tbb_exception.h</a>></code>
<p>
-<p>Inheritance diagram for tbb::continue_node:
-<p><center><img src="a00240.png" usemap="#tbb::continue_node_map" border="0" alt=""></center>
-<map name="tbb::continue_node_map">
-<area href="a00244.html" alt="tbb::executable_node< Output >" shape="rect" coords="0,56,192,80">
-<area href="a00251.html" alt="tbb::graph_node" shape="rect" coords="0,0,192,24">
+<p>Inheritance diagram for tbb::captured_exception:
+<p><center><img src="a00240.png" usemap="#tbb::captured_exception_map" border="0" alt=""></center>
+<map name="tbb::captured_exception_map">
+<area href="a00319.html" alt="tbb::tbb_exception" shape="rect" coords="0,0,146,24">
</map>
-<a href="a00053.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00143.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="5354c2c718362e50e73dd58d66f38d21"></a><!-- doxytag: member="tbb::continue_node::input_type" ref="5354c2c718362e50e73dd58d66f38d21" args="" -->
-typedef <a class="el" href="a00239.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="a00240.html">captured_exception</a> &src)</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="629da75fac31aa16474edbd7bbc403d4"></a><!-- doxytag: member="tbb::continue_node::output_type" ref="629da75fac31aa16474edbd7bbc403d4" args="" -->
-typedef <a class="el" href="a00239.html">continue_msg</a> </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="315d3789ba8da7d1d0f2f5144d579fe3"></a><!-- doxytag: member="tbb::continue_node::predecessor_type" ref="315d3789ba8da7d1d0f2f5144d579fe3" args="" -->
-typedef <a class="el" href="a00282.html">sender</a>< <a class="el" href="a00239.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="a00240.html">captured_exception</a> & </td><td class="memItemRight" valign="bottom"><b>operator=</b> (const <a class="el" href="a00240.html">captured_exception</a> &src)</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="920267f71ed69be5e962f9a4da2e9e66"></a><!-- doxytag: member="tbb::continue_node::successor_type" ref="920267f71ed69be5e962f9a4da2e9e66" args="" -->
-typedef <a class="el" href="a00277.html">receiver</a>< <a class="el" href="a00239.html">output_type</a> > </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="a00240.html">captured_exception</a> *__TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00240.html#837a50b8f6a800bda225c39d1699643f">move</a> () throw ()</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="f2808a5f31fccc06ad24d54f47170091"></a><!-- doxytag: member="tbb::continue_node::continue_node" ref="f2808a5f31fccc06ad24d54f47170091" args="(graph &g)" -->
- </td><td class="memItemRight" valign="bottom"><b>continue_node</b> (<a class="el" href="a00250.html">graph</a> &g)</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="a00240.html#93d875d3555502ff6f18513525de204c">destroy</a> () throw ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroys objects created by the <a class="el" href="a00240.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="a00240.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="a00240.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="a00240.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="a00240.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>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-Broadcasts completion message when it receives completion messages from all predecessors. Then resets.
+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="a00319.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">
+
+<p>
+Destroys objects created by the <a class="el" href="a00240.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="a00319.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="a00240.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="a00319.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>
-Is equivalent to an executable_node< continue_msg > with an empty_body
+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="a00319.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="a00466.html">graph.h</a></ul>
+<li><a class="el" href="a00593.html">tbb_exception.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00240.png b/doc/html/a00240.png
index d27b46c..2470bea 100644
Binary files a/doc/html/a00240.png and b/doc/html/a00240.png differ
diff --git a/doc/html/a00241.html b/doc/html/a00241.html
index 34c57f4..c324f56 100644
--- a/doc/html/a00241.html
+++ b/doc/html/a00241.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::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,135 +21,58 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00241.html">continue_receiver</a></div>
-<h1>tbb::continue_receiver Class Reference</h1><!-- doxytag: class="tbb::continue_receiver" --><!-- doxytag: inherits="tbb::receiver" -->Base class for receivers of completion messages.
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00241.html">combinable</a></div>
+<h1>tbb::combinable< T > Class Template Reference<br>
+<small>
+[<a class="el" href="a00396.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="a00466.html">graph.h</a>></code>
+<code>#include <<a class="el" href="a00417.html">combinable.h</a>></code>
<p>
-<p>Inheritance diagram for tbb::continue_receiver:
-<p><center><img src="a00241.png" usemap="#tbb::continue_receiver_map" border="0" alt=""></center>
-<map name="tbb::continue_receiver_map">
-<area href="a00277.html" alt="tbb::receiver< T >" shape="rect" coords="0,0,138,24">
-</map>
-<a href="a00044.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="21acef0b97b53d92f637619012837b30"></a><!-- doxytag: member="tbb::continue_receiver::input_type" ref="21acef0b97b53d92f637619012837b30" args="" -->
-typedef <a class="el" href="a00239.html">continue_msg</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00241.html#21acef0b97b53d92f637619012837b30">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="52fa92968dd48560d59798ca7ba6a3a2"></a><!-- doxytag: member="tbb::continue_receiver::predecessor_type" ref="52fa92968dd48560d59798ca7ba6a3a2" args="" -->
-typedef <a class="el" href="a00282.html">sender</a>< <a class="el" href="a00239.html">continue_msg</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00241.html#52fa92968dd48560d59798ca7ba6a3a2">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="799d383813261426d881b10247caadba"></a><!-- doxytag: member="tbb::continue_receiver::continue_receiver" ref="799d383813261426d881b10247caadba" args="(int number_of_predecessors=0)" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00241.html#799d383813261426d881b10247caadba">continue_receiver</a> (int number_of_predecessors=0)</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">Constructor. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9a38edb7e1e3c9be4e3848145c51a617"></a><!-- doxytag: member="tbb::continue_receiver::~continue_receiver" ref="9a38edb7e1e3c9be4e3848145c51a617" args="()" -->
-virtual </td><td class="memItemRight" valign="bottom"><a class="el" href="a00241.html#9a38edb7e1e3c9be4e3848145c51a617">~continue_receiver</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="a00241.html#2c87e79ae98588a5780f708773388843">~combinable</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="b9fa9290cbb871f8780f9d69e1ec3b4e"></a><!-- doxytag: member="tbb::continue_receiver::register_predecessor" ref="b9fa9290cbb871f8780f9d69e1ec3b4e" args="(predecessor_type &)" -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00241.html#b9fa9290cbb871f8780f9d69e1ec3b4e">register_predecessor</a> (<a class="el" href="a00282.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="a00241.html">combinable</a> &other)</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="a00241.html#02411d8d13b380062548aff133752cc5">remove_predecessor</a> (<a class="el" href="a00282.html">predecessor_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="a00241.html">combinable</a> & </td><td class="memItemRight" valign="bottom"><b>operator=</b> (const <a class="el" href="a00241.html">combinable</a> &other)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Decrements the trigger threshold. <a href="#02411d8d13b380062548aff133752cc5"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00241.html#a7f8b9cc6286eb2cd8d429d6279da64d">try_put</a> (<a class="el" href="a00239.html">input_type</a>)</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">Puts a <a class="el" href="a00239.html">continue_msg</a> to the receiver. <a href="#a7f8b9cc6286eb2cd8d429d6279da64d"></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="a00241.html#e6bf1d21e670b78ea00c71fccbe17c78">execute</a> ()=0</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="mdescLeft"> </td><td class="mdescRight">Does whatever should happen when the threshold is reached. <a href="#e6bf1d21e670b78ea00c71fccbe17c78"></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="ddee0bc66101010aa5552db4230ca9ac"></a><!-- doxytag: member="tbb::continue_receiver::my_mutex" ref="ddee0bc66101010aa5552db4230ca9ac" args="" -->
-<a class="el" href="a00286.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="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="c87649e54a1d77fbe386fa13b193e8ed"></a><!-- doxytag: member="tbb::continue_receiver::my_predecessor_count" ref="c87649e54a1d77fbe386fa13b193e8ed" args="" -->
-int </td><td class="memItemRight" valign="bottom"><b>my_predecessor_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="4f541d914398f99cff17521251742f53"></a><!-- doxytag: member="tbb::continue_receiver::my_current_count" ref="4f541d914398f99cff17521251742f53" 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="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="e6bf1d21e670b78ea00c71fccbe17c78"></a><!-- doxytag: member="tbb::continue_receiver::execute" ref="e6bf1d21e670b78ea00c71fccbe17c78" args="()=0" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">virtual void tbb::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="a00241.html#a7f8b9cc6286eb2cd8d429d6279da64d">try_put()</a>.
-</div>
-</div><p>
-<a class="anchor" name="02411d8d13b380062548aff133752cc5"></a><!-- doxytag: member="tbb::continue_receiver::remove_predecessor" ref="02411d8d13b380062548aff133752cc5" args="(predecessor_type &)" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">bool tbb::continue_receiver::remove_predecessor </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="a00282.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="a7f8b9cc6286eb2cd8d429d6279da64d"></a><!-- doxytag: member="tbb::continue_receiver::try_put" ref="a7f8b9cc6286eb2cd8d429d6279da64d" args="(input_type)" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">bool tbb::continue_receiver::try_put </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="a00239.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="a00239.html">continue_msg</a> to the receiver.
-<p>
-If the message causes the message count to reach the predecessor count, <a class="el" href="a00241.html#e6bf1d21e670b78ea00c71fccbe17c78">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="a00466.html">graph.h</a></ul>
+<li><a class="el" href="a00417.html">combinable.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00241.png b/doc/html/a00241.png
deleted file mode 100644
index 8c138ee..0000000
Binary files a/doc/html/a00241.png and /dev/null differ
diff --git a/doc/html/a00242.html b/doc/html/a00242.html
index c4a2f60..9c325cd 100644
--- a/doc/html/a00242.html
+++ b/doc/html/a00242.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,28 +21,280 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00242.html">empty_task</a></div>
-<h1>tbb::empty_task Class Reference<br>
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00242.html">concurrent_bounded_queue</a></div>
+<h1>tbb::concurrent_bounded_queue< T, A > Class Template Reference<br>
<small>
-[<a class="el" href="a00376.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="a00396.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="a00567.html">task.h</a>></code>
+<code>#include <<a class="el" href="a00432.html">concurrent_queue.h</a>></code>
<p>
-<p>Inheritance diagram for tbb::empty_task:
-<p><center><img src="a00242.png" usemap="#tbb::empty_task_map" border="0" alt=""></center>
-<map name="tbb::empty_task_map">
-<area href="a00291.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="a00242.png" usemap="#tbb::concurrent_bounded_queue< T, A >_map" border="0" alt=""></center>
+<map name="tbb::concurrent_bounded_queue< T, A >_map">
+<area href="a00249.html" alt="tbb::deprecated::concurrent_queue< T, A >" shape="rect" coords="0,56,257,80">
</map>
-<a href="a00120.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 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="a00242.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="a00242.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="a00242.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="a00242.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="a00242.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="a00242.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="a00242.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="a00242.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="a00242.html#e3525226732963ff0f13e89d8e6dab5b">concurrent_bounded_queue</a> (const <a class="el" href="a00242.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a> &a=<a class="el" href="a00242.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="a00242.html#7b7fb414d2eaa8a7f5d68fc4cd63ac50">concurrent_bounded_queue</a> (const <a class="el" href="a00242.html">concurrent_bounded_queue</a> &src, const <a class="el" href="a00242.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a> &a=<a class="el" href="a00242.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="a00242.html#a5e04dcd7db9fd9b583b4e7df832246a">concurrent_bounded_queue</a> (InputIterator begin, InputIterator end, const <a class="el" href="a00242.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a> &a=<a class="el" href="a00242.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="a00242.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="a00242.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="a00242.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">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00242.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="a00242.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="a00242.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00242.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="a00242.html#f64924f2ee9225c368a270fc3c394db9">empty</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Equivalent to <a class="el" href="a00242.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="a00242.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00242.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="a00242.html#f3c6c934f85fd02aedbc83a16943193b">set_capacity</a> (<a class="el" href="a00242.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="a00242.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00242.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="a00242.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="a00242.html">tbb::concurrent_bounded_queue</a>< T, A >::<a class="el" href="a00242.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="a00242.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="a00242.html">tbb::concurrent_bounded_queue</a>< T, A >::set_capacity </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="a00242.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="a00242.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> <a class="el" href="a00242.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="a00242.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="a00242.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="a00242.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="a00567.html">task.h</a></ul>
+<li><a class="el" href="a00432.html">concurrent_queue.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00242.png b/doc/html/a00242.png
index 2fa6419..e9d90a2 100644
Binary files a/doc/html/a00242.png and b/doc/html/a00242.png differ
diff --git a/doc/html/a00243.html b/doc/html/a00243.html
index 069ebf5..796bd76 100644
--- a/doc/html/a00243.html
+++ b/doc/html/a00243.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,171 +21,620 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<b>interface6</b>::<a class="el" href="a00243.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="a00383.html">tbb</a>::<b>interface5</b>::<a class="el" href="a00243.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="a00372.html">Containers</a>]</small>
-</h1><!-- doxytag: class="tbb::interface6::enumerable_thread_specific" -->The <a class="el" href="a00243.html">enumerable_thread_specific</a> container.
+[<a class="el" href="a00396.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="a00454.html">enumerable_thread_specific.h</a>></code>
+<code>#include <<a class="el" href="a00418.html">concurrent_hash_map.h</a>></code>
<p>
-<a href="a00037.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="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="a00243.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="a00238.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="a00238.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="a00243.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="a00243.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="a00243.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="a00243.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="a00243.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="a00243.html#6fb14710893308fb47aaeee55ee30dc3">concurrent_hash_map</a> (const <a class="el" href="a00243.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="a00243.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="a00243.html">concurrent_hash_map</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00243.html#088d1aaccc816884a49e38f7065622c8">operator=</a> (const <a class="el" href="a00243.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="a00243.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="a00243.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="a00243.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="a00243.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="a00243.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="a00243.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="a00243.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="a00243.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="a00243.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="a00243.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="a00243.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="a00243.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="a00243.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="a00243.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="a00243.html#076f8d9e16110aac5f558777aa744eb6">swap</a> (<a class="el" href="a00243.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="a00243.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="a00243.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="a00243.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="a00243.html#2afcc33dade7bb24e008d60c0df38230">find</a> (<a class="el" href="a00246.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="a00243.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="a00243.html#7bc475d1968f7f0af3d736d7e8a0d7df">find</a> (<a class="el" href="a00244.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="a00243.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="a00243.html#47fe0e60151a9bd7a444db827772a4e6">insert</a> (<a class="el" href="a00246.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="a00243.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="a00243.html#54e0955ecd11575b4c07166838a72893">insert</a> (<a class="el" href="a00244.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="a00243.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="a00243.html#091efd2d12fdad4fe9e54d9629a9dfc3">insert</a> (<a class="el" href="a00246.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="a00243.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="a00243.html#39183d78d6e8425917555ab542ab92de">insert</a> (<a class="el" href="a00244.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="a00243.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="a00243.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="a00243.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="a00243.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="a00243.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="a00243.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="a00243.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="a00243.html#e698ef3d70b2d1a29a7a5551784d3653">erase</a> (<a class="el" href="a00246.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="a00243.html">enumerable_thread_specific</a> & </td><td class="memItemRight" valign="bottom"><b>operator=</b> (const <a class="el" href="a00243.html">enumerable_thread_specific</a> &other)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Erase item by <a class="el" href="a00246.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="a00243.html#5f12d150d421420965db07368666a84f">erase</a> (<a class="el" href="a00244.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="a00243.html">enumerable_thread_specific</a> & </td><td class="memTemplItemRight" valign="bottom"><b>operator=</b> (const <a class="el" href="a00243.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="a00243.html#3f3413264a99174a224ef96f6c4ea769">lookup</a> (bool op_insert, const Key &key, const T *t, <a class="el" href="a00246.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="a00243.html#0c964214eb38f54603aa75fdff6d2709">exclude</a> (<a class="el" href="a00246.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="a00243.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="a00243.html#72c9c9e9655fcf096f5f0ed9c8ba6669">internal_copy</a> (const <a class="el" href="a00243.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="a00243.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="a00244.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="a00244.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="a00245.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="a00245.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="a00246.html">const_accessor</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Combines data access, locking, and garbage collection. <a href="a00246.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="a00243.html">enumerable_thread_specific</a> container.
+Unordered map from Key to T.
<p>
-<a class="el" href="a00243.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="a00243.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="a00243.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="a00243.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="a00243.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="a00243.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="a00243.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="a00243.html#47fe0e60151a9bd7a444db827772a4e6">insert()</a> methods</li><li>Added <a class="el" href="a00243.html#6cbcacb4a256a85bf89576c101373ca7">get_allocator()</a></li><li>Added <a class="el" href="a00243.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="a00243.html">tbb::interface5::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::erase </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="a00244.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="a00243.html">tbb::interface5::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::erase </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="a00246.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="a00246.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="a00243.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="a00243.html">tbb::interface5::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::find </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="a00244.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="a00243.html">tbb::interface5::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::find </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="a00246.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="a00243.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="a00243.html">tbb::interface5::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::insert </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="a00244.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="a00243.html">tbb::interface5::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::insert </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="a00246.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="a00243.html">tbb::interface5::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::insert </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="a00244.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="a00243.html">tbb::interface5::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::insert </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="a00246.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="a00243.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="a00243.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="a00243.html#2afcc33dade7bb24e008d60c0df38230">find()</a> and <a class="el" href="a00243.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="a00454.html">enumerable_thread_specific.h</a></ul>
+<li><a class="el" href="a00418.html">concurrent_hash_map.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00244.html b/doc/html/a00244.html
index 0e33679..55bf422 100644
--- a/doc/html/a00244.html
+++ b/doc/html/a00244.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::executable_node< Output > Class Template 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,63 +21,42 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00244.html">executable_node</a></div>
-<h1>tbb::executable_node< Output > Class Template Reference</h1><!-- doxytag: class="tbb::executable_node" --><!-- doxytag: inherits="tbb::graph_node" -->Implements an executable node that supports <a class="el" href="a00239.html">continue_msg</a> -> Output.
+<a class="el" href="a00383.html">tbb</a>::<b>interface5</b>::<a class="el" href="a00243.html">concurrent_hash_map</a>::<a class="el" href="a00244.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="a00466.html">graph.h</a>></code>
+<code>#include <<a class="el" href="a00418.html">concurrent_hash_map.h</a>></code>
<p>
-<p>Inheritance diagram for tbb::executable_node< Output >:
-<p><center><img src="a00244.png" usemap="#tbb::executable_node< Output >_map" border="0" alt=""></center>
-<map name="tbb::executable_node< Output >_map">
-<area href="a00251.html" alt="tbb::graph_node" shape="rect" coords="0,0,192,24">
-<area href="a00240.html" alt="tbb::continue_node" shape="rect" coords="0,112,192,136">
+<p>Inheritance diagram for tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor:
+<p><center><img src="a00244.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="a00246.html" alt="tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor" shape="rect" coords="0,0,530,24">
</map>
-<a href="a00050.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="2ff2aa9a54056c999963717dcf5e539d"></a><!-- doxytag: member="tbb::executable_node::input_type" ref="2ff2aa9a54056c999963717dcf5e539d" args="" -->
-typedef <a class="el" href="a00239.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="09edc2515bc199f58b29b7a54e45f4d5"></a><!-- doxytag: member="tbb::executable_node::output_type" ref="09edc2515bc199f58b29b7a54e45f4d5" 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="85c2d48065a194e75175a5a4e55ea0dd"></a><!-- doxytag: member="tbb::executable_node::predecessor_type" ref="85c2d48065a194e75175a5a4e55ea0dd" args="" -->
-typedef <a class="el" href="a00282.html">sender</a>< <a class="el" href="a00239.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="f38af33d6c53ca2822af6b739686f6b3"></a><!-- doxytag: member="tbb::executable_node::successor_type" ref="f38af33d6c53ca2822af6b739686f6b3" args="" -->
-typedef <a class="el" href="a00277.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="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="a00244.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="memTemplParams" nowrap colspan="2"><a class="anchor" name="73d4304b322a25ed0df468e607dd1dac"></a><!-- doxytag: member="tbb::executable_node::executable_node" ref="73d4304b322a25ed0df468e607dd1dac" 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="a00244.html#73d4304b322a25ed0df468e607dd1dac">executable_node</a> (<a class="el" href="a00250.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="a00239.html">continue_msg</a> -> Output. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="c13030111d34feeafd9cdb1dd21584f1"></a><!-- doxytag: member="tbb::executable_node::executable_node" ref="c13030111d34feeafd9cdb1dd21584f1" 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="a00244.html#c13030111d34feeafd9cdb1dd21584f1">executable_node</a> (<a class="el" href="a00250.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="a00239.html">continue_msg</a> -> Output. <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="bde6744db670181fe37a34decce95c56"></a><!-- doxytag: member="tbb::executable_node::successors" ref="bde6744db670181fe37a34decce95c56" 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="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="a00244.html#170280ea807a22e742095de3e8c5ea38">operator *</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="1b9b210a5ae77091dd1ed18cc36e6967"></a><!-- doxytag: member="tbb::executable_node::my_successors" ref="1b9b210a5ae77091dd1ed18cc36e6967" args="" -->
-internal::broadcast_cache<<br>
- output_type > </td><td class="memItemRight" valign="bottom"><b>my_successors</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="a00244.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>
-<h3>template<typename Output><br>
- class tbb::executable_node< Output ></h3>
+<h3>template<typename Key, typename T, typename HashCompare, typename Allocator><br>
+ class tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</h3>
-Implements an executable node that supports <a class="el" href="a00239.html">continue_msg</a> -> Output.
+Allows write access to elements and combines data access, locking, and garbage collection.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00466.html">graph.h</a></ul>
+<li><a class="el" href="a00418.html">concurrent_hash_map.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00244.png b/doc/html/a00244.png
index a8702b0..9fd6a57 100644
Binary files a/doc/html/a00244.png and b/doc/html/a00244.png differ
diff --git a/doc/html/a00245.html b/doc/html/a00245.html
index d4d7390..456a14b 100644
--- a/doc/html/a00245.html
+++ b/doc/html/a00245.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 >::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,210 +21,39 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00245.html">filter</a></div>
-<h1>tbb::filter Class Reference<br>
-<small>
-[<a class="el" href="a00371.html">Algorithms</a>]</small>
-</h1><!-- doxytag: class="tbb::filter" -->A stage in a pipeline.
+<a class="el" href="a00383.html">tbb</a>::<b>interface5</b>::<a class="el" href="a00243.html">concurrent_hash_map</a>::<a class="el" href="a00245.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="a00546.html">pipeline.h</a>></code>
+<code>#include <<a class="el" href="a00418.html">concurrent_hash_map.h</a>></code>
<p>
-<p>Inheritance diagram for tbb::filter:
-<p><center><img src="a00245.png" usemap="#tbb::filter_map" border="0" alt=""></center>
-<map name="tbb::filter_map">
-<area href="a00301.html" alt="tbb::thread_bound_filter" shape="rect" coords="0,56,145,80">
-</map>
-<a href="a00093.html">List of all members.</a><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 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="a00245.html#fcfec27656a69ff2072802ac001e936f">is_serial</a> () const </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="a00243.html">concurrent_hash_map</a> *base, const hashcode_t h, bool writer=false)</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="a00245.html#cd53206c4795ef2df5df26b795caf692">is_ordered</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="a00245.html#d11c77f4d70a94d4fb344492bbf18007">acquire</a> (<a class="el" href="a00243.html">concurrent_hash_map</a> *base, const hashcode_t h, bool writer=false)</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="a00245.html#15c29cae5d237e6d63dbfe5c94af89d5">is_bound</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="a00245.html#07d958f151a0eaa92f50fd56ad6440e2">is_writer</a> ()</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="a00245.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="a00245.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="a00245.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="a00245.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="a00245.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="a00245.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="a00245.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="a00245.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="a00245.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="a00245.html#f17200974c33be21f42a5f00893de028">exact_exception_propagation</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="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">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="a00245.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>
-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 >::bucket_accessor</h3>
+bucket accessor is to find, rehash, acquire a lock, and access a bucket
<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="a00245.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="a00245.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="a00245.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="a00546.html">pipeline.h</a></ul>
+<li><a class="el" href="a00418.html">concurrent_hash_map.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00246.html b/doc/html/a00246.html
index 52c4d77..6eb7733 100644
--- a/doc/html/a00246.html
+++ b/doc/html/a00246.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 >::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,50 +21,76 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<b>interface6</b>::<a class="el" href="a00246.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="a00383.html">tbb</a>::<b>interface5</b>::<a class="el" href="a00243.html">concurrent_hash_map</a>::<a class="el" href="a00246.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="a00546.html">pipeline.h</a>></code>
+<code>#include <<a class="el" href="a00418.html">concurrent_hash_map.h</a>></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="a00246.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="a00244.html" alt="tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor" shape="rect" coords="0,56,530,80">
+</map>
+<a href="a00016.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="a00246.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="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="a00246.html">filter_t</a>< T, U > &rhs)</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="a00246.html#84c3080d0c6124d55c8bb4cf6055e65f">empty</a> () const </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="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="a00246.html#7db006d41b49dc5f1716a913769d4698">release</a> ()</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="a00246.html">filter_t</a>< T, U > &rhs)</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="a00246.html#9411df8197ceb4881ec4c7368a0a7f88">operator *</a> () const </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 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="a00246.html#3d03a48ecb8cd9549bd8be64b09c9b0d">operator-></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="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="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="a00246.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="a00246.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 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="a00246.html">filter_t</a>< T_, U_ > </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00246.html#85c2892eff1fddcd06e28911e75838bd">make_filter</a> (tbb::filter::mode, const Body &)</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="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="a00246.html">filter_t</a>< T_, U_ > </td><td class="memTemplItemRight" valign="bottom"><b>operator &</b> (const <a class="el" href="a00246.html">filter_t</a>< T_, V_ > &, const <a class="el" href="a00246.html">filter_t</a>< V_, U_ > &)</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>
-<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 >::const_accessor</h3>
-Class representing a chain of type-safe pipeline filters.
+Combines data access, locking, and garbage collection.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00546.html">pipeline.h</a></ul>
+<li><a class="el" href="a00418.html">concurrent_hash_map.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00234.png b/doc/html/a00246.png
similarity index 100%
rename from doc/html/a00234.png
rename to doc/html/a00246.png
diff --git a/doc/html/a00247.html b/doc/html/a00247.html
index 8209ed4..1ab5139 100644
--- a/doc/html/a00247.html
+++ b/doc/html/a00247.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_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,27 +21,322 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00247.html">final_scan_tag</a></div>
-<h1>tbb::final_scan_tag Struct Reference<br>
-<small>
-[<a class="el" href="a00371.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="a00383.html">tbb</a>::<b>interface5</b>::<a class="el" href="a00247.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="a00528.html">parallel_scan.h</a>></code>
+<code>#include <<a class="el" href="a00429.html">concurrent_priority_queue.h</a>></code>
<p>
-<a href="a00086.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>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="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="a00247.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="a00247.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="a00247.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="a00247.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="a00247.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="a00247.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="a00247.html#eefa40599afe00ea393897d8f5662e65">concurrent_priority_queue</a> (const <a class="el" href="a00247.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a> &a=<a class="el" href="a00247.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a>())</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Constructs a new <a class="el" href="a00247.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="a00247.html#4555b4a55415a70024c4004b51e9f385">concurrent_priority_queue</a> (<a class="el" href="a00247.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a> init_capacity, const <a class="el" href="a00247.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a> &a=<a class="el" href="a00247.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a>())</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Constructs a new <a class="el" href="a00247.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="a00247.html#9147cb4207017c260a0c3929c12cd40f">concurrent_priority_queue</a> (InputIterator begin, InputIterator end, const <a class="el" href="a00247.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a> &a=<a class="el" href="a00247.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="a00247.html#509419e320f200456d89dc54a65140b3">concurrent_priority_queue</a> (const <a class="el" href="a00247.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="a00247.html#c8b20e7430c5302936030bef59a562be">concurrent_priority_queue</a> (const <a class="el" href="a00247.html">concurrent_priority_queue</a> &src, const <a class="el" href="a00247.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="a00247.html">concurrent_priority_queue</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00247.html#2ab7f7808891027ac0f0f5b3a4be51e9">operator=</a> (const <a class="el" href="a00247.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="a00247.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="a00247.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00247.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="a00247.html#d905af7b8f6defff562f5ae9c3275763">push</a> (<a class="el" href="a00247.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="a00247.html#e036461a29cc40902a2bb79abf9f5146">try_pop</a> (<a class="el" href="a00247.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="a00247.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="a00247.html#0ecdc6a04aa259374425d424ca2a6082">swap</a> (<a class="el" href="a00247.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="a00247.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00247.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>
-Used to indicate that the final scan is being performed.
+<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="a00247.html">tbb::interface5::concurrent_priority_queue</a>< T, Compare, A >::<a class="el" href="a00247.html">concurrent_priority_queue</a> </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="a00247.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="a00247.html">tbb::interface5::concurrent_priority_queue</a>< T, Compare, A >::<a class="el" href="a00247.html">concurrent_priority_queue</a> </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="a00247.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="a00247.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="a00247.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="a00247.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="a00247.html">concurrent_priority_queue</a>& <a class="el" href="a00247.html">tbb::interface5::concurrent_priority_queue</a>< T, Compare, A >::operator= </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="a00247.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="a00247.html">tbb::interface5::concurrent_priority_queue</a>< T, Compare, A >::push </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="a00247.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="a00247.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a> <a class="el" href="a00247.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="a00247.html">tbb::interface5::concurrent_priority_queue</a>< T, Compare, A >::swap </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="a00247.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="a00247.html">tbb::interface5::concurrent_priority_queue</a>< T, Compare, A >::try_pop </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="a00247.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>
-<hr>The documentation for this struct was generated from the following file:<ul>
-<li><a class="el" href="a00528.html">parallel_scan.h</a></ul>
+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="a00429.html">concurrent_priority_queue.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00248.html b/doc/html/a00248.html
index b394217..ee9798f 100644
--- a/doc/html/a00248.html
+++ b/doc/html/a00248.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::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,28 +21,143 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<b>interface6</b>::<a class="el" href="a00248.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="a00383.html">tbb</a>::<b>strict_ppl</b>::<a class="el" href="a00248.html">concurrent_queue</a></div>
+<h1>tbb::strict_ppl::concurrent_queue< T, A > Class Template Reference<br>
+<small>
+[<a class="el" href="a00396.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="a00546.html">pipeline.h</a>></code>
+<code>#include <<a class="el" href="a00432.html">concurrent_queue.h</a>></code>
<p>
-<a href="a00096.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<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>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="a00248.html#682c3978d5cb0620000994f11c44a476">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="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="a00248.html#a8d725c50a9834bb7af5b67c0aff92b8">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="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="a00248.html#4d48e7ff93f81636bca2c74f7da34750">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="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="a00248.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="a00248.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="a00248.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="a00248.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="a00248.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="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="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="a00248.html#7c48a05a94a1f4f98fdfadfbef98ecf6">concurrent_queue</a> (const <a class="el" href="a00248.html#5a3956341728eaa558d8827063718cac">allocator_type</a> &a=<a class="el" href="a00248.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="a00248.html#25209656c84f2f9b030e2f9162713341">concurrent_queue</a> (InputIterator begin, InputIterator end, const <a class="el" href="a00248.html#5a3956341728eaa558d8827063718cac">allocator_type</a> &a=<a class="el" href="a00248.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="a00248.html#8a6b98ea11a867db8ac868f0113ca429">concurrent_queue</a> (const <a class="el" href="a00248.html">concurrent_queue</a> &src, const <a class="el" href="a00248.html#5a3956341728eaa558d8827063718cac">allocator_type</a> &a=<a class="el" href="a00248.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="a00248.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="a00248.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="a00248.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="a00248.html#8fc30e93f8342a1960357f71e4fe8a2b">size_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00248.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="a00248.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="a00248.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="a00248.html#5a3956341728eaa558d8827063718cac">allocator_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00248.html#f034f70caef445fe8abc9113ec926a8d">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="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="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="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>
-input_filter control to signal end-of-input for parallel_pipeline
+<h3>template<typename T, typename A = cache_aligned_allocator<T>><br>
+ class tbb::strict_ppl::concurrent_queue< T, A ></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="a00248.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="a00546.html">pipeline.h</a></ul>
+<li><a class="el" href="a00432.html">concurrent_queue.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00249.html b/doc/html/a00249.html
index 8ab2586..eb4207b 100644
--- a/doc/html/a00249.html
+++ b/doc/html/a00249.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::function_node< Input, Output > 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,57 +21,128 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00249.html">function_node</a></div>
-<h1>tbb::function_node< Input, Output > Class Template Reference</h1><!-- doxytag: class="tbb::function_node" --><!-- doxytag: inherits="tbb::graph_node" -->Implements a function node that supports Input -> Output.
+<a class="el" href="a00383.html">tbb</a>::<b>deprecated</b>::<a class="el" href="a00249.html">concurrent_queue</a></div>
+<h1>tbb::deprecated::concurrent_queue< T, A > Class Template Reference<br>
+<small>
+[<a class="el" href="a00396.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="a00466.html">graph.h</a>></code>
+<code>#include <<a class="el" href="a00432.html">concurrent_queue.h</a>></code>
<p>
-<p>Inheritance diagram for tbb::function_node< Input, Output >:
-<p><center><img src="a00249.png" usemap="#tbb::function_node< Input, Output >_map" border="0" alt=""></center>
-<map name="tbb::function_node< Input, Output >_map">
-<area href="a00251.html" alt="tbb::graph_node" shape="rect" coords="0,0,212,24">
+<p>Inheritance diagram for tbb::deprecated::concurrent_queue< T, A >:
+<p><center><img src="a00249.png" usemap="#tbb::deprecated::concurrent_queue< T, A >_map" border="0" alt=""></center>
+<map name="tbb::deprecated::concurrent_queue< T, A >_map">
+<area href="a00242.html" alt="tbb::concurrent_bounded_queue< T, A >" shape="rect" coords="0,0,257,24">
</map>
-<a href="a00049.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00025.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="6e6329f2e501fe2ca3af68ab506ae970"></a><!-- doxytag: member="tbb::function_node::input_type" ref="6e6329f2e501fe2ca3af68ab506ae970" 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="a00242.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="8fdb5893b95c7127cecad4e549a4f293"></a><!-- doxytag: member="tbb::function_node::output_type" ref="8fdb5893b95c7127cecad4e549a4f293" 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="a00242.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="4283fbbd6c585e11d22c0fe199262e5d"></a><!-- doxytag: member="tbb::function_node::predecessor_type" ref="4283fbbd6c585e11d22c0fe199262e5d" args="" -->
-typedef <a class="el" href="a00282.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="a00249.html#aaf19bd7337b72f3131ece60f7315ef7">concurrent_queue</a> (const A &a=A())</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="277107a970082cf30bc73fe11232e27c"></a><!-- doxytag: member="tbb::function_node::successor_type" ref="277107a970082cf30bc73fe11232e27c" args="" -->
-typedef <a class="el" href="a00277.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="a00249.html#fc092b9082f233482f3513fc3bb670f7">concurrent_queue</a> (const <a class="el" href="a00249.html">concurrent_queue</a> &src, const A &a=A())</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="7bde12e8ee43d4cafbdd5b1fc2031e2b"></a><!-- doxytag: member="tbb::function_node::function_node" ref="7bde12e8ee43d4cafbdd5b1fc2031e2b" 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="a00249.html#7bde12e8ee43d4cafbdd5b1fc2031e2b">function_node</a> (<a class="el" href="a00250.html">graph</a> &g, size_t concurrency, Body body)</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="a00249.html#9102b897776bd2d9e908e6604ff16b5f">concurrent_queue</a> (InputIterator b, InputIterator e, const A &a=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">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00249.html#7c45561bafe71107d09b2bc1b8f4e681">push_if_not_full</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="#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="a00249.html#48da3536245318af6cb5fd58bac78039">pop_if_present</a> (T &destination)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">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="0d66f79bb45d6ae8e9fc97a4118451d5"></a><!-- doxytag: member="tbb::function_node::successors" ref="0d66f79bb45d6ae8e9fc97a4118451d5" 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">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 colspan="2"><br><h2>Protected Attributes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0b7de4c1337a7aec27adff1becea08d5"></a><!-- doxytag: member="tbb::function_node::my_successors" ref="0b7de4c1337a7aec27adff1becea08d5" args="" -->
-internal::broadcast_cache<<br>
- output_type > </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="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="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="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 = continue_msg><br>
- class tbb::function_node< Input, Output ></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="a00249.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="a00242.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="a00249.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="a00466.html">graph.h</a></ul>
+<li><a class="el" href="a00432.html">concurrent_queue.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00249.png b/doc/html/a00249.png
index 3b8737b..6aac5a0 100644
Binary files a/doc/html/a00249.png and b/doc/html/a00249.png differ
diff --git a/doc/html/a00250.html b/doc/html/a00250.html
index 41b9add..20f6c0b 100644
--- a/doc/html/a00250.html
+++ b/doc/html/a00250.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::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,73 +21,325 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00250.html">graph</a></div>
-<h1>tbb::graph Class Reference</h1><!-- doxytag: class="tbb::graph" -->The graph class.
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00250.html">concurrent_vector</a></div>
+<h1>tbb::concurrent_vector< T, A > Class Template Reference<br>
+<small>
+[<a class="el" href="a00396.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="a00466.html">graph.h</a>></code>
+<code>#include <<a class="el" href="a00443.html">concurrent_vector.h</a>></code>
<p>
-<a href="a00045.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="633b9b55e3248b785efd13264261f0e54431a30e2ba83c24deee35ce1218f08e"></a><!-- doxytag: member="tbb::graph::unlimited" ref="633b9b55e3248b785efd13264261f0e54431a30e2ba83c24deee35ce1218f08e" args="" -->
- </td><td class="memItemRight" valign="bottom"><b>unlimited</b> = 0</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="633b9b55e3248b785efd13264261f0e57fa790f3b0f0dd6330e4f91ffa85759a"></a><!-- doxytag: member="tbb::graph::serial" ref="633b9b55e3248b785efd13264261f0e57fa790f3b0f0dd6330e4f91ffa85759a" args="" -->
- </td><td class="memItemRight" valign="bottom"><b>serial</b> = 1</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">enum </td><td class="memItemRight" valign="bottom"><a class="el" href="a00250.html#633b9b55e3248b785efd13264261f0e5">concurrency</a> { <b>unlimited</b> = 0,
-<b>serial</b> = 1
- }</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="a00250.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="a00250.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 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>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1ba8311506558a2419101722f5d49ba9"></a><!-- doxytag: member="tbb::graph::graph" ref="1ba8311506558a2419101722f5d49ba9" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00250.html#1ba8311506558a2419101722f5d49ba9">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="a00250.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="a00250.html#dd8a200b99a8088435a37934b58fe335">concurrent_vector</a> (const <a class="el" href="a00250.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="a00250.html#64432f13f7b29bfe4acfb5568f34f3a8">concurrent_vector</a> (const <a class="el" href="a00250.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="a00250.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="a00250.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="a00250.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="a00250.html">concurrent_vector</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00250.html#691f0f3cda3e489c37a657016e375eaf">operator=</a> (const <a class="el" href="a00250.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="a00250.html">concurrent_vector</a> & </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00250.html#19f4ab88a01b0fd056af3bba463e7bd6">operator=</a> (const <a class="el" href="a00250.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="a00250.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="a00250.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="a00250.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 constuctor. <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="a00250.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="a00250.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="a00250.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="a00250.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="a00250.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="a00250.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="a00250.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="a00250.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="a00250.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="a00250.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="a00250.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="a00250.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="a00250.html#c6426cb93cf20d3af40f3c90f1f0481a">empty</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Return true 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="a00250.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="a00250.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="a00250.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="a00250.html#98ce6b2c6d2622f0c030b46dfac3880c">resize</a> (size_type n, const_reference t)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Constructs a graph withy no nodes. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00250.html#55332084e7884a26ff288b8fe960030d">~graph</a> ()</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="a00250.html#1693d1da41b1a8235871be9c6633be35">compact</a> ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroys the graph. <a href="#55332084e7884a26ff288b8fe960030d"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00250.html#1e5c5ae6538ec714cee107d1004705b9">increment_wait_count</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">An alias for <a class="el" href="a00250.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="a00250.html#03c6f4cf66532bf4cc907ee738a9a186">shrink_to_fit</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="#1e5c5ae6538ec714cee107d1004705b9"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00250.html#ff3b6a3ef2ae1e661dcdb398c227b43c">decrement_wait_count</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="a00250.html#2c248a017f0576df3e7cd99627836fd6">max_size</a> () const </td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Deregisters an external entity that may have interacted with the graph. <a href="#ff3b6a3ef2ae1e661dcdb398c227b43c"></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="a00250.html#4c5e8dc5a45e641d534d6206838cfa7f">run</a> (Receiver &r, Body body)</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="a00250.html#730b23a251ecb6d37f692fb22f38e029">begin</a> ()</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="#4c5e8dc5a45e641d534d6206838cfa7f"></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="a00250.html#71213dd18099298dc74731e293c8286a">run</a> (Body body)</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="a00250.html#c0b51160e5a764982ec97a455f94f2c6">end</a> ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Spawns a task that runs a function object. <a href="#71213dd18099298dc74731e293c8286a"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00250.html#bafd6349fdc6563ffa02746866e30bec">wait_for_all</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="a00250.html#78a06182276ff758788d4c0623ae0d71">begin</a> () const </td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Waits until the graph is idle and the number of decrement_wait_count calls equals the number of increment_wait_count calls. <a href="#bafd6349fdc6563ffa02746866e30bec"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="34d61d8b6560e5b2eb42e0112701db0f"></a><!-- doxytag: member="tbb::graph::root_task" ref="34d61d8b6560e5b2eb42e0112701db0f" args="()" -->
-<a class="el" href="a00291.html">task</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00250.html#34d61d8b6560e5b2eb42e0112701db0f">root_task</a> ()</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="a00250.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="f88fcf1c920693c39bd9709db33c199f"></a><!-- doxytag: member="tbb::concurrent_vector::cbegin" ref="f88fcf1c920693c39bd9709db33c199f" args="() const " -->
+const_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00250.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="0c15a5d0f1cf75d687dabba07da1d46b"></a><!-- doxytag: member="tbb::concurrent_vector::cend" ref="0c15a5d0f1cf75d687dabba07da1d46b" args="() const " -->
+const_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00250.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="5e220926d09236d98f04fe0721e5f9a1"></a><!-- doxytag: member="tbb::concurrent_vector::rbegin" ref="5e220926d09236d98f04fe0721e5f9a1" args="()" -->
+reverse_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00250.html#5e220926d09236d98f04fe0721e5f9a1">rbegin</a> ()</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="a00250.html#290119a4eb43cd6a9e98fa17016ba3c2">rend</a> ()</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="a00250.html#9f9c103e18d5f212703805354074ad44">rbegin</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="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="a00250.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="a00250.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="a00250.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="a00250.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="a00250.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="a00250.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="a00250.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="a00250.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="a00250.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="a00250.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="a00250.html#96c9c4bd968ed3edb8dd276854d2dae0">swap</a> (<a class="el" href="a00250.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="a00250.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="a00250.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">Returns the root task of the graph. <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>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>
+<a class="el" href="a00250.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>
-This class serves as a handle to the graph
+<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 guaranties 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="a00250.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="a00250.html#715fe313c4a9c22731cc404dd80c9ec9">concurrent_vector::size()</a> and <a class="el" href="a00250.html#47fe588214dd5fa06ab6e8ab78d83874">grow_to_at_least()</a> methods to assure elements are allocated.</li><li>Methods <a class="el" href="a00250.html#c0b51160e5a764982ec97a455f94f2c6">end()</a>/rbegin()/back() are partly thread-safe since they use <a class="el" href="a00250.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 guaranties</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="a00250.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="55332084e7884a26ff288b8fe960030d"></a><!-- doxytag: member="tbb::graph::~graph" ref="55332084e7884a26ff288b8fe960030d" 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::graph::~graph </td>
+ <td class="memname">void <a class="el" href="a00250.html">tbb::concurrent_vector</a>< T, A >::clear </td>
<td>(</td>
<td class="paramname"> </td>
<td> ) </td>
@@ -98,20 +350,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 on the graph, deletes all of the nodes appended by calls to add, and then destroys the root task of the graph.
+To free up the memory, use in conjunction with method <a class="el" href="a00250.html#1693d1da41b1a8235871be9c6633be35">compact()</a>. Not thread safe
</div>
</div><p>
-<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="ff3b6a3ef2ae1e661dcdb398c227b43c"></a><!-- doxytag: member="tbb::graph::decrement_wait_count" ref="ff3b6a3ef2ae1e661dcdb398c227b43c" 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::graph::decrement_wait_count </td>
+ <td class="memname">iterator <a class="el" href="a00250.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="a00250.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 constuctor.
+<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="a00250.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>
@@ -120,19 +438,20 @@ Calls wait_for_all on the graph, deletes all of the nodes appended by calls to a
<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="1e5c5ae6538ec714cee107d1004705b9"></a><!-- doxytag: member="tbb::graph::increment_wait_count" ref="1e5c5ae6538ec714cee107d1004705b9" 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::graph::increment_wait_count </td>
+ <td class="memname">size_type <a class="el" href="a00250.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>
@@ -141,22 +460,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="71213dd18099298dc74731e293c8286a"></a><!-- doxytag: member="tbb::graph::run" ref="71213dd18099298dc74731e293c8286a" 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::graph::run </td>
+ <td class="memname">iterator <a class="el" href="a00250.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>
@@ -165,52 +484,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="a00250.html#bafd6349fdc6563ffa02746866e30bec">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="4c5e8dc5a45e641d534d6206838cfa7f"></a><!-- doxytag: member="tbb::graph::run" ref="4c5e8dc5a45e641d534d6206838cfa7f" 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::graph::run </td>
+ <td class="memname">void <a class="el" href="a00250.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="a00250.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="a00250.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="a00250.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="a00250.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="a00250.html#bafd6349fdc6563ffa02746866e30bec">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="bafd6349fdc6563ffa02746866e30bec"></a><!-- doxytag: member="tbb::graph::wait_for_all" ref="bafd6349fdc6563ffa02746866e30bec" 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::graph::wait_for_all </td>
+ <td class="memname">void <a class="el" href="a00250.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>
@@ -219,13 +578,13 @@ The task is spawned as a child of the graph. This is useful for running tasks th
<div class="memdoc">
<p>
-Waits until the graph is idle and the number of decrement_wait_count calls equals the number of 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="a00466.html">graph.h</a></ul>
+<li><a class="el" href="a00443.html">concurrent_vector.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00251.html b/doc/html/a00251.html
index 43671de..53ab362 100644
--- a/doc/html/a00251.html
+++ b/doc/html/a00251.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::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,41 +21,20 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00251.html">graph_node</a></div>
-<h1>tbb::graph_node Class Reference</h1><!-- doxytag: class="tbb::graph_node" -->The base of all graph nodes. Allows them to be stored in a collection for deletion.
+<a class="el" href="a00383.html">tbb</a>::<b>flow</b>::<b>interface6</b>::<a class="el" href="a00251.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="a00466.html">graph.h</a>></code>
+<code>#include <<a class="el" href="a00468.html">flow_graph.h</a>></code>
<p>
-<p>Inheritance diagram for tbb::graph_node:
-<p><center><img src="a00251.png" usemap="#tbb::graph_node_map" border="0" alt=""></center>
-<map name="tbb::graph_node_map">
-<area href="a00224.html" alt="tbb::broadcast_node< T >" shape="rect" coords="4716,56,9422,80">
-<area href="a00225.html" alt="tbb::buffer_node< T >" shape="rect" coords="4716,112,9422,136">
-<area href="a00244.html" alt="tbb::executable_node< Output >" shape="rect" coords="4716,168,9422,192">
-<area href="a00244.html" alt="tbb::executable_node< tbb::continue_msg >" shape="rect" coords="4716,224,9422,248">
-<area href="a00249.html" alt="tbb::function_node< Input, Output >" shape="rect" coords="4716,280,9422,304">
-<area href="a00254.html" alt="tbb::internal::join_node_base< JP, InputTuple, OutputTuple >" shape="rect" coords="4716,336,9422,360">
-<area href="a00254.html" alt="tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type > >, OutputTuple >" shape="rect" coords="4716,392,9422,416">
-<area href="a00254.html" alt="tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 2, OutputTuple >::type > >, OutputTuple >" shape="rect" coords="4716,448,9422,472">
-<area href="a00254.html" alt="tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 2, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 3, OutputTuple >::type > >, OutputTuple >" shape="rect" coords="4716,504,9422,528">
-<area href="a00254.html" alt="tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 2, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 3, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 4, OutputTuple >::type > >, OutputTuple >" shape= [...]
-<area href="a00254.html" alt="tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 2, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 3, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 4, OutputTuple >::type >, tbb::internal::two_phas [...]
-<area href="a00254.html" alt="tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 2, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 3, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 4, OutputTuple >::type >, tbb::internal::two_phas [...]
-<area href="a00254.html" alt="tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 2, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 3, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 4, OutputTuple >::type >, tbb::internal::two_phas [...]
-<area href="a00254.html" alt="tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 2, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 3, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 4, OutputTuple >::type >, tbb::internal::two_phas [...]
-<area href="a00254.html" alt="tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 2, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 3, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 4, OutputTuple >::type >, tbb::internal::two_phas [...]
-<area href="a00255.html" alt="tbb::limiter_node< T >" shape="rect" coords="4716,896,9422,920">
-<area href="a00285.html" alt="tbb::source_node< Output >" shape="rect" coords="4716,952,9422,976">
-</map>
-<a href="a00040.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-The base of all graph nodes. Allows them to be stored in a collection for deletion.
+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="a00466.html">graph.h</a></ul>
+<li><a class="el" href="a00468.html">flow_graph.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00251.png b/doc/html/a00251.png
deleted file mode 100644
index 31daf9e..0000000
Binary files a/doc/html/a00251.png and /dev/null differ
diff --git a/doc/html/a00252.html b/doc/html/a00252.html
index 9fdf1d3..8ebd70d 100644
--- a/doc/html/a00252.html
+++ b/doc/html/a00252.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,24 +21,65 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00252.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="a00383.html">tbb</a>::<b>flow</b>::<b>interface6</b>::<a class="el" href="a00252.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="a00251.html">continue_msg</a> -> Output.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00593.html">tbb_exception.h</a>></code>
+<code>#include <<a class="el" href="a00468.html">flow_graph.h</a>></code>
<p>
-<a href="a00139.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="a00252.png" usemap="#tbb::flow::interface6::continue_node< Output >_map" border="0" alt=""></center>
+<map name="tbb::flow::interface6::continue_node< Output >_map">
+<area href="a00263.html" alt="tbb::flow::interface6::graph_node" shape="rect" coords="0,0,271,24">
+</map>
+<a href="a00054.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="a00251.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="a00301.html">sender</a>< <a class="el" href="a00251.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="a00295.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="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="a00252.html#2f200db877d2f80c08d09422e8bffd5a">continue_node</a> (<a class="el" href="a00262.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="a00251.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="a00252.html#7817aebf22dd125ca04df53ac488d163">continue_node</a> (<a class="el" href="a00262.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="a00251.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="a00252.html#869562787fcb5c57a90aea120f26d492">continue_node</a> (const <a class="el" href="a00252.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="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>
</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="a00251.html">continue_msg</a> -> Output.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00593.html">tbb_exception.h</a></ul>
+<li><a class="el" href="a00468.html">flow_graph.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00252.png b/doc/html/a00252.png
new file mode 100644
index 0000000..97eb6db
Binary files /dev/null and b/doc/html/a00252.png differ
diff --git a/doc/html/a00253.html b/doc/html/a00253.html
index 0637f2d..696e637 100644
--- a/doc/html/a00253.html
+++ b/doc/html/a00253.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,24 +21,142 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00253.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="a00383.html">tbb</a>::<b>flow</b>::<b>interface6</b>::<a class="el" href="a00253.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="a00593.html">tbb_exception.h</a>></code>
+<code>#include <<a class="el" href="a00468.html">flow_graph.h</a>></code>
<p>
-<a href="a00141.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="a00253.png" usemap="#tbb::flow::interface6::continue_receiver_map" border="0" alt=""></center>
+<map name="tbb::flow::interface6::continue_receiver_map">
+<area href="a00295.html" alt="tbb::flow::interface6::receiver< T >" shape="rect" coords="0,0,230,24">
+</map>
+<a href="a00043.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="a00251.html">continue_msg</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00253.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="a00301.html">sender</a>< <a class="el" href="a00251.html">continue_msg</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00253.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="a00253.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="a00253.html#a0b292ed7fa6556b2a735f6d1e82dc74">continue_receiver</a> (const <a class="el" href="a00253.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="a00253.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="a00253.html#2fcfa4990a42417bbeb1f3c8b9ac8a22">register_predecessor</a> (<a class="el" href="a00301.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="a00253.html#cb691b18416d4742265aed84d496ebbd">remove_predecessor</a> (<a class="el" href="a00301.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 class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00253.html#3969c70fb89c0a982f142ae9eb5facae">try_put</a> (const <a class="el" href="a00251.html">input_type</a> &)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Puts a <a class="el" href="a00251.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="a00253.html#40ca8b7e96c5bc3428b4d1e409725ee5">execute</a> ()=0</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="a00305.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>
</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="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">
+
+<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="a00253.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="a00301.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="a00251.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="a00251.html">continue_msg</a> to the receiver.
<p>
+If the message causes the message count to reach the predecessor count, <a class="el" href="a00253.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="a00593.html">tbb_exception.h</a></ul>
+<li><a class="el" href="a00468.html">flow_graph.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00253.png b/doc/html/a00253.png
new file mode 100644
index 0000000..b14a696
Binary files /dev/null and b/doc/html/a00253.png differ
diff --git a/doc/html/a00254.html b/doc/html/a00254.html
index 82fd7ad..9624512 100644
--- a/doc/html/a00254.html
+++ b/doc/html/a00254.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::join_node_base< JP, InputTuple, OutputTuple > 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,65 +21,28 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<b>internal</b>::<a class="el" href="a00254.html">join_node_base</a></div>
-<h1>tbb::internal::join_node_base< JP, InputTuple, OutputTuple > Class Template Reference</h1><!-- doxytag: class="tbb::internal::join_node_base" --><!-- doxytag: inherits="tbb::graph_node,tbb::sender< OutputTuple >" --><a class="el" href="a00254.html">join_node_base</a>
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00254.html">empty_task</a></div>
+<h1>tbb::empty_task Class Reference<br>
+<small>
+[<a class="el" href="a00400.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="a00466.html">graph.h</a>></code>
+<code>#include <<a class="el" href="a00567.html">task.h</a>></code>
<p>
-<p>Inheritance diagram for tbb::internal::join_node_base< JP, InputTuple, OutputTuple >:
-<p><center><img src="a00254.png" usemap="#tbb::internal::join_node_base< JP, InputTuple, OutputTuple >_map" border="0" alt=""></center>
-<map name="tbb::internal::join_node_base< JP, InputTuple, OutputTuple >_map">
-<area href="a00251.html" alt="tbb::graph_node" shape="rect" coords="0,0,355,24">
-<area href="a00282.html" alt="tbb::sender< OutputTuple >" shape="rect" coords="365,0,720,24">
+<p>Inheritance diagram for tbb::empty_task:
+<p><center><img src="a00254.png" usemap="#tbb::empty_task_map" border="0" alt=""></center>
+<map name="tbb::empty_task_map">
+<area href="a00311.html" alt="tbb::task" shape="rect" coords="0,0,97,24">
</map>
-<a href="a00067.html">List of all members.</a><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 Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="578893d923f91b7e44a15dea8b0d7082"></a><!-- doxytag: member="tbb::internal::join_node_base::output_type" ref="578893d923f91b7e44a15dea8b0d7082" args="" -->
-typedef OutputTuple </td><td class="memItemRight" valign="bottom"><a class="el" href="a00254.html#578893d923f91b7e44a15dea8b0d7082">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="1212cbaa293a93c3bf334da1539556bd"></a><!-- doxytag: member="tbb::internal::join_node_base::successor_type" ref="1212cbaa293a93c3bf334da1539556bd" args="" -->
-typedef <a class="el" href="a00277.html">receiver</a>< <a class="el" href="a00254.html#578893d923f91b7e44a15dea8b0d7082">output_type</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00254.html#1212cbaa293a93c3bf334da1539556bd">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="caa4c6d62f43e839024d99fb49ff4d25"></a><!-- doxytag: member="tbb::internal::join_node_base::input_ports_type" ref="caa4c6d62f43e839024d99fb49ff4d25" args="" -->
-typedef join_node_FE< JP,<br>
- InputTuple, OutputTuple > </td><td class="memItemRight" valign="bottom"><b>input_ports_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="74c044c29d83c8b70496ea2d40a3e8cf"></a><!-- doxytag: member="tbb::internal::join_node_base::join_node_base" ref="74c044c29d83c8b70496ea2d40a3e8cf" args="(graph &g)" -->
- </td><td class="memItemRight" valign="bottom"><b>join_node_base</b> (<a class="el" href="a00250.html">graph</a> &g)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4fe2bd006dbd111d1f1785ee6571dde6"></a><!-- doxytag: member="tbb::internal::join_node_base::register_successor" ref="4fe2bd006dbd111d1f1785ee6571dde6" args="(successor_type &r)" -->
-bool </td><td class="memItemRight" valign="bottom"><b>register_successor</b> (<a class="el" href="a00277.html">successor_type</a> &r)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="c3902ed788ea0c808de846b23d661548"></a><!-- doxytag: member="tbb::internal::join_node_base::input_port" ref="c3902ed788ea0c808de846b23d661548" args="(void)" -->
-template<size_t N> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"><a class="el" href="a00277.html">receiver</a>< typename std::tuple_element<<br>
- N, OutputTuple >::value > & </td><td class="memTemplItemRight" valign="bottom"><b>input_port</b> (void)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="46a9a783464d2739bb9dadfe794d8098"></a><!-- doxytag: member="tbb::internal::join_node_base::remove_successor" ref="46a9a783464d2739bb9dadfe794d8098" args="(successor_type &r)" -->
-bool </td><td class="memItemRight" valign="bottom"><b>remove_successor</b> (<a class="el" href="a00277.html">successor_type</a> &r)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="50c0e6465ac929a2e94d4e62a13ebeff"></a><!-- doxytag: member="tbb::internal::join_node_base::try_get" ref="50c0e6465ac929a2e94d4e62a13ebeff" args="(output_type &v)" -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00254.html#50c0e6465ac929a2e94d4e62a13ebeff">try_get</a> (<a class="el" href="a00254.html#578893d923f91b7e44a15dea8b0d7082">output_type</a> &v)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Request an item from the sender. <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="d7392be41db39cc27f6b52b4809c5f75"></a><!-- doxytag: member="tbb::internal::join_node_base::forward_task< join_node_base< JP, InputTuple, OutputTuple > >" ref="d7392be41db39cc27f6b52b4809c5f75" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>forward_task< join_node_base< JP, InputTuple, OutputTuple > ></b></td></tr>
-
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<join_policy JP, typename InputTuple, typename OutputTuple><br>
- class tbb::internal::join_node_base< JP, InputTuple, OutputTuple ></h3>
-
-<a class="el" href="a00254.html">join_node_base</a>
+task that does nothing. Useful for synchronization.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00466.html">graph.h</a></ul>
+<li><a class="el" href="a00567.html">task.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00254.png b/doc/html/a00254.png
index 53a922f..2fa6419 100644
Binary files a/doc/html/a00254.png and b/doc/html/a00254.png differ
diff --git a/doc/html/a00255.html b/doc/html/a00255.html
index 9d68537..51b8f44 100644
--- a/doc/html/a00255.html
+++ b/doc/html/a00255.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::limiter_node< T > Class 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,113 +21,171 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00255.html">limiter_node</a></div>
-<h1>tbb::limiter_node< T > Class Template Reference</h1><!-- doxytag: class="tbb::limiter_node" --><!-- doxytag: inherits="tbb::graph_node,tbb::receiver,tbb::sender" -->Forwards messages only if the threshold has not been reached.
+<a class="el" href="a00383.html">tbb</a>::<b>interface6</b>::<a class="el" href="a00255.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="a00396.html">Containers</a>]</small>
+</h1><!-- doxytag: class="tbb::interface6::enumerable_thread_specific" -->The <a class="el" href="a00255.html">enumerable_thread_specific</a> container.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00466.html">graph.h</a>></code>
+<code>#include <<a class="el" href="a00455.html">enumerable_thread_specific.h</a>></code>
<p>
-<p>Inheritance diagram for tbb::limiter_node< T >:
-<p><center><img src="a00255.png" usemap="#tbb::limiter_node< T >_map" border="0" alt=""></center>
-<map name="tbb::limiter_node< T >_map">
-<area href="a00251.html" alt="tbb::graph_node" shape="rect" coords="0,0,134,24">
-<area href="a00277.html" alt="tbb::receiver< T >" shape="rect" coords="144,0,278,24">
-<area href="a00282.html" alt="tbb::sender< T >" shape="rect" coords="288,0,422,24">
-</map>
-<a href="a00061.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="f654b8974c613e8fd3de5a40e181d5ff"></a><!-- doxytag: member="tbb::limiter_node::input_type" ref="f654b8974c613e8fd3de5a40e181d5ff" args="" -->
-typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00255.html#f654b8974c613e8fd3de5a40e181d5ff">input_type</a></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="a00255.html#3c03eb40955b933b01987222722ac4bd">allocator_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="370f88278dec6f584c1d08a375f9b4cd"></a><!-- doxytag: member="tbb::limiter_node::output_type" ref="370f88278dec6f584c1d08a375f9b4cd" args="" -->
-typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00255.html#370f88278dec6f584c1d08a375f9b4cd">output_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="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="fd88ce7670e7107aef2161b45f156185"></a><!-- doxytag: member="tbb::limiter_node::predecessor_type" ref="fd88ce7670e7107aef2161b45f156185" args="" -->
-typedef <a class="el" href="a00282.html">sender</a>< <a class="el" href="a00255.html#f654b8974c613e8fd3de5a40e181d5ff">input_type</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00255.html#fd88ce7670e7107aef2161b45f156185">predecessor_type</a></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="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="754182cc1e5b403201495bc1fd45674b"></a><!-- doxytag: member="tbb::limiter_node::successor_type" ref="754182cc1e5b403201495bc1fd45674b" args="" -->
-typedef <a class="el" href="a00277.html">receiver</a>< <a class="el" href="a00255.html#370f88278dec6f584c1d08a375f9b4cd">output_type</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00255.html#754182cc1e5b403201495bc1fd45674b">successor_type</a></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="a00250.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="a00250.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 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="f0139fc645a51ce30b7aebb59c38a4ed"></a><!-- doxytag: member="tbb::limiter_node::limiter_node" ref="f0139fc645a51ce30b7aebb59c38a4ed" args="(graph &g, size_t threshold, int number_of_decrement_predecessors=0)" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00255.html#f0139fc645a51ce30b7aebb59c38a4ed">limiter_node</a> (<a class="el" href="a00250.html">graph</a> &g, size_t threshold, int number_of_decrement_predecessors=0)</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="a00255.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="a00255.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="a00255.html#7bce6829981c9efe3f59cae2355e383e">enumerable_thread_specific</a> (const T &exemplar)</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="a00255.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="a00255.html#c8d5265ccbd5e4485996b3f3baaa5ba1">local</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="b8b9dbfbfc52750fa0c6bb8849681e86"></a><!-- doxytag: member="tbb::limiter_node::register_successor" ref="b8b9dbfbfc52750fa0c6bb8849681e86" args="(receiver< output_type > &r)" -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00255.html#b8b9dbfbfc52750fa0c6bb8849681e86">register_successor</a> (<a class="el" href="a00277.html">receiver</a>< <a class="el" href="a00255.html#370f88278dec6f584c1d08a375f9b4cd">output_type</a> > &r)</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="a00255.html#7dc79058d2832f7447de8e691c3455ea">local</a> (bool &exists)</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="a00255.html#047d77f583e789e6d3ac6a52aba3168b">remove_successor</a> (<a class="el" href="a00277.html">receiver</a>< <a class="el" href="a00255.html#370f88278dec6f584c1d08a375f9b4cd">output_type</a> > &r)</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="a00255.html#33fd6593da1ed14340f10f67d5a69130">size</a> () const </td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Removes a successor from this node. <a href="#047d77f583e789e6d3ac6a52aba3168b"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a38facb46cde854cb7408bf9f3bf8999"></a><!-- doxytag: member="tbb::limiter_node::try_put" ref="a38facb46cde854cb7408bf9f3bf8999" args="(T t)" -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00255.html#a38facb46cde854cb7408bf9f3bf8999">try_put</a> (T t)</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="a00255.html#72595886d0ac8fd0543f90038570510d">empty</a> () const </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="fb9909b87538f5c881c7cb7577436d14"></a><!-- doxytag: member="tbb::limiter_node::register_predecessor" ref="fb9909b87538f5c881c7cb7577436d14" args="(predecessor_type &src)" -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00255.html#fb9909b87538f5c881c7cb7577436d14">register_predecessor</a> (<a class="el" href="a00282.html">predecessor_type</a> &src)</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="a00255.html#01d7baf8e913ab2819e97917a2ac795f">begin</a> ()</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="a05cf39b2825183e9c0393890fbbbb41"></a><!-- doxytag: member="tbb::limiter_node::remove_predecessor" ref="a05cf39b2825183e9c0393890fbbbb41" args="(predecessor_type &src)" -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00255.html#a05cf39b2825183e9c0393890fbbbb41">remove_predecessor</a> (<a class="el" href="a00282.html">predecessor_type</a> &src)</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="a00255.html#2456ff88252fc921b01cd8907628a4ee">end</a> ()</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="181fa37d3e3c68ec3819ea46beed79a2"></a><!-- doxytag: member="tbb::limiter_node::decrement" ref="181fa37d3e3c68ec3819ea46beed79a2" args="" -->
-internal::decrementer< <a class="el" href="a00255.html">limiter_node</a><<br>
- T > > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00255.html#181fa37d3e3c68ec3819ea46beed79a2">decrement</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="a00255.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="a00255.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="a00255.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="a00255.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="a00255.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="a00255.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="a00255.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="a00255.html">enumerable_thread_specific</a> & </td><td class="memItemRight" valign="bottom"><b>operator=</b> (const <a class="el" href="a00255.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="a00255.html">enumerable_thread_specific</a> & </td><td class="memTemplItemRight" valign="bottom"><b>operator=</b> (const <a class="el" href="a00255.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 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::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="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="b43677b60c786d1071a7efd6f195c3be"></a><!-- doxytag: member="tbb::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 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><br>
- class tbb::limiter_node< T ></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>
-Forwards messages only if the threshold has not been reached.
+The <a class="el" href="a00255.html">enumerable_thread_specific</a> container.
<p>
-This node forwards items until its threshold is reached. It contains no buffering. If the downstream node rejects, the message is dropped.
+<a class="el" href="a00255.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="a00255.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="a00255.html">enumerable_thread_specific</a> containers may be copy-constructed or assigned. [...]
<p>
-<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="047d77f583e789e6d3ac6a52aba3168b"></a><!-- doxytag: member="tbb::limiter_node::remove_successor" ref="047d77f583e789e6d3ac6a52aba3168b" 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="a00255.html">tbb::limiter_node</a>< T >::remove_successor </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="a00277.html">receiver</a>< <a class="el" href="a00255.html#370f88278dec6f584c1d08a375f9b4cd">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">
+<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="a00255.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>
<p>
-Removes a successor from this node.
-<p>
-r.remove_predecessor(*this) is also called.
-<p>
-Implements <a class="el" href="a00282.html#3f345427e812e8741370308ff88f30bf">tbb::sender< T ></a>.
-</div>
-</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00466.html">graph.h</a></ul>
+<li><a class="el" href="a00455.html">enumerable_thread_specific.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00255.png b/doc/html/a00255.png
deleted file mode 100644
index 1683483..0000000
Binary files a/doc/html/a00255.png and /dev/null differ
diff --git a/doc/html/a00256.html b/doc/html/a00256.html
index 14fb16f..7ebc5a4 100644
--- a/doc/html/a00256.html
+++ b/doc/html/a00256.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::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,24 +21,210 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00256.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="a00383.html">tbb</a>::<a class="el" href="a00256.html">filter</a></div>
+<h1>tbb::filter Class Reference<br>
+<small>
+[<a class="el" href="a00395.html">Algorithms</a>]</small>
+</h1><!-- doxytag: class="tbb::filter" -->A stage in a pipeline.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00593.html">tbb_exception.h</a>></code>
+<code>#include <<a class="el" href="a00543.html">pipeline.h</a>></code>
<p>
-<a href="a00140.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<p>Inheritance diagram for tbb::filter:
+<p><center><img src="a00256.png" usemap="#tbb::filter_map" border="0" alt=""></center>
+<map name="tbb::filter_map">
+<area href="a00322.html" alt="tbb::thread_bound_filter" shape="rect" coords="0,56,145,80">
+</map>
+<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="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="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="a00256.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="a00256.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="a00256.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="a00256.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="a00256.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="a00256.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="a00256.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="a00256.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="a00256.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="a00256.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="a00256.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="a00256.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="a00256.html#f17200974c33be21f42a5f00893de028">exact_exception_propagation</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="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>
-Exception for missing wait on structured_task_group.
+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">
+
+<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="a00256.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="a00256.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="a00256.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="a00593.html">tbb_exception.h</a></ul>
+<li><a class="el" href="a00543.html">pipeline.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00245.png b/doc/html/a00256.png
similarity index 100%
rename from doc/html/a00245.png
rename to doc/html/a00256.png
diff --git a/doc/html/a00257.html b/doc/html/a00257.html
index b0adee3..6c49c54 100644
--- a/doc/html/a00257.html
+++ b/doc/html/a00257.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::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,145 +21,50 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00257.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="a00383.html">tbb</a>::<b>interface6</b>::<a class="el" href="a00257.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="a00593.html">tbb_exception.h</a>></code>
+<code>#include <<a class="el" href="a00543.html">pipeline.h</a>></code>
<p>
-<p>Inheritance diagram for tbb::movable_exception< ExceptionData >:
-<p><center><img src="a00257.png" usemap="#tbb::movable_exception< ExceptionData >_map" border="0" alt=""></center>
-<map name="tbb::movable_exception< ExceptionData >_map">
-<area href="a00298.html" alt="tbb::tbb_exception" shape="rect" coords="0,0,248,24">
-</map>
-<a href="a00144.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 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="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="a00257.html">filter_t</a>< T, U > &rhs)</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="a00257.html">movable_exception</a> &src) throw ()</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="dfafefe27f2afaa7c7894ca9c71cc568"></a><!-- doxytag: member="tbb::movable_exception::operator=" ref="dfafefe27f2afaa7c7894ca9c71cc568" args="(const movable_exception &src)" -->
-const <a class="el" href="a00257.html">movable_exception</a> & </td><td class="memItemRight" valign="bottom"><b>operator=</b> (const <a class="el" href="a00257.html">movable_exception</a> &src)</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="a00257.html">filter_t</a>< T, U > &rhs)</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="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 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 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="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="a00257.html#bc5f5c4739b17ac5211ac58226c2f5a5">name</a> () const throw ()</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="a00257.html">filter_t</a>< T_, U_ > </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00257.html#85c2892eff1fddcd06e28911e75838bd">make_filter</a> (tbb::filter::mode, const Body &)</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="a00257.html#b33a89bccf0c63106f1270c7bfaaf54f">what</a> () const throw ()</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="a00257.html">filter_t</a>< T_, U_ > </td><td class="memTemplItemRight" valign="bottom"><b>operator &</b> (const <a class="el" href="a00257.html">filter_t</a>< T_, V_ > &, const <a class="el" href="a00257.html">filter_t</a>< V_, U_ > &)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns the result of originally intercepted exception's <a class="el" href="a00257.html#b33a89bccf0c63106f1270c7bfaaf54f">what()</a> method. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="a00257.html">movable_exception</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00257.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="a00257.html#7a46873119d9f85a7b0009c13e41a258">destroy</a> () throw ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroys objects created by the <a class="el" href="a00257.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="a00257.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="a00257.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>
-<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="a00298.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="a00257.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="a00257.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="a00298.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="a00257.html">movable_exception</a>* <a class="el" href="a00257.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">
+<h3>template<typename T, typename U><br>
+ class tbb::interface6::filter_t< T, U ></h3>
+Class representing a chain of type-safe pipeline filters.
<p>
-Creates and returns pointer to the deep copy of this exception object.
-<p>
-Move semantics is allowed.
-<p>
-Implements <a class="el" href="a00298.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="a00257.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>
-Implements <a class="el" href="a00298.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="a00593.html">tbb_exception.h</a></ul>
+<li><a class="el" href="a00543.html">pipeline.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00258.html b/doc/html/a00258.html
index b2eaf43..75898ea 100644
--- a/doc/html/a00258.html
+++ b/doc/html/a00258.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::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,110 +21,27 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00258.html">mutex</a></div>
-<h1>tbb::mutex Class Reference<br>
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00258.html">final_scan_tag</a></div>
+<h1>tbb::final_scan_tag Struct Reference<br>
<small>
-[<a class="el" href="a00374.html">Synchronization</a>]</small>
-</h1><!-- doxytag: class="tbb::mutex" -->Wrapper around the platform's native reader-writer lock.
+[<a class="el" href="a00395.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="a00499.html">mutex.h</a>></code>
+<code>#include <<a class="el" href="a00518.html">parallel_scan.h</a>></code>
<p>
-<a href="a00078.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00083.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="a00258.html#9f1ec84d5815263ceae853f06ddb4cac">native_handle_type</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="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 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="a00258.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="a00258.html#4470e61c24c129a0299ca6c17240adbb">lock</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="a00258.html#4331652c79dea1c1131bd59ab161b234">try_lock</a> ()</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="a00258.html#5fc9ef443ae75d966695546be399cc6b">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="caf34349c0fbe7b44f1a2ca0a3150dd0"></a><!-- doxytag: member="tbb::mutex::native_handle" ref="caf34349c0fbe7b44f1a2ca0a3150dd0" args="()" -->
-<a class="el" href="a00258.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="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="a00258.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 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="a00259.html">scoped_lock</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The scoped locking pattern. <a href="a00259.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).
+Used to indicate that the final scan is being performed.
<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="a00499.html">mutex.h</a></ul>
+<hr>The documentation for this struct was generated from the following file:<ul>
+<li><a class="el" href="a00518.html">parallel_scan.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00259.html b/doc/html/a00259.html
index acd000a..bd90879 100644
--- a/doc/html/a00259.html
+++ b/doc/html/a00259.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::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,51 +21,28 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00258.html">mutex</a>::<a class="el" href="a00259.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="a00383.html">tbb</a>::<b>interface6</b>::<a class="el" href="a00259.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="a00499.html">mutex.h</a>></code>
+<code>#include <<a class="el" href="a00543.html">pipeline.h</a>></code>
<p>
-<a href="a00079.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"><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="a00259.html#1d403ae51b484df5d86d85ae38f11e6e">scoped_lock</a> ()</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="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="a00259.html#605a6b9af0f8cdabdf81825e0de99600">scoped_lock</a> (<a class="el" href="a00258.html">mutex</a> &<a class="el" href="a00258.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="a00259.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="a00259.html#862e022841cdc522e4296a5533b22efd">acquire</a> (<a class="el" href="a00258.html">mutex</a> &<a class="el" href="a00258.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="a00259.html#591e0c49b82bcedffcbe0923f1b915ec">try_acquire</a> (<a class="el" href="a00258.html">mutex</a> &<a class="el" href="a00258.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="a00259.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="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>
-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.
+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="a00499.html">mutex.h</a></ul>
+<li><a class="el" href="a00543.html">pipeline.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00260.html b/doc/html/a00260.html
index cfb1ce9..91ec502 100644
--- a/doc/html/a00260.html
+++ b/doc/html/a00260.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::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,39 +21,60 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00260.html">null_mutex</a></div>
-<h1>tbb::null_mutex Class Reference<br>
-<small>
-[<a class="el" href="a00374.html">Synchronization</a>]</small>
-</h1><!-- doxytag: class="tbb::null_mutex" -->A mutex which does nothing.
+<a class="el" href="a00383.html">tbb</a>::<b>flow</b>::<b>interface6</b>::<a class="el" href="a00260.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="a00501.html">null_mutex.h</a>></code>
+<code>#include <<a class="el" href="a00468.html">flow_graph.h</a>></code>
<p>
-<a href="a00080.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="a00260.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="a00263.html" alt="tbb::flow::interface6::graph_node" shape="rect" coords="0,0,368,24">
+</map>
+<a href="a00048.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 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="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="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="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="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="a00301.html">sender</a>< input_type > </td><td class="memItemRight" valign="bottom"><b>predecessor_type</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="a00261.html">scoped_lock</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="a00295.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="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="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="a00260.html#5c215b40e3daf73d1c6802ecb5aded6c">function_node</a> (<a class="el" href="a00262.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="a00260.html#d5132323fd2ac6a00ea0c78beda78723">function_node</a> (const <a class="el" href="a00260.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="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">Represents acquisition of a mutex. <a href="a00261.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="a00260.html">null_mutex</a> does no operation and simulates success.
+<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="a00501.html">null_mutex.h</a></ul>
+<li><a class="el" href="a00468.html">flow_graph.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00260.png b/doc/html/a00260.png
new file mode 100644
index 0000000..75bb777
Binary files /dev/null and b/doc/html/a00260.png differ
diff --git a/doc/html/a00261.html b/doc/html/a00261.html
index 4f7621e..6d5a273 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::null_mutex::scoped_lock Class 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,33 +21,69 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00260.html">null_mutex</a>::<a class="el" href="a00261.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="a00383.html">tbb</a>::<b>flow</b>::<b>interface6</b>::<a class="el" href="a00261.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="a00501.html">null_mutex.h</a>></code>
+<code>#include <<a class="el" href="a00468.html">flow_graph.h</a>></code>
<p>
-<a href="a00081.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<p>Inheritance diagram for tbb::flow::interface6::function_node< Input, Output, queueing, Allocator >:
+<p><center><img src="a00261.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="a00263.html" alt="tbb::flow::interface6::graph_node" shape="rect" coords="0,0,424,24">
+</map>
+<a href="a00049.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="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="a00260.html">null_mutex</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="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="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="8d8519eb42d5ddbba668a575b24a720a"></a><!-- doxytag: member="tbb::flow::interface6::function_node< Input, Output, queueing, Allocator >::predecessor_type" ref="8d8519eb42d5ddbba668a575b24a720a" args="" -->
+typedef <a class="el" href="a00301.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="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="a00260.html">null_mutex</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="a00295.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="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="a00260.html">null_mutex</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="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="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="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 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="a00261.html#5b9019c1e6e9b2c41c986a384bd179db">function_node</a> (<a class="el" href="a00262.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="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="a00261.html#01055081ed477714503820035db3a965">function_node</a> (const <a class="el" href="a00260.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="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>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-Represents acquisition of a mutex.
+<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>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00501.html">null_mutex.h</a></ul>
+<li><a class="el" href="a00468.html">flow_graph.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00261.png b/doc/html/a00261.png
new file mode 100644
index 0000000..349b919
Binary files /dev/null and b/doc/html/a00261.png differ
diff --git a/doc/html/a00262.html b/doc/html/a00262.html
index 684d1ea..f74449d 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::null_rw_mutex Class 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,39 +21,199 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00262.html">null_rw_mutex</a></div>
-<h1>tbb::null_rw_mutex Class Reference<br>
-<small>
-[<a class="el" href="a00374.html">Synchronization</a>]</small>
-</h1><!-- doxytag: class="tbb::null_rw_mutex" -->A rw mutex which does nothing.
+<a class="el" href="a00383.html">tbb</a>::<b>flow</b>::<b>interface6</b>::<a class="el" href="a00262.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="a00502.html">null_rw_mutex.h</a>></code>
+<code>#include <<a class="el" href="a00468.html">flow_graph.h</a>></code>
<p>
-<a href="a00082.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00044.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 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="a00262.html#4ab3d4b5208ece28c4c3ced647e26e12">graph</a> ()</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">Constructs a graph withy no nodes. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00262.html#8a7d424c0616a1c37a908ead182e2fe5">~graph</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">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="a00262.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="a00262.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="a00262.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="a00262.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="a00262.html#a66b0020f7514b86d030fa8aea073d37">wait_for_all</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Waits until the graph is idle and the number of decrement_wait_count calls equals the number of 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="a00311.html">task</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00262.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 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="a00263.html">scoped_lock</a></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>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Represents acquisition of a mutex. <a href="a00263.html#_details">More...</a><br></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-A rw mutex which does nothing.
+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 on the graph, deletes all of the nodes appended by calls to add, and then destroys the root task of the graph.
+</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">
+
+<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="a00262.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="a00262.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>
-A <a class="el" href="a00262.html">null_rw_mutex</a> is a rw mutex that does nothing and simulates successful operation.
+Waits until the graph is idle and the number of decrement_wait_count calls equals the number of 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="a00502.html">null_rw_mutex.h</a></ul>
+<li><a class="el" href="a00468.html">flow_graph.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00263.html b/doc/html/a00263.html
index fdf6e21..f52f173 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::null_rw_mutex::scoped_lock 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,39 +21,33 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00262.html">null_rw_mutex</a>::<a class="el" href="a00263.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 class="el" href="a00383.html">tbb</a>::<b>flow</b>::<b>interface6</b>::<a class="el" href="a00263.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. Allows them to be stored in a collection for deletion.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00502.html">null_rw_mutex.h</a>></code>
+<code>#include <<a class="el" href="a00468.html">flow_graph.h</a>></code>
<p>
-<a href="a00083.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="a00263.png" usemap="#tbb::flow::interface6::graph_node_map" border="0" alt=""></center>
+<map name="tbb::flow::interface6::graph_node_map">
+<area href="a00236.html" alt="tbb::flow::interface6::broadcast_node< T >" shape="rect" coords="552,56,1094,80">
+<area href="a00237.html" alt="tbb::flow::interface6::buffer_node< T, A >" shape="rect" coords="552,112,1094,136">
+<area href="a00252.html" alt="tbb::flow::interface6::continue_node< Output >" shape="rect" coords="552,168,1094,192">
+<area href="a00260.html" alt="tbb::flow::interface6::function_node< Input, Output,, Allocator >" shape="rect" coords="552,224,1094,248">
+<area href="a00261.html" alt="tbb::flow::interface6::function_node< Input, Output, queueing, Allocator >" shape="rect" coords="552,280,1094,304">
+<area href="a00266.html" alt="tbb::flow::interface6::limiter_node< T >" shape="rect" coords="552,336,1094,360">
+<area href="a00274.html" alt="tbb::flow::interface6::multioutput_function_node< Input, Output,, Allocator >" shape="rect" coords="552,392,1094,416">
+<area href="a00274.html" alt="tbb::flow::interface6::multioutput_function_node< TupleType, TupleType, rejecting, Allocator >" shape="rect" coords="552,448,1094,472">
+<area href="a00304.html" alt="tbb::flow::interface6::source_node< Output >" shape="rect" coords="552,504,1094,528">
+</map>
+<a href="a00039.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="a00262.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="a00262.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 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="a00262.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>
-
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-Represents acquisition of a mutex.
+The base of all graph nodes. Allows them to be stored in a collection for deletion.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00502.html">null_rw_mutex.h</a></ul>
+<li><a class="el" href="a00468.html">flow_graph.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00263.png b/doc/html/a00263.png
new file mode 100644
index 0000000..dc4610c
Binary files /dev/null and b/doc/html/a00263.png differ
diff --git a/doc/html/a00264.html b/doc/html/a00264.html
index 36e896b..49a65e4 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::parallel_do_feeder< Item > Class Template 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,39 +21,24 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00264.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="a00383.html">tbb</a>::<a class="el" href="a00264.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="a00503.html">parallel_do.h</a>></code>
+<code>#include <<a class="el" href="a00593.html">tbb_exception.h</a>></code>
<p>
-<a href="a00084.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00139.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="a00264.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="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="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>
-<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>
-
+Exception for PPL locks.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00503.html">parallel_do.h</a></ul>
+<li><a class="el" href="a00593.html">tbb_exception.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00265.html b/doc/html/a00265.html
index 20ed470..1fcde07 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::parallel_while< Body > Class Template 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,114 +21,24 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00265.html">parallel_while</a></div>
-<h1>tbb::parallel_while< Body > Class Template Reference<br>
-<small>
-[<a class="el" href="a00371.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="a00383.html">tbb</a>::<a class="el" href="a00265.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="a00537.html">parallel_while.h</a>></code>
+<code>#include <<a class="el" href="a00593.html">tbb_exception.h</a>></code>
<p>
-<a href="a00087.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00141.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="a00265.html#fa297e53d3af2a101e712bc200233e9c">value_type</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="a00265.html#36e26ba3880c7bcf804a97ba0cbe133f">parallel_while</a> ()</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="a00265.html#6fcfc973cc56b79c6d0fbb8a31be7e84">~parallel_while</a> ()</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="a00265.html#b32a0a6e5e09ebb7fad3e6652c19afe5">run</a> (Stream &stream, const Body &body)</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="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="a00265.html#e131c560057a58229992b61eb8dba4c6">add</a> (const <a class="el" href="a00265.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>
-<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="a00265.html">tbb::parallel_while</a>< Body >::add </td>
- <td>(</td>
- <td class="paramtype">const <a class="el" href="a00265.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="a00265.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.
+Exception for repeated scheduling of the same task_handle.
<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="a00537.html">parallel_while.h</a></ul>
+<li><a class="el" href="a00593.html">tbb_exception.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00266.html b/doc/html/a00266.html
index 20bed39..50c218a 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::pipeline 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,85 +21,117 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00266.html">pipeline</a></div>
-<h1>tbb::pipeline Class Reference<br>
-<small>
-[<a class="el" href="a00371.html">Algorithms</a>]</small>
-</h1><!-- doxytag: class="tbb::pipeline" -->A processing pipeline that applies filters to items.
+<a class="el" href="a00383.html">tbb</a>::<b>flow</b>::<b>interface6</b>::<a class="el" href="a00266.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="a00546.html">pipeline.h</a>></code>
+<code>#include <<a class="el" href="a00468.html">flow_graph.h</a>></code>
<p>
-<a href="a00095.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="a00266.png" usemap="#tbb::flow::interface6::limiter_node< T >_map" border="0" alt=""></center>
+<map name="tbb::flow::interface6::limiter_node< T >_map">
+<area href="a00263.html" alt="tbb::flow::interface6::graph_node" shape="rect" coords="0,0,226,24">
+<area href="a00295.html" alt="tbb::flow::interface6::receiver< T >" shape="rect" coords="236,0,462,24">
+<area href="a00301.html" alt="tbb::flow::interface6::sender< T >" shape="rect" coords="472,0,698,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 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="a00266.html#596dc3beba27099c4c8581cb419e1a59">pipeline</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="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="a00266.html#035196d3c9240ef041f528ebcde8baa7">input_type</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="a00266.html#49513c6c24f9d5bbbb27edca5efe01c9">~pipeline</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="a00266.html#6e67fc480147c0b88a483b85db6457b0">output_type</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="a00266.html#38fb5c9c8395dd6f89a4ae2011a83e0d">add_filter</a> (<a class="el" href="a00245.html">filter</a> &filter_)</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="a00301.html">sender</a>< <a class="el" href="a00266.html#035196d3c9240ef041f528ebcde8baa7">input_type</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00266.html#f89fcf44f38eb33f965ee5362d3e68e9">predecessor_type</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="a00266.html#f627616049b3fe36801f37ee40403ef8">run</a> (size_t max_number_of_live_tokens)</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="a00295.html">receiver</a>< <a class="el" href="a00266.html#6e67fc480147c0b88a483b85db6457b0">output_type</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00266.html#e8945e4dd6ea759ff9e4735da13f12ef">successor_type</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="a00266.html#93d7fec8cd607b803dd2d79fb46bd260">run</a> (size_t max_number_of_live_tokens, <a class="el" href="a00293.html">tbb::task_group_context</a> &context)</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="a00266.html#831b06576f46fe2bf3ed0f86b793c1b2">limiter_node</a> (<a class="el" href="a00262.html">graph</a> &g, size_t threshold, int num_decrement_predecessors=0)</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="a00266.html#2c84aef5b834b555ee220b176e25931e">clear</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="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="a00266.html#83d3ab884543b070ee5b345a87f241fa">limiter_node</a> (const <a class="el" href="a00266.html">limiter_node</a> &src)</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="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="a00266.html#c76561d8d871b4769876988a4de12a9b">register_successor</a> (<a class="el" href="a00295.html">receiver</a>< <a class="el" href="a00266.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="a00266.html#275e328063c121b3e506ccef2a825d28">remove_successor</a> (<a class="el" href="a00295.html">receiver</a>< <a class="el" href="a00266.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="a00266.html#55a02d458a4d8ffa6accd7a70605da2f">try_put</a> (const T &t)</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="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="a00266.html#de70a0e88ce7655d8c14b6af57f7496f">register_predecessor</a> (<a class="el" href="a00301.html">predecessor_type</a> &src)</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="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="a00266.html#c530e7b469454e2340460795f2da3317">remove_predecessor</a> (<a class="el" href="a00301.html">predecessor_type</a> &src)</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="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="a00266.html">limiter_node</a><<br>
+ T > > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00266.html#a3344b2461966631b6ee34b79fb105c7">decrement</a></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="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="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="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>
-A processing pipeline that applies filters to items.
+<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>Constructor & Destructor Documentation</h2>
-<a class="anchor" name="49513c6c24f9d5bbbb27edca5efe01c9"></a><!-- doxytag: member="tbb::pipeline::~pipeline" ref="49513c6c24f9d5bbbb27edca5efe01c9" args="()" -->
+<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">virtual __TBB_EXPORTED_METHOD tbb::pipeline::~pipeline </td>
+ <td class="memname">bool <a class="el" href="a00266.html">tbb::flow::interface6::limiter_node</a>< T >::remove_successor </td>
<td>(</td>
- <td class="paramname"> </td>
+ <td class="paramtype"><a class="el" href="a00295.html">receiver</a>< <a class="el" href="a00266.html#6e67fc480147c0b88a483b85db6457b0">output_type</a> > & </td>
+ <td class="paramname"> <em>r</em> </td>
<td> ) </td>
- <td width="100%"><code> [virtual]</code></td>
+ <td width="100%"><code> [inline, virtual]</code></td>
</tr>
</table>
</div>
<div class="memdoc">
<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.
+Removes a successor from this node.
+<p>
+r.remove_predecessor(*this) is also called.
+<p>
+Implements <a class="el" href="a00301.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="a00546.html">pipeline.h</a></ul>
+<li><a class="el" href="a00468.html">flow_graph.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00266.png b/doc/html/a00266.png
new file mode 100644
index 0000000..4eedec5
Binary files /dev/null and b/doc/html/a00266.png differ
diff --git a/doc/html/a00267.html b/doc/html/a00267.html
index 7ce5427..0c73575 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::pre_scan_tag Struct 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,27 +21,27 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00267.html">pre_scan_tag</a></div>
-<h1>tbb::pre_scan_tag Struct Reference<br>
-<small>
-[<a class="el" href="a00371.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>
+<a class="el" href="a00383.html">tbb</a>::<b>internal</b>::<a class="el" href="a00267.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="a00594.html">tbb_machine.h</a>></code>
<p>
-<code>#include <<a class="el" href="a00528.html">parallel_scan.h</a>></code>
-<p>
-<a href="a00085.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00155.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 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 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>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-Used to indicate that the initial scan is being performed.
+<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 struct was generated from the following file:<ul>
-<li><a class="el" href="a00528.html">parallel_scan.h</a></ul>
+<li><a class="el" href="a00594.html">tbb_machine.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00268.html b/doc/html/a00268.html
index 8cc1111..29c0de0 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::priority_queue_node< T, Compare > Class Template 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,103 +21,27 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00268.html">priority_queue_node</a></div>
-<h1>tbb::priority_queue_node< T, Compare > Class Template Reference</h1><!-- doxytag: class="tbb::priority_queue_node" --><!-- doxytag: inherits="tbb::buffer_node" -->Forwards messages in priority order.
-<a href="#_details">More...</a>
+<a class="el" href="a00383.html">tbb</a>::<b>internal</b>::<a class="el" href="a00268.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="a00594.html">tbb_machine.h</a>></code>
<p>
-<code>#include <<a class="el" href="a00466.html">graph.h</a>></code>
-<p>
-<p>Inheritance diagram for tbb::priority_queue_node< T, Compare >:
-<p><center><img src="a00268.png" usemap="#tbb::priority_queue_node< T, Compare >_map" border="0" alt=""></center>
-<map name="tbb::priority_queue_node< T, Compare >_map">
-<area href="a00225.html" alt="tbb::buffer_node< T >" shape="rect" coords="252,56,494,80">
-<area href="a00251.html" alt="tbb::graph_node" shape="rect" coords="0,0,242,24">
-<area href="a00277.html" alt="tbb::receiver< T >" shape="rect" coords="252,0,494,24">
-<area href="a00282.html" alt="tbb::sender< T >" shape="rect" coords="504,0,746,24">
-</map>
-<a href="a00060.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="40fdedd4829aeae3ebd1a5fdaf39b23d"></a><!-- doxytag: member="tbb::priority_queue_node::input_type" ref="40fdedd4829aeae3ebd1a5fdaf39b23d" args="" -->
-typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00268.html#40fdedd4829aeae3ebd1a5fdaf39b23d">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="3b3fa4479416e7cb6d4a6a4b175c2b15"></a><!-- doxytag: member="tbb::priority_queue_node::output_type" ref="3b3fa4479416e7cb6d4a6a4b175c2b15" args="" -->
-typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00268.html#3b3fa4479416e7cb6d4a6a4b175c2b15">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="98900a87758cac05500fcbc74113cebf"></a><!-- doxytag: member="tbb::priority_queue_node::predecessor_type" ref="98900a87758cac05500fcbc74113cebf" args="" -->
-typedef <a class="el" href="a00282.html">sender</a>< <a class="el" href="a00268.html#40fdedd4829aeae3ebd1a5fdaf39b23d">input_type</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00268.html#98900a87758cac05500fcbc74113cebf">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="e01014f2e5ceea292c68f6fe47391c57"></a><!-- doxytag: member="tbb::priority_queue_node::successor_type" ref="e01014f2e5ceea292c68f6fe47391c57" args="" -->
-typedef <a class="el" href="a00277.html">receiver</a>< <a class="el" href="a00268.html#3b3fa4479416e7cb6d4a6a4b175c2b15">output_type</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00268.html#e01014f2e5ceea292c68f6fe47391c57">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="1630f68674c4b201346a391b1e8d3f5d"></a><!-- doxytag: member="tbb::priority_queue_node::priority_queue_node" ref="1630f68674c4b201346a391b1e8d3f5d" args="(graph &g)" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00268.html#1630f68674c4b201346a391b1e8d3f5d">priority_queue_node</a> (<a class="el" href="a00250.html">graph</a> &g)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">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="de11b7abff98005607d7fa7466faf7b0"></a><!-- doxytag: member="tbb::priority_queue_node::size_type" ref="de11b7abff98005607d7fa7466faf7b0" args="" -->
-typedef <a class="el" href="a00225.html">buffer_node</a>< T <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="9e233a0b91aa4622406999f82f275658"></a><!-- doxytag: member="tbb::priority_queue_node::item_type" ref="9e233a0b91aa4622406999f82f275658" args="" -->
-typedef <a class="el" href="a00225.html">buffer_node</a>< T <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="9da8c5e1d88446a861aaaf833dff9563"></a><!-- doxytag: member="tbb::priority_queue_node::prio_operation" ref="9da8c5e1d88446a861aaaf833dff9563" args="" -->
-typedef <a class="el" href="a00225.html">buffer_node</a>< T <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="d735772d27a4946170769b4a44fc62c2164d37794dce6b5f579b76189b6c0021"></a><!-- doxytag: member="tbb::priority_queue_node::WAIT" ref="d735772d27a4946170769b4a44fc62c2164d37794dce6b5f579b76189b6c0021" 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="d735772d27a4946170769b4a44fc62c2b65b5f4fbcf64463d6db76340f7813b6"></a><!-- doxytag: member="tbb::priority_queue_node::SUCCEEDED" ref="d735772d27a4946170769b4a44fc62c2b65b5f4fbcf64463d6db76340f7813b6" 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="d735772d27a4946170769b4a44fc62c211ee259c9aa9cc587e0e16386f14ce31"></a><!-- doxytag: member="tbb::priority_queue_node::FAILED" ref="d735772d27a4946170769b4a44fc62c211ee259c9aa9cc587e0e16386f14ce31" 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>Protected Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="89ea37a545db6d58f0efba624c5478e5"></a><!-- doxytag: member="tbb::priority_queue_node::handle_operations" ref="89ea37a545db6d58f0efba624c5478e5" 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="79161e73f79cc43b2c2b08367504dfda"></a><!-- doxytag: member="tbb::priority_queue_node::internal_forward" ref="79161e73f79cc43b2c2b08367504dfda" args="(prio_operation *op)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00268.html#79161e73f79cc43b2c2b08367504dfda">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="baf920c99c8b5cdb3274e69180d38721"></a><!-- doxytag: member="tbb::priority_queue_node::internal_push" ref="baf920c99c8b5cdb3274e69180d38721" 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="9ad1406abcb8944fce20fdffc536b802"></a><!-- doxytag: member="tbb::priority_queue_node::internal_pop" ref="9ad1406abcb8944fce20fdffc536b802" 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="2679c01cb715be0fa27daef8ca7abcd6"></a><!-- doxytag: member="tbb::priority_queue_node::internal_reserve" ref="2679c01cb715be0fa27daef8ca7abcd6" 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="f622ca82a370e324131d129007989f17"></a><!-- doxytag: member="tbb::priority_queue_node::internal_consume" ref="f622ca82a370e324131d129007989f17" args="(prio_operation *op)" -->
-void </td><td class="memItemRight" valign="bottom"><b>internal_consume</b> (prio_operation *op)</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="b72aaba1fed1691779f695b6aa052073"></a><!-- doxytag: member="tbb::priority_queue_node::internal_release" ref="b72aaba1fed1691779f695b6aa052073" 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="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>
-<h3>template<typename T, typename Compare = std::less<T>><br>
- class tbb::priority_queue_node< T, Compare ></h3>
+<h3>template<typename T><br>
+ struct tbb::internal::machine_load_store_seq_cst< T, 8 ></h3>
-Forwards messages in priority order.
+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="a00466.html">graph.h</a></ul>
+<hr>The documentation for this struct was generated from the following file:<ul>
+<li><a class="el" href="a00594.html">tbb_machine.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00268.png b/doc/html/a00268.png
deleted file mode 100644
index 55c8b1f..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 dec2744..05e37b2 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::queue_node< T > 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,91 +21,32 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00269.html">queue_node</a></div>
-<h1>tbb::queue_node< T > Class Template Reference</h1><!-- doxytag: class="tbb::queue_node" --><!-- doxytag: inherits="tbb::buffer_node" -->Forwards messages in FIFO order.
+<a class="el" href="a00383.html">tbb</a>::<b>interface6</b>::<a class="el" href="a00269.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="a00466.html">graph.h</a>></code>
+<code>#include <<a class="el" href="a00480.html">memory_pool.h</a>></code>
<p>
-<p>Inheritance diagram for tbb::queue_node< T >:
-<p><center><img src="a00269.png" usemap="#tbb::queue_node< T >_map" border="0" alt=""></center>
-<map name="tbb::queue_node< T >_map">
-<area href="a00225.html" alt="tbb::buffer_node< T >" shape="rect" coords="170,56,330,80">
-<area href="a00251.html" alt="tbb::graph_node" shape="rect" coords="0,0,160,24">
-<area href="a00277.html" alt="tbb::receiver< T >" shape="rect" coords="170,0,330,24">
-<area href="a00282.html" alt="tbb::sender< T >" shape="rect" coords="340,0,500,24">
-<area href="a00283.html" alt="tbb::sequencer_node< T >" shape="rect" coords="170,168,330,192">
-</map>
-<a href="a00058.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00072.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="27016487003a4ff2908748c3cf11c1fe"></a><!-- doxytag: member="tbb::queue_node::input_type" ref="27016487003a4ff2908748c3cf11c1fe" args="" -->
-typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00269.html#27016487003a4ff2908748c3cf11c1fe">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="d227f122eebe2f9489ba763ff24fd6fb"></a><!-- doxytag: member="tbb::queue_node::output_type" ref="d227f122eebe2f9489ba763ff24fd6fb" args="" -->
-typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00269.html#d227f122eebe2f9489ba763ff24fd6fb">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="83bc7308a38f1d205377d78ec14931d1"></a><!-- doxytag: member="tbb::queue_node::predecessor_type" ref="83bc7308a38f1d205377d78ec14931d1" args="" -->
-typedef <a class="el" href="a00282.html">sender</a>< <a class="el" href="a00269.html#27016487003a4ff2908748c3cf11c1fe">input_type</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00269.html#83bc7308a38f1d205377d78ec14931d1">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="c3b1d76b66b1292f6a1b6dae52c67a0e"></a><!-- doxytag: member="tbb::queue_node::successor_type" ref="c3b1d76b66b1292f6a1b6dae52c67a0e" args="" -->
-typedef <a class="el" href="a00277.html">receiver</a>< <a class="el" href="a00269.html#d227f122eebe2f9489ba763ff24fd6fb">output_type</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00269.html#c3b1d76b66b1292f6a1b6dae52c67a0e">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="1564c6bf9573b13d6854b0e8f7ce2b68"></a><!-- doxytag: member="tbb::queue_node::queue_node" ref="1564c6bf9573b13d6854b0e8f7ce2b68" args="(graph &g)" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00269.html#1564c6bf9573b13d6854b0e8f7ce2b68">queue_node</a> (<a class="el" href="a00250.html">graph</a> &g)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">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="0e7be2008c0a07209fbf44e50f644615"></a><!-- doxytag: member="tbb::queue_node::size_type" ref="0e7be2008c0a07209fbf44e50f644615" args="" -->
-typedef <a class="el" href="a00225.html">buffer_node</a>< T <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="f68f9d697f8dc5304db1e2890b1c6706"></a><!-- doxytag: member="tbb::queue_node::queue_operation" ref="f68f9d697f8dc5304db1e2890b1c6706" args="" -->
-typedef <a class="el" href="a00225.html">buffer_node</a>< T <br>
->::buffer_operation </td><td class="memItemRight" valign="bottom"><b>queue_operation</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1003f4ce06f418a04dfb1e4ba782a074ad957ef8596b42f852dac7c3efc00fe0"></a><!-- doxytag: member="tbb::queue_node::WAIT" ref="1003f4ce06f418a04dfb1e4ba782a074ad957ef8596b42f852dac7c3efc00fe0" 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="1003f4ce06f418a04dfb1e4ba782a074db31905871417f86773801713c507df9"></a><!-- doxytag: member="tbb::queue_node::SUCCEEDED" ref="1003f4ce06f418a04dfb1e4ba782a074db31905871417f86773801713c507df9" 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="1003f4ce06f418a04dfb1e4ba782a0748dcea56812e8c7a7ae1dd26404bc2d05"></a><!-- doxytag: member="tbb::queue_node::FAILED" ref="1003f4ce06f418a04dfb1e4ba782a0748dcea56812e8c7a7ae1dd26404bc2d05" 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>Protected Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fb58bac5ac355e5134c51125e601fa2a"></a><!-- doxytag: member="tbb::queue_node::internal_forward" ref="fb58bac5ac355e5134c51125e601fa2a" args="(queue_operation *op)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00269.html#fb58bac5ac355e5134c51125e601fa2a">internal_forward</a> (queue_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="6ea932194502a5e3a02f4aad24820f60"></a><!-- doxytag: member="tbb::queue_node::internal_pop" ref="6ea932194502a5e3a02f4aad24820f60" 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="017f4ba18079116367e856e2f0eb42e9"></a><!-- doxytag: member="tbb::queue_node::internal_reserve" ref="017f4ba18079116367e856e2f0eb42e9" 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="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="a00269.html#2822528265718a4c779591fc37c02ca8">memory_pool</a> (const Alloc &src=Alloc())</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7bac37b32f69f4731195f7da1e4524d7"></a><!-- doxytag: member="tbb::queue_node::internal_consume" ref="7bac37b32f69f4731195f7da1e4524d7" args="(queue_operation *op)" -->
-void </td><td class="memItemRight" valign="bottom"><b>internal_consume</b> (queue_operation *op)</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="a00269.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 T><br>
- class tbb::queue_node< T ></h3>
+<h3>template<typename Alloc><br>
+ class tbb::interface6::memory_pool< Alloc ></h3>
-Forwards messages in FIFO order.
+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="a00466.html">graph.h</a></ul>
+<li><a class="el" href="a00480.html">memory_pool.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00269.png b/doc/html/a00269.png
deleted file mode 100644
index c2da07b..0000000
Binary files a/doc/html/a00269.png and /dev/null differ
diff --git a/doc/html/a00270.html b/doc/html/a00270.html
index 6824b2a..d3b2b28 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::queuing_mutex Class 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,49 +21,109 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00270.html">queuing_mutex</a></div>
-<h1>tbb::queuing_mutex Class Reference<br>
+<a class="el" href="a00383.html">tbb</a>::<b>interface6</b>::<a class="el" href="a00270.html">memory_pool_allocator</a></div>
+<h1>tbb::interface6::memory_pool_allocator< T, P > Class Template Reference<br>
<small>
-[<a class="el" href="a00374.html">Synchronization</a>]</small>
-</h1><!-- doxytag: class="tbb::queuing_mutex" -->Queuing lock with local-only spinning.
+[<a class="el" href="a00397.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="a00560.html">queuing_mutex.h</a>></code>
+<code>#include <<a class="el" href="a00480.html">memory_pool.h</a>></code>
<p>
-<a href="a00098.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="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="b389ad9c4db7293e4bdb5b8cda69ec04"></a><!-- doxytag: member="tbb::queuing_mutex::queuing_mutex" ref="b389ad9c4db7293e4bdb5b8cda69ec04" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00270.html#b389ad9c4db7293e4bdb5b8cda69ec04">queuing_mutex</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="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="a00270.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="a00270.html">memory_pool_allocator</a>< U, P > &src) 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="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="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 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="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="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="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="a00270.html#365bd64d284c80d85bb2149a12681526">allocate</a> (size_type n, const void *=0)</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">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="a00270.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="a00270.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="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c7e1671b725894b94ce9a6ac544e24f2"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator::construct" ref="c7e1671b725894b94ce9a6ac544e24f2" args="(pointer p, const value_type &value)" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00270.html#c7e1671b725894b94ce9a6ac544e24f2">construct</a> (pointer p, const value_type &value)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Copy-construct value at location pointed to by p. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a3af27e1f8535cc512134ec9a82ff4fc"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator::destroy" ref="a3af27e1f8535cc512134ec9a82ff4fc" args="(pointer p)" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00270.html#a3af27e1f8535cc512134ec9a82ff4fc">destroy</a> (pointer p)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroy 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="a36f15b770a1bb0b56e33d7fa75ebd1a"></a><!-- doxytag: member="tbb::queuing_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="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="a00270.html">memory_pool_allocator</a>< V, R > &a, const <a class="el" href="a00270.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="a00270.html">memory_pool_allocator</a>< V, R > &a, const <a class="el" href="a00270.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">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00271.html">scoped_lock</a></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">The scoped locking pattern. <a href="a00271.html#_details">More...</a><br></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-Queuing lock with local-only spinning.
+<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>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00560.html">queuing_mutex.h</a></ul>
+<li><a class="el" href="a00480.html">memory_pool.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00271.html b/doc/html/a00271.html
index 298e651..fdb5806 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::queuing_mutex::scoped_lock 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,68 +21,69 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00270.html">queuing_mutex</a>::<a class="el" href="a00271.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="a00383.html">tbb</a>::<b>interface6</b>::<a class="el" href="a00271.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="a00397.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="a00560.html">queuing_mutex.h</a>></code>
+<code>#include <<a class="el" href="a00480.html">memory_pool.h</a>></code>
<p>
-<a href="a00099.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<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="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"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00271.html#db0fa3967491014572e24d6607bdc971">scoped_lock</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="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="a00270.html">memory_pool_allocator</a> &src) throw ()</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="a00271.html#9b51ef972f5618ac17caadb58841ab6d">scoped_lock</a> (<a class="el" href="a00270.html">queuing_mutex</a> &m)</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="a00270.html">memory_pool_allocator</a>< U, P > &src) throw ()</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="a00271.html#ac2c576a93570957d694192a5f491443">~scoped_lock</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="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="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="a00271.html#533e4fc8355ee321206a0609c42d909d">acquire</a> (<a class="el" href="a00270.html">queuing_mutex</a> &m)</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="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="a00271.html#e5a014fb817599386a87170cf2cf51a9">try_acquire</a> (<a class="el" href="a00270.html">queuing_mutex</a> &m)</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="a00270.html">memory_pool_allocator</a>< V, R > &a, const <a class="el" href="a00270.html">memory_pool_allocator</a>< U, R > &b)</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="a00271.html#3bf2b8c87ff22115be9b2eac179f2d30">release</a> ()</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="a00270.html">memory_pool_allocator</a>< V, R > &a, const <a class="el" href="a00270.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="mdescLeft"> </td><td class="mdescRight">Release lock. <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">
+<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>
-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="a00560.html">queuing_mutex.h</a></ul>
+<li><a class="el" href="a00480.html">memory_pool.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00272.html b/doc/html/a00272.html
index ef65cd2..6a898d6 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::queuing_rw_mutex 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,55 +21,24 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00272.html">queuing_rw_mutex</a></div>
-<h1>tbb::queuing_rw_mutex Class Reference<br>
-<small>
-[<a class="el" href="a00374.html">Synchronization</a>]</small>
-</h1><!-- doxytag: class="tbb::queuing_rw_mutex" -->Reader-writer lock with local-only spinning.
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00272.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="a00561.html">queuing_rw_mutex.h</a>></code>
+<code>#include <<a class="el" href="a00593.html">tbb_exception.h</a>></code>
<p>
-<a href="a00100.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00140.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="a00272.html#85c90877c3447690ac4e2ac4ff8dea5e">queuing_rw_mutex</a> ()</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="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="a00272.html#1ba73e3d95cfdf8323880bc623af9099">~queuing_rw_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 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="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>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a36f15b770a1bb0b56e33d7fa75ebd1a"></a><!-- doxytag: member="tbb::queuing_rw_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="a00273.html">scoped_lock</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The scoped locking pattern. <a href="a00273.html#_details">More...</a><br></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-Reader-writer lock 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>
+Exception for missing wait on structured_task_group.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00561.html">queuing_rw_mutex.h</a></ul>
+<li><a class="el" href="a00593.html">tbb_exception.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00273.html b/doc/html/a00273.html
index c760ba3..b7a6db8 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::queuing_rw_mutex::scoped_lock Class 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,97 +21,145 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00272.html">queuing_rw_mutex</a>::<a class="el" href="a00273.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="a00383.html">tbb</a>::<a class="el" href="a00273.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="a00561.html">queuing_rw_mutex.h</a>></code>
+<code>#include <<a class="el" href="a00593.html">tbb_exception.h</a>></code>
<p>
-<a href="a00101.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="a00273.png" usemap="#tbb::movable_exception< ExceptionData >_map" border="0" alt=""></center>
+<map name="tbb::movable_exception< ExceptionData >_map">
+<area href="a00319.html" alt="tbb::tbb_exception" shape="rect" coords="0,0,248,24">
+</map>
+<a href="a00144.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="a00273.html#c62e365be7bcbba091c9ea7454a4d22c">scoped_lock</a> ()</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="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="a00273.html#fbb8798792d3aebb136c46fc63d2529e">scoped_lock</a> (<a class="el" href="a00272.html">queuing_rw_mutex</a> &m, bool write=true)</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="a00273.html">movable_exception</a> &src) throw ()</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="a00273.html#32c7d67a660d23ebbaab1a1d2826d31a">~scoped_lock</a> ()</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="a00273.html">movable_exception</a> & </td><td class="memItemRight" valign="bottom"><b>operator=</b> (const <a class="el" href="a00273.html">movable_exception</a> &src)</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="a00273.html#a8dd5ab8686e76de21587544dbb681e0">acquire</a> (<a class="el" href="a00272.html">queuing_rw_mutex</a> &m, bool write=true)</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="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="a00273.html#2e4ff6c9ec2fee6682f95290d1f42baa">try_acquire</a> (<a class="el" href="a00272.html">queuing_rw_mutex</a> &m, bool write=true)</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="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="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="a00273.html#67ae221109ddc69510ab593874e435d4">release</a> ()</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="a00273.html#bc5f5c4739b17ac5211ac58226c2f5a5">name</a> () const throw ()</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="a00273.html#11ba1da4a722c9e6f73339a52c487e82">upgrade_to_writer</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="b33a89bccf0c63106f1270c7bfaaf54f"></a><!-- doxytag: member="tbb::movable_exception::what" ref="b33a89bccf0c63106f1270c7bfaaf54f" args="() const " -->
+const char * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00273.html#b33a89bccf0c63106f1270c7bfaaf54f">what</a> () const throw ()</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="a00273.html#0d2f93edf7b15ec4bcee138823220c52">downgrade_to_reader</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns the result of originally intercepted exception's <a class="el" href="a00273.html#b33a89bccf0c63106f1270c7bfaaf54f">what()</a> method. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="a00273.html">movable_exception</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00273.html#1aea0ad179d6f0481fe7f3495f66adf9">move</a> () throw ()</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">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="a00273.html#7a46873119d9f85a7b0009c13e41a258">destroy</a> () throw ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroys objects created by the <a class="el" href="a00273.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="a00273.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="a00273.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>
-The scoped locking pattern.
+<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>
-It helps to avoid the common problem of forgetting to release lock. It also nicely provides the "node" for queuing locks.
+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="a00319.html">tbb::tbb_exception</a> </dd></dl>
+
<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="()" -->
+<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">tbb::queuing_rw_mutex::scoped_lock::scoped_lock </td>
+ <td class="memname">void <a class="el" href="a00273.html">tbb::movable_exception</a>< ExceptionData >::destroy </td>
<td>(</td>
<td class="paramname"> </td>
<td> ) </td>
- <td width="100%"><code> [inline]</code></td>
+ <td width="100%"> throw ()<code> [inline, virtual]</code></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>
-Construct lock that has not acquired a mutex.
+Destroys objects created by the <a class="el" href="a00273.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>
-Equivalent to zero-initialization of *this.
+Implements <a class="el" href="a00319.html#66c94938eca8bf88b76f3eccaaf215d8">tbb::tbb_exception</a>.
</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="()" -->
+<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="a00273.html">movable_exception</a>* <a class="el" href="a00273.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="a00319.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">bool tbb::queuing_rw_mutex::scoped_lock::upgrade_to_writer </td>
+ <td class="memname">void <a class="el" href="a00273.html">tbb::movable_exception</a>< ExceptionData >::throw_self </td>
<td>(</td>
<td class="paramname"> </td>
<td> ) </td>
- <td width="100%"></td>
+ <td width="100%"><code> [inline, virtual]</code></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>
-Upgrade reader to become a writer.
+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>
-Returns true if the upgrade happened without re-acquiring the lock and false if opposite
+Implements <a class="el" href="a00319.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="a00561.html">queuing_rw_mutex.h</a></ul>
+<li><a class="el" href="a00593.html">tbb_exception.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00257.png b/doc/html/a00273.png
similarity index 100%
rename from doc/html/a00257.png
rename to doc/html/a00273.png
diff --git a/doc/html/a00274.html b/doc/html/a00274.html
index 141f667..8623998 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::interface5::reader_writer_lock Class Reference</title>
+<title>tbb::flow::interface6::multioutput_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,195 +21,45 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<b>interface5</b>::<a class="el" href="a00274.html">reader_writer_lock</a></div>
-<h1>tbb::interface5::reader_writer_lock Class Reference<br>
-<small>
-[<a class="el" href="a00374.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="a00383.html">tbb</a>::<b>flow</b>::<b>interface6</b>::<a class="el" href="a00274.html">multioutput_function_node</a></div>
+<h1>tbb::flow::interface6::multioutput_function_node< Input, Output,, Allocator > Class Template Reference</h1><!-- doxytag: class="tbb::flow::interface6::multioutput_function_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="a00562.html">reader_writer_lock.h</a>></code>
+<code>#include <<a class="el" href="a00468.html">flow_graph.h</a>></code>
<p>
-<a href="a00102.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<p>Inheritance diagram for tbb::flow::interface6::multioutput_function_node< Input, Output,, Allocator >:
+<p><center><img src="a00274.png" usemap="#tbb::flow::interface6::multioutput_function_node< Input, Output,, Allocator >_map" border="0" alt=""></center>
+<map name="tbb::flow::interface6::multioutput_function_node< Input, Output,, Allocator >_map">
+<area href="a00263.html" alt="tbb::flow::interface6::graph_node" shape="rect" coords="0,0,434,24">
+</map>
+<a href="a00050.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="caf2ee1047fb85e2b4b02afe7877c385"></a><!-- doxytag: member="tbb::flow::interface6::multioutput_function_node::input_type" ref="caf2ee1047fb85e2b4b02afe7877c385" 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="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="c49aae50bb04b3439e6e88bf449a01a9"></a><!-- doxytag: member="tbb::flow::interface6::multioutput_function_node::ports_type" ref="c49aae50bb04b3439e6e88bf449a01a9" args="" -->
+typedef internal::wrap_tuple_elements<<br>
+ N, internal::function_output,<br>
+ Output >::type </td><td class="memItemRight" valign="bottom"><b>ports_type</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="a00274.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="a00274.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="a00274.html#c1431c4293e777efd9aab9a95c2a46e1">reader_writer_lock</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Constructs a new <a class="el" href="a00274.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="a00274.html#5135f64f7b7339017f33d956445edbee">~reader_writer_lock</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Destructs a <a class="el" href="a00274.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="a00274.html#2653d1a2d560059a51219a8ceab3ade9">lock</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquires the <a class="el" href="a00274.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="a00274.html#721eb173e154ab38292273e9266a9b07">try_lock</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Tries to acquire the <a class="el" href="a00274.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="a00274.html#d9d16a24d9f6c3dada73c6b9ff214f5b">lock_read</a> ()</td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="6054e8a5fe0159b5ec04c2a06687310c"></a><!-- doxytag: member="tbb::flow::interface6::multioutput_function_node::multioutput_function_node" ref="6054e8a5fe0159b5ec04c2a06687310c" 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>multioutput_function_node</b> (<a class="el" href="a00262.html">graph</a> &g, size_t concurrency, Body body)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquires the <a class="el" href="a00274.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="a00274.html#595fb23952e3b89426b1f7938dea9b11">try_lock_read</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="57f90e91362c343e4e80e2f305851220"></a><!-- doxytag: member="tbb::flow::interface6::multioutput_function_node::multioutput_function_node" ref="57f90e91362c343e4e80e2f305851220" args="(const multioutput_function_node &other)" -->
+ </td><td class="memItemRight" valign="bottom"><b>multioutput_function_node</b> (const <a class="el" href="a00274.html">multioutput_function_node</a> &other)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Tries to acquire the <a class="el" href="a00274.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="a00274.html#5113b32689305599b2c36b5831547704">unlock</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Releases the <a class="el" href="a00274.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="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="a00275.html">scoped_lock</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The scoped lock pattern for write locks. <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">scoped_lock_read</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The scoped lock pattern for read locks. <a href="a00276.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="a00274.html#6f921f0d7c1812ceb5674418c8b6ccaf">tbb::interface5::reader_writer_lock::status_t</a> </td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
+<h3>template<typename Input, typename Output, graph_buffer_policy = queueing, typename Allocator = cache_aligned_allocator<Input>><br>
+ class tbb::flow::interface6::multioutput_function_node< Input, Output,, Allocator ></h3>
+implements a function node that supports Input -> (set of outputs)
<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="a00275.html">scoped_lock</a> status:<p>
-waiting ----------> waiting_nonblocking | _____________/ | V V V active -----------------> invalid<p>
-State diagram for <a class="el" href="a00276.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="a00274.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="a00252.html">improper_lock</a> The context tries to acquire a <a class="el" href="a00274.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="a00274.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="a00252.html">improper_lock</a> The context tries to acquire a <a class="el" href="a00274.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="a00274.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="a00274.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="a00274.html">reader_writer_lock</a> for read.
-<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="a00562.html">reader_writer_lock.h</a></ul>
+<li><a class="el" href="a00468.html">flow_graph.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00274.png b/doc/html/a00274.png
new file mode 100644
index 0000000..f84a6bc
Binary files /dev/null and b/doc/html/a00274.png differ
diff --git a/doc/html/a00275.html b/doc/html/a00275.html
index 1b98338..c24ca20 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::interface5::reader_writer_lock::scoped_lock Class 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,41 +21,110 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<b>interface5</b>::<a class="el" href="a00274.html">reader_writer_lock</a>::<a class="el" href="a00275.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="a00383.html">tbb</a>::<a class="el" href="a00275.html">mutex</a></div>
+<h1>tbb::mutex Class Reference<br>
+<small>
+[<a class="el" href="a00398.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="a00562.html">reader_writer_lock.h</a>></code>
+<code>#include <<a class="el" href="a00487.html">mutex.h</a>></code>
<p>
-<a href="a00103.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="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="a00275.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="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="a00275.html#cf19f20e082887c1bb0ba6b0911c3583">scoped_lock</a> (<a class="el" href="a00274.html">reader_writer_lock</a> &lock)</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="a00275.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="a00275.html#4470e61c24c129a0299ca6c17240adbb">lock</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="a00275.html#4331652c79dea1c1131bd59ab161b234">try_lock</a> ()</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="a00275.html#70246e0260493625ff956fa5926fc71f">~scoped_lock</a> ()</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="a00275.html#5fc9ef443ae75d966695546be399cc6b">unlock</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">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="a00275.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="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="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="a00275.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 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="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="a00276.html">scoped_lock</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The scoped locking pattern. <a href="a00276.html#_details">More...</a><br></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-The scoped lock pattern for write locks.
+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>
-Scoped locks help avoid the common problem of forgetting to release the lock. This type is also serves as the node for queuing locks.
+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="a00562.html">reader_writer_lock.h</a></ul>
+<li><a class="el" href="a00487.html">mutex.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00276.html b/doc/html/a00276.html
index cb8c4ab..efdbef7 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::interface5::reader_writer_lock::scoped_lock_read 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,39 +21,51 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<b>interface5</b>::<a class="el" href="a00274.html">reader_writer_lock</a>::<a class="el" href="a00276.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="a00383.html">tbb</a>::<a class="el" href="a00275.html">mutex</a>::<a class="el" href="a00276.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="a00562.html">reader_writer_lock.h</a>></code>
+<code>#include <<a class="el" href="a00487.html">mutex.h</a>></code>
<p>
-<a href="a00104.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00075.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="a00276.html#87ab0dc8f7216e6ba0f7acd6aec33064">scoped_lock_read</a> (<a class="el" href="a00274.html">reader_writer_lock</a> &lock)</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="a00276.html#1d403ae51b484df5d86d85ae38f11e6e">scoped_lock</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="a00276.html#bd21c5f3d555d64d1de8658e15bf4966">~scoped_lock_read</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="a00276.html#605a6b9af0f8cdabdf81825e0de99600">scoped_lock</a> (<a class="el" href="a00275.html">mutex</a> &<a class="el" href="a00275.html">mutex</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">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="a00276.html#0ebbbecaf4311e9df7362cb76ceaa368">~scoped_lock</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">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="a00276.html#862e022841cdc522e4296a5533b22efd">acquire</a> (<a class="el" href="a00275.html">mutex</a> &<a class="el" href="a00275.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="a00276.html#591e0c49b82bcedffcbe0923f1b915ec">try_acquire</a> (<a class="el" href="a00275.html">mutex</a> &<a class="el" href="a00275.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="a00276.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="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="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>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-The scoped lock pattern for read locks.
+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="a00562.html">reader_writer_lock.h</a></ul>
+<li><a class="el" href="a00487.html">mutex.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00277.html b/doc/html/a00277.html
index 8ed75e7..b0bc02e 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::receiver< T > Class Template 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,61 +21,39 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00277.html">receiver</a></div>
-<h1>tbb::receiver< T > Class Template Reference</h1><!-- doxytag: class="tbb::receiver" -->Pure virtual template class that defines a receiver of messages of type T.
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00277.html">null_mutex</a></div>
+<h1>tbb::null_mutex Class Reference<br>
+<small>
+[<a class="el" href="a00398.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="a00466.html">graph.h</a>></code>
+<code>#include <<a class="el" href="a00489.html">null_mutex.h</a>></code>
<p>
-<p>Inheritance diagram for tbb::receiver< T >:
-<p><center><img src="a00277.png" usemap="#tbb::receiver< T >_map" border="0" alt=""></center>
-<map name="tbb::receiver< T >_map">
-<area href="a00224.html" alt="tbb::broadcast_node< T >" shape="rect" coords="0,56,242,80">
-<area href="a00225.html" alt="tbb::buffer_node< T >" shape="rect" coords="252,56,494,80">
-<area href="a00241.html" alt="tbb::continue_receiver" shape="rect" coords="504,56,746,80">
-<area href="a00304.html" alt="tbb::internal::two_phase_port< T >" shape="rect" coords="756,56,998,80">
-<area href="a00255.html" alt="tbb::limiter_node< T >" shape="rect" coords="1008,56,1250,80">
-<area href="a00268.html" alt="tbb::priority_queue_node< T, Compare >" shape="rect" coords="126,112,368,136">
-<area href="a00269.html" alt="tbb::queue_node< T >" shape="rect" coords="378,112,620,136">
-<area href="a00283.html" alt="tbb::sequencer_node< T >" shape="rect" coords="378,168,620,192">
-</map>
-<a href="a00043.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<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="9cfd5ef0d67d5bbfb5f9a76d75e62765"></a><!-- doxytag: member="tbb::receiver::input_type" ref="9cfd5ef0d67d5bbfb5f9a76d75e62765" args="" -->
-typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00277.html#9cfd5ef0d67d5bbfb5f9a76d75e62765">input_type</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">The input type of this receiver. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c802c845b51c6d129153b684d33f7310"></a><!-- doxytag: member="tbb::receiver::predecessor_type" ref="c802c845b51c6d129153b684d33f7310" args="" -->
-typedef <a class="el" href="a00282.html">sender</a>< T > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00277.html#c802c845b51c6d129153b684d33f7310">predecessor_type</a></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">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="18f74b83abae0ee1e4ce07942797ef27"></a><!-- doxytag: member="tbb::receiver::~receiver" ref="18f74b83abae0ee1e4ce07942797ef27" args="()" -->
-virtual </td><td class="memItemRight" valign="bottom"><a class="el" href="a00277.html#18f74b83abae0ee1e4ce07942797ef27">~receiver</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">Destructor. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6e5422b03b4570138f227b3d5d0073b8"></a><!-- doxytag: member="tbb::receiver::try_put" ref="6e5422b03b4570138f227b3d5d0073b8" args="(T t)=0" -->
-virtual bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00277.html#6e5422b03b4570138f227b3d5d0073b8">try_put</a> (T t)=0</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="a00278.html">scoped_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="14ae737c8fca4c8bf8e1a736dfbac444"></a><!-- doxytag: member="tbb::receiver::register_predecessor" ref="14ae737c8fca4c8bf8e1a736dfbac444" args="(predecessor_type &)" -->
-virtual bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00277.html#14ae737c8fca4c8bf8e1a736dfbac444">register_predecessor</a> (<a class="el" href="a00282.html">predecessor_type</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="d2f23b40b328dc254a7c2a0a30f408e4"></a><!-- doxytag: member="tbb::receiver::remove_predecessor" ref="d2f23b40b328dc254a7c2a0a30f408e4" args="(predecessor_type &)" -->
-virtual bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00277.html#d2f23b40b328dc254a7c2a0a30f408e4">remove_predecessor</a> (<a class="el" href="a00282.html">predecessor_type</a> &)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Remove a predecessor from the node. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Represents acquisition of a mutex. <a href="a00278.html#_details">More...</a><br></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename T><br>
- class tbb::receiver< T ></h3>
-
-Pure virtual template class that defines a receiver of messages of type T.
+A mutex which does nothing.
+<p>
+A <a class="el" href="a00277.html">null_mutex</a> does no operation and simulates success.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00466.html">graph.h</a></ul>
+<li><a class="el" href="a00489.html">null_mutex.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00277.png b/doc/html/a00277.png
deleted file mode 100644
index fdfa4c6..0000000
Binary files a/doc/html/a00277.png and /dev/null differ
diff --git a/doc/html/a00278.html b/doc/html/a00278.html
index 4b1721c..7218bd8 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::recursive_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,92 +21,33 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00278.html">recursive_mutex</a></div>
-<h1>tbb::recursive_mutex Class Reference<br>
-<small>
-[<a class="el" href="a00374.html">Synchronization</a>]</small>
-</h1><!-- doxytag: class="tbb::recursive_mutex" -->Mutex that allows recursive mutex acquisition.
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00277.html">null_mutex</a>::<a class="el" href="a00278.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="a00563.html">recursive_mutex.h</a>></code>
+<code>#include <<a class="el" href="a00489.html">null_mutex.h</a>></code>
<p>
-<a href="a00105.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="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="a00278.html#889fa8cc32dd707eef7c0f52dda09c0d">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="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 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="a00278.html#d2fceb7f95c24a8cd1457d4527e4b8c6">recursive_mutex</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct unacquired <a class="el" href="a00278.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="a00278.html#4c342c69d47f4bb0b393535dee4015d6">lock</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="a00278.html#86e719b0afee25704af11ab97694d240">try_lock</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="a00278.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="6baa9ce4b394c39622456fd8a68f8bd8"></a><!-- doxytag: member="tbb::recursive_mutex::native_handle" ref="6baa9ce4b394c39622456fd8a68f8bd8" args="()" -->
-<a class="el" href="a00278.html#889fa8cc32dd707eef7c0f52dda09c0d">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="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="a00277.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="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="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="a00277.html">null_mutex</a> &)</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="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="a00277.html">null_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="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="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 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="a00279.html">scoped_lock</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The scoped locking pattern. <a href="a00279.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.
-<p>
-<hr><h2>Member Function Documentation</h2>
-<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::recursive_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).
+Represents acquisition of a mutex.
<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="a00563.html">recursive_mutex.h</a></ul>
+<li><a class="el" href="a00489.html">null_mutex.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00279.html b/doc/html/a00279.html
index 353c73f..a908754 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::recursive_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,51 +21,39 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00278.html">recursive_mutex</a>::<a class="el" href="a00279.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="a00383.html">tbb</a>::<a class="el" href="a00279.html">null_rw_mutex</a></div>
+<h1>tbb::null_rw_mutex Class Reference<br>
+<small>
+[<a class="el" href="a00398.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="a00563.html">recursive_mutex.h</a>></code>
+<code>#include <<a class="el" href="a00490.html">null_rw_mutex.h</a>></code>
<p>
-<a href="a00106.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<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 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="a00279.html#d82d4d36fbf9727a493d26ae50855fe7">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 <a class="el" href="a00278.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="a00279.html#dec17713c4c1321ac8fec66816d0c602">scoped_lock</a> (<a class="el" href="a00278.html">recursive_mutex</a> &<a class="el" href="a00258.html">mutex</a>)</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="c1197ffb8f3cd9d4fed71d7e06265b7c"></a><!-- doxytag: member="tbb::recursive_mutex::scoped_lock::~scoped_lock" ref="c1197ffb8f3cd9d4fed71d7e06265b7c" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00279.html#c1197ffb8f3cd9d4fed71d7e06265b7c">~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="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="a00279.html#7fb04da37cccf8c99b1f9102d9074f9a">acquire</a> (<a class="el" href="a00278.html">recursive_mutex</a> &<a class="el" href="a00258.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="a00279.html#36bfc3e93e3ef6340abef4901444d340">try_acquire</a> (<a class="el" href="a00278.html">recursive_mutex</a> &<a class="el" href="a00258.html">mutex</a>)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Try acquire lock on given <a class="el" href="a00278.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="a00279.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>Classes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00280.html">scoped_lock</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Represents acquisition of a mutex. <a href="a00280.html#_details">More...</a><br></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-The scoped locking pattern.
+A rw mutex which does nothing.
<p>
-It helps to avoid the common problem of forgetting to release lock. It also nicely provides the "node" for queuing locks.
+A <a class="el" href="a00279.html">null_rw_mutex</a> is a rw mutex that does nothing and simulates successful operation.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00563.html">recursive_mutex.h</a></ul>
+<li><a class="el" href="a00490.html">null_rw_mutex.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00280.html b/doc/html/a00280.html
index 91d9c3b..acf08f1 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::scalable_allocator< T > Class Template 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,86 +21,39 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00280.html">scalable_allocator</a></div>
-<h1>tbb::scalable_allocator< T > Class Template Reference<br>
-<small>
-[<a class="el" href="a00373.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="a00383.html">tbb</a>::<a class="el" href="a00279.html">null_rw_mutex</a>::<a class="el" href="a00280.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="a00564.html">scalable_allocator.h</a>></code>
+<code>#include <<a class="el" href="a00490.html">null_rw_mutex.h</a>></code>
<p>
-<a href="a00107.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<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="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="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="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="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="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="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="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 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="a00280.html">scalable_allocator</a> &) throw ()</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="a00279.html">null_rw_mutex</a> &, bool=true)</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="a00280.html">scalable_allocator</a>< U > &) throw ()</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="a00279.html">null_rw_mutex</a> &, bool=true)</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="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="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="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="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="a00280.html#726b1586d05d44665a36e1c7b2699bfd">allocate</a> (size_type n, const void *=0)</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="a00279.html">null_rw_mutex</a> &, bool=true)</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="a00280.html#f806a238c18cbcfb531e1e0a0d2ec59d">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="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="a00280.html#880e766f1d913988c21973dbdd874fd5">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="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ae824c87fcc35467057fd3304c5e97ba"></a><!-- doxytag: member="tbb::scalable_allocator::construct" ref="ae824c87fcc35467057fd3304c5e97ba" args="(pointer p, const value_type &value)" -->
-void </td><td class="memItemRight" valign="bottom"><b>construct</b> (pointer p, const value_type &value)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="743f878b04a492bf7ae0e82a64dc20c8"></a><!-- doxytag: member="tbb::scalable_allocator::destroy" ref="743f878b04a492bf7ae0e82a64dc20c8" args="(pointer p)" -->
-void </td><td class="memItemRight" valign="bottom"><b>destroy</b> (pointer p)</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="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>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename T><br>
- class tbb::scalable_allocator< T ></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.
+Represents acquisition of a mutex.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00564.html">scalable_allocator.h</a></ul>
+<li><a class="el" href="a00490.html">null_rw_mutex.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00281.html b/doc/html/a00281.html
index 408f1a1..b818881 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::scalable_allocator< void > Class Template 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,39 +21,39 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00281.html">scalable_allocator< void ></a></div>
-<h1>tbb::scalable_allocator< void > Class Template Reference<br>
-<small>
-[<a class="el" href="a00373.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="a00383.html">tbb</a>::<a class="el" href="a00281.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="a00564.html">scalable_allocator.h</a>></code>
+<code>#include <<a class="el" href="a00491.html">parallel_do.h</a>></code>
<p>
-<a href="a00109.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00080.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="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="a00281.html#40baaf0f6856f4491dd0adf896c93516">add</a> (const Item &item)</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>
+<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>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<><br>
- class tbb::scalable_allocator< void ></h3>
+<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>
-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="a00564.html">scalable_allocator.h</a></ul>
+<li><a class="el" href="a00491.html">parallel_do.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00282.html b/doc/html/a00282.html
index 6357af6..f6b39db 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::sender< T > Class Template 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,67 +21,114 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00282.html">sender</a></div>
-<h1>tbb::sender< T > Class Template Reference</h1><!-- doxytag: class="tbb::sender" -->Pure virtual template class that defines a sender of messages of type T.
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00282.html">parallel_while</a></div>
+<h1>tbb::parallel_while< Body > Class Template Reference<br>
+<small>
+[<a class="el" href="a00395.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="a00466.html">graph.h</a>></code>
+<code>#include <<a class="el" href="a00527.html">parallel_while.h</a>></code>
<p>
-<p>Inheritance diagram for tbb::sender< T >:
-<p><center><img src="a00282.png" usemap="#tbb::sender< T >_map" border="0" alt=""></center>
-<map name="tbb::sender< T >_map">
-<area href="a00224.html" alt="tbb::broadcast_node< T >" shape="rect" coords="0,56,242,80">
-<area href="a00225.html" alt="tbb::buffer_node< T >" shape="rect" coords="252,56,494,80">
-<area href="a00255.html" alt="tbb::limiter_node< T >" shape="rect" coords="504,56,746,80">
-<area href="a00268.html" alt="tbb::priority_queue_node< T, Compare >" shape="rect" coords="126,112,368,136">
-<area href="a00269.html" alt="tbb::queue_node< T >" shape="rect" coords="378,112,620,136">
-<area href="a00283.html" alt="tbb::sequencer_node< T >" shape="rect" coords="378,168,620,192">
-</map>
-<a href="a00042.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="d3aa21714dfc464e65a471816e38ea89"></a><!-- doxytag: member="tbb::sender::output_type" ref="d3aa21714dfc464e65a471816e38ea89" args="" -->
-typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00282.html#d3aa21714dfc464e65a471816e38ea89">output_type</a></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="a00282.html#fa297e53d3af2a101e712bc200233e9c">value_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="c0746cda7dfd266f01acaf6cd5d4b77d"></a><!-- doxytag: member="tbb::sender::successor_type" ref="c0746cda7dfd266f01acaf6cd5d4b77d" args="" -->
-typedef <a class="el" href="a00277.html">receiver</a>< T > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00282.html#c0746cda7dfd266f01acaf6cd5d4b77d">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="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="be48ac70174cf8e08e2b0279cd6343d3"></a><!-- doxytag: member="tbb::sender::register_successor" ref="be48ac70174cf8e08e2b0279cd6343d3" args="(successor_type &r)=0" -->
-virtual bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00282.html#be48ac70174cf8e08e2b0279cd6343d3">register_successor</a> (<a class="el" href="a00277.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="3f345427e812e8741370308ff88f30bf"></a><!-- doxytag: member="tbb::sender::remove_successor" ref="3f345427e812e8741370308ff88f30bf" args="(successor_type &r)=0" -->
-virtual bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00282.html#3f345427e812e8741370308ff88f30bf">remove_successor</a> (<a class="el" href="a00277.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="bf8c9235810354f3353a899c982645de"></a><!-- doxytag: member="tbb::sender::try_get" ref="bf8c9235810354f3353a899c982645de" args="(T &)" -->
-virtual bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00282.html#bf8c9235810354f3353a899c982645de">try_get</a> (T &)</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="a00282.html#36e26ba3880c7bcf804a97ba0cbe133f">parallel_while</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="3506c7275aeeb2fc3ba5d5f10ee0adac"></a><!-- doxytag: member="tbb::sender::try_reserve" ref="3506c7275aeeb2fc3ba5d5f10ee0adac" args="(T &)" -->
-virtual bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00282.html#3506c7275aeeb2fc3ba5d5f10ee0adac">try_reserve</a> (T &)</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="a00282.html#6fcfc973cc56b79c6d0fbb8a31be7e84">~parallel_while</a> ()</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="28c41df1c0c7ed485b4a691ec8f30098"></a><!-- doxytag: member="tbb::sender::try_release" ref="28c41df1c0c7ed485b4a691ec8f30098" args="()" -->
-virtual bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00282.html#28c41df1c0c7ed485b4a691ec8f30098">try_release</a> ()</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="a00282.html#b32a0a6e5e09ebb7fad3e6652c19afe5">run</a> (Stream &stream, const Body &body)</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="add46946c4c7330422733432e4032fac"></a><!-- doxytag: member="tbb::sender::try_consume" ref="add46946c4c7330422733432e4032fac" args="()" -->
-virtual bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00282.html#add46946c4c7330422733432e4032fac">try_consume</a> ()</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="a00282.html#e131c560057a58229992b61eb8dba4c6">add</a> (const <a class="el" href="a00282.html#fa297e53d3af2a101e712bc200233e9c">value_type</a> &item)</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">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 T><br>
- class tbb::sender< T ></h3>
+<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="a00282.html">tbb::parallel_while</a>< Body >::add </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="a00282.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">
-Pure virtual template class that defines a sender of messages of type T.
<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="a00282.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="a00466.html">graph.h</a></ul>
+<li><a class="el" href="a00527.html">parallel_while.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00282.png b/doc/html/a00282.png
deleted file mode 100644
index d11da04..0000000
Binary files a/doc/html/a00282.png and /dev/null differ
diff --git a/doc/html/a00283.html b/doc/html/a00283.html
index 24d25ac..454d174 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::sequencer_node< 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,82 +21,36 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00283.html">sequencer_node</a></div>
-<h1>tbb::sequencer_node< T > Class Template Reference</h1><!-- doxytag: class="tbb::sequencer_node" --><!-- doxytag: inherits="tbb::queue_node" -->Forwards messages in sequence order.
+<a class="el" href="a00383.html">tbb</a>::<b>internal</b>::<a class="el" href="a00283.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="a00466.html">graph.h</a>></code>
+<code>#include <<a class="el" href="a00531.html">partitioner.h</a>></code>
<p>
-<p>Inheritance diagram for tbb::sequencer_node< T >:
-<p><center><img src="a00283.png" usemap="#tbb::sequencer_node< T >_map" border="0" alt=""></center>
-<map name="tbb::sequencer_node< T >_map">
-<area href="a00269.html" alt="tbb::queue_node< T >" shape="rect" coords="170,112,330,136">
-<area href="a00225.html" alt="tbb::buffer_node< T >" shape="rect" coords="170,56,330,80">
-<area href="a00251.html" alt="tbb::graph_node" shape="rect" coords="0,0,160,24">
-<area href="a00277.html" alt="tbb::receiver< T >" shape="rect" coords="170,0,330,24">
-<area href="a00282.html" alt="tbb::sender< T >" shape="rect" coords="340,0,500,24">
-</map>
-<a href="a00059.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="a73e4a3ae6c430281f08226d448ebfc8"></a><!-- doxytag: member="tbb::sequencer_node::input_type" ref="a73e4a3ae6c430281f08226d448ebfc8" args="" -->
-typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00283.html#a73e4a3ae6c430281f08226d448ebfc8">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="0c613bb01103dfcfbc3f9cbe943f95b0"></a><!-- doxytag: member="tbb::sequencer_node::output_type" ref="0c613bb01103dfcfbc3f9cbe943f95b0" args="" -->
-typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00283.html#0c613bb01103dfcfbc3f9cbe943f95b0">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="6581686ef0cf8e13c0270687628af5eb"></a><!-- doxytag: member="tbb::sequencer_node::predecessor_type" ref="6581686ef0cf8e13c0270687628af5eb" args="" -->
-typedef <a class="el" href="a00282.html">sender</a>< <a class="el" href="a00283.html#a73e4a3ae6c430281f08226d448ebfc8">input_type</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00283.html#6581686ef0cf8e13c0270687628af5eb">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="3591313e30d0f485a09106686067411f"></a><!-- doxytag: member="tbb::sequencer_node::successor_type" ref="3591313e30d0f485a09106686067411f" args="" -->
-typedef <a class="el" href="a00277.html">receiver</a>< <a class="el" href="a00283.html#0c613bb01103dfcfbc3f9cbe943f95b0">output_type</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00283.html#3591313e30d0f485a09106686067411f">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="c3138c1c96b76ae9f13b0abbf7029590"></a><!-- doxytag: member="tbb::sequencer_node::sequencer_node" ref="c3138c1c96b76ae9f13b0abbf7029590" 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="a00283.html#c3138c1c96b76ae9f13b0abbf7029590">sequencer_node</a> (<a class="el" href="a00250.html">graph</a> &g, const Sequencer &s)</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="a00311.html">task</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="c87d80feebaf2bae4af22b5f2459b37e"></a><!-- doxytag: member="tbb::sequencer_node::~sequencer_node" ref="c87d80feebaf2bae4af22b5f2459b37e" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00283.html#c87d80feebaf2bae4af22b5f2459b37e">~sequencer_node</a> ()</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="a00311.html#d61bb32389d3857bf7511d69beaafb76">task::affinity_id</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="cfc1242acfbd4ed1f4f041fdcacccb20"></a><!-- doxytag: member="tbb::sequencer_node::size_type" ref="cfc1242acfbd4ed1f4f041fdcacccb20" args="" -->
-typedef <a class="el" href="a00225.html">buffer_node</a>< T <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="87962b93599ff172cd4b64f2995ebc71"></a><!-- doxytag: member="tbb::internal::partition_type_base::continue_after_execute_range" ref="87962b93599ff172cd4b64f2995ebc71" args="()" -->
+<a class="el" href="a00311.html">task</a> * </td><td class="memItemRight" valign="bottom"><b>continue_after_execute_range</b> ()</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8b9307a6214b57cabe426833b9f44fb0"></a><!-- doxytag: member="tbb::sequencer_node::sequencer_operation" ref="8b9307a6214b57cabe426833b9f44fb0" args="" -->
-typedef <a class="el" href="a00225.html">buffer_node</a>< T <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="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="0b4dffb9323be2efc5112aaa853bac219e3998df4805f713bc2839c055678548"></a><!-- doxytag: member="tbb::sequencer_node::WAIT" ref="0b4dffb9323be2efc5112aaa853bac219e3998df4805f713bc2839c055678548" 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="0b4dffb9323be2efc5112aaa853bac2128dcec463d3112149f813ecd4dfdd956"></a><!-- doxytag: member="tbb::sequencer_node::SUCCEEDED" ref="0b4dffb9323be2efc5112aaa853bac2128dcec463d3112149f813ecd4dfdd956" 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="0b4dffb9323be2efc5112aaa853bac21a1766b4675effb3b6b03b315b51057ed"></a><!-- doxytag: member="tbb::sequencer_node::FAILED" ref="0b4dffb9323be2efc5112aaa853bac21a1766b4675effb3b6b03b315b51057ed" 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="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="a00311.html">task</a> &b)</td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename T><br>
- class tbb::sequencer_node< T ></h3>
-
-Forwards messages in sequence order.
+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="a00466.html">graph.h</a></ul>
+<li><a class="el" href="a00531.html">partitioner.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00283.png b/doc/html/a00283.png
deleted file mode 100644
index 0d1eae7..0000000
Binary files a/doc/html/a00283.png and /dev/null differ
diff --git a/doc/html/a00284.html b/doc/html/a00284.html
index a3e2a83..5f30066 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::simple_partitioner 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,38 +21,85 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00284.html">simple_partitioner</a></div>
-<h1>tbb::simple_partitioner Class Reference<br>
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00284.html">pipeline</a></div>
+<h1>tbb::pipeline Class Reference<br>
<small>
-[<a class="el" href="a00371.html">Algorithms</a>]</small>
-</h1><!-- doxytag: class="tbb::simple_partitioner" -->A simple partitioner.
+[<a class="el" href="a00395.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="a00541.html">partitioner.h</a>></code>
+<code>#include <<a class="el" href="a00543.html">pipeline.h</a>></code>
<p>
-<a href="a00088.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="596dc3beba27099c4c8581cb419e1a59"></a><!-- doxytag: member="tbb::pipeline::pipeline" ref="596dc3beba27099c4c8581cb419e1a59" args="()" -->
+__TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00284.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="a00284.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="a00284.html#38fb5c9c8395dd6f89a4ae2011a83e0d">add_filter</a> (<a class="el" href="a00256.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="a00284.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="a00284.html#93d7fec8cd607b803dd2d79fb46bd260">run</a> (size_t max_number_of_live_tokens, <a class="el" href="a00314.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="a00284.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="a47f7e0208a2bf68f35b51b27d2ddf2a"></a><!-- doxytag: member="tbb::simple_partitioner::internal::start_for" ref="a47f7e0208a2bf68f35b51b27d2ddf2a" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::start_for</b></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="e8f710e431b62c2a48914bd99d0fe034"></a><!-- doxytag: member="tbb::simple_partitioner::internal::start_reduce" ref="e8f710e431b62c2a48914bd99d0fe034" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::start_reduce</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="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="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>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="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>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-A simple partitioner.
+A processing pipeline that applies filters to items.
<p>
-Divides the range until the range is not divisible.
+<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">
+
<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="a00541.html">partitioner.h</a></ul>
+<li><a class="el" href="a00543.html">pipeline.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00285.html b/doc/html/a00285.html
index c55dacb..4c84e65 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::source_node< Output > Class Template 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,105 +21,27 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00285.html">source_node</a></div>
-<h1>tbb::source_node< Output > Class Template Reference</h1><!-- doxytag: class="tbb::source_node" --><!-- doxytag: inherits="tbb::graph_node,tbb::sender< Output >" -->An executable node that acts as a source, i.e. it has no predecessors.
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00285.html">pre_scan_tag</a></div>
+<h1>tbb::pre_scan_tag Struct Reference<br>
+<small>
+[<a class="el" href="a00395.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="a00466.html">graph.h</a>></code>
+<code>#include <<a class="el" href="a00518.html">parallel_scan.h</a>></code>
<p>
-<p>Inheritance diagram for tbb::source_node< Output >:
-<p><center><img src="a00285.png" usemap="#tbb::source_node< Output >_map" border="0" alt=""></center>
-<map name="tbb::source_node< Output >_map">
-<area href="a00251.html" alt="tbb::graph_node" shape="rect" coords="0,0,170,24">
-<area href="a00282.html" alt="tbb::sender< Output >" shape="rect" coords="180,0,350,24">
-</map>
-<a href="a00048.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00082.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="c5a2c6ab64bcd798724976d7d75ba92f"></a><!-- doxytag: member="tbb::source_node::output_type" ref="c5a2c6ab64bcd798724976d7d75ba92f" args="" -->
-typedef Output </td><td class="memItemRight" valign="bottom"><a class="el" href="a00285.html#c5a2c6ab64bcd798724976d7d75ba92f">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="217d72bbc6e7a4b35ef014dd9a15efca"></a><!-- doxytag: member="tbb::source_node::successor_type" ref="217d72bbc6e7a4b35ef014dd9a15efca" args="" -->
-typedef <a class="el" href="a00277.html">receiver</a>< Output > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00285.html#217d72bbc6e7a4b35ef014dd9a15efca">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="memTemplParams" nowrap colspan="2"><a class="anchor" name="0513272133a06db6742873671af98f21"></a><!-- doxytag: member="tbb::source_node::source_node" ref="0513272133a06db6742873671af98f21" 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="a00285.html#0513272133a06db6742873671af98f21">source_node</a> (<a class="el" href="a00250.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="90c94a8a52cc3d19cf393ce289e80733"></a><!-- doxytag: member="tbb::source_node::~source_node" ref="90c94a8a52cc3d19cf393ce289e80733" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00285.html#90c94a8a52cc3d19cf393ce289e80733">~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="ce601874ec5cbb0996f6dcb8e43badb8"></a><!-- doxytag: member="tbb::source_node::register_successor" ref="ce601874ec5cbb0996f6dcb8e43badb8" args="(receiver< output_type > &r)" -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00285.html#ce601874ec5cbb0996f6dcb8e43badb8">register_successor</a> (<a class="el" href="a00277.html">receiver</a>< <a class="el" href="a00285.html#c5a2c6ab64bcd798724976d7d75ba92f">output_type</a> > &r)</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="de069bfc6fae7ed4e82b2a1fbb58b721"></a><!-- doxytag: member="tbb::source_node::remove_successor" ref="de069bfc6fae7ed4e82b2a1fbb58b721" args="(receiver< output_type > &r)" -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00285.html#de069bfc6fae7ed4e82b2a1fbb58b721">remove_successor</a> (<a class="el" href="a00277.html">receiver</a>< <a class="el" href="a00285.html#c5a2c6ab64bcd798724976d7d75ba92f">output_type</a> > &r)</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="0434d2933ad082d3c43a4ec774150511"></a><!-- doxytag: member="tbb::source_node::try_get" ref="0434d2933ad082d3c43a4ec774150511" args="(output_type &v)" -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00285.html#0434d2933ad082d3c43a4ec774150511">try_get</a> (<a class="el" href="a00285.html#c5a2c6ab64bcd798724976d7d75ba92f">output_type</a> &v)</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="ecac0bb52cff61912dcd186647ccd1bf"></a><!-- doxytag: member="tbb::source_node::try_reserve" ref="ecac0bb52cff61912dcd186647ccd1bf" args="(output_type &v)" -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00285.html#ecac0bb52cff61912dcd186647ccd1bf">try_reserve</a> (<a class="el" href="a00285.html#c5a2c6ab64bcd798724976d7d75ba92f">output_type</a> &v)</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="a00285.html#3dd7e998aa3e7258b3b5731307df23a0">try_release</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Release a reserved item. <a href="#3dd7e998aa3e7258b3b5731307df23a0"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="809f51859ca4dd04204591d76c8572eb"></a><!-- doxytag: member="tbb::source_node::try_consume" ref="809f51859ca4dd04204591d76c8572eb" args="()" -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00285.html#809f51859ca4dd04204591d76c8572eb">try_consume</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="d71ed386c53032463f3435f79a15b6ff"></a><!-- doxytag: member="tbb::source_node::activate" ref="d71ed386c53032463f3435f79a15b6ff" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00285.html#d71ed386c53032463f3435f79a15b6ff">activate</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 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::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 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>
-<h3>template<typename Output><br>
- class tbb::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="3dd7e998aa3e7258b3b5731307df23a0"></a><!-- doxytag: member="tbb::source_node::try_release" ref="3dd7e998aa3e7258b3b5731307df23a0" 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="a00285.html">tbb::source_node</a>< Output >::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, dest must request or reserve future items
+Used to indicate that the initial scan is being performed.
<p>
-Reimplemented from <a class="el" href="a00282.html#28c41df1c0c7ed485b4a691ec8f30098">tbb::sender< Output ></a>.
-</div>
-</div><p>
-<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00466.html">graph.h</a></ul>
+<hr>The documentation for this struct was generated from the following file:<ul>
+<li><a class="el" href="a00518.html">parallel_scan.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00285.png b/doc/html/a00285.png
deleted file mode 100644
index faf755d..0000000
Binary files a/doc/html/a00285.png and /dev/null differ
diff --git a/doc/html/a00286.html b/doc/html/a00286.html
index 498cbb2..4a39f04 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::spin_mutex 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,105 +21,107 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00286.html">spin_mutex</a></div>
-<h1>tbb::spin_mutex Class Reference<br>
-<small>
-[<a class="el" href="a00374.html">Synchronization</a>]</small>
-</h1><!-- doxytag: class="tbb::spin_mutex" -->A lock that occupies a single byte.
+<a class="el" href="a00383.html">tbb</a>::<b>flow</b>::<b>interface6</b>::<a class="el" href="a00286.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="a00565.html">spin_mutex.h</a>></code>
+<code>#include <<a class="el" href="a00468.html">flow_graph.h</a>></code>
<p>
-<a href="a00111.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<p>Inheritance diagram for tbb::flow::interface6::priority_queue_node< T, Compare, A >:
+<p><center><img src="a00286.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="a00237.html" alt="tbb::flow::interface6::buffer_node< T, A >" shape="rect" coords="362,56,714,80">
+<area href="a00263.html" alt="tbb::flow::interface6::graph_node" shape="rect" coords="0,0,352,24">
+<area href="a00295.html" alt="tbb::flow::interface6::receiver< T >" shape="rect" coords="362,0,714,24">
+<area href="a00301.html" alt="tbb::flow::interface6::sender< T >" shape="rect" coords="724,0,1076,24">
+</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="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="a00286.html#b2829b518979874ad3d2a939e14ae7bd">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="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="a00286.html#2cb099b590246b6bc93cc15e78c6ee5c">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="fdea783bf9d5a4c98e794ac7e0f84ccf"></a><!-- doxytag: member="tbb::flow::interface6::priority_queue_node::predecessor_type" ref="fdea783bf9d5a4c98e794ac7e0f84ccf" args="" -->
+typedef <a class="el" href="a00301.html">sender</a>< <a class="el" href="a00286.html#b2829b518979874ad3d2a939e14ae7bd">input_type</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00286.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="a00295.html">receiver</a>< <a class="el" href="a00286.html#2cb099b590246b6bc93cc15e78c6ee5c">output_type</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00286.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"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00286.html#3d8fb44644fd8d41ada1fbeba7409be3">spin_mutex</a> ()</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="a00286.html#497ec2612615249bf5a294eb1b7b93b3">priority_queue_node</a> (<a class="el" href="a00262.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="a00286.html#17a4f66e23d54100b64805405e905d62">priority_queue_node</a> (const <a class="el" href="a00286.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="a00237.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="a00237.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="a00237.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">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="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="4f748989e19b6045e3a2d2ee73626a28"></a><!-- doxytag: member="tbb::spin_mutex::lock" ref="4f748989e19b6045e3a2d2ee73626a28" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00286.html#4f748989e19b6045e3a2d2ee73626a28">lock</a> ()</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">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="a00286.html#8f9a58fb56a2b4c5efe1a7f7c1ae2074">try_lock</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">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="a00286.html#0e843ee6265f57f27d228ba91e7308ef">unlock</a> ()</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">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 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="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="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="a00286.html#ed2d8dc0a9c1c2571e4a69df2f2209e5">internal_forward</a> (prio_operation *op)</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="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 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="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 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="a00287.html">scoped_lock</a></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="mdescLeft"> </td><td class="mdescRight">Represents acquisition of a mutex. <a href="a00287.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="a00286.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">
+<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>
-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">
-
-<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="a00565.html">spin_mutex.h</a></ul>
+<li><a class="el" href="a00468.html">flow_graph.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00286.png b/doc/html/a00286.png
new file mode 100644
index 0000000..1e0df07
Binary files /dev/null and b/doc/html/a00286.png differ
diff --git a/doc/html/a00287.html b/doc/html/a00287.html
index 9aa03c7..0325bb7 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::spin_mutex::scoped_lock Class 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,71 +21,95 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00286.html">spin_mutex</a>::<a class="el" href="a00287.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="a00383.html">tbb</a>::<b>flow</b>::<b>interface6</b>::<a class="el" href="a00287.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="a00565.html">spin_mutex.h</a>></code>
+<code>#include <<a class="el" href="a00468.html">flow_graph.h</a>></code>
<p>
-<a href="a00112.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="a00287.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="a00237.html" alt="tbb::flow::interface6::buffer_node< T, A >" shape="rect" coords="280,56,550,80">
+<area href="a00263.html" alt="tbb::flow::interface6::graph_node" shape="rect" coords="0,0,270,24">
+<area href="a00295.html" alt="tbb::flow::interface6::receiver< T >" shape="rect" coords="280,0,550,24">
+<area href="a00301.html" alt="tbb::flow::interface6::sender< T >" shape="rect" coords="560,0,830,24">
+<area href="a00302.html" alt="tbb::flow::interface6::sequencer_node< T, A >" shape="rect" coords="280,168,550,192">
+</map>
+<a href="a00060.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="a00287.html#1e71030845210b6c4c7380eb9e11a2ac">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="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="a00287.html#25b5a53ab1f9a342644fa3759bc0b1ad">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="5e2fdd33c45d44549dee9c1638e19898"></a><!-- doxytag: member="tbb::flow::interface6::queue_node::predecessor_type" ref="5e2fdd33c45d44549dee9c1638e19898" args="" -->
+typedef <a class="el" href="a00301.html">sender</a>< <a class="el" href="a00287.html#1e71030845210b6c4c7380eb9e11a2ac">input_type</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00287.html#5e2fdd33c45d44549dee9c1638e19898">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="f35076a19f256f9e7a61bed77ca1ccc5"></a><!-- doxytag: member="tbb::flow::interface6::queue_node::successor_type" ref="f35076a19f256f9e7a61bed77ca1ccc5" args="" -->
+typedef <a class="el" href="a00295.html">receiver</a>< <a class="el" href="a00287.html#25b5a53ab1f9a342644fa3759bc0b1ad">output_type</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00287.html#f35076a19f256f9e7a61bed77ca1ccc5">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="29ae680ae7f5e685c2e15535b9c855b3"></a><!-- doxytag: member="tbb::spin_mutex::scoped_lock::scoped_lock" ref="29ae680ae7f5e685c2e15535b9c855b3" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00287.html#29ae680ae7f5e685c2e15535b9c855b3">scoped_lock</a> ()</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="a00287.html#c716593a92448b0f429d1f3a38e67996">queue_node</a> (<a class="el" href="a00262.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="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="a00287.html#0226762d9ebba28311b7b1518d948ab1">queue_node</a> (const <a class="el" href="a00287.html">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="a84ab6bb43d056468ac5df3626219513"></a><!-- doxytag: member="tbb::flow::interface6::queue_node::size_type" ref="a84ab6bb43d056468ac5df3626219513" args="" -->
+typedef <a class="el" href="a00237.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">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="a00287.html#5ce6807050a9e8f87bcb4a65dccb12ef">scoped_lock</a> (<a class="el" href="a00286.html">spin_mutex</a> &m)</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="a00237.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 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="a00287.html#3ee3c338732b1f64b0b32a757807a30d">acquire</a> (<a class="el" href="a00286.html">spin_mutex</a> &m)</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="a00287.html#9297ec188534b45dc0ca48f2f39a0501">try_acquire</a> (<a class="el" href="a00286.html">spin_mutex</a> &m)</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="#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="a00287.html#eeb615e68e963e6bf8d9c11402d0ce8e">release</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="ac6fa425d1f06c56d8b70abc51aac844"></a><!-- doxytag: member="tbb::spin_mutex::scoped_lock::~scoped_lock" ref="ac6fa425d1f06c56d8b70abc51aac844" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00287.html#ac6fa425d1f06c56d8b70abc51aac844">~scoped_lock</a> ()</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">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 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="a00287.html#eadcbbb81f9a9d223afabe0f40e77ecb">internal_forward</a> (queue_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="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="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="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>
-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="a00286.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">
+<h3>template<typename T, typename A = cache_aligned_allocator<T>><br>
+ class tbb::flow::interface6::queue_node< T, A ></h3>
+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="a00565.html">spin_mutex.h</a></ul>
+<li><a class="el" href="a00468.html">flow_graph.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00287.png b/doc/html/a00287.png
new file mode 100644
index 0000000..09b37ae
Binary files /dev/null and b/doc/html/a00287.png differ
diff --git a/doc/html/a00288.html b/doc/html/a00288.html
index 747b447..ef43229 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::spin_rw_mutex_v3 Class 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,53 +21,34 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00288.html">spin_rw_mutex_v3</a></div>
-<h1>tbb::spin_rw_mutex_v3 Class Reference<br>
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00288.html">queuing_mutex</a></div>
+<h1>tbb::queuing_mutex Class Reference<br>
<small>
-[<a class="el" href="a00374.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="a00398.html">Synchronization</a>]</small>
+</h1><!-- doxytag: class="tbb::queuing_mutex" -->Queuing lock with local-only spinning.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00566.html">spin_rw_mutex.h</a>></code>
+<code>#include <<a class="el" href="a00557.html">queuing_mutex.h</a>></code>
<p>
-<a href="a00113.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="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="a00288.html#61332b2756de89f3f5f69310cbb6e70c">spin_rw_mutex_v3</a> ()</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="a00288.html#b389ad9c4db7293e4bdb5b8cda69ec04">queuing_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="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="a00288.html#9a815fb2759e55072ed413f1b6970cf3">~spin_rw_mutex_v3</a> ()</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">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="a00288.html#4007d6e1523dbc3c2bb7f889ab789a8a">lock</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="a00288.html#088bb256be794cc47d3b83791632fdfc">try_lock</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="a00288.html#f9f52ead2098eb5fb12da59d5ae53b55">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="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="a00288.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="a00288.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="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="681a816fe76d6ca7752303f9dcc3c4b2"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::is_recursive_mutex" ref="681a816fe76d6ca7752303f9dcc3c4b2" args="" -->
+<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="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="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">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00289.html">scoped_lock</a></td></tr>
@@ -75,53 +56,10 @@ static const bool </td><td class="memItemRight" valign="bottom"><b>is_fair_
<tr><td class="mdescLeft"> </td><td class="mdescRight">The scoped locking pattern. <a href="a00289.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">
-
-<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).
+Queuing lock with local-only spinning.
<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="a00566.html">spin_rw_mutex.h</a></ul>
+<li><a class="el" href="a00557.html">queuing_mutex.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00289.html b/doc/html/a00289.html
index 335ba2b..ea58887 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::spin_rw_mutex_v3::scoped_lock Class 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,53 +21,38 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00288.html">spin_rw_mutex_v3</a>::<a class="el" href="a00289.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="a00383.html">tbb</a>::<a class="el" href="a00288.html">queuing_mutex</a>::<a class="el" href="a00289.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="a00566.html">spin_rw_mutex.h</a>></code>
+<code>#include <<a class="el" href="a00557.html">queuing_mutex.h</a>></code>
<p>
-<a href="a00114.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00097.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="a00289.html#d6ea60dee5563f702379bf5e51aa8806">scoped_lock</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00289.html#db0fa3967491014572e24d6607bdc971">scoped_lock</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="a00289.html#42a92d4f8fdde425b111cfa8a9228071">scoped_lock</a> (<a class="el" href="a00288.html">spin_rw_mutex</a> &m, bool write=true)</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="a00289.html#9b51ef972f5618ac17caadb58841ab6d">scoped_lock</a> (<a class="el" href="a00288.html">queuing_mutex</a> &m)</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="a00289.html#d7eaaa3f2e2c5dc11e7005811b1bdd04">~scoped_lock</a> ()</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="a00289.html#ac2c576a93570957d694192a5f491443">~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="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="a00289.html#b0b646ec5be02a127d159bbb7ca65353">acquire</a> (<a class="el" href="a00288.html">spin_rw_mutex</a> &m, bool write=true)</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="a00289.html#533e4fc8355ee321206a0609c42d909d">acquire</a> (<a class="el" href="a00288.html">queuing_mutex</a> &m)</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="a00289.html#3f0b1e3f2efab63336400348bd070226">upgrade_to_writer</a> ()</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="a00289.html#e5a014fb817599386a87170cf2cf51a9">try_acquire</a> (<a class="el" href="a00288.html">queuing_mutex</a> &m)</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="a00289.html#61b14d00a78185c9b2d206ebfc379124">release</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="a00289.html#3bf2b8c87ff22115be9b2eac179f2d30">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="a00289.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="a00289.html#9879626968d9b9a04cd2ec0fb2e84ae1">try_acquire</a> (<a class="el" href="a00288.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="a00288.html">spin_rw_mutex</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00289.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="a00289.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>
The scoped locking pattern.
@@ -75,12 +60,12 @@ The scoped locking pattern.
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="()" -->
+<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::spin_rw_mutex_v3::scoped_lock::scoped_lock </td>
+ <td class="memname">tbb::queuing_mutex::scoped_lock::scoped_lock </td>
<td>(</td>
<td class="paramname"> </td>
<td> ) </td>
@@ -96,48 +81,8 @@ Construct lock that has not acquired a mutex.
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="()" -->
-<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>(</td>
- <td class="paramname"> </td>
- <td> ) </td>
- <td width="100%"><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Upgrade reader to become a writer.
-<p>
-Returns true if the upgrade happened without re-acquiring the lock and false if opposite
-</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="a00289.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.
-<p>
-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="a00566.html">spin_rw_mutex.h</a></ul>
+<li><a class="el" href="a00557.html">queuing_mutex.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00290.html b/doc/html/a00290.html
index e45523b..0114ab0 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::split Class 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,25 +21,55 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00290.html">split</a></div>
-<h1>tbb::split Class Reference<br>
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00290.html">queuing_rw_mutex</a></div>
+<h1>tbb::queuing_rw_mutex Class Reference<br>
<small>
-[<a class="el" href="a00371.html">Algorithms</a>]</small>
-</h1><!-- doxytag: class="tbb::split" -->Dummy type that distinguishes splitting constructor from copy constructor.
+[<a class="el" href="a00398.html">Synchronization</a>]</small>
+</h1><!-- doxytag: class="tbb::queuing_rw_mutex" -->Reader-writer lock with local-only spinning.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00600.html">tbb_stddef.h</a>></code>
+<code>#include <<a class="el" href="a00558.html">queuing_rw_mutex.h</a>></code>
<p>
-<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="85c90877c3447690ac4e2ac4ff8dea5e"></a><!-- doxytag: member="tbb::queuing_rw_mutex::queuing_rw_mutex" ref="85c90877c3447690ac4e2ac4ff8dea5e" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00290.html#85c90877c3447690ac4e2ac4ff8dea5e">queuing_rw_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="a00290.html#1ba73e3d95cfdf8323880bc623af9099">~queuing_rw_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 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="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>Friends</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a36f15b770a1bb0b56e33d7fa75ebd1a"></a><!-- doxytag: member="tbb::queuing_rw_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="a00291.html">scoped_lock</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The scoped locking pattern. <a href="a00291.html#_details">More...</a><br></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-Dummy type that distinguishes splitting constructor from copy constructor.
+Reader-writer lock with local-only spinning.
<p>
-See description of parallel_for and parallel_reduce for example usages.
+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="a00600.html">tbb_stddef.h</a></ul>
+<li><a class="el" href="a00558.html">queuing_rw_mutex.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00291.html b/doc/html/a00291.html
index 95a1bc4..442c9ba 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::task 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,294 +21,58 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00291.html">task</a></div>
-<h1>tbb::task Class Reference<br>
-<small>
-[<a class="el" href="a00376.html">Task Scheduling</a>]</small>
-</h1><!-- doxytag: class="tbb::task" -->Base class for user-defined tasks.
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00290.html">queuing_rw_mutex</a>::<a class="el" href="a00291.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="a00567.html">task.h</a>></code>
+<code>#include <<a class="el" href="a00558.html">queuing_rw_mutex.h</a>></code>
<p>
-<p>Inheritance diagram for tbb::task:
-<p><center><img src="a00291.png" usemap="#tbb::task_map" border="0" alt=""></center>
-<map name="tbb::task_map">
-<area href="a00242.html" alt="tbb::empty_task" shape="rect" coords="0,56,97,80">
-</map>
-<a href="a00119.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">typedef internal::affinity_id </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.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="a00291.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="a00291.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="a00291.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="a00291.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="a00291.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="a00291.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="a00291.html#4a3c415562d17905390ea5b49d12293e58debec6ab130290640d0cc2eedba35d">recycle</a></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="a00291.html#4a3c415562d17905390ea5b49d12293e">state_type</a> { <br>
- <a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293ead0fe2302ccc360923f738c2ed7ec1b9">executing</a>,
-<a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293e3bf499aa6e6487cd1ace883a63100513">reexecute</a>,
-<a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293e0841dcf1c2a96dee9aa7b69f636cb81a">ready</a>,
-<a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293ebe94d3348dd038e41107819f00c1884c">allocated</a>,
-<br>
- <a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293ecc67ca92bd6f1ce9738a1e9e7206b735">freed</a>,
-<a class="el" href="a00291.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="a00291.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="a00291.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="a00291.html">task</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.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="a00291.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="a00291.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="a00291.html#dfaacf92685e5f86393bf657b2853bf8">destroy</a> (<a class="el" href="a00291.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="a00291.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="a00291.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="a00291.html#db399855177438bbc9cc61d508dae8d2">recycle_as_child_of</a> (<a class="el" href="a00291.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="a00291.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="a00291.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="a00291.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="a00291.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="a00291.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="a00291.html#3ce28ca9baa771cfc37ecd72e69c4f3c">spawn_and_wait_for_all</a> (<a class="el" href="a00291.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="a00291.html#894ab68378e502776d8220eea7ce9fa1">spawn_and_wait_for_all</a> (<a class="el" href="a00294.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="a00291.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="a00291.html">task</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.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="el" href="a00293.html">task_group_context</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.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="a00293.html">task_group_context</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.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="a00291.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="a00291.html#4a3c415562d17905390ea5b49d12293e">state_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.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="a00291.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="a00291.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="a00291.html#dca19d7a45487a7d67a0db517e2b57c9">set_affinity</a> (<a class="el" href="a00291.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="a00291.html#d61bb32389d3857bf7511d69beaafb76">affinity_id</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.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="a00291.html#713c338c8eeaebdc5a6b10a69c039b06">note_affinity</a> (<a class="el" href="a00291.html#d61bb32389d3857bf7511d69beaafb76">affinity_id</a> id)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#c62e365be7bcbba091c9ea7454a4d22c">scoped_lock</a> ()</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="a00291.html#62247be9a637a814c8e8f4bcfb3a1908">change_group</a> (<a class="el" href="a00293.html">task_group_context</a> &ctx)</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="a00291.html#fbb8798792d3aebb136c46fc63d2529e">scoped_lock</a> (<a class="el" href="a00290.html">queuing_rw_mutex</a> &m, bool write=true)</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="a00291.html#0f3fb4aac549ab642022450a4bd13326">cancel_group_execution</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="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="a00291.html#32c7d67a660d23ebbaab1a1d2826d31a">~scoped_lock</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="a00291.html#025f18118c057c4c8db87ff2ce8df975">is_cancelled</a> () const </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="a00291.html#a8dd5ab8686e76de21587544dbb681e0">acquire</a> (<a class="el" href="a00290.html">queuing_rw_mutex</a> &m, bool write=true)</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="a00291.html#9ac8d1542d67d9d80121ff986801ac26">set_group_priority</a> (priority_t p)</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="a00291.html#2e4ff6c9ec2fee6682f95290d1f42baa">try_acquire</a> (<a class="el" href="a00290.html">queuing_rw_mutex</a> &m, bool write=true)</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="a00291.html#e1d969a1ccab6796e3b8b2c1a5be33d2">group_priority</a> () const </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="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="a00291.html#67ae221109ddc69510ab593874e435d4">release</a> ()</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="a00291.html#23acb0da0afd690da797f9f882027d34">allocate_root</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="a00291.html#11ba1da4a722c9e6f73339a52c487e82">upgrade_to_writer</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="a00291.html#8ccc518caf31075a3e073996d2d240a4">allocate_root</a> (<a class="el" href="a00293.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="a00291.html#ce8ce689c26a4ddf343829bc3c73290a">spawn_root_and_wait</a> (<a class="el" href="a00291.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="a00291.html#c33c7edbaec67aa8a56f48986a9dc69f">spawn_root_and_wait</a> (<a class="el" href="a00294.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="a00291.html#8365d063c0cc9d7bd616bca47256b93c">enqueue</a> (<a class="el" href="a00291.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="a00291.html#fe6bf6aaf84e664134fabb6c4f409ea9">enqueue</a> (<a class="el" href="a00291.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="a00291.html">task</a> &__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.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="a00291.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 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="a00291.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>
-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="a00291.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="a00291.html#4a3c415562d17905390ea5b49d12293e">tbb::task::state_type</a> </td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
+The scoped locking pattern.
<p>
-Enumeration of task states that the scheduler considers.
+It helps to avoid the common problem of forgetting to release lock. It also nicely provides the "node" for queuing locks.
<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="a00291.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="()" -->
+<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">internal::allocate_continuation_proxy& tbb::task::allocate_continuation </td>
+ <td class="memname">tbb::queuing_rw_mutex::scoped_lock::scoped_lock </td>
<td>(</td>
<td class="paramname"> </td>
<td> ) </td>
@@ -319,43 +83,21 @@ task to be recycled as continuation </td></tr>
<div class="memdoc">
<p>
-Returns proxy for overloaded new that allocates a continuation task of *this.
+Construct lock that has not acquired a mutex.
<p>
-The continuation's parent becomes the parent of *this.
+Equivalent to zero-initialization of *this.
</div>
</div><p>
-<a class="anchor" name="0f3fb4aac549ab642022450a4bd13326"></a><!-- doxytag: member="tbb::task::cancel_group_execution" ref="0f3fb4aac549ab642022450a4bd13326" args="()" -->
+<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::task::cancel_group_execution </td>
+ <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%"><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="a00293.html">task_group_context</a> & </td>
- <td class="paramname"> <em>ctx</em> </td>
- <td> ) </td>
<td width="100%"></td>
</tr>
</table>
@@ -363,253 +105,13 @@ Initiates cancellation of all tasks in this cancellation group and its subordina
<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="a00291.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="a00293.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="a00291.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="a00291.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="a00291.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="a00291.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="a00291.html#8365d063c0cc9d7bd616bca47256b93c">enqueue()</a> overload with explicit priority value and <a class="el" href="a00291.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="a00291.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="a00291.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="a00291.html#22c298cd40937a431a06777423f002f6">execute()</a> returns. Typically, this is done by having method <a class="el" href="a00291.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 decendants 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="a00291.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="a00294.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.
+Upgrade reader to become a writer.
<p>
-Works on tasks while waiting.
+Returns true if the upgrade happened without re-acquiring the lock and false if opposite
</div>
</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00567.html">task.h</a></ul>
+<li><a class="el" href="a00558.html">queuing_rw_mutex.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00292.html b/doc/html/a00292.html
index 7836bb9..5a61803 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::interface5::internal::task_base Class 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,22 +21,195 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<b>interface5</b>::<b>internal</b>::<a class="el" href="a00292.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="a00383.html">tbb</a>::<b>interface5</b>::<a class="el" href="a00292.html">reader_writer_lock</a></div>
+<h1>tbb::interface5::reader_writer_lock Class Reference<br>
+<small>
+[<a class="el" href="a00398.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="a00567.html">task.h</a>></code>
+<code>#include <<a class="el" href="a00559.html">reader_writer_lock.h</a>></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 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="a00292.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="a00292.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="a00292.html#c1431c4293e777efd9aab9a95c2a46e1">reader_writer_lock</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Constructs a new <a class="el" href="a00292.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="a00292.html#5135f64f7b7339017f33d956445edbee">~reader_writer_lock</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Destructs a <a class="el" href="a00292.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="a00292.html#2653d1a2d560059a51219a8ceab3ade9">lock</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquires the <a class="el" href="a00292.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="a00292.html#721eb173e154ab38292273e9266a9b07">try_lock</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Tries to acquire the <a class="el" href="a00292.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="a00292.html#d9d16a24d9f6c3dada73c6b9ff214f5b">lock_read</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquires the <a class="el" href="a00292.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="a00292.html#595fb23952e3b89426b1f7938dea9b11">try_lock_read</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Tries to acquire the <a class="el" href="a00292.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="a00292.html#5113b32689305599b2c36b5831547704">unlock</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Releases the <a class="el" href="a00292.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="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="a00293.html">scoped_lock</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The scoped lock pattern for write locks. <a href="a00293.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">scoped_lock_read</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The scoped lock pattern for read locks. <a href="a00294.html#_details">More...</a><br></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-Base class for methods that became static in TBB 3.0.
+Writer-preference reader-writer lock with local-only spinning on readers.
<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.
+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="a00292.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="a00293.html">scoped_lock</a> status:<p>
+waiting ----------> waiting_nonblocking | _____________/ | V V V active -----------------> invalid<p>
+State diagram for <a class="el" href="a00294.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="a00292.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="a00264.html">improper_lock</a> The context tries to acquire a <a class="el" href="a00292.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="a00292.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="a00264.html">improper_lock</a> The context tries to acquire a <a class="el" href="a00292.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="a00292.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="a00292.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="a00292.html">reader_writer_lock</a> for read.
+<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="a00567.html">task.h</a></ul>
+<li><a class="el" href="a00559.html">reader_writer_lock.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00293.html b/doc/html/a00293.html
index 98fd8a2..e6cf4ee 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::task_group_context 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,219 +21,41 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00293.html">task_group_context</a></div>
-<h1>tbb::task_group_context Class Reference<br>
-<small>
-[<a class="el" href="a00376.html">Task Scheduling</a>]</small>
-</h1><!-- doxytag: class="tbb::task_group_context" -->Used to form groups of tasks.
+<a class="el" href="a00383.html">tbb</a>::<b>interface5</b>::<a class="el" href="a00292.html">reader_writer_lock</a>::<a class="el" href="a00293.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="a00567.html">task.h</a>></code>
+<code>#include <<a class="el" href="a00559.html">reader_writer_lock.h</a>></code>
<p>
-<a href="a00117.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="d5af85179a348162d4ddd66b6fc0d60fb4fda16c4f77defd3d0f6aad87fceed4"></a><!-- doxytag: member="tbb::task_group_context::isolated" ref="d5af85179a348162d4ddd66b6fc0d60fb4fda16c4f77defd3d0f6aad87fceed4" args="" -->
- </td><td class="memItemRight" valign="bottom"><b>isolated</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d5af85179a348162d4ddd66b6fc0d60fc7f37e067ba1fca8a5c809d20522662b"></a><!-- doxytag: member="tbb::task_group_context::bound" ref="d5af85179a348162d4ddd66b6fc0d60fc7f37e067ba1fca8a5c809d20522662b" args="" -->
- </td><td class="memItemRight" valign="bottom"><b>bound</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b8dce4661b346756cb4f584529ecd0ebf774f9c21343eba6303927b5ae0be44c"></a><!-- doxytag: member="tbb::task_group_context::exact_exception" ref="b8dce4661b346756cb4f584529ecd0ebf774f9c21343eba6303927b5ae0be44c" args="" -->
- </td><td class="memItemRight" valign="bottom"><b>exact_exception</b> = 0x0001ul << traits_offset</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b8dce4661b346756cb4f584529ecd0eb4002d8f90c8c9f7c3f80ad349aee7cce"></a><!-- doxytag: member="tbb::task_group_context::concurrent_wait" ref="b8dce4661b346756cb4f584529ecd0eb4002d8f90c8c9f7c3f80ad349aee7cce" args="" -->
- </td><td class="memItemRight" valign="bottom"><b>concurrent_wait</b> = 0x0004ul << traits_offset</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><b>default_traits</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">enum </td><td class="memItemRight" valign="bottom"><b>kind_type</b> { <b>isolated</b>,
-<b>bound</b>
- }</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">enum </td><td class="memItemRight" valign="bottom"><b>traits_type</b> { <b>exact_exception</b> = 0x0001ul << traits_offset,
-<b>concurrent_wait</b> = 0x0004ul << traits_offset,
-<b>default_traits</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="a00293.html#19fee08fb8ac98adccfe69c1aa63c491">task_group_context</a> (kind_type relation_with_parent=bound, uintptr_t traits=default_traits)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Default & binding constructor. <a href="#19fee08fb8ac98adccfe69c1aa63c491"></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="a00293.html#6d30d16bf1cd22f86c6afaf29c2b430c">reset</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="a00293.html#cf19f20e082887c1bb0ba6b0911c3583">scoped_lock</a> (<a class="el" href="a00292.html">reader_writer_lock</a> &lock)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Forcefully reinitializes the context after the task tree it was associated with is completed. <a href="#6d30d16bf1cd22f86c6afaf29c2b430c"></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="a00293.html#8bcdfdf4e6bfb76125b6de15c00b571d">cancel_group_execution</a> ()</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="a00293.html#70246e0260493625ff956fa5926fc71f">~scoped_lock</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="#8bcdfdf4e6bfb76125b6de15c00b571d"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4db72f16210b0a991b2c134d6763a4cc"></a><!-- doxytag: member="tbb::task_group_context::is_group_execution_cancelled" ref="4db72f16210b0a991b2c134d6763a4cc" args="() const " -->
-bool __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00293.html#4db72f16210b0a991b2c134d6763a4cc">is_group_execution_cancelled</a> () const </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">Returns true if the context received cancellation request. <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="a00293.html#d97c8a03615594b71b4ef06ff75cf561">register_pending_exception</a> ()</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="mdescLeft"> </td><td class="mdescRight">Records the pending exception, and cancels the task group. <a href="#d97c8a03615594b71b4ef06ff75cf561"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c4272d4d9ab65d600ca70fc2c8c4b039"></a><!-- doxytag: member="tbb::task_group_context::set_priority" ref="c4272d4d9ab65d600ca70fc2c8c4b039" args="(priority_t)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00293.html#c4272d4d9ab65d600ca70fc2c8c4b039">set_priority</a> (priority_t)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Changes priority of the task grop. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2f2342b9e6c9c03703248ac13ad0271d"></a><!-- doxytag: member="tbb::task_group_context::priority" ref="2f2342b9e6c9c03703248ac13ad0271d" args="() const " -->
-priority_t </td><td class="memItemRight" valign="bottom"><a class="el" href="a00293.html#2f2342b9e6c9c03703248ac13ad0271d">priority</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Retrieves current priority of the current task group. <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 __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00293.html#49a55352084fd44b8863d182e839e6dc">init</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Out-of-line part of the constructor. <a href="#49a55352084fd44b8863d182e839e6dc"></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="fdfd61b0801af54e93367fc2d02cb54a"></a><!-- doxytag: member="tbb::task_group_context::internal::generic_scheduler" ref="fdfd61b0801af54e93367fc2d02cb54a" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::generic_scheduler</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="087690120218a0868a4a91ef388319af"></a><!-- doxytag: member="tbb::task_group_context::task_scheduler_init" ref="087690120218a0868a4a91ef388319af" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>task_scheduler_init</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e656073628561c8fd68f6134d527e2de"></a><!-- doxytag: member="tbb::task_group_context::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="ecedb9436fb30df30cb3a52c64bb97e5"></a><!-- doxytag: member="tbb::task_group_context::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="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>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-Used to form groups of tasks.
-<p>
-The context services explicit cancellation requests from user code, and unhandled exceptions intercepted during tasks execution. Intercepting an exception results in generating internal cancellation requests (which is processed in exactly the same way as external ones).<p>
-The context is associated with one or more root tasks and defines the cancellation group that includes all the descendants of the corresponding root task(s). Association is established when a context object is passed as an argument to the <a class="el" href="a00291.html#23acb0da0afd690da797f9f882027d34">task::allocate_root()</a> method. See <a class="el" href="a00293.html#19fee08fb8ac98adccfe69c1aa63c491">task_group_context::task_group_context</a> for more details.<p>
-The context can be bound to another one, and other contexts can be bound to it, forming a tree-like structure: parent -> this -> children. Arrows here designate cancellation propagation direction. If a task in a cancellation group is canceled all the other tasks in this group and groups bound to it (as children) get canceled too.<p>
-IMPLEMENTATION NOTE: When adding new members to <a class="el" href="a00293.html">task_group_context</a> or changing types of existing ones, update the size of both padding buffers (_leading_padding and _trailing_padding) appropriately. See also VERSIONING NOTE at the constructor definition below.
-<p>
-<hr><h2>Constructor & Destructor Documentation</h2>
-<a class="anchor" name="19fee08fb8ac98adccfe69c1aa63c491"></a><!-- doxytag: member="tbb::task_group_context::task_group_context" ref="19fee08fb8ac98adccfe69c1aa63c491" args="(kind_type relation_with_parent=bound, uintptr_t traits=default_traits)" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">tbb::task_group_context::task_group_context </td>
- <td>(</td>
- <td class="paramtype">kind_type </td>
- <td class="paramname"> <em>relation_with_parent</em> = <code>bound</code>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">uintptr_t </td>
- <td class="paramname"> <em>traits</em> = <code>default_traits</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>
-Default & binding constructor.
-<p>
-By default a bound context is created. That is this context will be bound (as child) to the context of the task calling task::allocate_root(this_context) method. Cancellation requests passed to the parent context are propagated to all the contexts bound to it. Similarly priority change is propagated from the parent context to its children.<p>
-If task_group_context::isolated is used as the argument, then the tasks associated with this context will never be affected by events in any other context.<p>
-Creating isolated contexts involve much less overhead, but they have limited utility. Normally when an exception occurs in an algorithm that has nested ones running, it is desirably to have all the nested algorithms canceled as well. Such a behavior requires nested algorithms to use bound contexts.<p>
-There is one good place where using isolated algorithms is beneficial. It is a master thread. That is if a particular algorithm is invoked directly from the master thread (not from a TBB task), supplying it with explicitly created isolated context will result in a faster algorithm startup.<p>
-VERSIONING NOTE: Implementation(s) of <a class="el" href="a00293.html">task_group_context</a> constructor(s) cannot be made entirely out-of-line because the run-time version must be set by the user code. This will become critically important for binary compatibility, if we ever have to change the size of the context object.<p>
-Boosting the runtime version will also be necessary if new data fields are introduced in the currently unused padding areas and these fields are updated by inline methods.
-</div>
-</div><p>
-<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="8bcdfdf4e6bfb76125b6de15c00b571d"></a><!-- doxytag: member="tbb::task_group_context::cancel_group_execution" ref="8bcdfdf4e6bfb76125b6de15c00b571d" args="()" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">bool __TBB_EXPORTED_METHOD tbb::task_group_context::cancel_group_execution </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td> ) </td>
- <td width="100%"></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>
-Note that canceling never fails. When false is returned, it just means that another thread (or this one) has already sent cancellation request to this context or to one of its ancestors (if this context is bound). It is guaranteed that when this method is concurrently called on the same not yet cancelled context, true will be returned by one and only one invocation.
-</div>
-</div><p>
-<a class="anchor" name="49a55352084fd44b8863d182e839e6dc"></a><!-- doxytag: member="tbb::task_group_context::init" ref="49a55352084fd44b8863d182e839e6dc" args="()" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">void __TBB_EXPORTED_METHOD tbb::task_group_context::init </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td> ) </td>
- <td width="100%"><code> [protected]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Out-of-line part of the constructor.
-<p>
-Singled out to ensure backward binary compatibility of the future versions.
-</div>
-</div><p>
-<a class="anchor" name="d97c8a03615594b71b4ef06ff75cf561"></a><!-- doxytag: member="tbb::task_group_context::register_pending_exception" ref="d97c8a03615594b71b4ef06ff75cf561" args="()" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">void __TBB_EXPORTED_METHOD tbb::task_group_context::register_pending_exception </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td> ) </td>
- <td width="100%"></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Records the pending exception, and cancels the task group.
-<p>
-May be called only from inside a catch-block. If the context is already canceled, does nothing. The method brings the task group associated with this context exactly into the state it would be in, if one of its tasks threw the currently pending exception during its execution. In other words, it emulates the actions of the scheduler's dispatch loop exception handler.
-</div>
-</div><p>
-<a class="anchor" name="6d30d16bf1cd22f86c6afaf29c2b430c"></a><!-- doxytag: member="tbb::task_group_context::reset" ref="6d30d16bf1cd22f86c6afaf29c2b430c" args="()" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">void __TBB_EXPORTED_METHOD tbb::task_group_context::reset </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td> ) </td>
- <td width="100%"></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
+The scoped lock pattern for write locks.
<p>
-Forcefully reinitializes the context after the task tree it was associated with is completed.
+Scoped locks help avoid the common problem of forgetting to release the lock. This type also serves as the node for queuing locks.
<p>
-Because the method assumes that all the tasks that used to be associated with this context have already finished, calling it while the context is still in use somewhere in the task hierarchy leads to undefined behavior.<p>
-IMPORTANT: This method is not thread safe!<p>
-The method does not change the context's parent if it is set.
-</div>
-</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00567.html">task.h</a></ul>
+<li><a class="el" href="a00559.html">reader_writer_lock.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00294.html b/doc/html/a00294.html
index 4656519..dd4f498 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::task_list 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,57 +21,39 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00294.html">task_list</a></div>
-<h1>tbb::task_list Class Reference<br>
-<small>
-[<a class="el" href="a00376.html">Task Scheduling</a>]</small>
-</h1><!-- doxytag: class="tbb::task_list" -->A list of children.
+<a class="el" href="a00383.html">tbb</a>::<b>interface5</b>::<a class="el" href="a00292.html">reader_writer_lock</a>::<a class="el" href="a00294.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="a00567.html">task.h</a>></code>
+<code>#include <<a class="el" href="a00559.html">reader_writer_lock.h</a>></code>
<p>
-<a href="a00121.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 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="a00294.html#416341c2047eaef50417b41eaf7e9de6">task_list</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="a00294.html#87ab0dc8f7216e6ba0f7acd6aec33064">scoped_lock_read</a> (<a class="el" href="a00292.html">reader_writer_lock</a> &lock)</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="a00294.html#6d438f1499a02db1e59c24ab6043e5ba">~task_list</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="a00294.html#bd21c5f3d555d64d1de8658e15bf4966">~scoped_lock_read</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="a00294.html#f3ac31e092814b90929f81bb30441959">empty</a> () const </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">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="a00294.html#4cd34756bc4763dafb8c84838a0124ff">push_back</a> (<a class="el" href="a00291.html">task</a> &<a class="el" href="a00291.html">task</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">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="a00291.html">task</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00294.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="a00294.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>
+<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>
-A list of children.
-<p>
-Used for method task::spawn_children
+The scoped lock pattern for read locks.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00567.html">task.h</a></ul>
+<li><a class="el" href="a00559.html">reader_writer_lock.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00295.html b/doc/html/a00295.html
index a485399..8589e2a 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::task_scheduler_init 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,142 +21,60 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00295.html">task_scheduler_init</a></div>
-<h1>tbb::task_scheduler_init Class Reference<br>
-<small>
-[<a class="el" href="a00376.html">Task Scheduling</a>]</small>
-</h1><!-- doxytag: class="tbb::task_scheduler_init" -->Class delimiting the scope of task scheduler activity.
+<a class="el" href="a00383.html">tbb</a>::<b>flow</b>::<b>interface6</b>::<a class="el" href="a00295.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="a00584.html">task_scheduler_init.h</a>></code>
+<code>#include <<a class="el" href="a00468.html">flow_graph.h</a>></code>
<p>
-<a href="a00128.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="a00295.png" usemap="#tbb::flow::interface6::receiver< T >_map" border="0" alt=""></center>
+<map name="tbb::flow::interface6::receiver< T >_map">
+<area href="a00236.html" alt="tbb::flow::interface6::broadcast_node< T >" shape="rect" coords="0,56,352,80">
+<area href="a00237.html" alt="tbb::flow::interface6::buffer_node< T, A >" shape="rect" coords="362,56,714,80">
+<area href="a00253.html" alt="tbb::flow::interface6::continue_receiver" shape="rect" coords="724,56,1076,80">
+<area href="a00266.html" alt="tbb::flow::interface6::limiter_node< T >" shape="rect" coords="1086,56,1438,80">
+<area href="a00286.html" alt="tbb::flow::interface6::priority_queue_node< T, Compare, A >" shape="rect" coords="181,112,533,136">
+<area href="a00287.html" alt="tbb::flow::interface6::queue_node< T, A >" shape="rect" coords="543,112,895,136">
+<area href="a00302.html" alt="tbb::flow::interface6::sequencer_node< T, A >" shape="rect" coords="543,168,895,192">
+</map>
+<a href="a00042.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="a00295.html#d476053cc712e572554823492a5229ce">initialize</a> (int number_of_threads=<a class="el" href="a00295.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="a00295.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="a00295.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="a00295.html#421600bf9bf9338bcf937063f2ff0e90">task_scheduler_init</a> (int number_of_threads=<a class="el" href="a00295.html#8f5988e2b0fbb2d533fcbb7f2583743f">automatic</a>, stack_size_type thread_stack_size=0)</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="a00295.html#0d0524c99313dedea1e04464bbf2f7ef">input_type</a></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="a00295.html#4da6c86292d80c703a66c1f6f5299488">~task_scheduler_init</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="a00301.html">sender</a>< T > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00295.html#7fa8cff811e7c1589b805a4bb4c7a74f">predecessor_type</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="a00295.html#12752282977029f23416642bc03e8b74">is_active</a> () const </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="a00295.html#b00699b235435f7b65b663d5063624a1">~receiver</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="a00295.html#ba00714c33a41a3c2216f48613971cab">default_num_threads</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="a00295.html#c6d5d0cb8ebe5771be91933609fe31b8">try_put</a> (const T &t)=0</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="a00295.html#8f5988e2b0fbb2d533fcbb7f2583743f">automatic</a> = -1</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="a00295.html#30e3316466efe3a713c23062b6e806f3">register_predecessor</a> (<a class="el" href="a00301.html">predecessor_type</a> &)</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="a00295.html#e6c860f1e559026ff3ef4599c0d6c514">deferred</a> = -2</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="a00295.html#3bc76547b51d3c9b633e3987d22dce95">remove_predecessor</a> (<a class="el" href="a00301.html">predecessor_type</a> &)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Argument to <a class="el" href="a00295.html#d476053cc712e572554823492a5229ce">initialize()</a> or constructor that causes initialization to be deferred. <br></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>
-Class delimiting the scope of task scheduler activity.
-<p>
-A thread can construct a <a class="el" href="a00295.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="a00295.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="a00295.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">
+<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>
-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>
- </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="a00295.html#8f5988e2b0fbb2d533fcbb7f2583743f">automatic</a></code> </td>
- <td> ) </td>
- <td width="100%"></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Ensure that scheduler exists for this thread.
-<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.
-</div>
-</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00584.html">task_scheduler_init.h</a></ul>
+<li><a class="el" href="a00468.html">flow_graph.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00295.png b/doc/html/a00295.png
new file mode 100644
index 0000000..73ffc73
Binary files /dev/null and b/doc/html/a00295.png differ
diff --git a/doc/html/a00296.html b/doc/html/a00296.html
index 6c0662e..022bbab 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::tbb_allocator< T > Class Template 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,104 +21,92 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00296.html">tbb_allocator</a></div>
-<h1>tbb::tbb_allocator< T > Class Template Reference<br>
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00296.html">recursive_mutex</a></div>
+<h1>tbb::recursive_mutex Class Reference<br>
<small>
-[<a class="el" href="a00373.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="a00398.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="a00588.html">tbb_allocator.h</a>></code>
+<code>#include <<a class="el" href="a00560.html">recursive_mutex.h</a>></code>
<p>
-<a href="a00130.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 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="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="a00296.html#889fa8cc32dd707eef7c0f52dda09c0d">native_handle_type</a></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="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="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="a00296.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="a00296.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="a00296.html">tbb_allocator</a>< U > &) throw ()</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="a00296.html#d2fceb7f95c24a8cd1457d4527e4b8c6">recursive_mutex</a> ()</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="mdescLeft"> </td><td class="mdescRight">Construct unacquired <a class="el" href="a00296.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="a00296.html#4c342c69d47f4bb0b393535dee4015d6">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="a00296.html#86e719b0afee25704af11ab97694d240">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="a00296.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="#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="a00296.html#f0a96e26b7f074588dc31e32524856ae">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="a00296.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 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="a00296.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">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="a00296.html#f059ca2c96243024f0d562ee3a87a3a5">max_size</a> () const throw ()</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">Largest value for which method allocate might succeed. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ab228ab9e324ed041c2226e1d717df5f"></a><!-- doxytag: member="tbb::tbb_allocator::construct" ref="ab228ab9e324ed041c2226e1d717df5f" args="(pointer p, const value_type &value)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00296.html#ab228ab9e324ed041c2226e1d717df5f">construct</a> (pointer p, const value_type &value)</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">Copy-construct value at location pointed to by p. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ef133522bf55f05a605bee0763208281"></a><!-- doxytag: member="tbb::tbb_allocator::destroy" ref="ef133522bf55f05a605bee0763208281" args="(pointer p)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00296.html#ef133522bf55f05a605bee0763208281">destroy</a> (pointer p)</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">Destroy value at location pointed to by p. <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="78701e7454ef8e1a25b5acd364367080"></a><!-- doxytag: member="tbb::tbb_allocator::allocator_type" ref="78701e7454ef8e1a25b5acd364367080" args="()" -->
-static <a class="el" href="a00296.html#09a7f81fb2c3055aaecf058b11538544">malloc_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00296.html#78701e7454ef8e1a25b5acd364367080">allocator_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="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">Returns current allocator. <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="a00297.html">scoped_lock</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The scoped locking pattern. <a href="a00297.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>
+Mutex that allows recursive mutex acquisition.
+<p>
+Mutex that allows recursive mutex acquisition.
+<p>
+<hr><h2>Member Function Documentation</h2>
+<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::recursive_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="a00588.html">tbb_allocator.h</a></ul>
+<li><a class="el" href="a00560.html">recursive_mutex.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00297.html b/doc/html/a00297.html
index 3a727da..ab61ed6 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::tbb_allocator< void > Class Template 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,39 +21,51 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00297.html">tbb_allocator< void ></a></div>
-<h1>tbb::tbb_allocator< void > Class Template Reference<br>
-<small>
-[<a class="el" href="a00373.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="a00383.html">tbb</a>::<a class="el" href="a00296.html">recursive_mutex</a>::<a class="el" href="a00297.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="a00588.html">tbb_allocator.h</a>></code>
+<code>#include <<a class="el" href="a00560.html">recursive_mutex.h</a>></code>
<p>
-<a href="a00132.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<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>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="d82d4d36fbf9727a493d26ae50855fe7"></a><!-- doxytag: member="tbb::recursive_mutex::scoped_lock::scoped_lock" ref="d82d4d36fbf9727a493d26ae50855fe7" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00297.html#d82d4d36fbf9727a493d26ae50855fe7">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 lock that has not acquired a <a class="el" href="a00296.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="a00297.html#dec17713c4c1321ac8fec66816d0c602">scoped_lock</a> (<a class="el" href="a00296.html">recursive_mutex</a> &<a class="el" href="a00275.html">mutex</a>)</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">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="a00297.html#c1197ffb8f3cd9d4fed71d7e06265b7c">~scoped_lock</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">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="a00297.html#7fb04da37cccf8c99b1f9102d9074f9a">acquire</a> (<a class="el" href="a00296.html">recursive_mutex</a> &<a class="el" href="a00275.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="a00297.html#36bfc3e93e3ef6340abef4901444d340">try_acquire</a> (<a class="el" href="a00296.html">recursive_mutex</a> &<a class="el" href="a00275.html">mutex</a>)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Try acquire lock on given <a class="el" href="a00296.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="a00297.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>
-<h3>template<><br>
- class tbb::tbb_allocator< void ></h3>
-
-Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1.
+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="a00588.html">tbb_allocator.h</a></ul>
+<li><a class="el" href="a00560.html">recursive_mutex.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00298.html b/doc/html/a00298.html
index 057f3cc..bc032fb 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::tbb_exception Class 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,142 +21,299 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00298.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="a00383.html">tbb</a>::<b>interface6</b>::<a class="el" href="a00298.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="a00593.html">tbb_exception.h</a>></code>
+<code>#include <<a class="el" href="a00561.html">runtime_loader.h</a>></code>
<p>
-<p>Inheritance diagram for tbb::tbb_exception:
-<p><center><img src="a00298.png" usemap="#tbb::tbb_exception_map" border="0" alt=""></center>
-<map name="tbb::tbb_exception_map">
-<area href="a00228.html" alt="tbb::captured_exception" shape="rect" coords="0,56,248,80">
-<area href="a00257.html" alt="tbb::movable_exception< ExceptionData >" shape="rect" coords="258,56,506,80">
-</map>
-<a href="a00142.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 Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">virtual <a class="el" href="a00298.html">tbb_exception</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00298.html#3e3482bf264d4ca4dde046cd9c02c766">move</a> ()=0 throw ()</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="a00298.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="a00298.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="a00298.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="a00298.html#6831be91cdc64e57e565ce0dde0187891e3a364f63f419e5ea2f1d1e52289b27">ec_ok</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="a00298.html#66c94938eca8bf88b76f3eccaaf215d8">destroy</a> ()=0 throw ()</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="a00298.html#6831be91cdc64e57e565ce0dde018789e6ce2b091083b80878cbb70cd00782a1">ec_bad_call</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroys objects created by the <a class="el" href="a00298.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="a00298.html#8588e07fa49692f4d734e4f2e4f048f4">throw_self</a> ()=0</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Invalid function call (e. g. <a class="el" href="a00298.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="a00298.html#6831be91cdc64e57e565ce0dde01878927e94a7b173bb8d0623bf48aad8fc703">ec_bad_arg</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="a00298.html#d00f6497e552fee978a02bfcbebf46e2">name</a> () const =0 throw ()</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="a00298.html#6831be91cdc64e57e565ce0dde01878903ee81d8c05966bc1125666713dee5f6">ec_bad_lib</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="a00298.html#e8157689ecb66bc6c72d3618bf3cc371">what</a> () const =0 throw ()</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="a00298.html#6831be91cdc64e57e565ce0dde01878907790f32918e60d670a96c1f0349e8d6">ec_bad_ver</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns the result of originally intercepted exception's <a class="el" href="a00298.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="a00298.html#3f2da7f3d8a6e4c1df522af1213afb5a">operator delete</a> (void *p)</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="a00298.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="a00298.html#bb0130fe0f596399707e61431231ebcb">error_mode</a> { <a class="el" href="a00298.html#bb0130fe0f596399707e61431231ebcbdb47fe5ffbd2eaf47e6de0af433ada38">em_status</a>,
+<a class="el" href="a00298.html#bb0130fe0f596399707e61431231ebcbdeb59ca2912432b47fd3ec831574653b">em_throw</a>,
+<a class="el" href="a00298.html#bb0130fe0f596399707e61431231ebcb630dd30c9ba61d5ab187e80313bbad94">em_abort</a>
+ }</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Error mode constants. <a href="a00298.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="a00298.html#6831be91cdc64e57e565ce0dde018789">error_code</a> { <br>
+ <a class="el" href="a00298.html#6831be91cdc64e57e565ce0dde0187891e3a364f63f419e5ea2f1d1e52289b27">ec_ok</a>,
+<a class="el" href="a00298.html#6831be91cdc64e57e565ce0dde018789e6ce2b091083b80878cbb70cd00782a1">ec_bad_call</a>,
+<a class="el" href="a00298.html#6831be91cdc64e57e565ce0dde01878927e94a7b173bb8d0623bf48aad8fc703">ec_bad_arg</a>,
+<a class="el" href="a00298.html#6831be91cdc64e57e565ce0dde01878903ee81d8c05966bc1125666713dee5f6">ec_bad_lib</a>,
+<br>
+ <a class="el" href="a00298.html#6831be91cdc64e57e565ce0dde01878907790f32918e60d670a96c1f0349e8d6">ec_bad_ver</a>,
+<a class="el" href="a00298.html#6831be91cdc64e57e565ce0dde01878902acc03ebfcdb16e3e26b24f64da2bdb">ec_no_lib</a>
+<br>
+ }</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Error codes. <a href="a00298.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="a00298.html#7caa4ff6e44c2348e67f601cc5d97c34">runtime_loader</a> (<a class="el" href="a00298.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="a00298.html#7ae5330beb48fce0c702c32a5df0094a">runtime_loader</a> (char const *path[], int min_ver=TBB_INTERFACE_VERSION, int max_ver=INT_MAX, <a class="el" href="a00298.html#bb0130fe0f596399707e61431231ebcb">error_mode</a> mode=em_abort)</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="a00298.html#c25fec923a751a3e03f5cbe969f1f0c5">~runtime_loader</a> ()</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="a00298.html#6831be91cdc64e57e565ce0dde018789">error_code</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00298.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="a00298.html#6831be91cdc64e57e565ce0dde018789">error_code</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00298.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>
-Interface to be implemented by all exceptions TBB recognizes and propagates across the threads.
+Load TBB at runtime.
<p>
-If an unhandled exception of the type derived from <a class="el" href="a00298.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="a00293.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="a00228.html">tbb::captured_exception</a> and template class <a class="el" href="a00257.html">tbb::movable_exception</a>. See their declarations for more info.
+<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="a00298.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>
-<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="66c94938eca8bf88b76f3eccaaf215d8"></a><!-- doxytag: member="tbb::tbb_exception::destroy" ref="66c94938eca8bf88b76f3eccaaf215d8" args="()=0" -->
+<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="a00298.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">virtual void tbb::tbb_exception::destroy </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td> ) </td>
- <td width="100%"> throw ()<code> [pure virtual]</code></td>
+ <td class="memname">enum <a class="el" href="a00298.html#6831be91cdc64e57e565ce0dde018789">tbb::interface6::runtime_loader::error_code</a> </td>
</tr>
</table>
</div>
<div class="memdoc">
<p>
-Destroys objects created by the <a class="el" href="a00298.html#3e3482bf264d4ca4dde046cd9c02c766">move()</a> method.
+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="a00298.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="a00298.html#bb0130fe0f596399707e61431231ebcb">tbb::interface6::runtime_loader::error_mode</a> </td>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
<p>
-Frees memory and calls destructor for this exception object. Can and must be used only on objects created by the move method.
+Error mode constants.
<p>
-Implemented in <a class="el" href="a00228.html#93d875d3555502ff6f18513525de204c">tbb::captured_exception</a>, and <a class="el" href="a00257.html#7a46873119d9f85a7b0009c13e41a258">tbb::movable_exception< ExceptionData ></a>.
+<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>
-<a class="anchor" name="3e3482bf264d4ca4dde046cd9c02c766"></a><!-- doxytag: member="tbb::tbb_exception::move" ref="3e3482bf264d4ca4dde046cd9c02c766" args="()=0" -->
+<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">virtual <a class="el" href="a00298.html">tbb_exception</a>* tbb::tbb_exception::move </td>
+ <td class="memname">tbb::interface6::runtime_loader::runtime_loader </td>
<td>(</td>
- <td class="paramname"> </td>
- <td> ) </td>
- <td width="100%"> throw ()<code> [pure virtual]</code></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="a00298.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">
<p>
-Creates and returns pointer to the deep copy of this exception object.
+Initialize object and load TBB.
<p>
-Move semantics is allowed.
-<p>
-Implemented in <a class="el" href="a00228.html#837a50b8f6a800bda225c39d1699643f">tbb::captured_exception</a>, and <a class="el" href="a00257.html#1aea0ad179d6f0481fe7f3495f66adf9">tbb::movable_exception< ExceptionData ></a>.
+See <a class="el" href="a00298.html#5f3f6f1683386705a6931acae45f0862">load()</a> for details.<p>
+If error mode is <code>em_status</code>, call <a class="el" href="a00298.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>
-<a class="anchor" name="3f2da7f3d8a6e4c1df522af1213afb5a"></a><!-- doxytag: member="tbb::tbb_exception::operator delete" ref="3f2da7f3d8a6e4c1df522af1213afb5a" args="(void *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">void tbb::tbb_exception::operator delete </td>
+ <td class="memname"><a class="el" href="a00298.html#6831be91cdc64e57e565ce0dde018789">error_code</a> tbb::interface6::runtime_loader::load </td>
<td>(</td>
- <td class="paramtype">void * </td>
- <td class="paramname"> <em>p</em> </td>
- <td> ) </td>
- <td width="100%"><code> [inline]</code></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>
-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="a00298.html#3e3482bf264d4ca4dde046cd9c02c766">move()</a> operation on an exception thrown out of TBB scheduler.<p>
-When overriding method <a class="el" href="a00298.html#3e3482bf264d4ca4dde046cd9c02c766">move()</a> make sure to override operator delete as well if memory is allocated not by TBB's scalable allocator.
+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="8588e07fa49692f4d734e4f2e4f048f4"></a><!-- doxytag: member="tbb::tbb_exception::throw_self" ref="8588e07fa49692f4d734e4f2e4f048f4" args="()=0" -->
+<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">virtual void tbb::tbb_exception::throw_self </td>
+ <td class="memname"><a class="el" href="a00298.html#6831be91cdc64e57e565ce0dde018789">error_code</a> tbb::interface6::runtime_loader::status </td>
<td>(</td>
<td class="paramname"> </td>
<td> ) </td>
- <td width="100%"><code> [pure virtual]</code></td>
+ <td width="100%"></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.
+Report status.
<p>
-Implemented in <a class="el" href="a00228.html#2dd1be66ab32fa27e0ddef5707fa67ef">tbb::captured_exception</a>, and <a class="el" href="a00257.html#17cffba35811c92b7e65d63506b69602">tbb::movable_exception< ExceptionData ></a>.
+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="a00593.html">tbb_exception.h</a></ul>
+<li><a class="el" href="a00561.html">runtime_loader.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00299.html b/doc/html/a00299.html
index 93956b3..c5ac2f8 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::internal::tbb_exception_ptr 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,63 +21,86 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<b>internal</b>::<a class="el" href="a00299.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="a00383.html">tbb</a>::<a class="el" href="a00299.html">scalable_allocator</a></div>
+<h1>tbb::scalable_allocator< T > Class Template Reference<br>
+<small>
+[<a class="el" href="a00397.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="a00593.html">tbb_exception.h</a>></code>
+<code>#include <<a class="el" href="a00562.html">scalable_allocator.h</a>></code>
<p>
-<a href="a00145.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<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>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="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="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="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="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="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="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 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="a00299.html#921875bbacd2c8a5f324c7da7a415262">destroy</a> () throw ()</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="a00299.html">scalable_allocator</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="a00299.html#292832fd5c523e3d8081a22247840a1d">throw_self</a> ()</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="a00299.html">scalable_allocator</a>< U > &) throw ()</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="a00299.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="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="d1111b00ba54b7fe35e6d3a0f21de287"></a><!-- doxytag: member="tbb::internal::tbb_exception_ptr::allocate" ref="d1111b00ba54b7fe35e6d3a0f21de287" args="(const tbb_exception &tag)" -->
-static <a class="el" href="a00299.html">tbb_exception_ptr</a> * </td><td class="memItemRight" valign="bottom"><b>allocate</b> (const <a class="el" href="a00298.html">tbb_exception</a> &tag)</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="c35e5db8e9cdff5d1387db5b0bad2e4a"></a><!-- doxytag: member="tbb::internal::tbb_exception_ptr::allocate" ref="c35e5db8e9cdff5d1387db5b0bad2e4a" args="(captured_exception &src)" -->
-static <a class="el" href="a00299.html">tbb_exception_ptr</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00299.html#c35e5db8e9cdff5d1387db5b0bad2e4a">allocate</a> (<a class="el" href="a00228.html">captured_exception</a> &src)</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="a00299.html#726b1586d05d44665a36e1c7b2699bfd">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="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="a00299.html#f806a238c18cbcfb531e1e0a0d2ec59d">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="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="a00299.html#880e766f1d913988c21973dbdd874fd5">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="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ae824c87fcc35467057fd3304c5e97ba"></a><!-- doxytag: member="tbb::scalable_allocator::construct" ref="ae824c87fcc35467057fd3304c5e97ba" args="(pointer p, const value_type &value)" -->
+void </td><td class="memItemRight" valign="bottom"><b>construct</b> (pointer p, const value_type &value)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="743f878b04a492bf7ae0e82a64dc20c8"></a><!-- doxytag: member="tbb::scalable_allocator::destroy" ref="743f878b04a492bf7ae0e82a64dc20c8" args="(pointer p)" -->
+void </td><td class="memItemRight" valign="bottom"><b>destroy</b> (pointer p)</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">This overload uses move semantics (i.e. it empties src). <br></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-Exception container that preserves the exact copy of the original exception.
-<p>
-This class can be used only when the appropriate runtime support (mandated by C++0x) is present
-<p>
-<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="921875bbacd2c8a5f324c7da7a415262"></a><!-- doxytag: member="tbb::internal::tbb_exception_ptr::destroy" ref="921875bbacd2c8a5f324c7da7a415262" args="()" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">void tbb::internal::tbb_exception_ptr::destroy </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td> ) </td>
- <td width="100%"> throw ()</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>
-Destroys this objects.
+The members are ordered the same way they are in section 20.4.1 of the ISO C++ standard.
<p>
-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="a00593.html">tbb_exception.h</a></ul>
+<li><a class="el" href="a00562.html">scalable_allocator.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00300.html b/doc/html/a00300.html
index 56b1298..e78bd34 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::tbb_hash_compare< Key > Struct Template 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,30 +21,39 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00300.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="a00383.html">tbb</a>::<a class="el" href="a00300.html">scalable_allocator< void ></a></div>
+<h1>tbb::scalable_allocator< void > Class Template Reference<br>
+<small>
+[<a class="el" href="a00397.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="a00424.html">concurrent_hash_map.h</a>></code>
+<code>#include <<a class="el" href="a00562.html">scalable_allocator.h</a>></code>
<p>
-<a href="a00014.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>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 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="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>
+<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>
-<h3>template<typename Key><br>
- struct tbb::tbb_hash_compare< Key ></h3>
+<h3>template<><br>
+ class tbb::scalable_allocator< void ></h3>
-hash_compare that is default argument for concurrent_hash_map
+Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1.
<p>
-<hr>The documentation for this struct was generated from the following file:<ul>
-<li><a class="el" href="a00424.html">concurrent_hash_map.h</a></ul>
+<hr>The documentation for this class was generated from the following file:<ul>
+<li><a class="el" href="a00562.html">scalable_allocator.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00301.html b/doc/html/a00301.html
index bb22869..9600b99 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::thread_bound_filter Class 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,97 +21,67 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00301.html">thread_bound_filter</a></div>
-<h1>tbb::thread_bound_filter Class Reference<br>
-<small>
-[<a class="el" href="a00371.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="a00383.html">tbb</a>::<b>flow</b>::<b>interface6</b>::<a class="el" href="a00301.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>
-<code>#include <<a class="el" href="a00546.html">pipeline.h</a>></code>
+<code>#include <<a class="el" href="a00468.html">flow_graph.h</a>></code>
<p>
-<p>Inheritance diagram for tbb::thread_bound_filter:
-<p><center><img src="a00301.png" usemap="#tbb::thread_bound_filter_map" border="0" alt=""></center>
-<map name="tbb::thread_bound_filter_map">
-<area href="a00245.html" alt="tbb::filter" shape="rect" coords="0,0,145,24">
+<p>Inheritance diagram for tbb::flow::interface6::sender< T >:
+<p><center><img src="a00301.png" usemap="#tbb::flow::interface6::sender< T >_map" border="0" alt=""></center>
+<map name="tbb::flow::interface6::sender< T >_map">
+<area href="a00236.html" alt="tbb::flow::interface6::broadcast_node< T >" shape="rect" coords="0,56,352,80">
+<area href="a00237.html" alt="tbb::flow::interface6::buffer_node< T, A >" shape="rect" coords="362,56,714,80">
+<area href="a00266.html" alt="tbb::flow::interface6::limiter_node< T >" shape="rect" coords="724,56,1076,80">
+<area href="a00286.html" alt="tbb::flow::interface6::priority_queue_node< T, Compare, A >" shape="rect" coords="181,112,533,136">
+<area href="a00287.html" alt="tbb::flow::interface6::queue_node< T, A >" shape="rect" coords="543,112,895,136">
+<area href="a00302.html" alt="tbb::flow::interface6::sequencer_node< T, A >" shape="rect" coords="543,168,895,192">
</map>
-<a href="a00094.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00041.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="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="a00301.html#127af99916cc085cd9dbc09c53299928">output_type</a></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="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="a00295.html">receiver</a>< T > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00301.html#d690e8a54e358968f0ee4fdf9ee73068">successor_type</a></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="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="a00301.html#68b8941ad77b9303cf3bcb8cf1f2d28a">register_successor</a> (<a class="el" href="a00295.html">successor_type</a> &r)=0</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="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="a00301.html#82f363bfb1738bb8789e167590b10ef9">remove_successor</a> (<a class="el" href="a00295.html">successor_type</a> &r)=0</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="a00301.html#c4f90f2c771bce748beb9be734fa286c">try_process_item</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="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="a00301.html#922fb56b0aad090b90a98b7d56b76a59">try_get</a> (T &)</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="a00301.html#5e726bdc7fbd924c0b07bd558b1d4d5d">process_item</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="a00301.html#02c05b472271db1b68a48ea2618fa72f">try_reserve</a> (T &)</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 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="a00301.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="a00301.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>
-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">
+<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>
-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">
-
-<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="a00546.html">pipeline.h</a></ul>
+<li><a class="el" href="a00468.html">flow_graph.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00301.png b/doc/html/a00301.png
index 3327bd5..64fee8f 100644
Binary files a/doc/html/a00301.png and b/doc/html/a00301.png differ
diff --git a/doc/html/a00302.html b/doc/html/a00302.html
index 82a3020..cf624b9 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::tick_count Class Reference</title>
+<title>tbb::flow::interface6::sequencer_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,42 +21,86 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00302.html">tick_count</a></div>
-<h1>tbb::tick_count Class Reference<br>
-<small>
-[<a class="el" href="a00375.html">Timing</a>]</small>
-</h1><!-- doxytag: class="tbb::tick_count" -->Absolute timestamp.
+<a class="el" href="a00383.html">tbb</a>::<b>flow</b>::<b>interface6</b>::<a class="el" href="a00302.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="a00616.html">tick_count.h</a>></code>
+<code>#include <<a class="el" href="a00468.html">flow_graph.h</a>></code>
<p>
-<a href="a00159.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<p>Inheritance diagram for tbb::flow::interface6::sequencer_node< T, A >:
+<p><center><img src="a00302.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="a00287.html" alt="tbb::flow::interface6::queue_node< T, A >" shape="rect" coords="280,112,550,136">
+<area href="a00237.html" alt="tbb::flow::interface6::buffer_node< T, A >" shape="rect" coords="280,56,550,80">
+<area href="a00263.html" alt="tbb::flow::interface6::graph_node" shape="rect" coords="0,0,270,24">
+<area href="a00295.html" alt="tbb::flow::interface6::receiver< T >" shape="rect" coords="280,0,550,24">
+<area href="a00301.html" alt="tbb::flow::interface6::sender< T >" shape="rect" coords="560,0,830,24">
+</map>
+<a href="a00061.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="a00302.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="a00302.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="a00301.html">sender</a>< <a class="el" href="a00302.html#af629f26832ff4e476e240637a78bc0c">input_type</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00302.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="a00295.html">receiver</a>< <a class="el" href="a00302.html#ca026eaef70e35791c407323199031a7">output_type</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00302.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="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="a00302.html#34593326ae4191e02a13c7cbdab9de4c">tick_count</a> ()</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="a00302.html#7e71cbdf78f989091bc162b89bee7e66">sequencer_node</a> (<a class="el" href="a00262.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="a00302.html#b38e7a070552960384bcc1d91af13a5c">sequencer_node</a> (const <a class="el" href="a00302.html">sequencer_node</a> &src)</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="a00302.html">tick_count</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00302.html#fb7f78ca61cf28398645ace66e284473">now</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="a00302.html#93d3d8f6a72b3e1387047282116ed6ee">~sequencer_node</a> ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Return current time. <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="a00303.html">interval_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00302.html#09dde78a4100800c11bb883d6204b586">operator-</a> (const <a class="el" href="a00302.html">tick_count</a> &t1, const <a class="el" href="a00302.html">tick_count</a> &t0)</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="a00237.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">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="a00303.html">interval_t</a></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="a00237.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="" -->
+ </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="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 class="mdescLeft"> </td><td class="mdescRight">Relative time interval. <a href="a00303.html#_details">More...</a><br></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-Absolute timestamp.
+<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.
<p>
<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00616.html">tick_count.h</a></ul>
+<li><a class="el" href="a00468.html">flow_graph.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00302.png b/doc/html/a00302.png
new file mode 100644
index 0000000..30266e5
Binary files /dev/null and b/doc/html/a00302.png differ
diff --git a/doc/html/a00303.html b/doc/html/a00303.html
index 6e582ab..6d9e038 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::tick_count::interval_t 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,57 +21,41 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00302.html">tick_count</a>::<a class="el" href="a00303.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 class="el" href="a00383.html">tbb</a>::<a class="el" href="a00303.html">simple_partitioner</a></div>
+<h1>tbb::simple_partitioner Class Reference<br>
+<small>
+[<a class="el" href="a00395.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="a00616.html">tick_count.h</a>></code>
+<code>#include <<a class="el" href="a00531.html">partitioner.h</a>></code>
<p>
-<a href="a00160.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00087.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="a00303.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="a00303.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="a00303.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="a00303.html">interval_t</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00303.html#cd9814947902e26463a69a111530f81b">operator+=</a> (const <a class="el" href="a00303.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="a00303.html">interval_t</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00303.html#35ff7eaf7c2031b4a991402ac9ecb940">operator-=</a> (const <a class="el" href="a00303.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="a00303.html#cc3a7ad7000317951ce61f706163efe8">tbb::tick_count</a></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="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="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="a00303.html">interval_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00303.html#09dde78a4100800c11bb883d6204b586">operator-</a> (const <a class="el" href="a00302.html">tick_count</a> &t1, const <a class="el" href="a00302.html">tick_count</a> &t0)</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">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="a00303.html">interval_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00303.html#5871ead1ca230efbe52a5008470e6428">operator+</a> (const <a class="el" href="a00303.html">interval_t</a> &i, const <a class="el" href="a00303.html">interval_t</a> &j)</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">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="a00303.html">interval_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00303.html#fa509691e1d689830931e36edd274f76">operator-</a> (const <a class="el" href="a00303.html">interval_t</a> &i, const <a class="el" href="a00303.html">interval_t</a> &j)</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">Subtract two intervals. <br></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-Relative time interval.
+A simple partitioner.
+<p>
+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="a00616.html">tick_count.h</a></ul>
+<li><a class="el" href="a00531.html">partitioner.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00304.html b/doc/html/a00304.html
index e3dfc82..e72f0cc 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::internal::two_phase_port< T > Class Template 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,72 +21,109 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<b>internal</b>::<a class="el" href="a00304.html">two_phase_port</a></div>
-<h1>tbb::internal::two_phase_port< T > Class Template Reference</h1><!-- doxytag: class="tbb::internal::two_phase_port" --><!-- doxytag: inherits="tbb::receiver" -->The two-phase join port.
+<a class="el" href="a00383.html">tbb</a>::<b>flow</b>::<b>interface6</b>::<a class="el" href="a00304.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="a00466.html">graph.h</a>></code>
+<code>#include <<a class="el" href="a00468.html">flow_graph.h</a>></code>
<p>
-<p>Inheritance diagram for tbb::internal::two_phase_port< T >:
-<p><center><img src="a00304.png" usemap="#tbb::internal::two_phase_port< T >_map" border="0" alt=""></center>
-<map name="tbb::internal::two_phase_port< T >_map">
-<area href="a00277.html" alt="tbb::receiver< T >" shape="rect" coords="0,0,203,24">
+<p>Inheritance diagram for tbb::flow::interface6::source_node< Output >:
+<p><center><img src="a00304.png" usemap="#tbb::flow::interface6::source_node< Output >_map" border="0" alt=""></center>
+<map name="tbb::flow::interface6::source_node< Output >_map">
+<area href="a00263.html" alt="tbb::flow::interface6::graph_node" shape="rect" coords="0,0,262,24">
+<area href="a00301.html" alt="tbb::flow::interface6::sender< Output >" shape="rect" coords="272,0,534,24">
</map>
-<a href="a00065.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00047.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="0f464d59e15941d6d625e8c7d634e26b"></a><!-- doxytag: member="tbb::internal::two_phase_port::input_type" ref="0f464d59e15941d6d625e8c7d634e26b" args="" -->
-typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00304.html#0f464d59e15941d6d625e8c7d634e26b">input_type</a></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="a00304.html#407533487cc3f6032c1072cba19c609c">output_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="37ee9b5320b631c39bccc0b4745d88d1"></a><!-- doxytag: member="tbb::internal::two_phase_port::predecessor_type" ref="37ee9b5320b631c39bccc0b4745d88d1" args="" -->
-typedef <a class="el" href="a00282.html">sender</a>< T > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00304.html#37ee9b5320b631c39bccc0b4745d88d1">predecessor_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="a00295.html">receiver</a>< Output > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00304.html#dd7b8fe78f0bec9d6b70cbf1018a69fe">successor_type</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The predecessor type for this node. <br></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"><a class="anchor" name="60e17ef935031c86c4a288eafab5c066"></a><!-- doxytag: member="tbb::internal::two_phase_port::two_phase_port" ref="60e17ef935031c86c4a288eafab5c066" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00304.html#60e17ef935031c86c4a288eafab5c066">two_phase_port</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="a00304.html#503c3b395c629296bf5cccd96d6388c1">source_node</a> (<a class="el" href="a00262.html">graph</a> &g, Body body, bool is_active=true)</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="3710ccbcc61df9602eaca1a77d9749a7"></a><!-- doxytag: member="tbb::internal::two_phase_port::two_phase_port" ref="3710ccbcc61df9602eaca1a77d9749a7" args="(const two_phase_port &)" -->
- </td><td class="memItemRight" valign="bottom"><b>two_phase_port</b> (const <a class="el" href="a00304.html">two_phase_port</a> &)</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="a00304.html#adaac111fbcace95804219a5f2929304">source_node</a> (const <a class="el" href="a00304.html">source_node</a> &src)</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ebb94d389919a46b6c1b7eb5d38f6d8f"></a><!-- doxytag: member="tbb::internal::two_phase_port::set_join_node_pointer" ref="ebb94d389919a46b6c1b7eb5d38f6d8f" args="(forwarding_base *join)" -->
-void </td><td class="memItemRight" valign="bottom"><b>set_join_node_pointer</b> (forwarding_base *join)</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="a00304.html#61700b0865fc17188b0abe26bbde65b6">~source_node</a> ()</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f316c0d5ff67068ff23b684accbe87f4"></a><!-- doxytag: member="tbb::internal::two_phase_port::try_put" ref="f316c0d5ff67068ff23b684accbe87f4" args="(T)" -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00304.html#f316c0d5ff67068ff23b684accbe87f4">try_put</a> (T)</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="a00304.html#22960d499df9f1569a9d8a544e35afe3">register_successor</a> (<a class="el" href="a00295.html">receiver</a>< <a class="el" href="a00304.html#407533487cc3f6032c1072cba19c609c">output_type</a> > &r)</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="6dc1f9bf02109c7f6fe4cc58bc31a00c"></a><!-- doxytag: member="tbb::internal::two_phase_port::register_predecessor" ref="6dc1f9bf02109c7f6fe4cc58bc31a00c" args="(sender< T > &src)" -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00304.html#6dc1f9bf02109c7f6fe4cc58bc31a00c">register_predecessor</a> (<a class="el" href="a00282.html">sender</a>< T > &src)</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="a00304.html#222484bf295f39df36415a29e508e5c9">remove_successor</a> (<a class="el" href="a00295.html">receiver</a>< <a class="el" href="a00304.html#407533487cc3f6032c1072cba19c609c">output_type</a> > &r)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Add a predecessor. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a734a55289804ff34ce1c6ac4c5075e4"></a><!-- doxytag: member="tbb::internal::two_phase_port::remove_predecessor" ref="a734a55289804ff34ce1c6ac4c5075e4" args="(sender< T > &src)" -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00304.html#a734a55289804ff34ce1c6ac4c5075e4">remove_predecessor</a> (<a class="el" href="a00282.html">sender</a>< T > &src)</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="a00304.html#41073ad4d3510ed5a8b6bda9c0f58636">try_get</a> (<a class="el" href="a00304.html#407533487cc3f6032c1072cba19c609c">output_type</a> &v)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Remove a predecessor. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1d7399cfc77fca8878d8d16049ce4e7e"></a><!-- doxytag: member="tbb::internal::two_phase_port::reserve" ref="1d7399cfc77fca8878d8d16049ce4e7e" args="(T &v)" -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00304.html#1d7399cfc77fca8878d8d16049ce4e7e">reserve</a> (T &v)</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="a00304.html#ad459713ff3c1c9ad0f4826daa141f65">try_reserve</a> (<a class="el" href="a00304.html#407533487cc3f6032c1072cba19c609c">output_type</a> &v)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Reserve an item from the port. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="091f6efffaadbbeca6cf23483dabd891"></a><!-- doxytag: member="tbb::internal::two_phase_port::release" ref="091f6efffaadbbeca6cf23483dabd891" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00304.html#091f6efffaadbbeca6cf23483dabd891">release</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="a00304.html#494678baf9096835268736b800824460">try_release</a> ()</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Release the port. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="684f6bbc3290270ed43cb34ffd273f71"></a><!-- doxytag: member="tbb::internal::two_phase_port::consume" ref="684f6bbc3290270ed43cb34ffd273f71" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00304.html#684f6bbc3290270ed43cb34ffd273f71">consume</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="a00304.html#2c7fcc29e2894b29138be3c1edce9bc9">try_consume</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="a00304.html#4b647e4a93d08ccdd8d323279e4eaaa6">activate</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 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="mdescLeft"> </td><td class="mdescRight">Complete use of the port. <br></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename T><br>
- class tbb::internal::two_phase_port< T ></h3>
+<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="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">bool <a class="el" href="a00304.html">tbb::flow::interface6::source_node</a>< Output >::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">
-The two-phase join port.
<p>
+Release a reserved item.
+<p>
+true = item has been released and so remains in sender, dest must request or reserve future items
+<p>
+Reimplemented from <a class="el" href="a00301.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="a00466.html">graph.h</a></ul>
+<li><a class="el" href="a00468.html">flow_graph.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00304.png b/doc/html/a00304.png
index b71488d..14df9ee 100644
Binary files a/doc/html/a00304.png and b/doc/html/a00304.png differ
diff --git a/doc/html/a00305.html b/doc/html/a00305.html
index dc3026d..e213f6a 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::internal::work_around_alignment_bug< Size, T > Struct 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,29 +21,105 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<b>internal</b>::<a class="el" href="a00305.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 class="el" href="a00383.html">tbb</a>::<a class="el" href="a00305.html">spin_mutex</a></div>
+<h1>tbb::spin_mutex Class Reference<br>
+<small>
+[<a class="el" href="a00398.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="a00594.html">tbb_machine.h</a>></code>
+<code>#include <<a class="el" href="a00565.html">spin_mutex.h</a>></code>
<p>
-<a href="a00153.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"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00305.html#3d8fb44644fd8d41ada1fbeba7409be3">spin_mutex</a> ()</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="4f748989e19b6045e3a2d2ee73626a28"></a><!-- doxytag: member="tbb::spin_mutex::lock" ref="4f748989e19b6045e3a2d2ee73626a28" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00305.html#4f748989e19b6045e3a2d2ee73626a28">lock</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="a00305.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="a00305.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="137d1b1dd94016bc52e423dc33c4fd1d"></a><!-- doxytag: member="tbb::internal::work_around_alignment_bug::alignment" ref="137d1b1dd94016bc52e423dc33c4fd1d" args="" -->
-static const size_t </td><td class="memItemRight" valign="bottom"><b>alignment</b> = __alignof(T)</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 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="a00306.html">scoped_lock</a></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>
-<h3>template<size_t Size, typename T><br>
- struct tbb::internal::work_around_alignment_bug< Size, T ></h3>
+A lock that occupies a single byte.
+<p>
+A <a class="el" href="a00305.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">
-Work around for bug in GNU 3.2 and MSVC compilers.
<p>
-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).
+Try acquiring lock (non-blocking).
<p>
-<hr>The documentation for this struct was generated from the following file:<ul>
-<li><a class="el" href="a00594.html">tbb_machine.h</a></ul>
+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="a00565.html">spin_mutex.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00306.html b/doc/html/a00306.html
index 72aafbc..732ed3e 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::zero_allocator< T, Allocator > 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,67 +21,71 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00306.html">zero_allocator</a></div>
-<h1>tbb::zero_allocator< T, Allocator > Class Template Reference<br>
-<small>
-[<a class="el" href="a00373.html">Memory Allocation</a>]</small>
-</h1><!-- doxytag: class="tbb::zero_allocator" -->Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5.
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00305.html">spin_mutex</a>::<a class="el" href="a00306.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="a00588.html">tbb_allocator.h</a>></code>
+<code>#include <<a class="el" href="a00565.html">spin_mutex.h</a>></code>
<p>
-<a href="a00134.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="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 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="a00306.html#29ae680ae7f5e685c2e15535b9c855b3">scoped_lock</a> ()</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="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="a00306.html#5ce6807050a9e8f87bcb4a65dccb12ef">scoped_lock</a> (<a class="el" href="a00305.html">spin_mutex</a> &m)</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 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="a00306.html#3ee3c338732b1f64b0b32a757807a30d">acquire</a> (<a class="el" href="a00305.html">spin_mutex</a> &m)</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="a00306.html">zero_allocator</a> &a) throw ()</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="a00306.html#9297ec188534b45dc0ca48f2f39a0501">try_acquire</a> (<a class="el" href="a00305.html">spin_mutex</a> &m)</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="a00306.html">zero_allocator</a>< U > &a) throw ()</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="a00306.html#eeb615e68e963e6bf8d9c11402d0ce8e">release</a> ()</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 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="a00306.html#ac6fa425d1f06c56d8b70abc51aac844">~scoped_lock</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">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<typename T, template< typename X > class Allocator = tbb_allocator><br>
- class tbb::zero_allocator< T, Allocator ></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="a00305.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">
-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.
+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="a00588.html">tbb_allocator.h</a></ul>
+<li><a class="el" href="a00565.html">spin_mutex.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00307.html b/doc/html/a00307.html
index fdfda97..ed41ffb 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::zero_allocator< void, Allocator > Class Template 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,42 +21,107 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00307.html">zero_allocator< void, Allocator ></a></div>
-<h1>tbb::zero_allocator< void, Allocator > Class Template Reference<br>
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00307.html">spin_rw_mutex_v3</a></div>
+<h1>tbb::spin_rw_mutex_v3 Class Reference<br>
<small>
-[<a class="el" href="a00373.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="a00398.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="a00588.html">tbb_allocator.h</a>></code>
+<code>#include <<a class="el" href="a00566.html">spin_rw_mutex.h</a>></code>
<p>
-<a href="a00136.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="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="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="a00307.html#61332b2756de89f3f5f69310cbb6e70c">spin_rw_mutex_v3</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 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="a00307.html#9a815fb2759e55072ed413f1b6970cf3">~spin_rw_mutex_v3</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">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="a00307.html#4007d6e1523dbc3c2bb7f889ab789a8a">lock</a> ()</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">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="a00307.html#088bb256be794cc47d3b83791632fdfc">try_lock</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="a00307.html#f9f52ead2098eb5fb12da59d5ae53b55">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="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="a00307.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="a00307.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">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="a00308.html">scoped_lock</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The scoped locking pattern. <a href="a00308.html#_details">More...</a><br></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>
+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">
-Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1.
<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="a00588.html">tbb_allocator.h</a></ul>
+<li><a class="el" href="a00566.html">spin_rw_mutex.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00289.html b/doc/html/a00308.html
similarity index 88%
copy from doc/html/a00289.html
copy to doc/html/a00308.html
index 335ba2b..6c9c2dd 100644
--- a/doc/html/a00289.html
+++ b/doc/html/a00308.html
@@ -21,7 +21,7 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00288.html">spin_rw_mutex_v3</a>::<a class="el" href="a00289.html">scoped_lock</a></div>
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00307.html">spin_rw_mutex_v3</a>::<a class="el" href="a00308.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>
@@ -30,42 +30,42 @@
<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 Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00289.html#d6ea60dee5563f702379bf5e51aa8806">scoped_lock</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00308.html#d6ea60dee5563f702379bf5e51aa8806">scoped_lock</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="a00289.html#42a92d4f8fdde425b111cfa8a9228071">scoped_lock</a> (<a class="el" href="a00288.html">spin_rw_mutex</a> &m, bool write=true)</td></tr>
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00308.html#42a92d4f8fdde425b111cfa8a9228071">scoped_lock</a> (<a class="el" href="a00307.html">spin_rw_mutex</a> &m, bool write=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="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="a00289.html#d7eaaa3f2e2c5dc11e7005811b1bdd04">~scoped_lock</a> ()</td></tr>
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00308.html#d7eaaa3f2e2c5dc11e7005811b1bdd04">~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="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="a00289.html#b0b646ec5be02a127d159bbb7ca65353">acquire</a> (<a class="el" href="a00288.html">spin_rw_mutex</a> &m, bool write=true)</td></tr>
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00308.html#b0b646ec5be02a127d159bbb7ca65353">acquire</a> (<a class="el" href="a00307.html">spin_rw_mutex</a> &m, bool write=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">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00289.html#3f0b1e3f2efab63336400348bd070226">upgrade_to_writer</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00308.html#3f0b1e3f2efab63336400348bd070226">upgrade_to_writer</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="a00289.html#61b14d00a78185c9b2d206ebfc379124">release</a> ()</td></tr>
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00308.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="a00289.html#c2c2c38a08cb9080e87099fac3e5bc94">downgrade_to_reader</a> ()</td></tr>
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00308.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="a00289.html#9879626968d9b9a04cd2ec0fb2e84ae1">try_acquire</a> (<a class="el" href="a00288.html">spin_rw_mutex</a> &m, bool write=true)</td></tr>
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00308.html#9879626968d9b9a04cd2ec0fb2e84ae1">try_acquire</a> (<a class="el" href="a00307.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="a00288.html">spin_rw_mutex</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00289.html#d96d1a1fcc3d79ef3e5c06a53b8ffeaa">mutex</a></td></tr>
+<a class="el" href="a00307.html">spin_rw_mutex</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00308.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="a00289.html#6b5a7c3c67a36b05c4df8410d32627d8">is_writer</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00308.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>
@@ -124,7 +124,7 @@ Returns true if the upgrade happened without re-acquiring the lock and false if
<div class="memproto">
<table class="memname">
<tr>
- <td class="memname">bool <a class="el" href="a00289.html#6b5a7c3c67a36b05c4df8410d32627d8">tbb::spin_rw_mutex_v3::scoped_lock::is_writer</a><code> [protected]</code> </td>
+ <td class="memname">bool <a class="el" href="a00308.html#6b5a7c3c67a36b05c4df8410d32627d8">tbb::spin_rw_mutex_v3::scoped_lock::is_writer</a><code> [protected]</code> </td>
</tr>
</table>
</div>
diff --git a/doc/html/a00290.html b/doc/html/a00309.html
similarity index 88%
copy from doc/html/a00290.html
copy to doc/html/a00309.html
index e45523b..7cf548e 100644
--- a/doc/html/a00290.html
+++ b/doc/html/a00309.html
@@ -21,14 +21,14 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00290.html">split</a></div>
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00309.html">split</a></div>
<h1>tbb::split Class Reference<br>
<small>
-[<a class="el" href="a00371.html">Algorithms</a>]</small>
+[<a class="el" href="a00395.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="a00600.html">tbb_stddef.h</a>></code>
+<code>#include <<a class="el" href="a00601.html">tbb_stddef.h</a>></code>
<p>
<table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
@@ -39,7 +39,7 @@ Dummy type that distinguishes splitting constructor from copy constructor.
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><a class="el" href="a00600.html">tbb_stddef.h</a></ul>
+<li><a class="el" href="a00601.html">tbb_stddef.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00310.html b/doc/html/a00310.html
new file mode 100644
index 0000000..6154720
--- /dev/null
+++ b/doc/html/a00310.html
@@ -0,0 +1,75 @@
+<!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>
+<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="a00383.html">tbb</a>::<b>flow</b>::<b>interface6</b>::<a class="el" href="a00310.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::multioutput_function_node< TupleType, TupleType, rejecting, Allocator >" --><a class="el" href="a00310.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="a00468.html">flow_graph.h</a>></code>
+<p>
+<p>Inheritance diagram for tbb::flow::interface6::split_node< TupleType, Allocator >:
+<p><center><img src="a00310.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="a00274.html" alt="tbb::flow::interface6::multioutput_function_node< TupleType, TupleType, rejecting, Allocator >" shape="rect" coords="474,56,1412,80">
+<area href="a00263.html" alt="tbb::flow::interface6::graph_node" shape="rect" coords="0,0,938,24">
+</map>
+<a href="a00052.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="2be7c82940654e1ac75a0027748388a2"></a><!-- doxytag: member="tbb::flow::interface6::split_node::ports_type" ref="2be7c82940654e1ac75a0027748388a2" args="" -->
+typedef base_type::ports_type </td><td class="memItemRight" valign="bottom"><b>ports_type</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="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"><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="a00262.html">graph</a> &g)</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="a00310.html">split_node</a> &other)</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>
+<h3>template<typename TupleType, typename Allocator = cache_aligned_allocator<TupleType>><br>
+ class tbb::flow::interface6::split_node< TupleType, Allocator ></h3>
+
+<a class="el" href="a00310.html">split_node</a>: accepts a tuple as input, forwards each element of the tuple to its
+<p>
+<hr>The documentation for this class was generated from the following file:<ul>
+<li><a class="el" href="a00468.html">flow_graph.h</a></ul>
+<hr>
+<p></p>
+Copyright © 2005-2011 Intel Corporation. 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/a00310.png b/doc/html/a00310.png
new file mode 100644
index 0000000..3645f7a
Binary files /dev/null and b/doc/html/a00310.png differ
diff --git a/doc/html/a00291.html b/doc/html/a00311.html
similarity index 85%
copy from doc/html/a00291.html
copy to doc/html/a00311.html
index 95a1bc4..57ad344 100644
--- a/doc/html/a00291.html
+++ b/doc/html/a00311.html
@@ -21,88 +21,88 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00291.html">task</a></div>
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00311.html">task</a></div>
<h1>tbb::task Class Reference<br>
<small>
-[<a class="el" href="a00376.html">Task Scheduling</a>]</small>
+[<a class="el" href="a00400.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="a00567.html">task.h</a>></code>
<p>
<p>Inheritance diagram for tbb::task:
-<p><center><img src="a00291.png" usemap="#tbb::task_map" border="0" alt=""></center>
+<p><center><img src="a00311.png" usemap="#tbb::task_map" border="0" alt=""></center>
<map name="tbb::task_map">
-<area href="a00242.html" alt="tbb::empty_task" shape="rect" coords="0,56,97,80">
+<area href="a00254.html" alt="tbb::empty_task" shape="rect" coords="0,56,97,80">
</map>
<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 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="a00291.html#d61bb32389d3857bf7511d69beaafb76">affinity_id</a></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="a00311.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="a00291.html#4a3c415562d17905390ea5b49d12293ead0fe2302ccc360923f738c2ed7ec1b9">executing</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.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="a00291.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="a00291.html#4a3c415562d17905390ea5b49d12293e3bf499aa6e6487cd1ace883a63100513">reexecute</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">task is running, and will be destroyed after method <a class="el" href="a00311.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="a00311.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="a00291.html#4a3c415562d17905390ea5b49d12293e0841dcf1c2a96dee9aa7b69f636cb81a">ready</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.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="a00291.html#4a3c415562d17905390ea5b49d12293ebe94d3348dd038e41107819f00c1884c">allocated</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.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="a00291.html#4a3c415562d17905390ea5b49d12293ecc67ca92bd6f1ce9738a1e9e7206b735">freed</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.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="a00291.html#4a3c415562d17905390ea5b49d12293e58debec6ab130290640d0cc2eedba35d">recycle</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.html#4a3c415562d17905390ea5b49d12293e58debec6ab130290640d0cc2eedba35d">recycle</a></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="a00291.html#4a3c415562d17905390ea5b49d12293e">state_type</a> { <br>
- <a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293ead0fe2302ccc360923f738c2ed7ec1b9">executing</a>,
-<a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293e3bf499aa6e6487cd1ace883a63100513">reexecute</a>,
-<a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293e0841dcf1c2a96dee9aa7b69f636cb81a">ready</a>,
-<a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293ebe94d3348dd038e41107819f00c1884c">allocated</a>,
+<tr><td class="memItemLeft" nowrap align="right" valign="top">enum </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.html#4a3c415562d17905390ea5b49d12293e">state_type</a> { <br>
+ <a class="el" href="a00311.html#4a3c415562d17905390ea5b49d12293ead0fe2302ccc360923f738c2ed7ec1b9">executing</a>,
+<a class="el" href="a00311.html#4a3c415562d17905390ea5b49d12293e3bf499aa6e6487cd1ace883a63100513">reexecute</a>,
+<a class="el" href="a00311.html#4a3c415562d17905390ea5b49d12293e0841dcf1c2a96dee9aa7b69f636cb81a">ready</a>,
+<a class="el" href="a00311.html#4a3c415562d17905390ea5b49d12293ebe94d3348dd038e41107819f00c1884c">allocated</a>,
<br>
- <a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293ecc67ca92bd6f1ce9738a1e9e7206b735">freed</a>,
-<a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293e58debec6ab130290640d0cc2eedba35d">recycle</a>
+ <a class="el" href="a00311.html#4a3c415562d17905390ea5b49d12293ecc67ca92bd6f1ce9738a1e9e7206b735">freed</a>,
+<a class="el" href="a00311.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="a00291.html#4a3c415562d17905390ea5b49d12293e">More...</a><br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Enumeration of task states that the scheduler considers. <a href="a00311.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="a00291.html#98245ee0473f84cb19dbbf8c81134908">~task</a> ()</td></tr>
+virtual </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.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="a00291.html">task</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#22c298cd40937a431a06777423f002f6">execute</a> ()=0</td></tr>
+virtual <a class="el" href="a00311.html">task</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.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="a00291.html#1434c79a5138993269d034008bff7329">allocate_continuation</a> ()</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="a00311.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="a00291.html#1ff794f7053cd9148d5f280fbf07377f">allocate_child</a> ()</td></tr>
+internal::allocate_child_proxy & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.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="a00291.html#dfaacf92685e5f86393bf657b2853bf8">destroy</a> (<a class="el" href="a00291.html">task</a> &t)</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="a00311.html#dfaacf92685e5f86393bf657b2853bf8">destroy</a> (<a class="el" href="a00311.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="a00291.html#a67a79e18f62b43a623a00cfbd76db4c">recycle_as_continuation</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.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="a00291.html#3b290d14109704e2b69dc1ac980a7a76">recycle_as_safe_continuation</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.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="a00291.html#db399855177438bbc9cc61d508dae8d2">recycle_as_child_of</a> (<a class="el" href="a00291.html">task</a> &new_parent)</td></tr>
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.html#db399855177438bbc9cc61d508dae8d2">recycle_as_child_of</a> (<a class="el" href="a00311.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="a00291.html#4f1be9bbcdb487830dbe298b68d85144">recycle_to_reexecute</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.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="a00291.html#22c298cd40937a431a06777423f002f6">execute()</a> returns. <a href="#4f1be9bbcdb487830dbe298b68d85144"></a><br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Schedule this for reexecution after current <a class="el" href="a00311.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>
@@ -113,112 +113,116 @@ void </td><td class="memItemRight" valign="bottom"><b>set_depth</b> (intptr
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="a00291.html#06a4206a57e8e12a439b14d6d41cfd92">set_ref_count</a> (int count)</td></tr>
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.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="a00291.html#f5fb43c7ad0de5a4b95703cebc39e345">increment_ref_count</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.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="a00291.html#ef4680f5c148020c5e7e43ddef44cd5d">decrement_ref_count</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.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="a00291.html#3ce28ca9baa771cfc37ecd72e69c4f3c">spawn_and_wait_for_all</a> (<a class="el" href="a00291.html">task</a> &child)</td></tr>
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.html#3ce28ca9baa771cfc37ecd72e69c4f3c">spawn_and_wait_for_all</a> (<a class="el" href="a00311.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="a00291.html#894ab68378e502776d8220eea7ce9fa1">spawn_and_wait_for_all</a> (<a class="el" href="a00294.html">task_list</a> &list)</td></tr>
+void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.html#894ab68378e502776d8220eea7ce9fa1">spawn_and_wait_for_all</a> (<a class="el" href="a00315.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="a00291.html#53d2615ad9c38859b4c8080936600283">wait_for_all</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.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="a00291.html">task</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#314e98ee4347ccec83efcb9ee22e8596">parent</a> () const </td></tr>
+<a class="el" href="a00311.html">task</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.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="el" href="a00293.html">task_group_context</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#d8c36a93f3972590fbb65ff1cef3173b">context</a> ()</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="a00311.html#d2eaf79fcaa3ae473e3bd3f44bd8a464">set_parent</a> (<a class="el" href="a00311.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="a00314.html">task_group_context</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.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="a00293.html">task_group_context</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#5987123486afca36ddebb9e2a8b7779a">group</a> ()</td></tr>
+<a class="el" href="a00314.html">task_group_context</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.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="a00291.html#f9169402702f56bf519448aaf34450aa">is_stolen_task</a> () const </td></tr>
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.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="a00291.html#4a3c415562d17905390ea5b49d12293e">state_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#0af7b2d7e6e8b4333b2accfce3dfb374">state</a> () const </td></tr>
+<a class="el" href="a00311.html#4a3c415562d17905390ea5b49d12293e">state_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.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="a00291.html#ad774f55eaec008ae02b236423209ced">ref_count</a> () const </td></tr>
+int </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.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="a00291.html#c26718b3b247cd13deb1a741902e7105">is_owned_by_current_thread</a> () const </td></tr>
+bool __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.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="a00291.html#dca19d7a45487a7d67a0db517e2b57c9">set_affinity</a> (<a class="el" href="a00291.html#d61bb32389d3857bf7511d69beaafb76">affinity_id</a> id)</td></tr>
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.html#dca19d7a45487a7d67a0db517e2b57c9">set_affinity</a> (<a class="el" href="a00311.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="a00291.html#d61bb32389d3857bf7511d69beaafb76">affinity_id</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#3a920a56b0bcf2801518fb45b2c9d2be">affinity</a> () const </td></tr>
+<a class="el" href="a00311.html#d61bb32389d3857bf7511d69beaafb76">affinity_id</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.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="a00291.html#713c338c8eeaebdc5a6b10a69c039b06">note_affinity</a> (<a class="el" href="a00291.html#d61bb32389d3857bf7511d69beaafb76">affinity_id</a> id)</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="a00311.html#713c338c8eeaebdc5a6b10a69c039b06">note_affinity</a> (<a class="el" href="a00311.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="a00291.html#62247be9a637a814c8e8f4bcfb3a1908">change_group</a> (<a class="el" href="a00293.html">task_group_context</a> &ctx)</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="a00311.html#62247be9a637a814c8e8f4bcfb3a1908">change_group</a> (<a class="el" href="a00314.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="a00291.html#0f3fb4aac549ab642022450a4bd13326">cancel_group_execution</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.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="a00291.html#025f18118c057c4c8db87ff2ce8df975">is_cancelled</a> () const </td></tr>
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.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="a00291.html#9ac8d1542d67d9d80121ff986801ac26">set_group_priority</a> (priority_t p)</td></tr>
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.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="a00291.html#e1d969a1ccab6796e3b8b2c1a5be33d2">group_priority</a> () const </td></tr>
+priority_t </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.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="a00291.html#23acb0da0afd690da797f9f882027d34">allocate_root</a> ()</td></tr>
+static internal::allocate_root_proxy </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.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="a00291.html#8ccc518caf31075a3e073996d2d240a4">allocate_root</a> (<a class="el" href="a00293.html">task_group_context</a> &ctx)</td></tr>
+static internal::allocate_root_with_context_proxy </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.html#8ccc518caf31075a3e073996d2d240a4">allocate_root</a> (<a class="el" href="a00314.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="a00291.html#ce8ce689c26a4ddf343829bc3c73290a">spawn_root_and_wait</a> (<a class="el" href="a00291.html">task</a> &root)</td></tr>
+static void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.html#ce8ce689c26a4ddf343829bc3c73290a">spawn_root_and_wait</a> (<a class="el" href="a00311.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="a00291.html#c33c7edbaec67aa8a56f48986a9dc69f">spawn_root_and_wait</a> (<a class="el" href="a00294.html">task_list</a> &root_list)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">static void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.html#c33c7edbaec67aa8a56f48986a9dc69f">spawn_root_and_wait</a> (<a class="el" href="a00315.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="a00291.html#8365d063c0cc9d7bd616bca47256b93c">enqueue</a> (<a class="el" href="a00291.html">task</a> &t)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">static void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.html#8365d063c0cc9d7bd616bca47256b93c">enqueue</a> (<a class="el" href="a00311.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="a00291.html#fe6bf6aaf84e664134fabb6c4f409ea9">enqueue</a> (<a class="el" href="a00291.html">task</a> &t, priority_t p)</td></tr>
+static void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.html#fe6bf6aaf84e664134fabb6c4f409ea9">enqueue</a> (<a class="el" href="a00311.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="a00291.html">task</a> &__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#bd43e8d6249738efafd12d6a4c72c5e3">self</a> ()</td></tr>
+static <a class="el" href="a00311.html">task</a> &__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.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="a00291.html#2bce8ec6e44706e70128f5cf91b76e67">task</a> ()</td></tr>
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.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>
@@ -256,7 +260,7 @@ Base class for user-defined tasks.
<div class="memproto">
<table class="memname">
<tr>
- <td class="memname">typedef internal::affinity_id <a class="el" href="a00291.html#d61bb32389d3857bf7511d69beaafb76">tbb::task::affinity_id</a> </td>
+ <td class="memname">typedef internal::affinity_id <a class="el" href="a00311.html#d61bb32389d3857bf7511d69beaafb76">tbb::task::affinity_id</a> </td>
</tr>
</table>
</div>
@@ -274,7 +278,7 @@ Guaranteed to be integral type. Value of 0 means no affinity.
<div class="memproto">
<table class="memname">
<tr>
- <td class="memname">enum <a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293e">tbb::task::state_type</a> </td>
+ <td class="memname">enum <a class="el" href="a00311.html#4a3c415562d17905390ea5b49d12293e">tbb::task::state_type</a> </td>
</tr>
</table>
</div>
@@ -286,7 +290,7 @@ Enumeration of task states that the scheduler considers.
<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="a00291.html#22c298cd40937a431a06777423f002f6">execute()</a> completes. </td></tr>
+task is running, and will be destroyed after method <a class="el" href="a00311.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>
@@ -353,7 +357,7 @@ Initiates cancellation of all tasks in this cancellation group and its subordina
<tr>
<td class="memname">void __TBB_EXPORTED_METHOD tbb::task::change_group </td>
<td>(</td>
- <td class="paramtype"><a class="el" href="a00293.html">task_group_context</a> & </td>
+ <td class="paramtype"><a class="el" href="a00314.html">task_group_context</a> & </td>
<td class="paramname"> <em>ctx</em> </td>
<td> ) </td>
<td width="100%"></td>
@@ -366,7 +370,7 @@ Initiates cancellation of all tasks in this cancellation group and its subordina
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="a00291.html#62247be9a637a814c8e8f4bcfb3a1908">change_group()</a> allow [...]
+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="a00311.html#62247be9a637a814c8e8f4bcfb3a1908">change_group()</a> allow [...]
</div>
</div><p>
<a class="anchor" name="d8c36a93f3972590fbb65ff1cef3173b"></a><!-- doxytag: member="tbb::task::context" ref="d8c36a93f3972590fbb65ff1cef3173b" args="()" -->
@@ -374,7 +378,7 @@ The primary purpose of this method is to associate unique task group context wit
<div class="memproto">
<table class="memname">
<tr>
- <td class="memname"><a class="el" href="a00293.html">task_group_context</a>* tbb::task::context </td>
+ <td class="memname"><a class="el" href="a00314.html">task_group_context</a>* tbb::task::context </td>
<td>(</td>
<td class="paramname"> </td>
<td> ) </td>
@@ -387,7 +391,7 @@ The primary purpose of this method is to associate unique task group context wit
<p>
This method is deprecated and will be removed in the future.
<p>
-Use method <a class="el" href="a00291.html#5987123486afca36ddebb9e2a8b7779a">group()</a> instead.
+Use method <a class="el" href="a00311.html#5987123486afca36ddebb9e2a8b7779a">group()</a> instead.
</div>
</div><p>
<a class="anchor" name="ef4680f5c148020c5e7e43ddef44cd5d"></a><!-- doxytag: member="tbb::task::decrement_ref_count" ref="ef4680f5c148020c5e7e43ddef44cd5d" args="()" -->
@@ -418,7 +422,7 @@ Has release semantics.
<tr>
<td class="memname">void __TBB_EXPORTED_METHOD tbb::task::destroy </td>
<td>(</td>
- <td class="paramtype"><a class="el" href="a00291.html">task</a> & </td>
+ <td class="paramtype"><a class="el" href="a00311.html">task</a> & </td>
<td class="paramname"> <em>t</em> </td>
<td> ) </td>
<td width="100%"></td>
@@ -430,7 +434,7 @@ Has release semantics.
<p>
Destroy a task.
<p>
-Usually, calling this method is unnecessary, because a task is implicitly deleted after its <a class="el" href="a00291.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.
+Usually, calling this method is unnecessary, because a task is implicitly deleted after its <a class="el" href="a00311.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)" -->
@@ -440,7 +444,7 @@ Usually, calling this method is unnecessary, because a task is implicitly delete
<tr>
<td class="memname">static void tbb::task::enqueue </td>
<td>(</td>
- <td class="paramtype"><a class="el" href="a00291.html">task</a> & </td>
+ <td class="paramtype"><a class="el" href="a00311.html">task</a> & </td>
<td class="paramname"> <em>t</em> </td>
<td> ) </td>
<td width="100%"><code> [inline, static]</code></td>
@@ -454,7 +458,7 @@ 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="a00291.html#8365d063c0cc9d7bd616bca47256b93c">enqueue()</a> overload with explicit priority value and <a class="el" href="a00291.html#e1d969a1ccab6796e3b8b2c1a5be33d2">task::group_priority()</a> method to implement such priority inheritance when it is really necessary.
+Use <a class="el" href="a00311.html#8365d063c0cc9d7bd616bca47256b93c">enqueue()</a> overload with explicit priority value and <a class="el" href="a00311.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="()" -->
@@ -485,7 +489,7 @@ Has acquire semantics
<tr>
<td class="memname">virtual void __TBB_EXPORTED_METHOD tbb::task::note_affinity </td>
<td>(</td>
- <td class="paramtype"><a class="el" href="a00291.html#d61bb32389d3857bf7511d69beaafb76">affinity_id</a> </td>
+ <td class="paramtype"><a class="el" href="a00311.html#d61bb32389d3857bf7511d69beaafb76">affinity_id</a> </td>
<td class="paramname"> <em>id</em> </td>
<td> ) </td>
<td width="100%"><code> [virtual]</code></td>
@@ -497,7 +501,7 @@ Has acquire semantics
<p>
Invoked by scheduler to notify task that it ran on unexpected thread.
<p>
-Invoked before method <a class="el" href="a00291.html#22c298cd40937a431a06777423f002f6">execute()</a> runs, if task is stolen, or task has affinity but will be executed on another thread.<p>
+Invoked before method <a class="el" href="a00311.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>
@@ -519,7 +523,7 @@ The default action does nothing.
<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="a00291.html#22c298cd40937a431a06777423f002f6">execute()</a> returns. Typically, this is done by having method <a class="el" href="a00291.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>
+The caller must guarantee that the task's refcount does not become zero until after the method <a class="el" href="a00311.html#22c298cd40937a431a06777423f002f6">execute()</a> returns. Typically, this is done by having method <a class="el" href="a00311.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>
@@ -541,7 +545,7 @@ Because of the hazard, this method may be deprecated in the future.
<p>
Recommended to use, safe variant of recycle_as_continuation.
<p>
-For safety, it requires additional increment of ref_count. With no decendants and ref_count of 1, it has the semantics of recycle_to_reexecute.
+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="()" -->
@@ -560,7 +564,7 @@ For safety, it requires additional increment of ref_count. With no decendants an
<div class="memdoc">
<p>
-Schedule this for reexecution after current <a class="el" href="a00291.html#22c298cd40937a431a06777423f002f6">execute()</a> returns.
+Schedule this for reexecution after current <a class="el" href="a00311.html#22c298cd40937a431a06777423f002f6">execute()</a> returns.
<p>
Made obsolete by recycle_as_safe_continuation; may become deprecated.
</div>
@@ -572,7 +576,7 @@ Made obsolete by recycle_as_safe_continuation; may become deprecated.
<tr>
<td class="memname">void tbb::task::spawn_root_and_wait </td>
<td>(</td>
- <td class="paramtype"><a class="el" href="a00294.html">task_list</a> & </td>
+ <td class="paramtype"><a class="el" href="a00315.html">task_list</a> & </td>
<td class="paramname"> <em>root_list</em> </td>
<td> ) </td>
<td width="100%"><code> [inline, static]</code></td>
diff --git a/doc/html/a00291.png b/doc/html/a00311.png
similarity index 100%
rename from doc/html/a00291.png
rename to doc/html/a00311.png
diff --git a/doc/html/a00292.html b/doc/html/a00312.html
similarity index 95%
copy from doc/html/a00292.html
copy to doc/html/a00312.html
index 7836bb9..ba52a82 100644
--- a/doc/html/a00292.html
+++ b/doc/html/a00312.html
@@ -21,7 +21,7 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<b>interface5</b>::<b>internal</b>::<a class="el" href="a00292.html">task_base</a></div>
+<a class="el" href="a00383.html">tbb</a>::<b>interface5</b>::<b>internal</b>::<a class="el" href="a00312.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>
diff --git a/doc/html/a00239.html b/doc/html/a00314.html
similarity index 72%
copy from doc/html/a00239.html
copy to doc/html/a00314.html
index 76b45e0..bfa3bf0 100644
--- a/doc/html/a00239.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::continue_msg Class 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,20 +21,17 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00239.html">continue_msg</a></div>
-<h1>tbb::continue_msg Class Reference</h1><!-- doxytag: class="tbb::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="a00466.html">graph.h</a>></code>
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00314.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="a00506.html">parallel_invoke.h</a>></code>
<p>
<table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-An empty class used for messages that mean "I'm done".
+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="a00466.html">graph.h</a></ul>
+<hr>The documentation for this struct was generated from the following file:<ul>
+<li><a class="el" href="a00506.html">parallel_invoke.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00294.html b/doc/html/a00315.html
similarity index 88%
copy from doc/html/a00294.html
copy to doc/html/a00315.html
index 4656519..c229fcb 100644
--- a/doc/html/a00294.html
+++ b/doc/html/a00315.html
@@ -21,10 +21,10 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00294.html">task_list</a></div>
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00315.html">task_list</a></div>
<h1>tbb::task_list Class Reference<br>
<small>
-[<a class="el" href="a00376.html">Task Scheduling</a>]</small>
+[<a class="el" href="a00400.html">Task Scheduling</a>]</small>
</h1><!-- doxytag: class="tbb::task_list" -->A list of children.
<a href="#_details">More...</a>
<p>
@@ -34,27 +34,27 @@
<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="a00294.html#416341c2047eaef50417b41eaf7e9de6">task_list</a> ()</td></tr>
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00315.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="a00294.html#6d438f1499a02db1e59c24ab6043e5ba">~task_list</a> ()</td></tr>
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00315.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="a00294.html#f3ac31e092814b90929f81bb30441959">empty</a> () const </td></tr>
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00315.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="a00294.html#4cd34756bc4763dafb8c84838a0124ff">push_back</a> (<a class="el" href="a00291.html">task</a> &<a class="el" href="a00291.html">task</a>)</td></tr>
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00315.html#4cd34756bc4763dafb8c84838a0124ff">push_back</a> (<a class="el" href="a00311.html">task</a> &<a class="el" href="a00311.html">task</a>)</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="a00291.html">task</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00294.html#5fe85df5ed524418389d34051750347d">pop_front</a> ()</td></tr>
+<a class="el" href="a00311.html">task</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00315.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="a00294.html#fce446ee13e025969945328f3ff59b95">clear</a> ()</td></tr>
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00315.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>
diff --git a/doc/html/a00295.html b/doc/html/a00316.html
similarity index 90%
copy from doc/html/a00295.html
copy to doc/html/a00316.html
index a485399..cbc055e 100644
--- a/doc/html/a00295.html
+++ b/doc/html/a00316.html
@@ -21,10 +21,10 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00295.html">task_scheduler_init</a></div>
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00316.html">task_scheduler_init</a></div>
<h1>tbb::task_scheduler_init Class Reference<br>
<small>
-[<a class="el" href="a00376.html">Task Scheduling</a>]</small>
+[<a class="el" href="a00400.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>
@@ -33,48 +33,48 @@
<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 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="a00295.html#d476053cc712e572554823492a5229ce">initialize</a> (int number_of_threads=<a class="el" href="a00295.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="a00316.html#d476053cc712e572554823492a5229ce">initialize</a> (int number_of_threads=<a class="el" href="a00316.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="a00295.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="a00316.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="a00295.html#f73257e04cb7fb9bd5be2b635d9016f1">terminate</a> ()</td></tr>
+void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00316.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="a00295.html#421600bf9bf9338bcf937063f2ff0e90">task_scheduler_init</a> (int number_of_threads=<a class="el" href="a00295.html#8f5988e2b0fbb2d533fcbb7f2583743f">automatic</a>, stack_size_type thread_stack_size=0)</td></tr>
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00316.html#421600bf9bf9338bcf937063f2ff0e90">task_scheduler_init</a> (int number_of_threads=<a class="el" href="a00316.html#8f5988e2b0fbb2d533fcbb7f2583743f">automatic</a>, stack_size_type thread_stack_size=0)</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="a00295.html#4da6c86292d80c703a66c1f6f5299488">~task_scheduler_init</a> ()</td></tr>
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00316.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="a00295.html#12752282977029f23416642bc03e8b74">is_active</a> () const </td></tr>
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00316.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="a00295.html#ba00714c33a41a3c2216f48613971cab">default_num_threads</a> ()</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="a00316.html#ba00714c33a41a3c2216f48613971cab">default_num_threads</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="a00295.html#8f5988e2b0fbb2d533fcbb7f2583743f">automatic</a> = -1</td></tr>
+static const int </td><td class="memItemRight" valign="bottom"><a class="el" href="a00316.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="a00295.html#e6c860f1e559026ff3ef4599c0d6c514">deferred</a> = -2</td></tr>
+static const int </td><td class="memItemRight" valign="bottom"><a class="el" href="a00316.html#e6c860f1e559026ff3ef4599c0d6c514">deferred</a> = -2</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Argument to <a class="el" href="a00295.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="a00316.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="a00295.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="a00316.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="a00295.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="a00295.html#d476053cc712e572554823492a5229ce">task_scheduler_init::initialize()</a>.
+If a parallel construct is used without <a class="el" href="a00316.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="a00316.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="()" -->
@@ -140,7 +140,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="a00295.html#8f5988e2b0fbb2d533fcbb7f2583743f">automatic</a></code> </td>
+ <td class="paramname"> <em>number_of_threads</em> = <code><a class="el" href="a00316.html#8f5988e2b0fbb2d533fcbb7f2583743f">automatic</a></code> </td>
<td> ) </td>
<td width="100%"></td>
</tr>
diff --git a/doc/html/a00296.html b/doc/html/a00317.html
similarity index 92%
copy from doc/html/a00296.html
copy to doc/html/a00317.html
index 6c0662e..afd87d6 100644
--- a/doc/html/a00296.html
+++ b/doc/html/a00317.html
@@ -21,10 +21,10 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00296.html">tbb_allocator</a></div>
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00317.html">tbb_allocator</a></div>
<h1>tbb::tbb_allocator< T > Class Template Reference<br>
<small>
-[<a class="el" href="a00373.html">Memory Allocation</a>]</small>
+[<a class="el" href="a00397.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>
@@ -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="a00296.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="a00317.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="a00296.html">tbb_allocator</a> &) throw ()</td></tr>
+ </td><td class="memItemRight" valign="bottom"><b>tbb_allocator</b> (const <a class="el" href="a00317.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="a00296.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="a00317.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,28 +81,28 @@ 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="a00296.html#f6cb487b1bdce0b581f265a77dca6d53">allocate</a> (size_type n, const void *=0)</td></tr>
+pointer </td><td class="memItemRight" valign="bottom"><a class="el" href="a00317.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="a00296.html#fdd011fdf2f9ad07006dc7c0a7ec1da2">deallocate</a> (pointer p, size_type)</td></tr>
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00317.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="a00296.html#f059ca2c96243024f0d562ee3a87a3a5">max_size</a> () const throw ()</td></tr>
+size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00317.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="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ab228ab9e324ed041c2226e1d717df5f"></a><!-- doxytag: member="tbb::tbb_allocator::construct" ref="ab228ab9e324ed041c2226e1d717df5f" args="(pointer p, const value_type &value)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00296.html#ab228ab9e324ed041c2226e1d717df5f">construct</a> (pointer p, const value_type &value)</td></tr>
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00317.html#ab228ab9e324ed041c2226e1d717df5f">construct</a> (pointer p, const value_type &value)</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Copy-construct value at location pointed to by p. <br></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ef133522bf55f05a605bee0763208281"></a><!-- doxytag: member="tbb::tbb_allocator::destroy" ref="ef133522bf55f05a605bee0763208281" args="(pointer p)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00296.html#ef133522bf55f05a605bee0763208281">destroy</a> (pointer p)</td></tr>
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00317.html#ef133522bf55f05a605bee0763208281">destroy</a> (pointer p)</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroy value at location pointed to by p. <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="78701e7454ef8e1a25b5acd364367080"></a><!-- doxytag: member="tbb::tbb_allocator::allocator_type" ref="78701e7454ef8e1a25b5acd364367080" args="()" -->
-static <a class="el" href="a00296.html#09a7f81fb2c3055aaecf058b11538544">malloc_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00296.html#78701e7454ef8e1a25b5acd364367080">allocator_type</a> ()</td></tr>
+static <a class="el" href="a00317.html#09a7f81fb2c3055aaecf058b11538544">malloc_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00317.html#78701e7454ef8e1a25b5acd364367080">allocator_type</a> ()</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns current allocator. <br></td></tr>
<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
diff --git a/doc/html/a00297.html b/doc/html/a00318.html
similarity index 95%
copy from doc/html/a00297.html
copy to doc/html/a00318.html
index 3a727da..cbb4c69 100644
--- a/doc/html/a00297.html
+++ b/doc/html/a00318.html
@@ -21,10 +21,10 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00297.html">tbb_allocator< void ></a></div>
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00318.html">tbb_allocator< void ></a></div>
<h1>tbb::tbb_allocator< void > Class Template Reference<br>
<small>
-[<a class="el" href="a00373.html">Memory Allocation</a>]</small>
+[<a class="el" href="a00397.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>
diff --git a/doc/html/a00298.html b/doc/html/a00319.html
similarity index 84%
copy from doc/html/a00298.html
copy to doc/html/a00319.html
index 057f3cc..2146d84 100644
--- a/doc/html/a00298.html
+++ b/doc/html/a00319.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="a00362.html">tbb</a>::<a class="el" href="a00298.html">tbb_exception</a></div>
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00319.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="a00593.html">tbb_exception.h</a>></code>
<p>
<p>Inheritance diagram for tbb::tbb_exception:
-<p><center><img src="a00298.png" usemap="#tbb::tbb_exception_map" border="0" alt=""></center>
+<p><center><img src="a00319.png" usemap="#tbb::tbb_exception_map" border="0" alt=""></center>
<map name="tbb::tbb_exception_map">
-<area href="a00228.html" alt="tbb::captured_exception" shape="rect" coords="0,56,248,80">
-<area href="a00257.html" alt="tbb::movable_exception< ExceptionData >" shape="rect" coords="258,56,506,80">
+<area href="a00240.html" alt="tbb::captured_exception" shape="rect" coords="0,56,248,80">
+<area href="a00273.html" alt="tbb::movable_exception< ExceptionData >" shape="rect" coords="258,56,506,80">
</map>
<a href="a00142.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="a00298.html">tbb_exception</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00298.html#3e3482bf264d4ca4dde046cd9c02c766">move</a> ()=0 throw ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">virtual <a class="el" href="a00319.html">tbb_exception</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00319.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="a00298.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="a00319.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="a00298.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="a00298.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="a00319.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="a00319.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="a00298.html#d00f6497e552fee978a02bfcbebf46e2">name</a> () const =0 throw ()</td></tr>
+virtual const char * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00319.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="a00298.html#e8157689ecb66bc6c72d3618bf3cc371">what</a> () const =0 throw ()</td></tr>
+virtual const char * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00319.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="a00298.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="a00298.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="a00319.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="a00319.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="a00298.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="a00293.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="a00319.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="a00313.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="a00228.html">tbb::captured_exception</a> and template class <a class="el" href="a00257.html">tbb::movable_exception</a>. See their declarations for more info.
+TBB provides two implementations of this interface: <a class="el" href="a00240.html">tbb::captured_exception</a> and template class <a class="el" href="a00273.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="a00228.h
<div class="memdoc">
<p>
-Destroys objects created by the <a class="el" href="a00298.html#3e3482bf264d4ca4dde046cd9c02c766">move()</a> method.
+Destroys objects created by the <a class="el" href="a00319.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="a00228.html#93d875d3555502ff6f18513525de204c">tbb::captured_exception</a>, and <a class="el" href="a00257.html#7a46873119d9f85a7b0009c13e41a258">tbb::movable_exception< ExceptionData ></a>.
+Implemented in <a class="el" href="a00240.html#93d875d3555502ff6f18513525de204c">tbb::captured_exception</a>, and <a class="el" href="a00273.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="a00228.html#93d875d3555502ff6f18513525de204c"
<div class="memproto">
<table class="memname">
<tr>
- <td class="memname">virtual <a class="el" href="a00298.html">tbb_exception</a>* tbb::tbb_exception::move </td>
+ <td class="memname">virtual <a class="el" href="a00319.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="a00228.html#837a50b8f6a800bda225c39d1699643f">tbb::captured_exception</a>, and <a class="el" href="a00257.html#1aea0ad179d6f0481fe7f3495f66adf9">tbb::movable_exception< ExceptionData ></a>.
+Implemented in <a class="el" href="a00240.html#837a50b8f6a800bda225c39d1699643f">tbb::captured_exception</a>, and <a class="el" href="a00273.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="a00228.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="a00298.html#3e3482bf264d4ca4dde046cd9c02c766">move()</a> operation on an exception thrown out of TBB scheduler.<p>
-When overriding method <a class="el" href="a00298.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="a00319.html#3e3482bf264d4ca4dde046cd9c02c766">move()</a> operation on an exception thrown out of TBB scheduler.<p>
+When overriding method <a class="el" href="a00319.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,7 +152,7 @@ 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="a00228.html#2dd1be66ab32fa27e0ddef5707fa67ef">tbb::captured_exception</a>, and <a class="el" href="a00257.html#17cffba35811c92b7e65d63506b69602">tbb::movable_exception< ExceptionData ></a>.
+Implemented in <a class="el" href="a00240.html#2dd1be66ab32fa27e0ddef5707fa67ef">tbb::captured_exception</a>, and <a class="el" href="a00273.html#17cffba35811c92b7e65d63506b69602">tbb::movable_exception< ExceptionData ></a>.
</div>
</div><p>
<hr>The documentation for this class was generated from the following file:<ul>
diff --git a/doc/html/a00298.png b/doc/html/a00319.png
similarity index 100%
rename from doc/html/a00298.png
rename to doc/html/a00319.png
diff --git a/doc/html/a00299.html b/doc/html/a00320.html
similarity index 88%
copy from doc/html/a00299.html
copy to doc/html/a00320.html
index 93956b3..a5f307b 100644
--- a/doc/html/a00299.html
+++ b/doc/html/a00320.html
@@ -21,7 +21,7 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<b>internal</b>::<a class="el" href="a00299.html">tbb_exception_ptr</a></div>
+<a class="el" href="a00383.html">tbb</a>::<b>internal</b>::<a class="el" href="a00320.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>
@@ -30,22 +30,22 @@
<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 </td><td class="memItemRight" valign="bottom"><a class="el" href="a00299.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="a00320.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="a00299.html#292832fd5c523e3d8081a22247840a1d">throw_self</a> ()</td></tr>
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00320.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="a00299.html">tbb_exception_ptr</a> * </td><td class="memItemRight" valign="bottom"><b>allocate</b> ()</td></tr>
+static <a class="el" href="a00320.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="a00299.html">tbb_exception_ptr</a> * </td><td class="memItemRight" valign="bottom"><b>allocate</b> (const <a class="el" href="a00298.html">tbb_exception</a> &tag)</td></tr>
+static <a class="el" href="a00320.html">tbb_exception_ptr</a> * </td><td class="memItemRight" valign="bottom"><b>allocate</b> (const <a class="el" href="a00319.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="a00299.html">tbb_exception_ptr</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00299.html#c35e5db8e9cdff5d1387db5b0bad2e4a">allocate</a> (<a class="el" href="a00228.html">captured_exception</a> &src)</td></tr>
+static <a class="el" href="a00320.html">tbb_exception_ptr</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00320.html#c35e5db8e9cdff5d1387db5b0bad2e4a">allocate</a> (<a class="el" href="a00240.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>
diff --git a/doc/html/a00216.html b/doc/html/a00321.html
similarity index 55%
rename from doc/html/a00216.html
rename to doc/html/a00321.html
index c19731e..a8beaa8 100644
--- a/doc/html/a00216.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::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,35 +21,30 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00216.html">atomic</a></div>
-<h1>tbb::atomic< T > Struct Template Reference<br>
-<small>
-[<a class="el" href="a00374.html">Synchronization</a>]</small>
-</h1><!-- doxytag: class="tbb::atomic" -->Primary template for atomic.
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00321.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="a00410.html">atomic.h</a>></code>
+<code>#include <<a class="el" href="a00418.html">concurrent_hash_map.h</a>></code>
<p>
-<a href="a00004.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 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="a00216.html">atomic</a>< T > & </td><td class="memItemRight" valign="bottom"><b>operator=</b> (const <a class="el" href="a00216.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="a00410.html">atomic.h</a></ul>
+<li><a class="el" href="a00418.html">concurrent_hash_map.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00301.html b/doc/html/a00322.html
similarity index 91%
copy from doc/html/a00301.html
copy to doc/html/a00322.html
index bb22869..38ef4e0 100644
--- a/doc/html/a00301.html
+++ b/doc/html/a00322.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="a00362.html">tbb</a>::<a class="el" href="a00301.html">thread_bound_filter</a></div>
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00322.html">thread_bound_filter</a></div>
<h1>tbb::thread_bound_filter Class Reference<br>
<small>
-[<a class="el" href="a00371.html">Algorithms</a>]</small>
+[<a class="el" href="a00395.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="a00546.html">pipeline.h</a>></code>
+<code>#include <<a class="el" href="a00543.html">pipeline.h</a>></code>
<p>
<p>Inheritance diagram for tbb::thread_bound_filter:
-<p><center><img src="a00301.png" usemap="#tbb::thread_bound_filter_map" border="0" alt=""></center>
+<p><center><img src="a00322.png" usemap="#tbb::thread_bound_filter_map" border="0" alt=""></center>
<map name="tbb::thread_bound_filter_map">
-<area href="a00245.html" alt="tbb::filter" shape="rect" coords="0,0,145,24">
+<area href="a00256.html" alt="tbb::filter" shape="rect" coords="0,0,145,24">
</map>
-<a href="a00094.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 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="a00301.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="a00322.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="a00301.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="a00322.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,7 +111,7 @@ 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="a00546.html">pipeline.h</a></ul>
+<li><a class="el" href="a00543.html">pipeline.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00301.png b/doc/html/a00322.png
similarity index 100%
copy from doc/html/a00301.png
copy to doc/html/a00322.png
diff --git a/doc/html/a00302.html b/doc/html/a00323.html
similarity index 79%
copy from doc/html/a00302.html
copy to doc/html/a00323.html
index 82a3020..30b831a 100644
--- a/doc/html/a00302.html
+++ b/doc/html/a00323.html
@@ -21,42 +21,42 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00302.html">tick_count</a></div>
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00323.html">tick_count</a></div>
<h1>tbb::tick_count Class Reference<br>
<small>
-[<a class="el" href="a00375.html">Timing</a>]</small>
+[<a class="el" href="a00399.html">Timing</a>]</small>
</h1><!-- doxytag: class="tbb::tick_count" -->Absolute timestamp.
<a href="#_details">More...</a>
<p>
-<code>#include <<a class="el" href="a00616.html">tick_count.h</a>></code>
+<code>#include <<a class="el" href="a00618.html">tick_count.h</a>></code>
<p>
-<a href="a00159.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00168.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="a00302.html#34593326ae4191e02a13c7cbdab9de4c">tick_count</a> ()</td></tr>
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00323.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="a00302.html">tick_count</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00302.html#fb7f78ca61cf28398645ace66e284473">now</a> ()</td></tr>
+static <a class="el" href="a00323.html">tick_count</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00323.html#fb7f78ca61cf28398645ace66e284473">now</a> ()</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Return current time. <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="a00303.html">interval_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00302.html#09dde78a4100800c11bb883d6204b586">operator-</a> (const <a class="el" href="a00302.html">tick_count</a> &t1, const <a class="el" href="a00302.html">tick_count</a> &t0)</td></tr>
+<a class="el" href="a00324.html">interval_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00323.html#09dde78a4100800c11bb883d6204b586">operator-</a> (const <a class="el" href="a00323.html">tick_count</a> &t1, const <a class="el" href="a00323.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="a00303.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="a00324.html">interval_t</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Relative time interval. <a href="a00303.html#_details">More...</a><br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Relative time interval. <a href="a00324.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="a00616.html">tick_count.h</a></ul>
+<li><a class="el" href="a00618.html">tick_count.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00303.html b/doc/html/a00324.html
similarity index 77%
copy from doc/html/a00303.html
copy to doc/html/a00324.html
index 6e582ab..7b213ca 100644
--- a/doc/html/a00303.html
+++ b/doc/html/a00324.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="a00362.html">tbb</a>::<a class="el" href="a00302.html">tick_count</a>::<a class="el" href="a00303.html">interval_t</a></div>
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00323.html">tick_count</a>::<a class="el" href="a00324.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="a00616.html">tick_count.h</a>></code>
+<code>#include <<a class="el" href="a00618.html">tick_count.h</a>></code>
<p>
-<a href="a00160.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 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="a00303.html#75a9a0949f8a8a84d6758835f1b48dad">interval_t</a> ()</td></tr>
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00324.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="a00303.html#1a21a428e00cced2e6a49e0f5f2258bf">interval_t</a> (double sec)</td></tr>
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00324.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="a00303.html#d5d8429c0bc59cf6131b2abc7929fa59">seconds</a> () const </td></tr>
+double </td><td class="memItemRight" valign="bottom"><a class="el" href="a00324.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="a00303.html">interval_t</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00303.html#cd9814947902e26463a69a111530f81b">operator+=</a> (const <a class="el" href="a00303.html">interval_t</a> &i)</td></tr>
+<a class="el" href="a00324.html">interval_t</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00324.html#cd9814947902e26463a69a111530f81b">operator+=</a> (const <a class="el" href="a00324.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="a00303.html">interval_t</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00303.html#35ff7eaf7c2031b4a991402ac9ecb940">operator-=</a> (const <a class="el" href="a00303.html">interval_t</a> &i)</td></tr>
+<a class="el" href="a00324.html">interval_t</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00324.html#35ff7eaf7c2031b4a991402ac9ecb940">operator-=</a> (const <a class="el" href="a00324.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="a00303.html#cc3a7ad7000317951ce61f706163efe8">tbb::tick_count</a></td></tr>
+class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00324.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="a00303.html">interval_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00303.html#09dde78a4100800c11bb883d6204b586">operator-</a> (const <a class="el" href="a00302.html">tick_count</a> &t1, const <a class="el" href="a00302.html">tick_count</a> &t0)</td></tr>
+<a class="el" href="a00324.html">interval_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00324.html#09dde78a4100800c11bb883d6204b586">operator-</a> (const <a class="el" href="a00323.html">tick_count</a> &t1, const <a class="el" href="a00323.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="a00303.html">interval_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00303.html#5871ead1ca230efbe52a5008470e6428">operator+</a> (const <a class="el" href="a00303.html">interval_t</a> &i, const <a class="el" href="a00303.html">interval_t</a> &j)</td></tr>
+<a class="el" href="a00324.html">interval_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00324.html#5871ead1ca230efbe52a5008470e6428">operator+</a> (const <a class="el" href="a00324.html">interval_t</a> &i, const <a class="el" href="a00324.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="a00303.html">interval_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00303.html#fa509691e1d689830931e36edd274f76">operator-</a> (const <a class="el" href="a00303.html">interval_t</a> &i, const <a class="el" href="a00303.html">interval_t</a> &j)</td></tr>
+<a class="el" href="a00324.html">interval_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00324.html#fa509691e1d689830931e36edd274f76">operator-</a> (const <a class="el" href="a00324.html">interval_t</a> &i, const <a class="el" href="a00324.html">interval_t</a> &j)</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Subtract two intervals. <br></td></tr>
</table>
@@ -71,7 +71,7 @@ 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="a00616.html">tick_count.h</a></ul>
+<li><a class="el" href="a00618.html">tick_count.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00305.html b/doc/html/a00325.html
similarity index 88%
copy from doc/html/a00305.html
copy to doc/html/a00325.html
index dc3026d..5f12ffe 100644
--- a/doc/html/a00305.html
+++ b/doc/html/a00325.html
@@ -21,17 +21,17 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<b>internal</b>::<a class="el" href="a00305.html">work_around_alignment_bug</a></div>
+<a class="el" href="a00383.html">tbb</a>::<b>internal</b>::<a class="el" href="a00325.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="a00594.html">tbb_machine.h</a>></code>
<p>
-<a href="a00153.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>Static Public Attributes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="137d1b1dd94016bc52e423dc33c4fd1d"></a><!-- doxytag: member="tbb::internal::work_around_alignment_bug::alignment" ref="137d1b1dd94016bc52e423dc33c4fd1d" args="" -->
-static const size_t </td><td class="memItemRight" valign="bottom"><b>alignment</b> = __alignof(T)</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="" -->
+static const size_t </td><td class="memItemRight" valign="bottom"><b>alignment</b> = __TBB_alignof(T)</td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
diff --git a/doc/html/a00326.html b/doc/html/a00326.html
index e13b006..84281d3 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>graph.h File Reference</title>
+<title>tbb::zero_allocator< T, 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>
@@ -10,148 +10,79 @@
<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 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="files.html"><span>File List</span></a></li>
- <li><a href="globals.html"><span>File Members</span></a></li>
+ <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>graph.h File Reference</h1>The graph related classes and functions. <a href="#_details">More...</a>
+<div class="nav">
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00326.html">zero_allocator</a></div>
+<h1>tbb::zero_allocator< T, Allocator > Class Template Reference<br>
+<small>
+[<a class="el" href="a00397.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="a00588.html">tbb_allocator.h</a>></code>
<p>
-<a href="a00466.html">Go to the source code of this file.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00134.html">List of all members.</a><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="a00362.html">tbb</a></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">namespace </td><td class="memItemRight" valign="bottom"><b>tbb::internal</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">namespace </td><td class="memItemRight" valign="bottom"><b>tbb::internal::join_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="a00251.html">tbb::graph_node</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The base of all graph nodes. Allows them to be stored in a collection for deletion. <a href="a00251.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="a00239.html">tbb::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="a00239.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::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="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="a00277.html">tbb::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="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="a00241.html">tbb::continue_receiver</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Base class for receivers of completion messages. <a href="a00241.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="a00250.html">tbb::graph</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The graph class. <a href="a00250.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::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::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="a00285.html">tbb::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="a00285.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">tbb::function_node< Input, Output ></a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Implements a function node that supports Input -> Output. <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="a00244.html">tbb::executable_node< Output ></a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Implements an executable node that supports <a class="el" href="a00239.html">continue_msg</a> -> Output. <a href="a00244.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::overwrite_node< T ></b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><b>tbb::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="a00240.html">tbb::continue_node</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Broadcasts completion message when it receives completion messages from all predecessors. Then resets. <a href="a00240.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="a00224.html">tbb::broadcast_node< T ></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="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="mdescLeft"> </td><td class="mdescRight">Forwards messages of type T to all successors. <a href="a00224.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="a00225.html">tbb::buffer_node< T ></a></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="mdescLeft"> </td><td class="mdescRight">Forwards messages in arbitrary order. <a href="a00225.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::buffer_node< T >::buffer_operation</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">class </td><td class="memItemRight" valign="bottom"><b>tbb::buffer_node< T >::my_functor_t</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">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00269.html">tbb::queue_node< T ></a></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="mdescLeft"> </td><td class="mdescRight">Forwards messages in FIFO order. <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="a00283.html">tbb::sequencer_node< T ></a></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="mdescLeft"> </td><td class="mdescRight">Forwards messages in sequence order. <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="a00268.html">tbb::priority_queue_node< T, Compare ></a></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="mdescLeft"> </td><td class="mdescRight">Forwards messages in priority order. <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="a00255.html">tbb::limiter_node< T ></a></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 class="mdescLeft"> </td><td class="mdescRight">Forwards messages only if the threshold has not been reached. <a href="a00255.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::internal::forwarding_base</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="a00326.html">zero_allocator</a> &a) throw ()</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">struct </td><td class="memItemRight" valign="bottom"><b>tbb::internal::join_helper< N ></b></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="a00326.html">zero_allocator</a>< U > &a) throw ()</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">struct </td><td class="memItemRight" valign="bottom"><b>tbb::internal::join_helper< 1 ></b></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 class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00304.html">tbb::internal::two_phase_port< T ></a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The two-phase join port. <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::internal::join_node_FE< two_phase, InputTuple, OutputTuple ></b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00254.html">tbb::internal::join_node_base< JP, InputTuple, OutputTuple ></a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight"><a class="el" href="a00254.html">join_node_base</a> <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"><b>tbb::internal::unfolded_join_node< 2, OutputTuple, two_phase ></b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><b>tbb::internal::unfolded_join_node< 3, OutputTuple, two_phase ></b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><b>tbb::internal::unfolded_join_node< 4, OutputTuple, two_phase ></b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><b>tbb::internal::unfolded_join_node< 5, OutputTuple, two_phase ></b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><b>tbb::internal::unfolded_join_node< 6, OutputTuple, two_phase ></b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><b>tbb::internal::unfolded_join_node< 7, OutputTuple, two_phase ></b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><b>tbb::internal::unfolded_join_node< 8, OutputTuple, two_phase ></b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><b>tbb::internal::unfolded_join_node< 9, OutputTuple, two_phase ></b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><b>tbb::internal::unfolded_join_node< 10, OutputTuple, two_phase ></b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><b>tbb::join_node< OutputTuple, JP ></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"><b>join_policy</b> { <b>two_phase</b>
- }</td></tr>
-
-<tr><td colspan="2"><br><h2>Functions</h2></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="0a5a2559e7d28a9bf8f9e5e60d745e86"></a><!-- doxytag: member="graph.h::make_edge" ref="0a5a2559e7d28a9bf8f9e5e60d745e86" 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="a00362.html#0a5a2559e7d28a9bf8f9e5e60d745e86">tbb::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="ac6def751039959ab7ab1e52c8535fd3"></a><!-- doxytag: member="graph.h::make_edges" ref="ac6def751039959ab7ab1e52c8535fd3" args="(sender< T > &p, SIterator s_begin, SIterator s_end)" -->
-template<typename T, typename SIterator> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00362.html#ac6def751039959ab7ab1e52c8535fd3">tbb::make_edges</a> (sender< T > &p, SIterator s_begin, SIterator s_end)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Makes edges between a single predecessor and multiple successors. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="9368d2f689961f790bf7aa4a8cc1135e"></a><!-- doxytag: member="graph.h::make_edges" ref="9368d2f689961f790bf7aa4a8cc1135e" args="(PIterator p_begin, PIterator p_end, receiver< T > &s)" -->
-template<typename T, typename PIterator> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00362.html#9368d2f689961f790bf7aa4a8cc1135e">tbb::make_edges</a> (PIterator p_begin, PIterator p_end, receiver< T > &s)</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">Makes edges between a set of predecessors and a single successor. <br></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
-The graph related classes and functions.
+<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.
<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>
+<hr>The documentation for this class was generated from the following file:<ul>
+<li><a class="el" href="a00588.html">tbb_allocator.h</a></ul>
+<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
<p></p>
diff --git a/doc/html/a00307.html b/doc/html/a00327.html
similarity index 95%
copy from doc/html/a00307.html
copy to doc/html/a00327.html
index fdfda97..598c711 100644
--- a/doc/html/a00307.html
+++ b/doc/html/a00327.html
@@ -21,10 +21,10 @@
<li><a href="functions.html"><span>Class Members</span></a></li>
</ul></div>
<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00307.html">zero_allocator< void, Allocator ></a></div>
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00327.html">zero_allocator< void, Allocator ></a></div>
<h1>tbb::zero_allocator< void, Allocator > Class Template Reference<br>
<small>
-[<a class="el" href="a00373.html">Memory Allocation</a>]</small>
+[<a class="el" href="a00397.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>
diff --git a/doc/html/a00326.html b/doc/html/a00343.html
similarity index 56%
copy from doc/html/a00326.html
copy to doc/html/a00343.html
index e13b006..e693a50 100644
--- a/doc/html/a00326.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>graph.h File Reference</title>
+<title>flow_graph.h File Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -19,134 +19,122 @@
<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>graph.h File Reference</h1>The graph related classes and functions. <a href="#_details">More...</a>
+<h1>flow_graph.h File Reference</h1>The graph related classes and functions. <a href="#_details">More...</a>
<p>
<p>
-<a href="a00466.html">Go to the source code of this file.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00468.html">Go to the source code of this file.</a><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="a00362.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="a00383.html">tbb</a></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">namespace </td><td class="memItemRight" valign="bottom"><b>tbb::internal</b></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::internal::join_policy_namespace</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 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="a00251.html">tbb::graph_node</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The base of all graph nodes. Allows them to be stored in a collection for deletion. <a href="a00251.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="a00239.html">tbb::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="a00239.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::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="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="a00277.html">tbb::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="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="a00241.html">tbb::continue_receiver</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Base class for receivers of completion messages. <a href="a00241.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="a00250.html">tbb::graph</a></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="mdescLeft"> </td><td class="mdescRight">The graph class. <a href="a00250.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::graph::run_task< Body ></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 class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><b>tbb::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="a00285.html">tbb::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="a00285.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">tbb::function_node< Input, Output ></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="a00263.html">tbb::flow::interface6::graph_node</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Implements a function node that supports Input -> Output. <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="a00244.html">tbb::executable_node< Output ></a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The base of all graph nodes. Allows them to be stored in a collection for deletion. <a href="a00263.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="a00251.html">tbb::flow::interface6::continue_msg</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Implements an executable node that supports <a class="el" href="a00239.html">continue_msg</a> -> Output. <a href="a00244.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::overwrite_node< T ></b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">An empty class used for messages that mean "I'm done". <a href="a00251.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::flow::interface6::sender< T ></a></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><b>tbb::write_once_node< T ></b></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="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="a00295.html">tbb::flow::interface6::receiver< T ></a></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00240.html">tbb::continue_node</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="a00295.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="a00253.html">tbb::flow::interface6::continue_receiver</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Broadcasts completion message when it receives completion messages from all predecessors. Then resets. <a href="a00240.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="a00224.html">tbb::broadcast_node< T ></a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Base class for receivers of completion messages. <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="a00262.html">tbb::flow::interface6::graph</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Forwards messages of type T to all successors. <a href="a00224.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="a00225.html">tbb::buffer_node< T ></a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The graph class. <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"><b>tbb::flow::interface6::graph::run_task< Body ></b></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Forwards messages in arbitrary order. <a href="a00225.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::buffer_node< T >::buffer_operation</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"><b>tbb::buffer_node< T >::my_functor_t</b></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::source_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="a00269.html">tbb::queue_node< T ></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="a00304.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::flow::interface6::function_node< Input, Output,, Allocator ></a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Forwards messages in FIFO order. <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="a00283.html">tbb::sequencer_node< T ></a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Implements a function node that supports Input -> Output. <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::flow::interface6::function_node< Input, Output, queueing, Allocator ></a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Forwards messages in sequence order. <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="a00268.html">tbb::priority_queue_node< T, Compare ></a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Implements a function node that supports Input -> Output. <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="a00274.html">tbb::flow::interface6::multioutput_function_node< Input, Output,, Allocator ></a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Forwards messages in priority order. <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="a00255.html">tbb::limiter_node< T ></a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">implements a function node that supports Input -> (set of outputs) <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"><b>tbb::flow::interface6::multioutput_function_node< Input, Output, queueing, Allocator ></b></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Forwards messages only if the threshold has not been reached. <a href="a00255.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::internal::forwarding_base</b></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::flow::interface6::split_node< TupleType, Allocator ></a></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">struct </td><td class="memItemRight" valign="bottom"><b>tbb::internal::join_helper< N ></b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight"><a class="el" href="a00310.html">split_node</a>: accepts a tuple as input, forwards each element of the tuple to its <a href="a00310.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">struct </td><td class="memItemRight" valign="bottom"><b>tbb::internal::join_helper< 1 ></b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00252.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="a00304.html">tbb::internal::two_phase_port< T ></a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Implements an executable node that supports <a class="el" href="a00251.html">continue_msg</a> -> Output. <a href="a00252.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="mdescLeft"> </td><td class="mdescRight">The two-phase join port. <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::internal::join_node_FE< two_phase, InputTuple, OutputTuple ></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="a00254.html">tbb::internal::join_node_base< JP, InputTuple, OutputTuple ></a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00236.html">tbb::flow::interface6::broadcast_node< T ></a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight"><a class="el" href="a00254.html">join_node_base</a> <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"><b>tbb::internal::unfolded_join_node< 2, OutputTuple, two_phase ></b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Forwards messages of type T to all successors. <a href="a00236.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="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><b>tbb::internal::unfolded_join_node< 3, OutputTuple, two_phase ></b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Forwards messages in arbitrary order. <a href="a00237.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"><b>tbb::internal::unfolded_join_node< 4, OutputTuple, two_phase ></b></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::queue_node< T, A ></a></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><b>tbb::internal::unfolded_join_node< 5, OutputTuple, two_phase ></b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Forwards messages in FIFO order. <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="a00302.html">tbb::flow::interface6::sequencer_node< T, A ></a></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><b>tbb::internal::unfolded_join_node< 6, OutputTuple, two_phase ></b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Forwards messages in sequence order. <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="a00286.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><b>tbb::internal::unfolded_join_node< 7, OutputTuple, two_phase ></b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Forwards messages in priority order. <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="a00266.html">tbb::flow::interface6::limiter_node< T ></a></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><b>tbb::internal::unfolded_join_node< 8, OutputTuple, two_phase ></b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Forwards messages only if the threshold has not been reached. <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"><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::internal::unfolded_join_node< 9, OutputTuple, two_phase ></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>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><b>tbb::internal::unfolded_join_node< 10, OutputTuple, two_phase ></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, tag_matching ></b></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><b>tbb::join_node< OutputTuple, JP ></b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><b>tbb::flow::interface6::or_node< InputTuple ></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"><b>join_policy</b> { <b>two_phase</b>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">enum </td><td class="memItemRight" valign="bottom"><b>concurrency</b> { <b>unlimited</b> = 0,
+<b>serial</b> = 1
}</td></tr>
+<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="memTemplParams" nowrap colspan="2"><a class="anchor" name="0a5a2559e7d28a9bf8f9e5e60d745e86"></a><!-- doxytag: member="graph.h::make_edge" ref="0a5a2559e7d28a9bf8f9e5e60d745e86" args="(sender< T > &p, receiver< T > &s)" -->
+<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="a00362.html#0a5a2559e7d28a9bf8f9e5e60d745e86">tbb::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="a00386.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="ac6def751039959ab7ab1e52c8535fd3"></a><!-- doxytag: member="graph.h::make_edges" ref="ac6def751039959ab7ab1e52c8535fd3" args="(sender< T > &p, SIterator s_begin, SIterator s_end)" -->
-template<typename T, typename SIterator> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00362.html#ac6def751039959ab7ab1e52c8535fd3">tbb::make_edges</a> (sender< T > &p, SIterator s_begin, SIterator s_end)</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="a00386.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 edges between a single predecessor and multiple successors. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="9368d2f689961f790bf7aa4a8cc1135e"></a><!-- doxytag: member="graph.h::make_edges" ref="9368d2f689961f790bf7aa4a8cc1135e" args="(PIterator p_begin, PIterator p_end, receiver< T > &s)" -->
-template<typename T, typename PIterator> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00362.html#9368d2f689961f790bf7aa4a8cc1135e">tbb::make_edges</a> (PIterator p_begin, PIterator p_end, 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="a00386.html#c8a3ee78426f0aa4df0c5a5e4bcd53e1">tbb::flow::interface6::copy_body</a> (Node &n)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Makes edges between a set of predecessors and a single successor. <br></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>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
The graph related classes and functions.
diff --git a/doc/html/a00344.html b/doc/html/a00344.html
index 78dbf54..1b3c8b5 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>scalable_allocator.h File Reference</title>
+<title>memory_pool.h File Reference</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -19,50 +19,39 @@
<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>
+<h1>memory_pool.h File Reference</h1>
<p>
-<a href="a00564.html">Go to the source code of this file.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00480.html">Go to the source code of this file.</a><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="a00362.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="a00383.html">tbb</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="a00280.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="a00280.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="a00281.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="a00281.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>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="a00373.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="a00373.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="a00373.html#g951bbbbd2d041acb59ba5fa910b52543">scalable_realloc</a> (void *ptr, size_t size)</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 class="memItemLeft" nowrap align="right" valign="top">void *__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00373.html#g3f5a2fde0bcaa3eda35be32c8658f444">scalable_calloc</a> (size_t nobj, size_t size)</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">tbb::interface6::memory_pool_allocator< T, P ></a></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="a00373.html#g05dcec987480bb2c82ecdead6a085899">scalable_posix_memalign</a> (void **memptr, size_t alignment, size_t size)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5. <a href="a00270.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">void *__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00373.html#gc1c7aaa1fe85c17ba5a3a96f7e8d89e7">scalable_aligned_malloc</a> (size_t size, size_t alignment)</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::interface6::memory_pool_allocator< void, P ></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="a00373.html#gbaea91376be80dfabd7c93eaffd9abaa">scalable_aligned_realloc</a> (void *ptr, size_t size, size_t alignment)</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="a00271.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">void __TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00373.html#g65a20e812012f15ec7442d5b45d0cba5">scalable_aligned_free</a> (void *ptr)</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::interface6::memory_pool< Alloc ></a></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="a00373.html#g0965ce1b4b7835f92869c7fd867265f7">scalable_msize</a> (void *ptr)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Thread-safe growable pool allocator for variable-size requests. <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"><b>tbb::interface6::fixed_pool</b></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="906ebb461ecb0446989739fd0399e4b8"></a><!-- doxytag: member="scalable_allocator.h::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>tbb::operator==</b> (const scalable_allocator< T > &, const scalable_allocator< U > &)</td></tr>
+<tr><td colspan="2"><br><h2>Functions</h2></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="157d737026f35a661bbb784af7e16cd4"></a><!-- doxytag: member="memory_pool.h::operator==" ref="157d737026f35a661bbb784af7e16cd4" args="(const memory_pool_allocator< T, P > &a, const memory_pool_allocator< U, P > &b)" -->
+template<typename T, typename U, typename P> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>tbb::interface6::operator==</b> (const memory_pool_allocator< T, P > &a, const memory_pool_allocator< U, P > &b)</td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="a92757aca0a69082eb8dc223eb257433"></a><!-- doxytag: member="scalable_allocator.h::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>tbb::operator!=</b> (const scalable_allocator< T > &, const scalable_allocator< U > &)</td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="4665e8f86e3bc274708bf7994beec895"></a><!-- doxytag: member="memory_pool.h::operator!=" ref="4665e8f86e3bc274708bf7994beec895" args="(const memory_pool_allocator< T, P > &a, const memory_pool_allocator< U, P > &b)" -->
+template<typename T, typename U, typename P> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>tbb::interface6::operator!=</b> (const memory_pool_allocator< T, P > &a, const memory_pool_allocator< U, P > &b)</td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
diff --git a/doc/html/a00344.html b/doc/html/a00363.html
similarity index 55%
copy from doc/html/a00344.html
copy to doc/html/a00363.html
index 78dbf54..7edb342 100644
--- a/doc/html/a00344.html
+++ b/doc/html/a00363.html
@@ -21,40 +21,69 @@
</ul></div>
<h1>scalable_allocator.h File Reference</h1>
<p>
-<a href="a00564.html">Go to the source code of this file.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00562.html">Go to the source code of this file.</a><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="a00362.html">tbb</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">namespace </td><td class="memItemRight" valign="bottom"><b>rml</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">namespace </td><td class="memItemRight" valign="bottom"><a class="el" href="a00383.html">tbb</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="a00280.html">tbb::scalable_allocator< T ></a></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="a00299.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="a00280.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="a00299.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="a00281.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="a00300.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="a00281.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="a00300.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>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5af06ad025ac20cff3a1c13aa5bded5c"></a><!-- doxytag: member="scalable_allocator.h::rawAllocType" ref="5af06ad025ac20cff3a1c13aa5bded5c" args="(intptr_t pool_id, size_t &bytes)" -->
+typedef void *(*) </td><td class="memItemRight" valign="bottom"><b>rml::rawAllocType</b> (intptr_t pool_id, size_t &bytes)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="49f1efbc1496ae2c1492093bb222051b"></a><!-- doxytag: member="scalable_allocator.h::rawFreeType" ref="49f1efbc1496ae2c1492093bb222051b" args="(intptr_t pool_id, void *raw_ptr, size_t raw_bytes)" -->
+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>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="a00373.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="a00397.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="a00397.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="a00397.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="a00397.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="a00397.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="a00397.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="a00397.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="a00373.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="a00397.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="a00373.html#g951bbbbd2d041acb59ba5fa910b52543">scalable_realloc</a> (void *ptr, size_t size)</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="a00397.html#g0965ce1b4b7835f92869c7fd867265f7">scalable_msize</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="a00373.html#g3f5a2fde0bcaa3eda35be32c8658f444">scalable_calloc</a> (size_t nobj, size_t size)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8ed52400cba22b7c02913eca8135f782"></a><!-- doxytag: member="scalable_allocator.h::pool_create" ref="8ed52400cba22b7c02913eca8135f782" args="(intptr_t pool_id, const MemPoolPolicy *memPoolPolicy)" -->
+MemoryPool * </td><td class="memItemRight" valign="bottom"><b>rml::pool_create</b> (intptr_t pool_id, const MemPoolPolicy *memPoolPolicy)</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="a00373.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"><a class="anchor" name="66dafd186fef3ce07c5acfa57309671d"></a><!-- doxytag: member="scalable_allocator.h::pool_destroy" ref="66dafd186fef3ce07c5acfa57309671d" args="(MemoryPool *memPool)" -->
+bool </td><td class="memItemRight" valign="bottom"><b>rml::pool_destroy</b> (MemoryPool *memPool)</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="a00373.html#gc1c7aaa1fe85c17ba5a3a96f7e8d89e7">scalable_aligned_malloc</a> (size_t size, size_t alignment)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1f68622d83e291b152ba9bdb5eb54c4c"></a><!-- doxytag: member="scalable_allocator.h::pool_malloc" ref="1f68622d83e291b152ba9bdb5eb54c4c" args="(MemoryPool *memPool, size_t size)" -->
+void * </td><td class="memItemRight" valign="bottom"><b>rml::pool_malloc</b> (MemoryPool *memPool, 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="a00373.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"><a class="anchor" name="4c46ef1c26429df31030d3278e5479fc"></a><!-- doxytag: member="scalable_allocator.h::pool_realloc" ref="4c46ef1c26429df31030d3278e5479fc" args="(MemoryPool *memPool, void *object, size_t size)" -->
+void * </td><td class="memItemRight" valign="bottom"><b>rml::pool_realloc</b> (MemoryPool *memPool, void *object, 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="a00373.html#g65a20e812012f15ec7442d5b45d0cba5">scalable_aligned_free</a> (void *ptr)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3eab1c7294baade9d21fad92f979890a"></a><!-- doxytag: member="scalable_allocator.h::pool_reset" ref="3eab1c7294baade9d21fad92f979890a" args="(MemoryPool *memPool)" -->
+bool </td><td class="memItemRight" valign="bottom"><b>rml::pool_reset</b> (MemoryPool *memPool)</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="a00373.html#g0965ce1b4b7835f92869c7fd867265f7">scalable_msize</a> (void *ptr)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e43a04a5b9e84bb26345945b1a15ed28"></a><!-- doxytag: member="scalable_allocator.h::pool_free" ref="e43a04a5b9e84bb26345945b1a15ed28" args="(MemoryPool *memPool, void *object)" -->
+bool </td><td class="memItemRight" valign="bottom"><b>rml::pool_free</b> (MemoryPool *memPool, void *object)</td></tr>
<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="906ebb461ecb0446989739fd0399e4b8"></a><!-- doxytag: member="scalable_allocator.h::operator==" ref="906ebb461ecb0446989739fd0399e4b8" args="(const scalable_allocator< T > &, const scalable_allocator< U > &)" -->
template<typename T, typename U> </td></tr>
diff --git a/doc/html/a00370.html b/doc/html/a00370.html
deleted file mode 100644
index e113fb8..0000000
--- a/doc/html/a00370.html
+++ /dev/null
@@ -1,61 +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::strict_ppl 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>
-<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00370.html">strict_ppl</a></div>
-<h1>tbb::strict_ppl Namespace Reference</h1>For internal use only.
-<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="a00236.html">concurrent_queue</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A high-performance thread-safe non-blocking concurrent queue. <a href="a00236.html#_details">More...</a><br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="15c764c70c8a32e7a4b8c291d0cc8dde"></a><!-- doxytag: member="tbb::strict_ppl::parallel_for" ref="15c764c70c8a32e7a4b8c291d0cc8dde" args="(Index first, Index last, Index step, const Function &f)" -->
-template<typename Index, typename Function> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00370.html#15c764c70c8a32e7a4b8c291d0cc8dde">parallel_for</a> (Index first, Index last, Index step, const Function &f)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over a range of integers with a step provided. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="fb5925ad98ec9608139661cfd2b9b88f"></a><!-- doxytag: member="tbb::strict_ppl::parallel_for" ref="fb5925ad98ec9608139661cfd2b9b88f" args="(Index first, Index last, Index step, const Function &f, tbb::task_group_context &context)" -->
-template<typename Index, typename Function> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>parallel_for</b> (Index first, Index last, Index step, const Function &f, <a class="el" href="a00293.html">tbb::task_group_context</a> &context)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="490399525b1e690ec31d6db964c6b272"></a><!-- doxytag: member="tbb::strict_ppl::parallel_for" ref="490399525b1e690ec31d6db964c6b272" args="(Index first, Index last, const Function &f)" -->
-template<typename Index, typename Function> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00370.html#490399525b1e690ec31d6db964c6b272">parallel_for</a> (Index first, Index last, const Function &f)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over a range of integers with a default step value. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="bda0b331c88a836cb756fff0f661d609"></a><!-- doxytag: member="tbb::strict_ppl::parallel_for" ref="bda0b331c88a836cb756fff0f661d609" args="(Index first, Index last, const Function &f, tbb::task_group_context &context)" -->
-template<typename Index, typename Function> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>parallel_for</b> (Index first, Index last, const Function &f, <a class="el" href="a00293.html">tbb::task_group_context</a> &context)</td></tr>
-
-</table>
-<hr><a name="_details"></a><h2>Detailed Description</h2>
-For internal use only. <hr>
-<p></p>
-Copyright © 2005-2011 Intel Corporation. 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/a00373.html b/doc/html/a00373.html
deleted file mode 100644
index 5eb792c..0000000
--- a/doc/html/a00373.html
+++ /dev/null
@@ -1,313 +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 Allocation</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>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="a00215.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="a00215.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="a00226.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="a00226.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="a00227.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="a00227.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::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="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="a00281.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="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="a00296.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="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::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="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="a00306.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="a00306.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">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="a00307.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="a00373.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="a00373.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="a00373.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="a00373.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="a00373.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="a00373.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="a00373.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="a00373.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="a00373.html#g0965ce1b4b7835f92869c7fd867265f7">scalable_msize</a> (void *ptr)</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">
-
-<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">
-
-<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">
-
-<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">
-
-<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">
-
-<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)" -->
-<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>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-The "malloc" analogue to allocate block of memory of size bytes.
-</div>
-</div><p>
-<a class="anchor" name="g0965ce1b4b7835f92869c7fd867265f7"></a><!-- doxytag: member="scalable_allocator.h::scalable_msize" ref="g0965ce1b4b7835f92869c7fd867265f7" args="(void *ptr)" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">size_t __TBB_EXPORTED_FUNC scalable_msize </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">
-
-<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">
-
-<p>
-The "realloc" analogue complementing scalable_malloc.
-</div>
-</div><p>
-<hr>
-<p></p>
-Copyright © 2005-2011 Intel Corporation. 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/a00377.html b/doc/html/a00377.html
deleted file mode 100644
index 1c71169..0000000
--- a/doc/html/a00377.html
+++ /dev/null
@@ -1,159 +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_internal.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_internal.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-2011 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_internal_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_aggregator_internal_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 "tbb_profiling.h"</span>
-<a name="l00026"></a>00026
-<a name="l00027"></a><a class="code" href="a00362.html">00027</a> <span class="keyword">namespace </span>tbb {
-<a name="l00028"></a>00028 <span class="keyword">namespace </span>interface6 {
-<a name="l00029"></a>00029 <span class="keyword">namespace </span>internal {
-<a name="l00030"></a>00030
-<a name="l00031"></a>00031 <span class="keyword">using namespace </span>tbb::internal;
-<a name="l00032"></a>00032
-<a name="l00034"></a>00034 <span class="keyword">template</span> <<span class="keyword">typename</span> Derived>
-<a name="l00035"></a><a class="code" href="a00213.html">00035</a> <span class="keyword">class </span><a class="code" href="a00213.html">aggregated_operation</a> {
-<a name="l00036"></a>00036 <span class="keyword">public</span>:
-<a name="l00037"></a>00037 uintptr_t status;
-<a name="l00038"></a>00038 Derived *next;
-<a name="l00039"></a>00039 <a class="code" href="a00213.html">aggregated_operation</a>() : status(0), next(NULL) {}
-<a name="l00040"></a>00040 };
-<a name="l00041"></a>00041
-<a name="l00043"></a>00043
-<a name="l00048"></a>00048 <span class="keyword">template</span> < <span class="keyword">typename</span> handler_type, <span class="keyword">typename</span> operation_type >
-<a name="l00049"></a><a class="code" href="a00214.html">00049</a> <span class="keyword">class </span><a class="code" href="a00214.html">aggregator</a> {
-<a name="l00050"></a>00050 <span class="keyword">public</span>:
-<a name="l00051"></a>00051 <a class="code" href="a00214.html">aggregator</a>() : handler_busy(<span class="keyword">false</span>) { pending_operations = NULL; }
-<a name="l00052"></a>00052 ~<a class="code" href="a00214.html">aggregator</a>() {}
-<a name="l00053"></a>00053
-<a name="l00054"></a>00054 <span class="keywordtype">void</span> initialize_handler(handler_type h) { handle_operations = h; }
-<a name="l00055"></a>00055
-<a name="l00057"></a>00057
-<a name="l00059"></a><a class="code" href="a00214.html#282d5a2f1216b185c91ed23d00119481">00059</a> <span class="keywordtype">void</span> <a class="code" href="a00214.html#282d5a2f1216b185c91ed23d00119481">execute</a>(operation_type *op) {
-<a name="l00060"></a>00060 operation_type *res;
-<a name="l00061"></a>00061
-<a name="l00062"></a>00062 <span class="comment">// ITT note: &(op->status) tag is used to cover accesses to this op node. This</span>
-<a name="l00063"></a>00063 <span class="comment">// thread has created the operation, and now releases it so that the handler</span>
-<a name="l00064"></a>00064 <span class="comment">// thread may handle the associated operation w/o triggering a race condition;</span>
-<a name="l00065"></a>00065 <span class="comment">// thus this tag will be acquired just before the operation is handled in the</span>
-<a name="l00066"></a>00066 <span class="comment">// handle_operations functor.</span>
-<a name="l00067"></a>00067 call_itt_notify(releasing, &(op->status));
-<a name="l00068"></a>00068 <span class="comment">// insert the operation in the queue</span>
-<a name="l00069"></a>00069 <span class="keywordflow">do</span> {
-<a name="l00070"></a>00070 <span class="comment">// ITT may flag the following line as a race; it is a false positive:</span>
-<a name="l00071"></a>00071 <span class="comment">// This is an atomic read; we don't provide itt_hide_load_word for atomics</span>
-<a name="l00072"></a>00072 op->next = res = pending_operations; <span class="comment">// NOT A RACE </span>
-<a name="l00073"></a>00073 } <span class="keywordflow">while</span> (pending_operations.compare_and_swap(op, res) != res);
-<a name="l00074"></a>00074 <span class="keywordflow">if</span> (!res) { <span class="comment">// first in the list; handle the operations</span>
-<a name="l00075"></a>00075 <span class="comment">// ITT note: &pending_operations tag covers access to the handler_busy flag,</span>
-<a name="l00076"></a>00076 <span class="comment">// which this waiting handler thread will try to set before entering</span>
-<a name="l00077"></a>00077 <span class="comment">// handle_operations.</span>
-<a name="l00078"></a>00078 call_itt_notify(acquired, &pending_operations);
-<a name="l00079"></a>00079 start_handle_operations();
-<a name="l00080"></a>00080 __TBB_ASSERT(op->status, NULL);
-<a name="l00081"></a>00081 }
-<a name="l00082"></a>00082 <span class="keywordflow">else</span> { <span class="comment">// not first; wait for op to be ready</span>
-<a name="l00083"></a>00083 call_itt_notify(prepare, &(op->status));
-<a name="l00084"></a>00084 spin_wait_while_eq(op->status, uintptr_t(0));
-<a name="l00085"></a>00085 itt_load_word_with_acquire(op->status);
-<a name="l00086"></a>00086 }
-<a name="l00087"></a>00087 }
-<a name="l00088"></a>00088
-<a name="l00089"></a>00089 <span class="keyword">private</span>:
-<a name="l00091"></a>00091 <a class="code" href="a00216.html">atomic<operation_type *></a> pending_operations;
-<a name="l00093"></a>00093 uintptr_t handler_busy;
-<a name="l00094"></a>00094 handler_type handle_operations;
-<a name="l00095"></a>00095
-<a name="l00097"></a>00097 <span class="keywordtype">void</span> start_handle_operations() {
-<a name="l00098"></a>00098 operation_type *op_list;
-<a name="l00099"></a>00099
-<a name="l00100"></a>00100 <span class="comment">// ITT note: &handler_busy tag covers access to pending_operations as it is passed</span>
-<a name="l00101"></a>00101 <span class="comment">// between active and waiting handlers. Below, the waiting handler waits until</span>
-<a name="l00102"></a>00102 <span class="comment">// the active handler releases, and the waiting handler acquires &handler_busy as</span>
-<a name="l00103"></a>00103 <span class="comment">// it becomes the active_handler. The release point is at the end of this</span>
-<a name="l00104"></a>00104 <span class="comment">// function, when all operations in pending_operations have been handled by the</span>
-<a name="l00105"></a>00105 <span class="comment">// owner of this aggregator.</span>
-<a name="l00106"></a>00106 call_itt_notify(prepare, &handler_busy);
-<a name="l00107"></a>00107 <span class="comment">// get the handler_busy:</span>
-<a name="l00108"></a>00108 <span class="comment">// only one thread can possibly spin here at a time</span>
-<a name="l00109"></a>00109 spin_wait_until_eq(handler_busy, uintptr_t(0));
-<a name="l00110"></a>00110 call_itt_notify(acquired, &handler_busy);
-<a name="l00111"></a>00111 <span class="comment">// acquire fence not necessary here due to causality rule and surrounding atomics</span>
-<a name="l00112"></a>00112 __TBB_store_with_release(handler_busy, uintptr_t(1));
-<a name="l00113"></a>00113
-<a name="l00114"></a>00114 <span class="comment">// ITT note: &pending_operations tag covers access to the handler_busy flag</span>
-<a name="l00115"></a>00115 <span class="comment">// itself. Capturing the state of the pending_operations signifies that</span>
-<a name="l00116"></a>00116 <span class="comment">// handler_busy has been set and a new active handler will now process that list's</span>
-<a name="l00117"></a>00117 <span class="comment">// operations.</span>
-<a name="l00118"></a>00118 call_itt_notify(releasing, &pending_operations);
-<a name="l00119"></a>00119 <span class="comment">// grab pending_operations</span>
-<a name="l00120"></a>00120 op_list = pending_operations.fetch_and_store(NULL);
-<a name="l00121"></a>00121
-<a name="l00122"></a>00122 <span class="comment">// handle all the operations</span>
-<a name="l00123"></a>00123 handle_operations(op_list);
-<a name="l00124"></a>00124
-<a name="l00125"></a>00125 <span class="comment">// release the handler</span>
-<a name="l00126"></a>00126 itt_store_word_with_release(handler_busy, uintptr_t(0));
-<a name="l00127"></a>00127 }
-<a name="l00128"></a>00128 };
-<a name="l00129"></a>00129
-<a name="l00130"></a>00130 } <span class="comment">// namespace internal</span>
-<a name="l00131"></a>00131 } <span class="comment">// namespace interface6</span>
-<a name="l00132"></a>00132
-<a name="l00133"></a>00133 <span class="keyword">namespace </span>internal {
-<a name="l00134"></a>00134 <span class="keyword">using</span> interface6::internal::aggregated_operation;
-<a name="l00135"></a>00135 <span class="keyword">using</span> interface6::internal::aggregator;
-<a name="l00136"></a>00136 } <span class="comment">// namespace internal</span>
-<a name="l00137"></a>00137
-<a name="l00138"></a>00138 } <span class="comment">// namespace tbb</span>
-<a name="l00139"></a>00139
-<a name="l00140"></a>00140 <span class="preprocessor">#endif</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2011 Intel Corporation. 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/a00381.html b/doc/html/a00381.html
deleted file mode 100644
index 5f6bb29..0000000
--- a/doc/html/a00381.html
+++ /dev/null
@@ -1,942 +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_internal.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_internal.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-2011 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_internal_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_concurrent_queue_internal_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 "atomic.h"</span>
-<a name="l00027"></a>00027 <span class="preprocessor">#include "spin_mutex.h"</span>
-<a name="l00028"></a>00028 <span class="preprocessor">#include "cache_aligned_allocator.h"</span>
-<a name="l00029"></a>00029 <span class="preprocessor">#include "tbb_exception.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
-<a name="l00033"></a>00033 <span class="preprocessor">#if !TBB_USE_EXCEPTIONS && _MSC_VER</span>
-<a name="l00034"></a>00034 <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="l00035"></a>00035 <span class="preprocessor"> #pragma warning (push)</span>
-<a name="l00036"></a>00036 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (disable: 4530)</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="preprocessor">#include <iterator></span>
-<a name="l00040"></a>00040
-<a name="l00041"></a>00041 <span class="preprocessor">#if !TBB_USE_EXCEPTIONS && _MSC_VER</span>
-<a name="l00042"></a>00042 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (pop)</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="l00045"></a>00045 <span class="keyword">namespace </span>tbb {
-<a name="l00046"></a>00046
-<a name="l00047"></a>00047 <span class="preprocessor">#if !__TBB_TEMPLATE_FRIENDS_BROKEN</span>
-<a name="l00048"></a>00048 <span class="preprocessor"></span>
-<a name="l00049"></a>00049 <span class="comment">// forward declaration</span>
-<a name="l00050"></a><a class="code" href="a00370.html">00050</a> <span class="keyword">namespace </span>strict_ppl {
-<a name="l00051"></a>00051 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> A> <span class="keyword">class </span><a class="code" href="a00236.html">concurrent_queue</a>;
-<a name="l00052"></a>00052 }
-<a name="l00053"></a>00053
-<a name="l00054"></a>00054 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> A> <span class="keyword">class </span><a class="code" href="a00230.html">concurrent_bounded_queue</a>;
-<a name="l00055"></a>00055
-<a name="l00056"></a>00056 <span class="keyword">namespace </span>deprecated {
-<a name="l00057"></a>00057 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> A> <span class="keyword">class </span><a class="code" href="a00236.html">concurrent_queue</a>;
-<a name="l00058"></a>00058 }
-<a name="l00059"></a>00059 <span class="preprocessor">#endif</span>
-<a name="l00060"></a>00060 <span class="preprocessor"></span>
-<a name="l00062"></a>00062 <span class="keyword">namespace </span>strict_ppl {
-<a name="l00063"></a>00063
-<a name="l00065"></a>00065 <span class="keyword">namespace </span>internal {
-<a name="l00066"></a>00066
-<a name="l00067"></a>00067 <span class="keyword">using namespace </span>tbb::internal;
-<a name="l00068"></a>00068
-<a name="l00069"></a>00069 <span class="keyword">typedef</span> size_t ticket;
-<a name="l00070"></a>00070
-<a name="l00071"></a>00071 <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">class </span>micro_queue ;
-<a name="l00072"></a>00072 <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">class </span>micro_queue_pop_finalizer ;
-<a name="l00073"></a>00073 <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">class </span>concurrent_queue_base_v3;
-<a name="l00074"></a>00074
-<a name="l00076"></a>00076
-<a name="l00079"></a>00079 <span class="keyword">struct </span>concurrent_queue_rep_base : no_copy {
-<a name="l00080"></a>00080 <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">friend</span> <span class="keyword">class </span>micro_queue;
-<a name="l00081"></a>00081 <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">friend</span> <span class="keyword">class </span>concurrent_queue_base_v3;
-<a name="l00082"></a>00082
-<a name="l00083"></a>00083 <span class="keyword">protected</span>:
-<a name="l00085"></a>00085 <span class="keyword">static</span> <span class="keyword">const</span> size_t phi = 3;
-<a name="l00086"></a>00086
-<a name="l00087"></a>00087 <span class="keyword">public</span>:
-<a name="l00088"></a>00088 <span class="comment">// must be power of 2</span>
-<a name="l00089"></a>00089 <span class="keyword">static</span> <span class="keyword">const</span> size_t n_queue = 8;
-<a name="l00090"></a>00090
-<a name="l00092"></a>00092 <span class="keyword">struct </span>page {
-<a name="l00093"></a>00093 page* next;
-<a name="l00094"></a>00094 uintptr_t mask;
-<a name="l00095"></a>00095 };
-<a name="l00096"></a>00096
-<a name="l00097"></a>00097 atomic<ticket> head_counter;
-<a name="l00098"></a>00098 <span class="keywordtype">char</span> pad1[NFS_MaxLineSize-<span class="keyword">sizeof</span>(atomic<ticket>)];
-<a name="l00099"></a>00099 atomic<ticket> tail_counter;
-<a name="l00100"></a>00100 <span class="keywordtype">char</span> pad2[NFS_MaxLineSize-<span class="keyword">sizeof</span>(atomic<ticket>)];
-<a name="l00101"></a>00101
-<a name="l00103"></a>00103 size_t items_per_page;
-<a name="l00104"></a>00104
-<a name="l00106"></a>00106 size_t item_size;
-<a name="l00107"></a>00107
-<a name="l00109"></a>00109 atomic<size_t> n_invalid_entries;
-<a name="l00110"></a>00110
-<a name="l00111"></a>00111 <span class="keywordtype">char</span> pad3[NFS_MaxLineSize-<span class="keyword">sizeof</span>(size_t)-<span class="keyword">sizeof</span>(size_t)-<span class="keyword">sizeof</span>(atomic<size_t>)];
-<a name="l00112"></a>00112 } ;
-<a name="l00113"></a>00113
-<a name="l00114"></a>00114 <span class="keyword">inline</span> <span class="keywordtype">bool</span> is_valid_page(<span class="keyword">const</span> concurrent_queue_rep_base::page* p) {
-<a name="l00115"></a>00115 <span class="keywordflow">return</span> uintptr_t(p)>1;
-<a name="l00116"></a>00116 }
-<a name="l00117"></a>00117
-<a name="l00119"></a>00119
-<a name="l00122"></a>00122 <span class="keyword">class </span>concurrent_queue_page_allocator
-<a name="l00123"></a>00123 {
-<a name="l00124"></a>00124 <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">friend</span> <span class="keyword">class </span>micro_queue ;
-<a name="l00125"></a>00125 <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">friend</span> <span class="keyword">class </span>micro_queue_pop_finalizer ;
-<a name="l00126"></a>00126 <span class="keyword">protected</span>:
-<a name="l00127"></a>00127 <span class="keyword">virtual</span> ~concurrent_queue_page_allocator() {}
-<a name="l00128"></a>00128 <span class="keyword">private</span>:
-<a name="l00129"></a>00129 <span class="keyword">virtual</span> concurrent_queue_rep_base::page* allocate_page() = 0;
-<a name="l00130"></a>00130 <span class="keyword">virtual</span> <span class="keywordtype">void</span> deallocate_page( concurrent_queue_rep_base::page* p ) = 0;
-<a name="l00131"></a>00131 } ;
-<a name="l00132"></a>00132
-<a name="l00133"></a>00133 <span class="preprocessor">#if _MSC_VER && !defined(__INTEL_COMPILER)</span>
-<a name="l00134"></a>00134 <span class="preprocessor"></span><span class="comment">// unary minus operator applied to unsigned type, result still unsigned</span>
-<a name="l00135"></a>00135 <span class="preprocessor">#pragma warning( push )</span>
-<a name="l00136"></a>00136 <span class="preprocessor"></span><span class="preprocessor">#pragma warning( disable: 4146 )</span>
-<a name="l00137"></a>00137 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00138"></a>00138 <span class="preprocessor"></span>
-<a name="l00140"></a>00140
-<a name="l00142"></a>00142 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00143"></a>00143 <span class="keyword">class </span>micro_queue : no_copy {
-<a name="l00144"></a>00144 <span class="keyword">typedef</span> concurrent_queue_rep_base::page page;
-<a name="l00145"></a>00145
-<a name="l00147"></a>00147 <span class="keyword">class </span>destroyer: no_copy {
-<a name="l00148"></a>00148 T& my_value;
-<a name="l00149"></a>00149 <span class="keyword">public</span>:
-<a name="l00150"></a>00150 destroyer( T& value ) : my_value(value) {}
-<a name="l00151"></a>00151 ~destroyer() {my_value.~T();}
-<a name="l00152"></a>00152 };
-<a name="l00153"></a>00153
-<a name="l00154"></a>00154 <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="l00155"></a>00155 <span class="keyword">new</span>( &get_ref(dst,index) ) T(*static_cast<const T*>(src));
-<a name="l00156"></a>00156 }
-<a name="l00157"></a>00157
-<a name="l00158"></a>00158 <span class="keywordtype">void</span> copy_item( page& dst, size_t dindex, <span class="keyword">const</span> page& src, size_t sindex ) {
-<a name="l00159"></a>00159 <span class="keyword">new</span>( &get_ref(dst,dindex) ) T( get_ref(const_cast<page&>(src),sindex) );
-<a name="l00160"></a>00160 }
-<a name="l00161"></a>00161
-<a name="l00162"></a>00162 <span class="keywordtype">void</span> assign_and_destroy_item( <span class="keywordtype">void</span>* dst, page& src, size_t index ) {
-<a name="l00163"></a>00163 T& from = get_ref(src,index);
-<a name="l00164"></a>00164 destroyer d(from);
-<a name="l00165"></a>00165 *static_cast<T*>(dst) = from;
-<a name="l00166"></a>00166 }
-<a name="l00167"></a>00167
-<a name="l00168"></a>00168 <span class="keywordtype">void</span> spin_wait_until_my_turn( atomic<ticket>& counter, ticket k, concurrent_queue_rep_base& rb ) <span class="keyword">const </span>;
-<a name="l00169"></a>00169
-<a name="l00170"></a>00170 <span class="keyword">public</span>:
-<a name="l00171"></a>00171 <span class="keyword">friend</span> <span class="keyword">class </span>micro_queue_pop_finalizer<T>;
-<a name="l00172"></a>00172
-<a name="l00173"></a>00173 <span class="keyword">struct </span>padded_page: page {
-<a name="l00175"></a>00175 padded_page();
-<a name="l00177"></a>00177 <span class="keywordtype">void</span> operator=( <span class="keyword">const</span> padded_page& );
-<a name="l00179"></a>00179 T last;
-<a name="l00180"></a>00180 };
-<a name="l00181"></a>00181
-<a name="l00182"></a>00182 <span class="keyword">static</span> T& get_ref( page& p, size_t index ) {
-<a name="l00183"></a>00183 <span class="keywordflow">return</span> (&static_cast<padded_page*>(static_cast<void*>(&p))->last)[index];
-<a name="l00184"></a>00184 }
-<a name="l00185"></a>00185
-<a name="l00186"></a>00186 atomic<page*> head_page;
-<a name="l00187"></a>00187 atomic<ticket> head_counter;
-<a name="l00188"></a>00188
-<a name="l00189"></a>00189 atomic<page*> tail_page;
-<a name="l00190"></a>00190 atomic<ticket> tail_counter;
-<a name="l00191"></a>00191
-<a name="l00192"></a>00192 spin_mutex page_mutex;
-<a name="l00193"></a>00193
-<a name="l00194"></a>00194 <span class="keywordtype">void</span> push( <span class="keyword">const</span> <span class="keywordtype">void</span>* item, ticket k, concurrent_queue_base_v3<T>& base ) ;
-<a name="l00195"></a>00195
-<a name="l00196"></a>00196 <span class="keywordtype">bool</span> pop( <span class="keywordtype">void</span>* dst, ticket k, concurrent_queue_base_v3<T>& base ) ;
-<a name="l00197"></a>00197
-<a name="l00198"></a>00198 micro_queue& assign( <span class="keyword">const</span> micro_queue& src, concurrent_queue_base_v3<T>& base ) ;
-<a name="l00199"></a>00199
-<a name="l00200"></a>00200 page* make_copy( concurrent_queue_base_v3<T>& base, <span class="keyword">const</span> page* src_page, size_t begin_in_page, size_t end_in_page, ticket& g_index ) ;
-<a name="l00201"></a>00201
-<a name="l00202"></a>00202 <span class="keywordtype">void</span> invalidate_page_and_rethrow( ticket k ) ;
-<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> T>
-<a name="l00206"></a>00206 <span class="keywordtype">void</span> micro_queue<T>::spin_wait_until_my_turn( atomic<ticket>& counter, ticket k, concurrent_queue_rep_base& rb )<span class="keyword"> const </span>{
-<a name="l00207"></a>00207 atomic_backoff backoff;
-<a name="l00208"></a>00208 <span class="keywordflow">do</span> {
-<a name="l00209"></a>00209 backoff.pause();
-<a name="l00210"></a>00210 <span class="keywordflow">if</span>( counter&1 ) {
-<a name="l00211"></a>00211 ++rb.n_invalid_entries;
-<a name="l00212"></a>00212 throw_exception( eid_bad_last_alloc );
-<a name="l00213"></a>00213 }
-<a name="l00214"></a>00214 } <span class="keywordflow">while</span>( counter!=k ) ;
-<a name="l00215"></a>00215 }
-<a name="l00216"></a>00216
-<a name="l00217"></a>00217 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00218"></a>00218 <span class="keywordtype">void</span> micro_queue<T>::push( <span class="keyword">const</span> <span class="keywordtype">void</span>* item, ticket k, concurrent_queue_base_v3<T>& base ) {
-<a name="l00219"></a>00219 k &= -concurrent_queue_rep_base::n_queue;
-<a name="l00220"></a>00220 page* p = NULL;
-<a name="l00221"></a>00221 size_t index = k/concurrent_queue_rep_base::n_queue & (base.my_rep->items_per_page-1);
-<a name="l00222"></a>00222 <span class="keywordflow">if</span>( !index ) {
-<a name="l00223"></a>00223 __TBB_TRY {
-<a name="l00224"></a>00224 concurrent_queue_page_allocator& pa = base;
-<a name="l00225"></a>00225 p = pa.allocate_page();
-<a name="l00226"></a>00226 } __TBB_CATCH (...) {
-<a name="l00227"></a>00227 ++base.my_rep->n_invalid_entries;
-<a name="l00228"></a>00228 invalidate_page_and_rethrow( k );
-<a name="l00229"></a>00229 }
-<a name="l00230"></a>00230 p->mask = 0;
-<a name="l00231"></a>00231 p->next = NULL;
-<a name="l00232"></a>00232 }
-<a name="l00233"></a>00233
-<a name="l00234"></a>00234 <span class="keywordflow">if</span>( tail_counter!=k ) spin_wait_until_my_turn( tail_counter, k, *base.my_rep );
-<a name="l00235"></a>00235 call_itt_notify(acquired, &tail_counter);
-<a name="l00236"></a>00236
-<a name="l00237"></a>00237 <span class="keywordflow">if</span>( p ) {
-<a name="l00238"></a>00238 spin_mutex::scoped_lock lock( page_mutex );
-<a name="l00239"></a>00239 page* q = tail_page;
-<a name="l00240"></a>00240 <span class="keywordflow">if</span>( is_valid_page(q) )
-<a name="l00241"></a>00241 q->next = p;
-<a name="l00242"></a>00242 <span class="keywordflow">else</span>
-<a name="l00243"></a>00243 head_page = p;
-<a name="l00244"></a>00244 tail_page = p;
-<a name="l00245"></a>00245 } <span class="keywordflow">else</span> {
-<a name="l00246"></a>00246 p = tail_page;
-<a name="l00247"></a>00247 }
-<a name="l00248"></a>00248 __TBB_TRY {
-<a name="l00249"></a>00249 copy_item( *p, index, item );
-<a name="l00250"></a>00250 <span class="comment">// If no exception was thrown, mark item as present.</span>
-<a name="l00251"></a>00251 itt_hide_store_word(p->mask, p->mask | uintptr_t(1)<<index);
-<a name="l00252"></a>00252 call_itt_notify(releasing, &tail_counter);
-<a name="l00253"></a>00253 tail_counter += concurrent_queue_rep_base::n_queue;
-<a name="l00254"></a>00254 } __TBB_CATCH (...) {
-<a name="l00255"></a>00255 ++base.my_rep->n_invalid_entries;
-<a name="l00256"></a>00256 call_itt_notify(releasing, &tail_counter);
-<a name="l00257"></a>00257 tail_counter += concurrent_queue_rep_base::n_queue;
-<a name="l00258"></a>00258 __TBB_RETHROW();
-<a name="l00259"></a>00259 }
-<a name="l00260"></a>00260 }
-<a name="l00261"></a>00261
-<a name="l00262"></a>00262 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00263"></a>00263 <span class="keywordtype">bool</span> micro_queue<T>::pop( <span class="keywordtype">void</span>* dst, ticket k, concurrent_queue_base_v3<T>& base ) {
-<a name="l00264"></a>00264 k &= -concurrent_queue_rep_base::n_queue;
-<a name="l00265"></a>00265 <span class="keywordflow">if</span>( head_counter!=k ) spin_wait_until_eq( head_counter, k );
-<a name="l00266"></a>00266 call_itt_notify(acquired, &head_counter);
-<a name="l00267"></a>00267 <span class="keywordflow">if</span>( tail_counter==k ) spin_wait_while_eq( tail_counter, k );
-<a name="l00268"></a>00268 call_itt_notify(acquired, &tail_counter);
-<a name="l00269"></a>00269 page& p = *head_page;
-<a name="l00270"></a>00270 __TBB_ASSERT( &p, NULL );
-<a name="l00271"></a>00271 size_t index = k/concurrent_queue_rep_base::n_queue & (base.my_rep->items_per_page-1);
-<a name="l00272"></a>00272 <span class="keywordtype">bool</span> success = <span class="keyword">false</span>;
-<a name="l00273"></a>00273 {
-<a name="l00274"></a>00274 micro_queue_pop_finalizer<T> finalizer( *<span class="keyword">this</span>, base, k+concurrent_queue_rep_base::n_queue, index==base.my_rep->items_per_page-1 ? &p : NULL );
-<a name="l00275"></a>00275 <span class="keywordflow">if</span>( p.mask & uintptr_t(1)<<index ) {
-<a name="l00276"></a>00276 success = <span class="keyword">true</span>;
-<a name="l00277"></a>00277 assign_and_destroy_item( dst, p, index );
-<a name="l00278"></a>00278 } <span class="keywordflow">else</span> {
-<a name="l00279"></a>00279 --base.my_rep->n_invalid_entries;
-<a name="l00280"></a>00280 }
-<a name="l00281"></a>00281 }
-<a name="l00282"></a>00282 <span class="keywordflow">return</span> success;
-<a name="l00283"></a>00283 }
-<a name="l00284"></a>00284
-<a name="l00285"></a>00285 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00286"></a>00286 micro_queue<T>& micro_queue<T>::assign( <span class="keyword">const</span> micro_queue<T>& src, concurrent_queue_base_v3<T>& base ) {
-<a name="l00287"></a>00287 head_counter = src.head_counter;
-<a name="l00288"></a>00288 tail_counter = src.tail_counter;
-<a name="l00289"></a>00289 page_mutex = src.page_mutex;
-<a name="l00290"></a>00290
-<a name="l00291"></a>00291 <span class="keyword">const</span> page* srcp = src.head_page;
-<a name="l00292"></a>00292 <span class="keywordflow">if</span>( is_valid_page(srcp) ) {
-<a name="l00293"></a>00293 ticket g_index = head_counter;
-<a name="l00294"></a>00294 __TBB_TRY {
-<a name="l00295"></a>00295 size_t n_items = (tail_counter-head_counter)/concurrent_queue_rep_base::n_queue;
-<a name="l00296"></a>00296 size_t index = head_counter/concurrent_queue_rep_base::n_queue & (base.my_rep->items_per_page-1);
-<a name="l00297"></a>00297 size_t end_in_first_page = (index+n_items<base.my_rep->items_per_page)?(index+n_items):base.my_rep->items_per_page;
-<a name="l00298"></a>00298
-<a name="l00299"></a>00299 head_page = make_copy( base, srcp, index, end_in_first_page, g_index );
-<a name="l00300"></a>00300 page* cur_page = head_page;
-<a name="l00301"></a>00301
-<a name="l00302"></a>00302 <span class="keywordflow">if</span>( srcp != src.tail_page ) {
-<a name="l00303"></a>00303 <span class="keywordflow">for</span>( srcp = srcp->next; srcp!=src.tail_page; srcp=srcp->next ) {
-<a name="l00304"></a>00304 cur_page->next = make_copy( base, srcp, 0, base.my_rep->items_per_page, g_index );
-<a name="l00305"></a>00305 cur_page = cur_page->next;
-<a name="l00306"></a>00306 }
-<a name="l00307"></a>00307
-<a name="l00308"></a>00308 __TBB_ASSERT( srcp==src.tail_page, NULL );
-<a name="l00309"></a>00309 size_t last_index = tail_counter/concurrent_queue_rep_base::n_queue & (base.my_rep->items_per_page-1);
-<a name="l00310"></a>00310 <span class="keywordflow">if</span>( last_index==0 ) last_index = base.my_rep->items_per_page;
-<a name="l00311"></a>00311
-<a name="l00312"></a>00312 cur_page->next = make_copy( base, srcp, 0, last_index, g_index );
-<a name="l00313"></a>00313 cur_page = cur_page->next;
-<a name="l00314"></a>00314 }
-<a name="l00315"></a>00315 tail_page = cur_page;
-<a name="l00316"></a>00316 } __TBB_CATCH (...) {
-<a name="l00317"></a>00317 invalidate_page_and_rethrow( g_index );
-<a name="l00318"></a>00318 }
-<a name="l00319"></a>00319 } <span class="keywordflow">else</span> {
-<a name="l00320"></a>00320 head_page = tail_page = NULL;
-<a name="l00321"></a>00321 }
-<a name="l00322"></a>00322 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<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>
-<a name="l00326"></a>00326 <span class="keywordtype">void</span> micro_queue<T>::invalidate_page_and_rethrow( ticket k ) {
-<a name="l00327"></a>00327 <span class="comment">// Append an invalid page at address 1 so that no more pushes are allowed.</span>
-<a name="l00328"></a>00328 page* invalid_page = (page*)uintptr_t(1);
-<a name="l00329"></a>00329 {
-<a name="l00330"></a>00330 spin_mutex::scoped_lock lock( page_mutex );
-<a name="l00331"></a>00331 itt_store_word_with_release(tail_counter, k+concurrent_queue_rep_base::n_queue+1);
-<a name="l00332"></a>00332 page* q = tail_page;
-<a name="l00333"></a>00333 <span class="keywordflow">if</span>( is_valid_page(q) )
-<a name="l00334"></a>00334 q->next = invalid_page;
-<a name="l00335"></a>00335 <span class="keywordflow">else</span>
-<a name="l00336"></a>00336 head_page = invalid_page;
-<a name="l00337"></a>00337 tail_page = invalid_page;
-<a name="l00338"></a>00338 }
-<a name="l00339"></a>00339 __TBB_RETHROW();
-<a name="l00340"></a>00340 }
-<a name="l00341"></a>00341
-<a name="l00342"></a>00342 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00343"></a>00343 concurrent_queue_rep_base::page* micro_queue<T>::make_copy( concurrent_queue_base_v3<T>& base, <span class="keyword">const</span> concurrent_queue_rep_base::page* src_page, size_t begin_in_page, size_t end_in_page, ticket& g_index ) {
-<a name="l00344"></a>00344 concurrent_queue_page_allocator& pa = base;
-<a name="l00345"></a>00345 page* new_page = pa.allocate_page();
-<a name="l00346"></a>00346 new_page->next = NULL;
-<a name="l00347"></a>00347 new_page->mask = src_page->mask;
-<a name="l00348"></a>00348 <span class="keywordflow">for</span>( ; begin_in_page!=end_in_page; ++begin_in_page, ++g_index )
-<a name="l00349"></a>00349 <span class="keywordflow">if</span>( new_page->mask & uintptr_t(1)<<begin_in_page )
-<a name="l00350"></a>00350 copy_item( *new_page, begin_in_page, *src_page, begin_in_page );
-<a name="l00351"></a>00351 <span class="keywordflow">return</span> new_page;
-<a name="l00352"></a>00352 }
-<a name="l00353"></a>00353
-<a name="l00354"></a>00354 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00355"></a>00355 <span class="keyword">class </span>micro_queue_pop_finalizer: no_copy {
-<a name="l00356"></a>00356 <span class="keyword">typedef</span> concurrent_queue_rep_base::page page;
-<a name="l00357"></a>00357 ticket my_ticket;
-<a name="l00358"></a>00358 micro_queue<T>& my_queue;
-<a name="l00359"></a>00359 page* my_page;
-<a name="l00360"></a>00360 concurrent_queue_page_allocator& allocator;
-<a name="l00361"></a>00361 <span class="keyword">public</span>:
-<a name="l00362"></a>00362 micro_queue_pop_finalizer( micro_queue<T>& queue, concurrent_queue_base_v3<T>& b, ticket k, page* p ) :
-<a name="l00363"></a>00363 my_ticket(k), my_queue(queue), my_page(p), allocator(b)
-<a name="l00364"></a>00364 {}
-<a name="l00365"></a>00365 ~micro_queue_pop_finalizer() ;
-<a name="l00366"></a>00366 };
-<a name="l00367"></a>00367
-<a name="l00368"></a>00368 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00369"></a>00369 micro_queue_pop_finalizer<T>::~micro_queue_pop_finalizer() {
-<a name="l00370"></a>00370 page* p = my_page;
-<a name="l00371"></a>00371 <span class="keywordflow">if</span>( is_valid_page(p) ) {
-<a name="l00372"></a>00372 spin_mutex::scoped_lock lock( my_queue.page_mutex );
-<a name="l00373"></a>00373 page* q = p->next;
-<a name="l00374"></a>00374 my_queue.head_page = q;
-<a name="l00375"></a>00375 <span class="keywordflow">if</span>( !is_valid_page(q) ) {
-<a name="l00376"></a>00376 my_queue.tail_page = NULL;
-<a name="l00377"></a>00377 }
-<a name="l00378"></a>00378 }
-<a name="l00379"></a>00379 itt_store_word_with_release(my_queue.head_counter, my_ticket);
-<a name="l00380"></a>00380 <span class="keywordflow">if</span>( is_valid_page(p) ) {
-<a name="l00381"></a>00381 allocator.deallocate_page( p );
-<a name="l00382"></a>00382 }
-<a name="l00383"></a>00383 }
-<a name="l00384"></a>00384
-<a name="l00385"></a>00385 <span class="preprocessor">#if _MSC_VER && !defined(__INTEL_COMPILER)</span>
-<a name="l00386"></a>00386 <span class="preprocessor"></span><span class="preprocessor">#pragma warning( pop )</span>
-<a name="l00387"></a>00387 <span class="preprocessor"></span><span class="preprocessor">#endif // warning 4146 is back</span>
-<a name="l00388"></a>00388 <span class="preprocessor"></span>
-<a name="l00389"></a>00389 <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">class </span>concurrent_queue_iterator_rep ;
-<a name="l00390"></a>00390 <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">class </span>concurrent_queue_iterator_base_v3;
-<a name="l00391"></a>00391
-<a name="l00393"></a>00393
-<a name="l00396"></a>00396 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00397"></a>00397 <span class="keyword">struct </span>concurrent_queue_rep : <span class="keyword">public</span> concurrent_queue_rep_base {
-<a name="l00398"></a>00398 micro_queue<T> array[n_queue];
-<a name="l00399"></a>00399
-<a name="l00401"></a>00401 <span class="keyword">static</span> size_t index( ticket k ) {
-<a name="l00402"></a>00402 <span class="keywordflow">return</span> k*phi%n_queue;
-<a name="l00403"></a>00403 }
-<a name="l00404"></a>00404
-<a name="l00405"></a>00405 micro_queue<T>& choose( ticket k ) {
-<a name="l00406"></a>00406 <span class="comment">// The formula here approximates LRU in a cache-oblivious way.</span>
-<a name="l00407"></a>00407 <span class="keywordflow">return</span> array[index(k)];
-<a name="l00408"></a>00408 }
-<a name="l00409"></a>00409 };
-<a name="l00410"></a>00410
-<a name="l00412"></a>00412
-<a name="l00416"></a>00416 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00417"></a>00417 <span class="keyword">class </span>concurrent_queue_base_v3: <span class="keyword">public</span> concurrent_queue_page_allocator {
-<a name="l00419"></a>00419 concurrent_queue_rep<T>* my_rep;
-<a name="l00420"></a>00420
-<a name="l00421"></a>00421 <span class="keyword">friend</span> <span class="keyword">struct </span>concurrent_queue_rep<T>;
-<a name="l00422"></a>00422 <span class="keyword">friend</span> <span class="keyword">class </span>micro_queue<T>;
-<a name="l00423"></a>00423 <span class="keyword">friend</span> <span class="keyword">class </span>concurrent_queue_iterator_rep<T>;
-<a name="l00424"></a>00424 <span class="keyword">friend</span> <span class="keyword">class </span>concurrent_queue_iterator_base_v3<T>;
-<a name="l00425"></a>00425
-<a name="l00426"></a>00426 <span class="keyword">protected</span>:
-<a name="l00427"></a>00427 <span class="keyword">typedef</span> <span class="keyword">typename</span> concurrent_queue_rep<T>::page page;
-<a name="l00428"></a>00428
-<a name="l00429"></a>00429 <span class="keyword">private</span>:
-<a name="l00430"></a>00430 <span class="keyword">typedef</span> <span class="keyword">typename</span> micro_queue<T>::padded_page padded_page;
-<a name="l00431"></a>00431
-<a name="l00432"></a>00432 <span class="comment">/* override */</span> <span class="keyword">virtual</span> page *allocate_page() {
-<a name="l00433"></a>00433 concurrent_queue_rep<T>& r = *my_rep;
-<a name="l00434"></a>00434 size_t n = <span class="keyword">sizeof</span>(padded_page) + (r.items_per_page-1)*<span class="keyword">sizeof</span>(T);
-<a name="l00435"></a>00435 <span class="keywordflow">return</span> reinterpret_cast<page*>(allocate_block ( n ));
-<a name="l00436"></a>00436 }
-<a name="l00437"></a>00437
-<a name="l00438"></a>00438 <span class="comment">/* override */</span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> deallocate_page( concurrent_queue_rep_base::page *p ) {
-<a name="l00439"></a>00439 concurrent_queue_rep<T>& r = *my_rep;
-<a name="l00440"></a>00440 size_t n = <span class="keyword">sizeof</span>(padded_page) + (r.items_per_page-1)*<span class="keyword">sizeof</span>(T);
-<a name="l00441"></a>00441 deallocate_block( reinterpret_cast<void*>(p), n );
-<a name="l00442"></a>00442 }
-<a name="l00443"></a>00443
-<a name="l00445"></a>00445 <span class="keyword">virtual</span> <span class="keywordtype">void</span> *allocate_block( size_t n ) = 0;
-<a name="l00446"></a>00446
-<a name="l00448"></a>00448 <span class="keyword">virtual</span> <span class="keywordtype">void</span> deallocate_block( <span class="keywordtype">void</span> *p, size_t n ) = 0;
-<a name="l00449"></a>00449
-<a name="l00450"></a>00450 <span class="keyword">protected</span>:
-<a name="l00451"></a>00451 concurrent_queue_base_v3();
-<a name="l00452"></a>00452
-<a name="l00453"></a>00453 <span class="comment">/* override */</span> <span class="keyword">virtual</span> ~concurrent_queue_base_v3() {
-<a name="l00454"></a>00454 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00455"></a>00455 <span class="preprocessor"></span> size_t nq = my_rep->n_queue;
-<a name="l00456"></a>00456 <span class="keywordflow">for</span>( size_t i=0; i<nq; i++ )
-<a name="l00457"></a>00457 __TBB_ASSERT( my_rep->array[i].tail_page==NULL, <span class="stringliteral">"pages were not freed properly"</span> );
-<a name="l00458"></a>00458 #endif <span class="comment">/* TBB_USE_ASSERT */</span>
-<a name="l00459"></a>00459 cache_aligned_allocator<concurrent_queue_rep<T> >().deallocate(my_rep,1);
-<a name="l00460"></a>00460 }
-<a name="l00461"></a>00461
-<a name="l00463"></a>00463 <span class="keywordtype">void</span> internal_push( <span class="keyword">const</span> <span class="keywordtype">void</span>* src ) {
-<a name="l00464"></a>00464 concurrent_queue_rep<T>& r = *my_rep;
-<a name="l00465"></a>00465 ticket k = r.tail_counter++;
-<a name="l00466"></a>00466 r.choose(k).push( src, k, *<span class="keyword">this</span> );
-<a name="l00467"></a>00467 }
-<a name="l00468"></a>00468
-<a name="l00470"></a>00470
-<a name="l00471"></a>00471 <span class="keywordtype">bool</span> internal_try_pop( <span class="keywordtype">void</span>* dst ) ;
-<a name="l00472"></a>00472
-<a name="l00474"></a>00474 size_t internal_size() <span class="keyword">const </span>;
-<a name="l00475"></a>00475
-<a name="l00477"></a>00477 <span class="keywordtype">bool</span> internal_empty() <span class="keyword">const </span>;
-<a name="l00478"></a>00478
-<a name="l00480"></a>00480 <span class="comment">/* note that the name may be misleading, but it remains so due to a historical accident. */</span>
-<a name="l00481"></a>00481 <span class="keywordtype">void</span> internal_finish_clear() ;
-<a name="l00482"></a>00482
-<a name="l00484"></a>00484 <span class="keywordtype">void</span> internal_throw_exception()<span class="keyword"> const </span>{
-<a name="l00485"></a>00485 throw_exception( eid_bad_alloc );
-<a name="l00486"></a>00486 }
-<a name="l00487"></a>00487
-<a name="l00489"></a>00489 <span class="keywordtype">void</span> assign( <span class="keyword">const</span> concurrent_queue_base_v3& src ) ;
-<a name="l00490"></a>00490 };
-<a name="l00491"></a>00491
-<a name="l00492"></a>00492 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00493"></a>00493 concurrent_queue_base_v3<T>::concurrent_queue_base_v3() {
-<a name="l00494"></a>00494 <span class="keyword">const</span> size_t item_size = <span class="keyword">sizeof</span>(T);
-<a name="l00495"></a>00495 my_rep = cache_aligned_allocator<concurrent_queue_rep<T> >().allocate(1);
-<a name="l00496"></a>00496 __TBB_ASSERT( (size_t)my_rep % NFS_GetLineSize()==0, <span class="stringliteral">"alignment error"</span> );
-<a name="l00497"></a>00497 __TBB_ASSERT( (size_t)&my_rep->head_counter % NFS_GetLineSize()==0, <span class="stringliteral">"alignment error"</span> );
-<a name="l00498"></a>00498 __TBB_ASSERT( (size_t)&my_rep->tail_counter % NFS_GetLineSize()==0, <span class="stringliteral">"alignment error"</span> );
-<a name="l00499"></a>00499 __TBB_ASSERT( (size_t)&my_rep->array % NFS_GetLineSize()==0, <span class="stringliteral">"alignment error"</span> );
-<a name="l00500"></a>00500 memset(my_rep,0,<span class="keyword">sizeof</span>(concurrent_queue_rep<T>));
-<a name="l00501"></a>00501 my_rep->item_size = item_size;
-<a name="l00502"></a>00502 my_rep->items_per_page = item_size<=8 ? 32 :
-<a name="l00503"></a>00503 item_size<=16 ? 16 :
-<a name="l00504"></a>00504 item_size<=32 ? 8 :
-<a name="l00505"></a>00505 item_size<=64 ? 4 :
-<a name="l00506"></a>00506 item_size<=128 ? 2 :
-<a name="l00507"></a>00507 1;
-<a name="l00508"></a>00508 }
-<a name="l00509"></a>00509
-<a name="l00510"></a>00510 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00511"></a>00511 <span class="keywordtype">bool</span> concurrent_queue_base_v3<T>::internal_try_pop( <span class="keywordtype">void</span>* dst ) {
-<a name="l00512"></a>00512 concurrent_queue_rep<T>& r = *my_rep;
-<a name="l00513"></a>00513 ticket k;
-<a name="l00514"></a>00514 <span class="keywordflow">do</span> {
-<a name="l00515"></a>00515 k = r.head_counter;
-<a name="l00516"></a>00516 <span class="keywordflow">for</span>(;;) {
-<a name="l00517"></a>00517 <span class="keywordflow">if</span>( r.tail_counter<=k ) {
-<a name="l00518"></a>00518 <span class="comment">// Queue is empty </span>
-<a name="l00519"></a>00519 <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l00520"></a>00520 }
-<a name="l00521"></a>00521 <span class="comment">// Queue had item with ticket k when we looked. Attempt to get that item.</span>
-<a name="l00522"></a>00522 ticket tk=k;
-<a name="l00523"></a>00523 <span class="preprocessor">#if defined(_MSC_VER) && defined(_Wp64)</span>
-<a name="l00524"></a>00524 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (push)</span>
-<a name="l00525"></a>00525 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (disable: 4267)</span>
-<a name="l00526"></a>00526 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00527"></a>00527 <span class="preprocessor"></span> k = r.head_counter.compare_and_swap( tk+1, tk );
-<a name="l00528"></a>00528 <span class="preprocessor">#if defined(_MSC_VER) && defined(_Wp64)</span>
-<a name="l00529"></a>00529 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (pop)</span>
-<a name="l00530"></a>00530 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00531"></a>00531 <span class="preprocessor"></span> <span class="keywordflow">if</span>( k==tk )
-<a name="l00532"></a>00532 <span class="keywordflow">break</span>;
-<a name="l00533"></a>00533 <span class="comment">// Another thread snatched the item, retry.</span>
-<a name="l00534"></a>00534 }
-<a name="l00535"></a>00535 } <span class="keywordflow">while</span>( !r.choose( k ).pop( dst, k, *<span class="keyword">this</span> ) );
-<a name="l00536"></a>00536 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l00537"></a>00537 }
-<a name="l00538"></a>00538
-<a name="l00539"></a>00539 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00540"></a>00540 size_t concurrent_queue_base_v3<T>::internal_size()<span class="keyword"> const </span>{
-<a name="l00541"></a>00541 concurrent_queue_rep<T>& r = *my_rep;
-<a name="l00542"></a>00542 __TBB_ASSERT( <span class="keyword">sizeof</span>(ptrdiff_t)<=<span class="keyword">sizeof</span>(size_t), NULL );
-<a name="l00543"></a>00543 ticket hc = r.head_counter;
-<a name="l00544"></a>00544 size_t nie = r.n_invalid_entries;
-<a name="l00545"></a>00545 ticket tc = r.tail_counter;
-<a name="l00546"></a>00546 __TBB_ASSERT( hc!=tc || !nie, NULL );
-<a name="l00547"></a>00547 ptrdiff_t sz = tc-hc-nie;
-<a name="l00548"></a>00548 <span class="keywordflow">return</span> sz<0 ? 0 : size_t(sz);
-<a name="l00549"></a>00549 }
-<a name="l00550"></a>00550
-<a name="l00551"></a>00551 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00552"></a>00552 <span class="keywordtype">bool</span> concurrent_queue_base_v3<T>::internal_empty()<span class="keyword"> const </span>{
-<a name="l00553"></a>00553 concurrent_queue_rep<T>& r = *my_rep;
-<a name="l00554"></a>00554 ticket tc = r.tail_counter;
-<a name="l00555"></a>00555 ticket hc = r.head_counter;
-<a name="l00556"></a>00556 <span class="comment">// if tc!=r.tail_counter, the queue was not empty at some point between the two reads.</span>
-<a name="l00557"></a>00557 <span class="keywordflow">return</span> tc==r.tail_counter && tc==hc+r.n_invalid_entries ;
-<a name="l00558"></a>00558 }
-<a name="l00559"></a>00559
-<a name="l00560"></a>00560 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00561"></a>00561 <span class="keywordtype">void</span> concurrent_queue_base_v3<T>::internal_finish_clear() {
-<a name="l00562"></a>00562 concurrent_queue_rep<T>& r = *my_rep;
-<a name="l00563"></a>00563 size_t nq = r.n_queue;
-<a name="l00564"></a>00564 <span class="keywordflow">for</span>( size_t i=0; i<nq; ++i ) {
-<a name="l00565"></a>00565 page* tp = r.array[i].tail_page;
-<a name="l00566"></a>00566 <span class="keywordflow">if</span>( is_valid_page(tp) ) {
-<a name="l00567"></a>00567 __TBB_ASSERT( r.array[i].head_page==tp, <span class="stringliteral">"at most one page should remain"</span> );
-<a name="l00568"></a>00568 deallocate_page( tp );
-<a name="l00569"></a>00569 r.array[i].tail_page = NULL;
-<a name="l00570"></a>00570 } <span class="keywordflow">else</span>
-<a name="l00571"></a>00571 __TBB_ASSERT( !is_valid_page(r.array[i].head_page), <span class="stringliteral">"head page pointer corrupt?"</span> );
-<a name="l00572"></a>00572 }
-<a name="l00573"></a>00573 }
-<a name="l00574"></a>00574
-<a name="l00575"></a>00575 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00576"></a>00576 <span class="keywordtype">void</span> concurrent_queue_base_v3<T>::assign( <span class="keyword">const</span> concurrent_queue_base_v3& src ) {
-<a name="l00577"></a>00577 concurrent_queue_rep<T>& r = *my_rep;
-<a name="l00578"></a>00578 r.items_per_page = src.my_rep->items_per_page;
-<a name="l00579"></a>00579
-<a name="l00580"></a>00580 <span class="comment">// copy concurrent_queue_rep.</span>
-<a name="l00581"></a>00581 r.head_counter = src.my_rep->head_counter;
-<a name="l00582"></a>00582 r.tail_counter = src.my_rep->tail_counter;
-<a name="l00583"></a>00583 r.n_invalid_entries = src.my_rep->n_invalid_entries;
-<a name="l00584"></a>00584
-<a name="l00585"></a>00585 <span class="comment">// copy micro_queues</span>
-<a name="l00586"></a>00586 <span class="keywordflow">for</span>( size_t i = 0; i<r.n_queue; ++i )
-<a name="l00587"></a>00587 r.array[i].assign( src.my_rep->array[i], *<span class="keyword">this</span>);
-<a name="l00588"></a>00588
-<a name="l00589"></a>00589 __TBB_ASSERT( r.head_counter==src.my_rep->head_counter && r.tail_counter==src.my_rep->tail_counter,
-<a name="l00590"></a>00590 <span class="stringliteral">"the source concurrent queue should not be concurrently modified."</span> );
-<a name="l00591"></a>00591 }
-<a name="l00592"></a>00592
-<a name="l00593"></a>00593 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> Value> <span class="keyword">class </span>concurrent_queue_iterator;
-<a name="l00594"></a>00594
-<a name="l00595"></a>00595 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00596"></a>00596 <span class="keyword">class </span>concurrent_queue_iterator_rep: no_assign {
-<a name="l00597"></a>00597 <span class="keyword">typedef</span> <span class="keyword">typename</span> micro_queue<T>::padded_page padded_page;
-<a name="l00598"></a>00598 <span class="keyword">public</span>:
-<a name="l00599"></a>00599 ticket head_counter;
-<a name="l00600"></a>00600 <span class="keyword">const</span> concurrent_queue_base_v3<T>& my_queue;
-<a name="l00601"></a>00601 <span class="keyword">typename</span> concurrent_queue_base_v3<T>::page* array[concurrent_queue_rep<T>::n_queue];
-<a name="l00602"></a>00602 concurrent_queue_iterator_rep( <span class="keyword">const</span> concurrent_queue_base_v3<T>& queue ) :
-<a name="l00603"></a>00603 head_counter(queue.my_rep->head_counter),
-<a name="l00604"></a>00604 my_queue(queue)
-<a name="l00605"></a>00605 {
-<a name="l00606"></a>00606 <span class="keywordflow">for</span>( size_t k=0; k<concurrent_queue_rep<T>::n_queue; ++k )
-<a name="l00607"></a>00607 array[k] = queue.my_rep->array[k].head_page;
-<a name="l00608"></a>00608 }
-<a name="l00609"></a>00609
-<a name="l00611"></a>00611 <span class="keywordtype">bool</span> get_item( T*& item, size_t k ) ;
-<a name="l00612"></a>00612 };
-<a name="l00613"></a>00613
-<a name="l00614"></a>00614 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00615"></a>00615 <span class="keywordtype">bool</span> concurrent_queue_iterator_rep<T>::get_item( T*& item, size_t k ) {
-<a name="l00616"></a>00616 <span class="keywordflow">if</span>( k==my_queue.my_rep->tail_counter ) {
-<a name="l00617"></a>00617 item = NULL;
-<a name="l00618"></a>00618 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l00619"></a>00619 } <span class="keywordflow">else</span> {
-<a name="l00620"></a>00620 <span class="keyword">typename</span> concurrent_queue_base_v3<T>::page* p = array[concurrent_queue_rep<T>::index(k)];
-<a name="l00621"></a>00621 __TBB_ASSERT(p,NULL);
-<a name="l00622"></a>00622 size_t i = k/concurrent_queue_rep<T>::n_queue & (my_queue.my_rep->items_per_page-1);
-<a name="l00623"></a>00623 item = µ_queue<T>::get_ref(*p,i);
-<a name="l00624"></a>00624 <span class="keywordflow">return</span> (p->mask & uintptr_t(1)<<i)!=0;
-<a name="l00625"></a>00625 }
-<a name="l00626"></a>00626 }
-<a name="l00627"></a>00627
-<a name="l00629"></a>00629
-<a name="l00630"></a>00630 <span class="keyword">template</span><<span class="keyword">typename</span> Value>
-<a name="l00631"></a>00631 <span class="keyword">class </span>concurrent_queue_iterator_base_v3 : no_assign {
-<a name="l00633"></a>00633
-<a name="l00634"></a>00634 concurrent_queue_iterator_rep<Value>* my_rep;
-<a name="l00635"></a>00635
-<a name="l00636"></a>00636 <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="l00637"></a>00637 <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> concurrent_queue_iterator<C,T>& i, <span class="keyword">const</span> concurrent_queue_iterator<C,U>& j );
-<a name="l00638"></a>00638
-<a name="l00639"></a>00639 <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="l00640"></a>00640 <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator!=( <span class="keyword">const</span> concurrent_queue_iterator<C,T>& i, <span class="keyword">const</span> concurrent_queue_iterator<C,U>& j );
-<a name="l00641"></a>00641 <span class="keyword">protected</span>:
-<a name="l00643"></a>00643 Value* my_item;
-<a name="l00644"></a>00644
-<a name="l00646"></a>00646 concurrent_queue_iterator_base_v3() : my_rep(NULL), my_item(NULL) {
-<a name="l00647"></a>00647 <span class="preprocessor">#if __TBB_GCC_OPTIMIZER_ORDERING_BROKEN</span>
-<a name="l00648"></a>00648 <span class="preprocessor"></span> __asm__ __volatile__(<span class="stringliteral">""</span>: : :<span class="stringliteral">"memory"</span>);
-<a name="l00649"></a>00649 <span class="preprocessor">#endif</span>
-<a name="l00650"></a>00650 <span class="preprocessor"></span> }
-<a name="l00651"></a>00651
-<a name="l00653"></a>00653 concurrent_queue_iterator_base_v3( <span class="keyword">const</span> concurrent_queue_iterator_base_v3& i )
-<a name="l00654"></a>00654 : no_assign(), my_rep(NULL), my_item(NULL) {
-<a name="l00655"></a>00655 assign(i);
-<a name="l00656"></a>00656 }
-<a name="l00657"></a>00657
-<a name="l00659"></a>00659 concurrent_queue_iterator_base_v3( <span class="keyword">const</span> concurrent_queue_base_v3<Value>& queue ) ;
-<a name="l00660"></a>00660
-<a name="l00662"></a>00662 <span class="keywordtype">void</span> assign( <span class="keyword">const</span> concurrent_queue_iterator_base_v3<Value>& other ) ;
-<a name="l00663"></a>00663
-<a name="l00665"></a>00665 <span class="keywordtype">void</span> advance() ;
-<a name="l00666"></a>00666
-<a name="l00668"></a>00668 ~concurrent_queue_iterator_base_v3() {
-<a name="l00669"></a>00669 cache_aligned_allocator<concurrent_queue_iterator_rep<Value> >().deallocate(my_rep, 1);
-<a name="l00670"></a>00670 my_rep = NULL;
-<a name="l00671"></a>00671 }
-<a name="l00672"></a>00672 };
-<a name="l00673"></a>00673
-<a name="l00674"></a>00674 <span class="keyword">template</span><<span class="keyword">typename</span> Value>
-<a name="l00675"></a>00675 concurrent_queue_iterator_base_v3<Value>::concurrent_queue_iterator_base_v3( <span class="keyword">const</span> concurrent_queue_base_v3<Value>& queue ) {
-<a name="l00676"></a>00676 my_rep = cache_aligned_allocator<concurrent_queue_iterator_rep<Value> >().allocate(1);
-<a name="l00677"></a>00677 <span class="keyword">new</span>( my_rep ) concurrent_queue_iterator_rep<Value>(queue);
-<a name="l00678"></a>00678 size_t k = my_rep->head_counter;
-<a name="l00679"></a>00679 <span class="keywordflow">if</span>( !my_rep->get_item(my_item, k) ) advance();
-<a name="l00680"></a>00680 }
-<a name="l00681"></a>00681
-<a name="l00682"></a>00682 <span class="keyword">template</span><<span class="keyword">typename</span> Value>
-<a name="l00683"></a>00683 <span class="keywordtype">void</span> concurrent_queue_iterator_base_v3<Value>::assign( <span class="keyword">const</span> concurrent_queue_iterator_base_v3<Value>& other ) {
-<a name="l00684"></a>00684 <span class="keywordflow">if</span>( my_rep!=other.my_rep ) {
-<a name="l00685"></a>00685 <span class="keywordflow">if</span>( my_rep ) {
-<a name="l00686"></a>00686 cache_aligned_allocator<concurrent_queue_iterator_rep<Value> >().deallocate(my_rep, 1);
-<a name="l00687"></a>00687 my_rep = NULL;
-<a name="l00688"></a>00688 }
-<a name="l00689"></a>00689 <span class="keywordflow">if</span>( other.my_rep ) {
-<a name="l00690"></a>00690 my_rep = cache_aligned_allocator<concurrent_queue_iterator_rep<Value> >().allocate(1);
-<a name="l00691"></a>00691 <span class="keyword">new</span>( my_rep ) concurrent_queue_iterator_rep<Value>( *other.my_rep );
-<a name="l00692"></a>00692 }
-<a name="l00693"></a>00693 }
-<a name="l00694"></a>00694 my_item = other.my_item;
-<a name="l00695"></a>00695 }
-<a name="l00696"></a>00696
-<a name="l00697"></a>00697 <span class="keyword">template</span><<span class="keyword">typename</span> Value>
-<a name="l00698"></a>00698 <span class="keywordtype">void</span> concurrent_queue_iterator_base_v3<Value>::advance() {
-<a name="l00699"></a>00699 __TBB_ASSERT( my_item, <span class="stringliteral">"attempt to increment iterator past end of queue"</span> );
-<a name="l00700"></a>00700 size_t k = my_rep->head_counter;
-<a name="l00701"></a>00701 <span class="keyword">const</span> concurrent_queue_base_v3<Value>& queue = my_rep->my_queue;
-<a name="l00702"></a>00702 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00703"></a>00703 <span class="preprocessor"></span> Value* tmp;
-<a name="l00704"></a>00704 my_rep->get_item(tmp,k);
-<a name="l00705"></a>00705 __TBB_ASSERT( my_item==tmp, NULL );
-<a name="l00706"></a>00706 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
-<a name="l00707"></a>00707 size_t i = k/concurrent_queue_rep<Value>::n_queue & (queue.my_rep->items_per_page-1);
-<a name="l00708"></a>00708 <span class="keywordflow">if</span>( i==queue.my_rep->items_per_page-1 ) {
-<a name="l00709"></a>00709 <span class="keyword">typename</span> concurrent_queue_base_v3<Value>::page*& root = my_rep->array[concurrent_queue_rep<Value>::index(k)];
-<a name="l00710"></a>00710 root = root->next;
-<a name="l00711"></a>00711 }
-<a name="l00712"></a>00712 <span class="comment">// advance k</span>
-<a name="l00713"></a>00713 my_rep->head_counter = ++k;
-<a name="l00714"></a>00714 <span class="keywordflow">if</span>( !my_rep->get_item(my_item, k) ) advance();
-<a name="l00715"></a>00715 }
-<a name="l00716"></a>00716
-<a name="l00718"></a>00718
-<a name="l00719"></a>00719 <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">struct </span>tbb_remove_cv {<span class="keyword">typedef</span> T type;};
-<a name="l00720"></a>00720 <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">struct </span>tbb_remove_cv<const T> {<span class="keyword">typedef</span> T type;};
-<a name="l00721"></a>00721 <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">struct </span>tbb_remove_cv<volatile T> {<span class="keyword">typedef</span> T type;};
-<a name="l00722"></a>00722 <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">struct </span>tbb_remove_cv<const volatile T> {<span class="keyword">typedef</span> T type;};
-<a name="l00723"></a>00723
-<a name="l00725"></a>00725
-<a name="l00727"></a>00727 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> Value>
-<a name="l00728"></a>00728 <span class="keyword">class </span>concurrent_queue_iterator: <span class="keyword">public</span> concurrent_queue_iterator_base_v3<typename tbb_remove_cv<Value>::type>,
-<a name="l00729"></a>00729 <span class="keyword">public</span> std::iterator<std::forward_iterator_tag,Value> {
-<a name="l00730"></a>00730 <span class="preprocessor">#if !__TBB_TEMPLATE_FRIENDS_BROKEN</span>
-<a name="l00731"></a>00731 <span class="preprocessor"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l00732"></a>00732 <span class="keyword">friend</span> class ::tbb::strict_ppl::concurrent_queue;
-<a name="l00733"></a>00733 <span class="preprocessor">#else</span>
-<a name="l00734"></a>00734 <span class="preprocessor"></span><span class="keyword">public</span>: <span class="comment">// workaround for MSVC</span>
-<a name="l00735"></a>00735 <span class="preprocessor">#endif </span>
-<a name="l00737"></a>00737 <span class="preprocessor"> concurrent_queue_iterator( const concurrent_queue_base_v3<Value>& queue ) :</span>
-<a name="l00738"></a>00738 <span class="preprocessor"></span> concurrent_queue_iterator_base_v3<typename tbb_remove_cv<Value>::type>(queue)
-<a name="l00739"></a>00739 {
-<a name="l00740"></a>00740 }
-<a name="l00741"></a>00741
-<a name="l00742"></a>00742 <span class="keyword">public</span>:
-<a name="l00743"></a>00743 concurrent_queue_iterator() {}
-<a name="l00744"></a>00744
-<a name="l00745"></a>00745 concurrent_queue_iterator( <span class="keyword">const</span> concurrent_queue_iterator<Container,typename Container::value_type>& other ) :
-<a name="l00746"></a>00746 concurrent_queue_iterator_base_v3<typename tbb_remove_cv<Value>::type>(other)
-<a name="l00747"></a>00747 {}
-<a name="l00748"></a>00748
-<a name="l00750"></a>00750 concurrent_queue_iterator& operator=( <span class="keyword">const</span> concurrent_queue_iterator& other ) {
-<a name="l00751"></a>00751 this->assign(other);
-<a name="l00752"></a>00752 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00753"></a>00753 }
-<a name="l00754"></a>00754
-<a name="l00756"></a>00756 Value& operator*()<span class="keyword"> const </span>{
-<a name="l00757"></a>00757 <span class="keywordflow">return</span> *static_cast<Value*>(this->my_item);
-<a name="l00758"></a>00758 }
-<a name="l00759"></a>00759
-<a name="l00760"></a>00760 Value* operator->()<span class="keyword"> const </span>{<span class="keywordflow">return</span> &operator*();}
-<a name="l00761"></a>00761
-<a name="l00763"></a>00763 concurrent_queue_iterator& operator++() {
-<a name="l00764"></a>00764 this->advance();
-<a name="l00765"></a>00765 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00766"></a>00766 }
-<a name="l00767"></a>00767
-<a name="l00769"></a>00769 Value* operator++(<span class="keywordtype">int</span>) {
-<a name="l00770"></a>00770 Value* result = &operator*();
-<a name="l00771"></a>00771 operator++();
-<a name="l00772"></a>00772 <span class="keywordflow">return</span> result;
-<a name="l00773"></a>00773 }
-<a name="l00774"></a>00774 }; <span class="comment">// concurrent_queue_iterator</span>
-<a name="l00775"></a>00775
-<a name="l00776"></a>00776
-<a name="l00777"></a>00777 <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="l00778"></a>00778 <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> concurrent_queue_iterator<C,T>& i, <span class="keyword">const</span> concurrent_queue_iterator<C,U>& j ) {
-<a name="l00779"></a>00779 <span class="keywordflow">return</span> i.my_item==j.my_item;
-<a name="l00780"></a>00780 }
-<a name="l00781"></a>00781
-<a name="l00782"></a>00782 <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="l00783"></a>00783 <span class="keywordtype">bool</span> operator!=( <span class="keyword">const</span> concurrent_queue_iterator<C,T>& i, <span class="keyword">const</span> concurrent_queue_iterator<C,U>& j ) {
-<a name="l00784"></a>00784 <span class="keywordflow">return</span> i.my_item!=j.my_item;
-<a name="l00785"></a>00785 }
-<a name="l00786"></a>00786
-<a name="l00787"></a>00787 } <span class="comment">// namespace internal</span>
-<a name="l00788"></a>00788
-<a name="l00790"></a>00790
-<a name="l00791"></a>00791 } <span class="comment">// namespace strict_ppl</span>
-<a name="l00792"></a>00792
-<a name="l00794"></a>00794 <span class="keyword">namespace </span>internal {
-<a name="l00795"></a>00795
-<a name="l00796"></a>00796 <span class="keyword">class </span>concurrent_queue_rep;
-<a name="l00797"></a>00797 <span class="keyword">class </span>concurrent_queue_iterator_rep;
-<a name="l00798"></a>00798 <span class="keyword">class </span>concurrent_queue_iterator_base_v3;
-<a name="l00799"></a>00799 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> Value> <span class="keyword">class </span>concurrent_queue_iterator;
-<a name="l00800"></a>00800
-<a name="l00802"></a>00802
-<a name="l00804"></a>00804 <span class="keyword">class </span>concurrent_queue_base_v3: no_copy {
-<a name="l00806"></a>00806 concurrent_queue_rep* my_rep;
-<a name="l00807"></a>00807
-<a name="l00808"></a>00808 <span class="keyword">friend</span> <span class="keyword">class </span>concurrent_queue_rep;
-<a name="l00809"></a>00809 <span class="keyword">friend</span> <span class="keyword">struct </span>micro_queue;
-<a name="l00810"></a>00810 <span class="keyword">friend</span> <span class="keyword">class </span>micro_queue_pop_finalizer;
-<a name="l00811"></a>00811 <span class="keyword">friend</span> <span class="keyword">class </span>concurrent_queue_iterator_rep;
-<a name="l00812"></a>00812 <span class="keyword">friend</span> <span class="keyword">class </span>concurrent_queue_iterator_base_v3;
-<a name="l00813"></a>00813 <span class="keyword">protected</span>:
-<a name="l00815"></a>00815 <span class="keyword">struct </span>page {
-<a name="l00816"></a>00816 page* next;
-<a name="l00817"></a>00817 uintptr_t mask;
-<a name="l00818"></a>00818 };
-<a name="l00819"></a>00819
-<a name="l00821"></a>00821 ptrdiff_t my_capacity;
-<a name="l00822"></a>00822
-<a name="l00824"></a>00824 size_t items_per_page;
-<a name="l00825"></a>00825
-<a name="l00827"></a>00827 size_t item_size;
-<a name="l00828"></a>00828
-<a name="l00829"></a>00829 <span class="preprocessor">#if __TBB_GCC_3_3_PROTECTED_BROKEN</span>
-<a name="l00830"></a>00830 <span class="preprocessor"></span><span class="keyword">public</span>:
-<a name="l00831"></a>00831 <span class="preprocessor">#endif</span>
-<a name="l00832"></a>00832 <span class="preprocessor"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00833"></a>00833 <span class="keyword">struct </span>padded_page: page {
-<a name="l00835"></a>00835 padded_page();
-<a name="l00837"></a>00837 <span class="keywordtype">void</span> operator=( <span class="keyword">const</span> padded_page& );
-<a name="l00839"></a>00839 T last;
-<a name="l00840"></a>00840 };
-<a name="l00841"></a>00841
-<a name="l00842"></a>00842 <span class="keyword">private</span>:
-<a name="l00843"></a>00843 <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 ) = 0;
-<a name="l00844"></a>00844 <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 ) = 0;
-<a name="l00845"></a>00845 <span class="keyword">protected</span>:
-<a name="l00846"></a>00846 __TBB_EXPORTED_METHOD concurrent_queue_base_v3( size_t item_size );
-<a name="l00847"></a>00847 <span class="keyword">virtual</span> __TBB_EXPORTED_METHOD ~concurrent_queue_base_v3();
-<a name="l00848"></a>00848
-<a name="l00850"></a>00850 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_push( <span class="keyword">const</span> <span class="keywordtype">void</span>* src );
-<a name="l00851"></a>00851
-<a name="l00853"></a>00853 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_pop( <span class="keywordtype">void</span>* dst );
-<a name="l00854"></a>00854
-<a name="l00856"></a>00856 <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD internal_push_if_not_full( <span class="keyword">const</span> <span class="keywordtype">void</span>* src );
-<a name="l00857"></a>00857
-<a name="l00859"></a>00859
-<a name="l00860"></a>00860 <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD internal_pop_if_present( <span class="keywordtype">void</span>* dst );
-<a name="l00861"></a>00861
-<a name="l00863"></a>00863 ptrdiff_t __TBB_EXPORTED_METHOD internal_size() <span class="keyword">const</span>;
-<a name="l00864"></a>00864
-<a name="l00866"></a>00866 <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD internal_empty() <span class="keyword">const</span>;
-<a name="l00867"></a>00867
-<a name="l00869"></a>00869 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_set_capacity( ptrdiff_t capacity, size_t element_size );
-<a name="l00870"></a>00870
-<a name="l00872"></a>00872 <span class="keyword">virtual</span> page *allocate_page() = 0;
-<a name="l00873"></a>00873
-<a name="l00875"></a>00875 <span class="keyword">virtual</span> <span class="keywordtype">void</span> deallocate_page( page *p ) = 0;
-<a name="l00876"></a>00876
-<a name="l00878"></a>00878 <span class="comment">/* note that the name may be misleading, but it remains so due to a historical accident. */</span>
-<a name="l00879"></a>00879 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_finish_clear() ;
-<a name="l00880"></a>00880
-<a name="l00882"></a>00882 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_throw_exception() <span class="keyword">const</span>;
-<a name="l00883"></a>00883
-<a name="l00885"></a>00885 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD assign( <span class="keyword">const</span> concurrent_queue_base_v3& src ) ;
-<a name="l00886"></a>00886
-<a name="l00887"></a>00887 <span class="keyword">private</span>:
-<a name="l00888"></a>00888 <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 ) = 0;
-<a name="l00889"></a>00889 };
-<a name="l00890"></a>00890
-<a name="l00892"></a>00892
-<a name="l00893"></a>00893 <span class="keyword">class </span>concurrent_queue_iterator_base_v3 {
-<a name="l00895"></a>00895
-<a name="l00896"></a>00896 concurrent_queue_iterator_rep* my_rep;
-<a name="l00897"></a>00897
-<a name="l00898"></a>00898 <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="l00899"></a>00899 <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> concurrent_queue_iterator<C,T>& i, <span class="keyword">const</span> concurrent_queue_iterator<C,U>& j );
-<a name="l00900"></a>00900
-<a name="l00901"></a>00901 <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="l00902"></a>00902 <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator!=( <span class="keyword">const</span> concurrent_queue_iterator<C,T>& i, <span class="keyword">const</span> concurrent_queue_iterator<C,U>& j );
-<a name="l00903"></a>00903
-<a name="l00904"></a>00904 <span class="keywordtype">void</span> initialize( <span class="keyword">const</span> concurrent_queue_base_v3& queue, size_t offset_of_data );
-<a name="l00905"></a>00905 <span class="keyword">protected</span>:
-<a name="l00907"></a>00907 <span class="keywordtype">void</span>* my_item;
-<a name="l00908"></a>00908
-<a name="l00910"></a>00910 concurrent_queue_iterator_base_v3() : my_rep(NULL), my_item(NULL) {}
-<a name="l00911"></a>00911
-<a name="l00913"></a>00913 concurrent_queue_iterator_base_v3( <span class="keyword">const</span> concurrent_queue_iterator_base_v3& i ) : my_rep(NULL), my_item(NULL) {
-<a name="l00914"></a>00914 assign(i);
-<a name="l00915"></a>00915 }
-<a name="l00916"></a>00916
-<a name="l00918"></a>00918
-<a name="l00919"></a>00919 __TBB_EXPORTED_METHOD concurrent_queue_iterator_base_v3( <span class="keyword">const</span> concurrent_queue_base_v3& queue );
-<a name="l00920"></a>00920
-<a name="l00922"></a>00922 __TBB_EXPORTED_METHOD concurrent_queue_iterator_base_v3( <span class="keyword">const</span> concurrent_queue_base_v3& queue, size_t offset_of_data );
-<a name="l00923"></a>00923
-<a name="l00925"></a>00925 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD assign( <span class="keyword">const</span> concurrent_queue_iterator_base_v3& i );
-<a name="l00926"></a>00926
-<a name="l00928"></a>00928 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD advance();
-<a name="l00929"></a>00929
-<a name="l00931"></a>00931 __TBB_EXPORTED_METHOD ~concurrent_queue_iterator_base_v3();
-<a name="l00932"></a>00932 };
-<a name="l00933"></a>00933
-<a name="l00934"></a>00934 <span class="keyword">typedef</span> concurrent_queue_iterator_base_v3 concurrent_queue_iterator_base;
-<a name="l00935"></a>00935
-<a name="l00937"></a>00937
-<a name="l00939"></a>00939 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> Value>
-<a name="l00940"></a>00940 <span class="keyword">class </span>concurrent_queue_iterator: <span class="keyword">public</span> concurrent_queue_iterator_base,
-<a name="l00941"></a>00941 <span class="keyword">public</span> std::iterator<std::forward_iterator_tag,Value> {
-<a name="l00942"></a>00942
-<a name="l00943"></a>00943 <span class="preprocessor">#if !defined(_MSC_VER) || defined(__INTEL_COMPILER)</span>
-<a name="l00944"></a>00944 <span class="preprocessor"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l00945"></a>00945 <span class="keyword">friend</span> class ::tbb::concurrent_bounded_queue;
-<a name="l00946"></a>00946
-<a name="l00947"></a>00947 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l00948"></a>00948 <span class="keyword">friend</span> class ::tbb::deprecated::concurrent_queue;
-<a name="l00949"></a>00949 <span class="preprocessor">#else</span>
-<a name="l00950"></a>00950 <span class="preprocessor"></span><span class="keyword">public</span>: <span class="comment">// workaround for MSVC</span>
-<a name="l00951"></a>00951 <span class="preprocessor">#endif </span>
-<a name="l00953"></a>00953 <span class="preprocessor"> concurrent_queue_iterator( const concurrent_queue_base_v3& queue ) :</span>
-<a name="l00954"></a>00954 <span class="preprocessor"></span> concurrent_queue_iterator_base_v3(queue,__TBB_offsetof(concurrent_queue_base_v3::padded_page<Value>,last))
-<a name="l00955"></a>00955 {
-<a name="l00956"></a>00956 }
-<a name="l00957"></a>00957
-<a name="l00958"></a>00958 <span class="keyword">public</span>:
-<a name="l00959"></a>00959 concurrent_queue_iterator() {}
-<a name="l00960"></a>00960
-<a name="l00963"></a>00963 concurrent_queue_iterator( <span class="keyword">const</span> concurrent_queue_iterator<Container,typename Container::value_type>& other ) :
-<a name="l00964"></a>00964 concurrent_queue_iterator_base_v3(other)
-<a name="l00965"></a>00965 {}
-<a name="l00966"></a>00966
-<a name="l00968"></a>00968 concurrent_queue_iterator& operator=( <span class="keyword">const</span> concurrent_queue_iterator& other ) {
-<a name="l00969"></a>00969 assign(other);
-<a name="l00970"></a>00970 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00971"></a>00971 }
-<a name="l00972"></a>00972
-<a name="l00974"></a>00974 Value& operator*()<span class="keyword"> const </span>{
-<a name="l00975"></a>00975 <span class="keywordflow">return</span> *static_cast<Value*>(my_item);
-<a name="l00976"></a>00976 }
-<a name="l00977"></a>00977
-<a name="l00978"></a>00978 Value* operator->()<span class="keyword"> const </span>{<span class="keywordflow">return</span> &operator*();}
-<a name="l00979"></a>00979
-<a name="l00981"></a>00981 concurrent_queue_iterator& operator++() {
-<a name="l00982"></a>00982 advance();
-<a name="l00983"></a>00983 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00984"></a>00984 }
-<a name="l00985"></a>00985
-<a name="l00987"></a>00987 Value* operator++(<span class="keywordtype">int</span>) {
-<a name="l00988"></a>00988 Value* result = &operator*();
-<a name="l00989"></a>00989 operator++();
-<a name="l00990"></a>00990 <span class="keywordflow">return</span> result;
-<a name="l00991"></a>00991 }
-<a name="l00992"></a>00992 }; <span class="comment">// concurrent_queue_iterator</span>
-<a name="l00993"></a>00993
-<a name="l00994"></a>00994
-<a name="l00995"></a>00995 <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="l00996"></a>00996 <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> concurrent_queue_iterator<C,T>& i, <span class="keyword">const</span> concurrent_queue_iterator<C,U>& j ) {
-<a name="l00997"></a>00997 <span class="keywordflow">return</span> i.my_item==j.my_item;
-<a name="l00998"></a>00998 }
-<a name="l00999"></a>00999
-<a name="l01000"></a>01000 <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="l01001"></a>01001 <span class="keywordtype">bool</span> operator!=( <span class="keyword">const</span> concurrent_queue_iterator<C,T>& i, <span class="keyword">const</span> concurrent_queue_iterator<C,U>& j ) {
-<a name="l01002"></a>01002 <span class="keywordflow">return</span> i.my_item!=j.my_item;
-<a name="l01003"></a>01003 }
-<a name="l01004"></a>01004
-<a name="l01005"></a>01005 } <span class="comment">// namespace internal;</span>
-<a name="l01006"></a>01006
-<a name="l01008"></a>01008
-<a name="l01009"></a>01009 } <span class="comment">// namespace tbb</span>
-<a name="l01010"></a>01010
-<a name="l01011"></a>01011 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_concurrent_queue_internal_H */</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2011 Intel Corporation. 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/a00362.html b/doc/html/a00383.html
similarity index 75%
rename from doc/html/a00362.html
rename to doc/html/a00383.html
index e86456d..1f46da7 100644
--- a/doc/html/a00362.html
+++ b/doc/html/a00383.html
@@ -25,321 +25,258 @@
<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="a00215.html">aligned_space</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00227.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="a00215.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="a00216.html">atomic</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="a00227.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="a00228.html">atomic</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Primary template for atomic. <a href="a00216.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="a00217.html">atomic< void * ></a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Primary template for atomic. <a href="a00228.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="a00229.html">atomic< void * ></a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Specialization for <a class="el" href="a00217.html">atomic<void*></a>, for sake of not allowing arithmetic or operator->. <a href="a00217.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="a00221.html">blocked_range</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Specialization for <a class="el" href="a00229.html">atomic<void*></a>, for sake of not allowing arithmetic or operator->. <a href="a00229.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="a00233.html">blocked_range</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A range over which to iterate. <a href="a00221.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="a00222.html">blocked_range2d</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A range over which to iterate. <a href="a00233.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="a00234.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="a00222.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="a00223.html">blocked_range3d</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A 2-dimensional range that models the Range concept. <a href="a00234.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="a00235.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="a00223.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="a00226.html">cache_aligned_allocator</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A 3-dimensional range that models the Range concept. <a href="a00235.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="a00238.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="a00226.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="a00227.html">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="a00238.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="a00239.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="a00227.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="a00229.html">combinable</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="a00239.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="a00241.html">combinable</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Thread-local storage with optional reduction. <a href="a00229.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="a00300.html">tbb_hash_compare</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Thread-local storage with optional reduction. <a href="a00241.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="a00321.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="a00300.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="a00230.html">concurrent_bounded_queue</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">hash_compare that is default argument for concurrent_hash_map <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="a00242.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="a00230.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_hash</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A high-performance thread-safe blocking concurrent bounded queue. <a href="a00242.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="a00250.html">concurrent_vector</a></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00238.html">concurrent_vector</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Concurrent vector container. <a href="a00250.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">mutex</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Concurrent vector container. <a href="a00238.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="a00251.html">graph_node</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Wrapper around the platform's native reader-writer lock. <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="a00277.html">null_mutex</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The base of all graph nodes. Allows them to be stored in a collection for deletion. <a href="a00251.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="a00239.html">continue_msg</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A mutex which does nothing. <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">null_rw_mutex</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">An empty class used for messages that mean "I'm done". <a href="a00239.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">sender</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A rw mutex which does nothing. <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">parallel_do_feeder</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="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="a00277.html">receiver</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Class the user supplied algorithm body uses to add new tasks. <a href="a00281.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="a00314.html">task_group_context</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="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="a00241.html">continue_receiver</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">struct </td><td class="memItemRight" valign="bottom"><a class="el" href="a00285.html">pre_scan_tag</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Base class for receivers of completion messages. <a href="a00241.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="a00250.html">graph</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Used to indicate that the initial scan is being performed. <a href="a00285.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="a00258.html">final_scan_tag</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The graph class. <a href="a00250.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="a00285.html">source_node</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Used to indicate that the final scan is being performed. <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="a00282.html">parallel_while</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="a00285.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">function_node</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over a stream, with optional addition of more work. <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="a00303.html">simple_partitioner</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Implements a function node that supports Input -> Output. <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="a00244.html">executable_node</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A simple partitioner. <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="a00231.html">auto_partitioner</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Implements an executable node that supports <a class="el" href="a00239.html">continue_msg</a> -> Output. <a href="a00244.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><b>overwrite_node</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">An auto partitioner. <a href="a00231.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="a00225.html">affinity_partitioner</a></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><b>write_once_node</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">An affinity partitioner. <a href="a00225.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="a00256.html">filter</a></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00240.html">continue_node</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A stage in a pipeline. <a href="a00256.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">thread_bound_filter</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Broadcasts completion message when it receives completion messages from all predecessors. Then resets. <a href="a00240.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="a00224.html">broadcast_node</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A stage in a pipeline served by a user thread. <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="a00284.html">pipeline</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Forwards messages of type T to all successors. <a href="a00224.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="a00225.html">buffer_node</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A processing pipeline that applies filters to items. <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="a00288.html">queuing_mutex</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Forwards messages in arbitrary order. <a href="a00225.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">queue_node</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Queuing lock with local-only spinning. <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="a00290.html">queuing_rw_mutex</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Forwards messages in FIFO order. <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="a00283.html">sequencer_node</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Reader-writer lock with local-only spinning. <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="a00296.html">recursive_mutex</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Forwards messages in sequence order. <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="a00268.html">priority_queue_node</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Mutex that allows recursive mutex acquisition. <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="a00299.html">scalable_allocator</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Forwards messages in priority order. <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="a00255.html">limiter_node</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5. <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="a00300.html">scalable_allocator< void ></a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Forwards messages only if the threshold has not been reached. <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"><b>join_node</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="a00300.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">spin_mutex</a></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00258.html">mutex</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A lock that occupies a single byte. <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">spin_rw_mutex_v3</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Wrapper around the platform's native reader-writer lock. <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="a00260.html">null_mutex</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Fast, unfair, spinning reader-writer lock with backoff and writer-preference. <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"><a class="el" href="a00311.html">task</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A mutex which does nothing. <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="a00262.html">null_rw_mutex</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Base class for user-defined tasks. <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="a00254.html">empty_task</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A rw mutex which does nothing. <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="a00264.html">parallel_do_feeder</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">task that does nothing. Useful for synchronization. <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="a00315.html">task_list</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Class the user supplied algorithm body uses to add new tasks. <a href="a00264.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">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="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="a00247.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="a00247.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">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="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="a00284.html">simple_partitioner</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A simple partitioner. <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="a00219.html">auto_partitioner</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">An auto partitioner. <a href="a00219.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="a00212.html">affinity_partitioner</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">An affinity partitioner. <a href="a00212.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="a00245.html">filter</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A stage in a pipeline. <a href="a00245.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">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="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="a00266.html">pipeline</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A processing pipeline that applies filters to items. <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="a00270.html">queuing_mutex</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Queuing lock with local-only spinning. <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="a00272.html">queuing_rw_mutex</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Reader-writer lock with local-only spinning. <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="a00278.html">recursive_mutex</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Mutex that allows recursive mutex acquisition. <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="a00280.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="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="a00281.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="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">spin_mutex</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A lock that occupies a single byte. <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="a00288.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="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">task_group_context</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Used to form groups of tasks. <a href="a00293.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">task</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Base class for user-defined tasks. <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="a00242.html">empty_task</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">task that does nothing. Useful for synchronization. <a href="a00242.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">task_list</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A list of children. <a href="a00294.html#_details">More...</a><br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A list of children. <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"><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="a00295.html">task_scheduler_init</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00316.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="a00295.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_allocator</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Class delimiting the scope of task scheduler activity. <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="a00317.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="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_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="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="a00318.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="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="a00306.html">zero_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="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="a00326.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="a00306.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">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="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="a00327.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="a00307.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="a00220.html">bad_last_alloc</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="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="a00232.html">bad_last_alloc</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Exception for concurrent containers. <a href="a00220.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="a00252.html">improper_lock</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Exception for concurrent containers. <a href="a00232.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">improper_lock</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Exception for PPL locks. <a href="a00252.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="a00256.html">missing_wait</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Exception for PPL locks. <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="a00272.html">missing_wait</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Exception for missing wait on structured_task_group. <a href="a00256.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="a00253.html">invalid_multiple_scheduling</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Exception for missing wait on structured_task_group. <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="a00265.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="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="a00298.html">tbb_exception</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Exception for repeated scheduling of the same task_handle. <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="a00319.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="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="a00228.html">captured_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="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="a00240.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="a00228.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">movable_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="a00240.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">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="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="a00290.html">split</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="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="a00309.html">split</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Dummy type that distinguishes splitting constructor from copy constructor. <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="a00302.html">tick_count</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Dummy type that distinguishes splitting constructor from copy constructor. <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="a00323.html">tick_count</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Absolute timestamp. <a href="a00302.html#_details">More...</a><br></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="a00370.html">strict_ppl</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">For internal use only. <br></td></tr>
-
-<p>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Absolute timestamp. <a href="a00323.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="a00371.html#g3383e2703977012b6f384d673410f1f7">parallel_do</a> (Iterator first, Iterator last, const Body &body)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.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="a00371.html#g2617dc9b88b3285a7212599d49f74228">parallel_do</a> (Iterator first, Iterator last, const Body &body, <a class="el" href="a00293.html">task_group_context</a> &context)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#g2617dc9b88b3285a7212599d49f74228">parallel_do</a> (Iterator first, Iterator last, const Body &body, <a class="el" href="a00314.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="a00371.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a> (const Range &range, const Body &body)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.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="a00371.html#g13cac5dd55c7533bccea43a51c33d0e5">parallel_for</a> (const Range &range, const Body &body, const <a class="el" href="a00284.html">simple_partitioner</a> &partitioner)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#g13cac5dd55c7533bccea43a51c33d0e5">parallel_for</a> (const Range &range, const Body &body, const <a class="el" href="a00303.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="a00371.html#ga7ac75d532389b55b9247f3fdb0b00d1">parallel_for</a> (const Range &range, const Body &body, const <a class="el" href="a00219.html">auto_partitioner</a> &partitioner)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#ga7ac75d532389b55b9247f3fdb0b00d1">parallel_for</a> (const Range &range, const Body &body, const <a class="el" href="a00231.html">auto_partitioner</a> &partitioner)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with <a class="el" href="a00219.html">auto_partitioner</a>. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with <a class="el" href="a00231.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="a00371.html#g9cd1b210ceb1c040f30e390b4a21bde8">parallel_for</a> (const Range &range, const Body &body, <a class="el" href="a00212.html">affinity_partitioner</a> &partitioner)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#g9cd1b210ceb1c040f30e390b4a21bde8">parallel_for</a> (const Range &range, const Body &body, <a class="el" href="a00225.html">affinity_partitioner</a> &partitioner)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with <a class="el" href="a00212.html">affinity_partitioner</a>. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with <a class="el" href="a00225.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="a00371.html#g2d317a5e0078cd193125439fed60dfdc">parallel_for</a> (const Range &range, const Body &body, const <a class="el" href="a00284.html">simple_partitioner</a> &partitioner, <a class="el" href="a00293.html">task_group_context</a> &context)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#g2d317a5e0078cd193125439fed60dfdc">parallel_for</a> (const Range &range, const Body &body, const <a class="el" href="a00303.html">simple_partitioner</a> &partitioner, <a class="el" href="a00314.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="a00371.html#g1c0700e3f85e83a788ff3ede88ebb7e9">parallel_for</a> (const Range &range, const Body &body, const <a class="el" href="a00219.html">auto_partitioner</a> &partitioner, <a class="el" href="a00293.html">task_group_context</a> &context)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#g1c0700e3f85e83a788ff3ede88ebb7e9">parallel_for</a> (const Range &range, const Body &body, const <a class="el" href="a00231.html">auto_partitioner</a> &partitioner, <a class="el" href="a00314.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="a00219.html">auto_partitioner</a> and user-supplied context. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with <a class="el" href="a00231.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="a00371.html#g04b4696b67370c01353ff5974c8f1196">parallel_for</a> (const Range &range, const Body &body, <a class="el" href="a00212.html">affinity_partitioner</a> &partitioner, <a class="el" href="a00293.html">task_group_context</a> &context)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#g04b4696b67370c01353ff5974c8f1196">parallel_for</a> (const Range &range, const Body &body, <a class="el" href="a00225.html">affinity_partitioner</a> &partitioner, <a class="el" href="a00314.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="a00212.html">affinity_partitioner</a> and user-supplied context. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with <a class="el" href="a00225.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="a00371.html#gcd40c32f319747e61a8f73fcfc452001">parallel_for_each</a> (InputIterator first, InputIterator last, const Function &f, <a class="el" href="a00293.html">task_group_context</a> &context)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#gcd40c32f319747e61a8f73fcfc452001">parallel_for_each</a> (InputIterator first, InputIterator last, const Function &f, <a class="el" href="a00314.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="a00371.html#gc2d710ca573f0a9bd94379cba3772def">parallel_for_each</a> (InputIterator first, InputIterator last, const Function &f)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.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="a00371.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a> (const F0 &f0, const F1 &f1, <a class="el" href="a00293.html">tbb::task_group_context</a> &context)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a> (const F0 &f0, const F1 &f1, <a class="el" href="a00314.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="a00293.html">tbb::task_group_context</a> &context)</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="a00314.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="a00293.html">tbb::task_group_context</a> &context)</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="a00314.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="a00293.html">tbb::task_group_context</a> &context)</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="a00314.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="a00293.html">tbb::task_group_context</a> &context)</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="a00314.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="a00293.html">tbb::task_group_context</a> &context)</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="a00314.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="a00293.html">tbb::task_group_context</a> &context)</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="a00314.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="a00293.html">tbb::task_group_context</a> &context)</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="a00314.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="a00293.html">tbb::task_group_context</a> &context)</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="a00314.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>
@@ -381,105 +318,125 @@ template<typename F0, typename F1, typename F2, typename F3, typename F4, typ
<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="a00371.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a> (const Range &range, Body &body)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.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="a00371.html#gec1b7c03f9da909bef5db12e3d41bed3">parallel_reduce</a> (const Range &range, Body &body, const <a class="el" href="a00284.html">simple_partitioner</a> &partitioner)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#gec1b7c03f9da909bef5db12e3d41bed3">parallel_reduce</a> (const Range &range, Body &body, const <a class="el" href="a00303.html">simple_partitioner</a> &partitioner)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00284.html">simple_partitioner</a>. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00303.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="a00371.html#g18a19157e6245992fc00ca0adeb7dd37">parallel_reduce</a> (const Range &range, Body &body, const <a class="el" href="a00219.html">auto_partitioner</a> &partitioner)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#g18a19157e6245992fc00ca0adeb7dd37">parallel_reduce</a> (const Range &range, Body &body, const <a class="el" href="a00231.html">auto_partitioner</a> &partitioner)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00219.html">auto_partitioner</a>. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00231.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="a00371.html#gc61e73fcc36c92d79a217fc355ff4a6b">parallel_reduce</a> (const Range &range, Body &body, <a class="el" href="a00212.html">affinity_partitioner</a> &partitioner)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#gc61e73fcc36c92d79a217fc355ff4a6b">parallel_reduce</a> (const Range &range, Body &body, <a class="el" href="a00225.html">affinity_partitioner</a> &partitioner)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00212.html">affinity_partitioner</a>. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00225.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="a00371.html#g45cb00c42a18e334bbde8b7535afe460">parallel_reduce</a> (const Range &range, Body &body, const <a class="el" href="a00284.html">simple_partitioner</a> &partitioner, <a class="el" href="a00293.html">task_group_context</a> &context)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#g45cb00c42a18e334bbde8b7535afe460">parallel_reduce</a> (const Range &range, Body &body, const <a class="el" href="a00303.html">simple_partitioner</a> &partitioner, <a class="el" href="a00314.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="a00371.html#g1c1ea1d7c61b3c225e92c70d669a53a5">parallel_reduce</a> (const Range &range, Body &body, const <a class="el" href="a00219.html">auto_partitioner</a> &partitioner, <a class="el" href="a00293.html">task_group_context</a> &context)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#g1c1ea1d7c61b3c225e92c70d669a53a5">parallel_reduce</a> (const Range &range, Body &body, const <a class="el" href="a00231.html">auto_partitioner</a> &partitioner, <a class="el" href="a00314.html">task_group_context</a> &context)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction, <a class="el" href="a00219.html">auto_partitioner</a> and user-supplied context. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction, <a class="el" href="a00231.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="a00371.html#gd9ac3a3811060314695f33b703c6e11b">parallel_reduce</a> (const Range &range, Body &body, <a class="el" href="a00212.html">affinity_partitioner</a> &partitioner, <a class="el" href="a00293.html">task_group_context</a> &context)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#gd9ac3a3811060314695f33b703c6e11b">parallel_reduce</a> (const Range &range, Body &body, <a class="el" href="a00225.html">affinity_partitioner</a> &partitioner, <a class="el" href="a00314.html">task_group_context</a> &context)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction, <a class="el" href="a00212.html">affinity_partitioner</a> and user-supplied context. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction, <a class="el" href="a00225.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="a00371.html#gc9412e09fb01fcad8c018ea9cffb28ef">parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.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="a00371.html#gaddffeec0e892ac3d6fc7fc2053e1eca">parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const <a class="el" href="a00284.html">simple_partitioner</a> &partitioner)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#gaddffeec0e892ac3d6fc7fc2053e1eca">parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const <a class="el" href="a00303.html">simple_partitioner</a> &partitioner)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00284.html">simple_partitioner</a>. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00303.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="a00371.html#gb175401f0729e40dd2c5860a17c14385">parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const <a class="el" href="a00219.html">auto_partitioner</a> &partitioner)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#gb175401f0729e40dd2c5860a17c14385">parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const <a class="el" href="a00231.html">auto_partitioner</a> &partitioner)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00219.html">auto_partitioner</a>. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00231.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="a00371.html#gb7f1f1828ae2b330ce05b8513a495154">parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, <a class="el" href="a00212.html">affinity_partitioner</a> &partitioner)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#gb7f1f1828ae2b330ce05b8513a495154">parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, <a class="el" href="a00225.html">affinity_partitioner</a> &partitioner)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00212.html">affinity_partitioner</a>. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00225.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="a00371.html#gfbc0cc2026d87f11a96bcd62788f5bb5">parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const <a class="el" href="a00284.html">simple_partitioner</a> &partitioner, <a class="el" href="a00293.html">task_group_context</a> &context)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#gfbc0cc2026d87f11a96bcd62788f5bb5">parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const <a class="el" href="a00303.html">simple_partitioner</a> &partitioner, <a class="el" href="a00314.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="a00371.html#g630c90a399937d9d4ae70ff883186dfd">parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const <a class="el" href="a00219.html">auto_partitioner</a> &partitioner, <a class="el" href="a00293.html">task_group_context</a> &context)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#g630c90a399937d9d4ae70ff883186dfd">parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const <a class="el" href="a00231.html">auto_partitioner</a> &partitioner, <a class="el" href="a00314.html">task_group_context</a> &context)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction, <a class="el" href="a00219.html">auto_partitioner</a> and user-supplied context. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction, <a class="el" href="a00231.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="a00371.html#g496bd7eadb3b97495ccb5655ef90319e">parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, <a class="el" href="a00212.html">affinity_partitioner</a> &partitioner, <a class="el" href="a00293.html">task_group_context</a> &context)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#g496bd7eadb3b97495ccb5655ef90319e">parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, <a class="el" href="a00225.html">affinity_partitioner</a> &partitioner, <a class="el" href="a00314.html">task_group_context</a> &context)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction, <a class="el" href="a00225.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="a00395.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="a00395.html#gfd08c56b3a98d4437dadc5365326928a">parallel_deterministic_reduce</a> (const Range &range, Body &body, <a class="el" href="a00314.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="a00395.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 reduction, <a class="el" href="a00212.html">affinity_partitioner</a> and user-supplied context. <br></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="a00395.html#g0a66bc67567b2d01d709b59b9bddf84a">parallel_deterministic_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, <a class="el" href="a00314.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="a00371.html#ged143f31dd3d96ded02ab3db915b91c7">parallel_scan</a> (const Range &range, Body &body)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.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="a00371.html#gc9fac8870b2e6365fb337014404529df">parallel_scan</a> (const Range &range, Body &body, const <a class="el" href="a00284.html">simple_partitioner</a> &partitioner)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#gc9fac8870b2e6365fb337014404529df">parallel_scan</a> (const Range &range, Body &body, const <a class="el" href="a00303.html">simple_partitioner</a> &partitioner)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel prefix with <a class="el" href="a00284.html">simple_partitioner</a>. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel prefix with <a class="el" href="a00303.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="a00371.html#g62fde400a37bbca1a2fddc8e3d22f556">parallel_scan</a> (const Range &range, Body &body, const <a class="el" href="a00219.html">auto_partitioner</a> &partitioner)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#g62fde400a37bbca1a2fddc8e3d22f556">parallel_scan</a> (const Range &range, Body &body, const <a class="el" href="a00231.html">auto_partitioner</a> &partitioner)</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel prefix with <a class="el" href="a00219.html">auto_partitioner</a>. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel prefix with <a class="el" href="a00231.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="a00371.html#g49edcf9447cd91a9527a3f8e8512b7aa">parallel_sort</a> (RandomAccessIterator begin, RandomAccessIterator end, const Compare &comp)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.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="a00371.html#g49edcf9447cd91a9527a3f8e8512b7aa"></a><br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Sorts the data in [begin,end) using the given comparator. <a href="a00395.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="a00371.html#g16c3eb77d0e530834c51ce3857f01012">parallel_sort</a> (RandomAccessIterator begin, RandomAccessIterator end)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.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="a00371.html#gc7576f82fdedc8a701a6c17ad9415926">parallel_sort</a> (T *begin, T *end)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.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>
@@ -487,7 +444,7 @@ template<typename T> </td></tr>
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="a00288.html">spin_rw_mutex_v3</a> </td><td class="memItemRight" valign="bottom"><b>spin_rw_mutex</b></td></tr>
+typedef <a class="el" href="a00307.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>
@@ -496,17 +453,18 @@ typedef std::size_t </td><td class="memItemRight" valign="bottom"><b>stack_
typedef internal::task_scheduler_observer_v3 </td><td class="memItemRight" valign="bottom"><b>task_scheduler_observer</b></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ed375248ff6019a70ca0f9da528e5d0b"></a><!-- doxytag: member="tbb::assertion_handler_type" ref="ed375248ff6019a70ca0f9da528e5d0b" args="(const char *filename, int line, const char *expression, const char *comment)" -->
-typedef void(*) </td><td class="memItemRight" valign="bottom"><a class="el" href="a00362.html#ed375248ff6019a70ca0f9da528e5d0b">assertion_handler_type</a> (const char *filename, int line, const char *expression, const char *comment)</td></tr>
+typedef void(*) </td><td class="memItemRight" valign="bottom"><a class="el" href="a00383.html#ed375248ff6019a70ca0f9da528e5d0b">assertion_handler_type</a> (const char *filename, int line, const char *expression, const char *comment)</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Type for an assertion handler. <br></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="a00362.html#a8686246bb5d3664bd07563749970fef">memory_semantics</a> { <a class="el" href="a00362.html#a8686246bb5d3664bd07563749970fefc6db01678b1749dff7554688d079520c">__TBB_full_fence</a>,
-<a class="el" href="a00362.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>,
-<a class="el" href="a00362.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">release</a>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">enum </td><td class="memItemRight" valign="bottom"><a class="el" href="a00383.html#a8686246bb5d3664bd07563749970fef">memory_semantics</a> { <a class="el" href="a00383.html#a8686246bb5d3664bd07563749970fef07b959f69a4f70d821c67b85316803ff">full_fence</a>,
+<a class="el" href="a00383.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>,
+<a class="el" href="a00383.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">release</a>,
+<a class="el" href="a00383.html#a8686246bb5d3664bd07563749970fefaba4b1574646947f1b519188a93c1900">relaxed</a>
}</td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Specifies memory fencing. <a href="a00362.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="a00362.html#a8622ae61b7e7737dac26542e181178e">ets_key_usage_type</a> { <b>ets_key_per_instance</b>,
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Specifies memory fencing. <a href="a00383.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="a00383.html#a8622ae61b7e7737dac26542e181178e">ets_key_usage_type</a> { <b>ets_key_per_instance</b>,
<b>ets_no_key</b>
}</td></tr>
@@ -526,79 +484,72 @@ typedef void(*) </td><td class="memItemRight" valign="bottom"><a class="el"
</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="a00362.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="a00216.html">atomic</a>< T * ></td></tr>
+size_t </td><td class="memItemRight" valign="bottom"><a class="el" href="a00383.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="a00228.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="a00228.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="a00228.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="a00226.html">cache_aligned_allocator</a>< T > &, const <a class="el" href="a00226.html">cache_aligned_allocator</a>< 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="a00238.html">cache_aligned_allocator</a>< T > &, const <a class="el" href="a00238.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="a00226.html">cache_aligned_allocator</a>< T > &, const <a class="el" href="a00226.html">cache_aligned_allocator</a>< 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="a00238.html">cache_aligned_allocator</a>< T > &, const <a class="el" href="a00238.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="a00231.html">concurrent_hash_map</a>< Key, T, HashCompare, A1 > &a, const <a class="el" href="a00231.html">concurrent_hash_map</a>< Key, T, HashCompare, A2 > &b)</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="a00243.html">concurrent_hash_map</a>< Key, T, HashCompare, A1 > &a, const <a class="el" href="a00243.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="a00231.html">concurrent_hash_map</a>< Key, T, HashCompare, A1 > &a, const <a class="el" href="a00231.html">concurrent_hash_map</a>< Key, T, HashCompare, A2 > &b)</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="a00243.html">concurrent_hash_map</a>< Key, T, HashCompare, A1 > &a, const <a class="el" href="a00243.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="a00231.html">concurrent_hash_map</a>< Key, T, HashCompare, A > &a, <a class="el" href="a00231.html">concurrent_hash_map</a>< Key, T, HashCompare, A > &b)</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="a00243.html">concurrent_hash_map</a>< Key, T, HashCompare, A > &a, <a class="el" href="a00243.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="a00238.html">concurrent_vector</a>< T, A1 > &a, const <a class="el" href="a00238.html">concurrent_vector</a>< T, A2 > &b)</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="a00250.html">concurrent_vector</a>< T, A1 > &a, const <a class="el" href="a00250.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="a00238.html">concurrent_vector</a>< T, A1 > &a, const <a class="el" href="a00238.html">concurrent_vector</a>< T, A2 > &b)</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="a00250.html">concurrent_vector</a>< T, A1 > &a, const <a class="el" href="a00250.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="a00238.html">concurrent_vector</a>< T, A1 > &a, const <a class="el" href="a00238.html">concurrent_vector</a>< T, A2 > &b)</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="a00250.html">concurrent_vector</a>< T, A1 > &a, const <a class="el" href="a00250.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="a00238.html">concurrent_vector</a>< T, A1 > &a, const <a class="el" href="a00238.html">concurrent_vector</a>< T, A2 > &b)</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="a00250.html">concurrent_vector</a>< T, A1 > &a, const <a class="el" href="a00250.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="a00238.html">concurrent_vector</a>< T, A1 > &a, const <a class="el" href="a00238.html">concurrent_vector</a>< T, A2 > &b)</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="a00250.html">concurrent_vector</a>< T, A1 > &a, const <a class="el" href="a00250.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="a00238.html">concurrent_vector</a>< T, A1 > &a, const <a class="el" href="a00238.html">concurrent_vector</a>< T, A2 > &b)</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="a00250.html">concurrent_vector</a>< T, A1 > &a, const <a class="el" href="a00250.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="a00238.html">concurrent_vector</a>< T, A > &a, <a class="el" href="a00238.html">concurrent_vector</a>< T, A > &b)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="0a5a2559e7d28a9bf8f9e5e60d745e86"></a><!-- doxytag: member="tbb::make_edge" ref="0a5a2559e7d28a9bf8f9e5e60d745e86" 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="a00362.html#0a5a2559e7d28a9bf8f9e5e60d745e86">make_edge</a> (<a class="el" href="a00282.html">sender</a>< T > &p, <a class="el" href="a00277.html">receiver</a>< T > &s)</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="a00250.html">concurrent_vector</a>< T, A > &a, <a class="el" href="a00250.html">concurrent_vector</a>< T, A > &b)</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="ac6def751039959ab7ab1e52c8535fd3"></a><!-- doxytag: member="tbb::make_edges" ref="ac6def751039959ab7ab1e52c8535fd3" args="(sender< T > &p, SIterator s_begin, SIterator s_end)" -->
-template<typename T, typename SIterator> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00362.html#ac6def751039959ab7ab1e52c8535fd3">make_edges</a> (<a class="el" href="a00282.html">sender</a>< T > &p, SIterator s_begin, SIterator s_end)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Makes edges between a single predecessor and multiple successors. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="9368d2f689961f790bf7aa4a8cc1135e"></a><!-- doxytag: member="tbb::make_edges" ref="9368d2f689961f790bf7aa4a8cc1135e" args="(PIterator p_begin, PIterator p_end, receiver< T > &s)" -->
-template<typename T, typename PIterator> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00362.html#9368d2f689961f790bf7aa4a8cc1135e">make_edges</a> (PIterator p_begin, PIterator p_end, <a class="el" href="a00277.html">receiver</a>< T > &s)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Makes edges between a set of predecessors and a single successor. <br></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="a00280.html">scalable_allocator</a>< T > &, const <a class="el" href="a00280.html">scalable_allocator</a>< 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="a00299.html">scalable_allocator</a>< T > &, const <a class="el" href="a00299.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="a00280.html">scalable_allocator</a>< T > &, const <a class="el" href="a00280.html">scalable_allocator</a>< 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="a00299.html">scalable_allocator</a>< T > &, const <a class="el" href="a00299.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>
@@ -609,46 +560,61 @@ template<class 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="a00296.html">tbb_allocator</a>< T > &, const <a class="el" href="a00296.html">tbb_allocator</a>< 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="a00317.html">tbb_allocator</a>< T > &, const <a class="el" href="a00317.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="a00296.html">tbb_allocator</a>< T > &, const <a class="el" href="a00296.html">tbb_allocator</a>< 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="a00317.html">tbb_allocator</a>< T > &, const <a class="el" href="a00317.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="a00306.html">zero_allocator</a>< T1, B1 > &a, const <a class="el" href="a00306.html">zero_allocator</a>< T2, B2 > &b)</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="a00326.html">zero_allocator</a>< T1, B1 > &a, const <a class="el" href="a00326.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="a00306.html">zero_allocator</a>< T1, B1 > &a, const <a class="el" href="a00306.html">zero_allocator</a>< T2, B2 > &b)</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="a00326.html">zero_allocator</a>< T1, B1 > &a, const <a class="el" href="a00326.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="a00362.html#250275615f10d5b5de6ad466ae2f54de">atomic_fence</a> ()</td></tr>
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00383.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"><a class="anchor" name="823fa1c15dd829d1d9167157450ddcd9"></a><!-- doxytag: member="tbb::set_assertion_handler" ref="823fa1c15dd829d1d9167157450ddcd9" args="(assertion_handler_type new_handler)" -->
-<a class="el" href="a00362.html#ed375248ff6019a70ca0f9da528e5d0b">assertion_handler_type</a> __TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00362.html#823fa1c15dd829d1d9167157450ddcd9">set_assertion_handler</a> (<a class="el" href="a00362.html#ed375248ff6019a70ca0f9da528e5d0b">assertion_handler_type</a> new_handler)</td></tr>
+<a class="el" href="a00383.html#ed375248ff6019a70ca0f9da528e5d0b">assertion_handler_type</a> __TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00383.html#823fa1c15dd829d1d9167157450ddcd9">set_assertion_handler</a> (<a class="el" href="a00383.html#ed375248ff6019a70ca0f9da528e5d0b">assertion_handler_type</a> new_handler)</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Set assertion handler and return previous value of it. <br></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="a00362.html#3d1252787be39b4aef311f1cadaff9e8">assertion_failure</a> (const char *filename, int line, const char *expression, const char *comment)</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="a00383.html#3d1252787be39b4aef311f1cadaff9e8">assertion_failure</a> (const char *filename, int line, const char *expression, const char *comment)</td></tr>
<tr><td class="mdescLeft"> </td><td class="mdescRight">Process an assertion failure. <a href="#3d1252787be39b4aef311f1cadaff9e8"></a><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="a00362.html#a6858b22e90041c9c4669674ff39b056">TBB_runtime_interface_version</a> ()</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="a00383.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="a00303.html">tick_count::interval_t</a> </td><td class="memItemRight" valign="bottom"><b>operator-</b> (const <a class="el" href="a00302.html">tick_count</a> &t1, const <a class="el" href="a00302.html">tick_count</a> &t0)</td></tr>
+<a class="el" href="a00324.html">tick_count::interval_t</a> </td><td class="memItemRight" valign="bottom"><b>operator-</b> (const <a class="el" href="a00323.html">tick_count</a> &t1, const <a class="el" href="a00323.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. <hr><h2>Enumeration Type Documentation</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="a00594.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 futher. 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="a00594.html">tbb_machine.h</a> will set it automatically.<p>
+Prerequisites for each architecture port ---------------------------------------- The following functions 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_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 Itanium). 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 an empty definition where implied by the architecture either s [...]
+__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="a00362.html#a8686246bb5d3664bd07563749970fef">tbb::memory_semantics</a> </td>
+ <td class="memname">enum <a class="el" href="a00383.html#a8686246bb5d3664bd07563749970fef">tbb::memory_semantics</a> </td>
</tr>
</table>
</div>
@@ -659,12 +625,14 @@ Specifies memory fencing.
<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="a8686246bb5d3664bd07563749970fefc6db01678b1749dff7554688d079520c"></a><!-- doxytag: member="__TBB_full_fence" ref="a8686246bb5d3664bd07563749970fefc6db01678b1749dff7554688d079520c" args="" -->__TBB_full_fence</em> </td><td>
-For internal use only. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="a8686246bb5d3664bd07563749970fef07b959f69a4f70d821c67b85316803ff"></a><!-- doxytag: member="full_fence" ref="a8686246bb5d3664bd07563749970fef07b959f69a4f70d821c67b85316803ff" args="" -->full_fence</em> </td><td>
+Sequentially consistent fence. </td></tr>
<tr><td valign="top"><em><a class="anchor" name="a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7"></a><!-- doxytag: member="acquire" ref="a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7" args="" -->acquire</em> </td><td>
Acquire fence. </td></tr>
<tr><td valign="top"><em><a class="anchor" name="a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70"></a><!-- doxytag: member="release" ref="a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70" args="" -->release</em> </td><td>
Release fence. </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>
diff --git a/doc/html/a00371.html b/doc/html/a00395.html
similarity index 83%
rename from doc/html/a00371.html
rename to doc/html/a00395.html
index 286e5b1..6640b97 100644
--- a/doc/html/a00371.html
+++ b/doc/html/a00395.html
@@ -17,139 +17,139 @@
<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="a00221.html">tbb::blocked_range< Value ></a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00233.html">tbb::blocked_range< Value ></a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A range over which to iterate. <a href="a00221.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="a00222.html">tbb::blocked_range2d< RowValue, ColValue ></a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A range over which to iterate. <a href="a00233.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="a00234.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="a00222.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="a00223.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A 2-dimensional range that models the Range concept. <a href="a00234.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="a00235.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="a00223.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">tbb::pre_scan_tag</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A 3-dimensional range that models the Range concept. <a href="a00235.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="a00285.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="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="a00247.html">tbb::final_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="a00285.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="a00258.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="a00247.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::parallel_while< Body ></a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Used to indicate that the final scan is being performed. <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="a00282.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="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="a00284.html">tbb::simple_partitioner</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over a stream, with optional addition of more work. <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="a00303.html">tbb::simple_partitioner</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A simple partitioner. <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="a00219.html">tbb::auto_partitioner</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A simple partitioner. <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="a00231.html">tbb::auto_partitioner</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">An auto partitioner. <a href="a00219.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="a00245.html">tbb::filter</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">An auto partitioner. <a href="a00231.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="a00256.html">tbb::filter</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A stage in a pipeline. <a href="a00245.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::thread_bound_filter</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A stage in a pipeline. <a href="a00256.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::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="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="a00266.html">tbb::pipeline</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A stage in a pipeline served by a user thread. <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="a00284.html">tbb::pipeline</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A processing pipeline that applies filters to items. <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="a00290.html">tbb::split</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A processing pipeline that applies filters to items. <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="a00309.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="a00290.html#_details">More...</a><br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Dummy type that distinguishes splitting constructor from copy constructor. <a href="a00309.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="a00371.html#g3383e2703977012b6f384d673410f1f7">tbb::parallel_do</a> (Iterator first, Iterator last, const Body &body)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.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="a00371.html#g2617dc9b88b3285a7212599d49f74228">tbb::parallel_do</a> (Iterator first, Iterator last, const Body &body, task_group_context &context)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.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="a00371.html#g68cc046ef72c42ce205fccbc435a0d81">tbb::parallel_for</a> (const Range &range, const Body &body)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.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="a00371.html#g13cac5dd55c7533bccea43a51c33d0e5">tbb::parallel_for</a> (const Range &range, const Body &body, const simple_partitioner &partitioner)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.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="a00371.html#ga7ac75d532389b55b9247f3fdb0b00d1">tbb::parallel_for</a> (const Range &range, const Body &body, const auto_partitioner &partitioner)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.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="a00219.html">auto_partitioner</a>. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with <a class="el" href="a00231.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="a00371.html#g9cd1b210ceb1c040f30e390b4a21bde8">tbb::parallel_for</a> (const Range &range, const Body &body, affinity_partitioner &partitioner)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.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="a00212.html">affinity_partitioner</a>. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with <a class="el" href="a00225.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="a00371.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="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.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="a00371.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="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.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="a00219.html">auto_partitioner</a> and user-supplied context. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with <a class="el" href="a00231.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="a00371.html#g04b4696b67370c01353ff5974c8f1196">tbb::parallel_for</a> (const Range &range, const Body &body, affinity_partitioner &partitioner, task_group_context &context)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.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="a00212.html">affinity_partitioner</a> and user-supplied context. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with <a class="el" href="a00225.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="a00371.html#gcd40c32f319747e61a8f73fcfc452001">tbb::parallel_for_each</a> (InputIterator first, InputIterator last, const Function &f, task_group_context &context)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.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="a00371.html#gc2d710ca573f0a9bd94379cba3772def">tbb::parallel_for_each</a> (InputIterator first, InputIterator last, const Function &f)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.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="a00371.html#gd3e2998f171494f94c2103f4eb924084">tbb::parallel_invoke</a> (const F0 &f0, const F1 &f1, <a class="el" href="a00293.html">tbb::task_group_context</a> &context)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#gd3e2998f171494f94c2103f4eb924084">tbb::parallel_invoke</a> (const F0 &f0, const F1 &f1, <a class="el" href="a00314.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="a00293.html">tbb::task_group_context</a> &context)</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="a00314.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="a00293.html">tbb::task_group_context</a> &context)</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="a00314.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="a00293.html">tbb::task_group_context</a> &context)</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="a00314.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="a00293.html">tbb::task_group_context</a> &context)</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="a00314.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="a00293.html">tbb::task_group_context</a> &context)</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="a00314.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="a00293.html">tbb::task_group_context</a> &context)</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="a00314.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="a00293.html">tbb::task_group_context</a> &context)</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="a00314.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="a00293.html">tbb::task_group_context</a> &context)</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="a00314.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>
@@ -191,105 +191,125 @@ template<typename F0, typename F1, typename F2, typename F3, typename F4, typ
<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="a00371.html#g1b3d59c5eb62683c5754db6970392fa3">tbb::parallel_reduce</a> (const Range &range, Body &body)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.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="a00371.html#gec1b7c03f9da909bef5db12e3d41bed3">tbb::parallel_reduce</a> (const Range &range, Body &body, const simple_partitioner &partitioner)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.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="a00284.html">simple_partitioner</a>. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00303.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="a00371.html#g18a19157e6245992fc00ca0adeb7dd37">tbb::parallel_reduce</a> (const Range &range, Body &body, const auto_partitioner &partitioner)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.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="a00219.html">auto_partitioner</a>. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00231.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="a00371.html#gc61e73fcc36c92d79a217fc355ff4a6b">tbb::parallel_reduce</a> (const Range &range, Body &body, affinity_partitioner &partitioner)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.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="a00212.html">affinity_partitioner</a>. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00225.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="a00371.html#g45cb00c42a18e334bbde8b7535afe460">tbb::parallel_reduce</a> (const Range &range, Body &body, const simple_partitioner &partitioner, task_group_context &context)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.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="a00371.html#g1c1ea1d7c61b3c225e92c70d669a53a5">tbb::parallel_reduce</a> (const Range &range, Body &body, const auto_partitioner &partitioner, task_group_context &context)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.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="a00219.html">auto_partitioner</a> and user-supplied context. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction, <a class="el" href="a00231.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="a00371.html#gd9ac3a3811060314695f33b703c6e11b">tbb::parallel_reduce</a> (const Range &range, Body &body, affinity_partitioner &partitioner, task_group_context &context)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.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="a00212.html">affinity_partitioner</a> and user-supplied context. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction, <a class="el" href="a00225.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="a00371.html#gc9412e09fb01fcad8c018ea9cffb28ef">tbb::parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.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="a00371.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="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.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="a00284.html">simple_partitioner</a>. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00303.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="a00371.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="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.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="a00219.html">auto_partitioner</a>. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00231.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="a00371.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="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.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="a00212.html">affinity_partitioner</a>. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00225.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="a00371.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="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.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="a00371.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="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.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="a00219.html">auto_partitioner</a> and user-supplied context. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction, <a class="el" href="a00231.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="a00371.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="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.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="a00212.html">affinity_partitioner</a> and user-supplied context. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction, <a class="el" href="a00225.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="a00395.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="a00395.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="a00395.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="a00395.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="a00371.html#ged143f31dd3d96ded02ab3db915b91c7">tbb::parallel_scan</a> (const Range &range, Body &body)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.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="a00371.html#gc9fac8870b2e6365fb337014404529df">tbb::parallel_scan</a> (const Range &range, Body &body, const simple_partitioner &partitioner)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.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="a00284.html">simple_partitioner</a>. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel prefix with <a class="el" href="a00303.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="a00371.html#g62fde400a37bbca1a2fddc8e3d22f556">tbb::parallel_scan</a> (const Range &range, Body &body, const auto_partitioner &partitioner)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.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="a00219.html">auto_partitioner</a>. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel prefix with <a class="el" href="a00231.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="a00371.html#g49edcf9447cd91a9527a3f8e8512b7aa">tbb::parallel_sort</a> (RandomAccessIterator begin, RandomAccessIterator end, const Compare &comp)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.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="a00371.html#g16c3eb77d0e530834c51ce3857f01012">tbb::parallel_sort</a> (RandomAccessIterator begin, RandomAccessIterator end)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.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="a00371.html#gc7576f82fdedc8a701a6c17ad9415926">tbb::parallel_sort</a> (T *begin, T *end)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.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>
diff --git a/doc/html/a00372.html b/doc/html/a00396.html
similarity index 76%
rename from doc/html/a00372.html
rename to doc/html/a00396.html
index a7e1e0d..f6ebde6 100644
--- a/doc/html/a00372.html
+++ b/doc/html/a00396.html
@@ -17,27 +17,27 @@
<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="a00229.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="a00241.html">tbb::combinable< T ></a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Thread-local storage with optional reduction. <a href="a00229.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="a00231.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="a00241.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="a00243.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="a00231.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="a00236.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="a00243.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="a00248.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="a00236.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="a00230.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="a00248.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="a00242.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="a00230.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="a00237.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="a00242.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">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="a00237.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="a00238.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="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="a00250.html">tbb::concurrent_vector< T, A ></a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Concurrent vector container. <a href="a00238.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="a00243.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="a00250.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="a00255.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="a00243.html">enumerable_thread_specific</a> container. <a href="a00243.html#_details">More...</a><br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The <a class="el" href="a00255.html">enumerable_thread_specific</a> container. <a href="a00255.html#_details">More...</a><br></td></tr>
</table>
<hr>
<p></p>
diff --git a/doc/html/a00397.html b/doc/html/a00397.html
index 9f13e4f..6346401 100644
--- a/doc/html/a00397.html
+++ b/doc/html/a00397.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>_concurrent_unordered_internal.h Source File</title>
+<title>Memory Allocation</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
@@ -11,1402 +11,304 @@
<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>_concurrent_unordered_internal.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-2011 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_internal_H</span>
-<a name="l00025"></a>00025 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_concurrent_unordered_internal_H</span>
-<a name="l00026"></a>00026 <span class="preprocessor"></span>
-<a name="l00027"></a>00027 <span class="preprocessor">#include "tbb_stddef.h"</span>
-<a name="l00028"></a>00028
-<a name="l00029"></a>00029 <span class="preprocessor">#if !TBB_USE_EXCEPTIONS && _MSC_VER</span>
-<a name="l00030"></a>00030 <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="l00031"></a>00031 <span class="preprocessor"> #pragma warning (push)</span>
-<a name="l00032"></a>00032 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (disable: 4530)</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">#include <iterator></span>
-<a name="l00036"></a>00036 <span class="preprocessor">#include <utility></span> <span class="comment">// Need std::pair</span>
-<a name="l00037"></a>00037 <span class="preprocessor">#include <functional></span>
-<a name="l00038"></a>00038 <span class="preprocessor">#include <string></span> <span class="comment">// For tbb_hasher</span>
-<a name="l00039"></a>00039 <span class="preprocessor">#include <cstring></span> <span class="comment">// Need std::memset</span>
-<a name="l00040"></a>00040
-<a name="l00041"></a>00041 <span class="preprocessor">#if !TBB_USE_EXCEPTIONS && _MSC_VER</span>
-<a name="l00042"></a>00042 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (pop)</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="l00045"></a>00045 <span class="preprocessor">#include "atomic.h"</span>
-<a name="l00046"></a>00046 <span class="preprocessor">#include "tbb_exception.h"</span>
-<a name="l00047"></a>00047 <span class="preprocessor">#include "tbb_allocator.h"</span>
-<a name="l00048"></a>00048
-<a name="l00049"></a>00049 <span class="keyword">namespace </span>tbb {
-<a name="l00050"></a>00050 <span class="keyword">namespace </span>interface5 {
-<a name="l00052"></a>00052 <span class="keyword">namespace </span>internal {
-<a name="l00053"></a>00053
-<a name="l00054"></a>00054 <span class="keyword">template</span> <<span class="keyword">typename</span> T, <span class="keyword">typename</span> Allocator>
-<a name="l00055"></a>00055 <span class="keyword">class </span>split_ordered_list;
-<a name="l00056"></a>00056 <span class="keyword">template</span> <<span class="keyword">typename</span> Traits>
-<a name="l00057"></a>00057 <span class="keyword">class </span>concurrent_unordered_base;
-<a name="l00058"></a>00058
-<a name="l00059"></a>00059 <span class="comment">// Forward list iterators (without skipping dummy elements)</span>
-<a name="l00060"></a>00060 <span class="keyword">template</span><<span class="keyword">class</span> Solist, <span class="keyword">typename</span> Value>
-<a name="l00061"></a>00061 <span class="keyword">class </span>flist_iterator : <span class="keyword">public</span> std::iterator<std::forward_iterator_tag, Value>
-<a name="l00062"></a>00062 {
-<a name="l00063"></a>00063 <span class="keyword">template</span> <<span class="keyword">typename</span> T, <span class="keyword">typename</span> Allocator>
-<a name="l00064"></a>00064 <span class="keyword">friend</span> <span class="keyword">class </span>split_ordered_list;
-<a name="l00065"></a>00065 <span class="keyword">template</span> <<span class="keyword">typename</span> Traits>
-<a name="l00066"></a>00066 <span class="keyword">friend</span> <span class="keyword">class </span>concurrent_unordered_base;
-<a name="l00067"></a>00067 <span class="keyword">template</span><<span class="keyword">class</span> M, <span class="keyword">typename</span> V>
-<a name="l00068"></a>00068 <span class="keyword">friend</span> <span class="keyword">class </span>flist_iterator;
-<a name="l00069"></a>00069
-<a name="l00070"></a>00070 <span class="keyword">typedef</span> <span class="keyword">typename</span> Solist::nodeptr_t nodeptr_t;
-<a name="l00071"></a>00071 <span class="keyword">public</span>:
-<a name="l00072"></a>00072 <span class="keyword">typedef</span> <span class="keyword">typename</span> Solist::value_type value_type;
-<a name="l00073"></a>00073 <span class="keyword">typedef</span> <span class="keyword">typename</span> Solist::difference_type difference_type;
-<a name="l00074"></a>00074 <span class="keyword">typedef</span> <span class="keyword">typename</span> Solist::pointer pointer;
-<a name="l00075"></a>00075 <span class="keyword">typedef</span> <span class="keyword">typename</span> Solist::reference reference;
-<a name="l00076"></a>00076
-<a name="l00077"></a>00077 flist_iterator() : my_node_ptr(0) {}
-<a name="l00078"></a>00078 flist_iterator( <span class="keyword">const</span> flist_iterator<Solist, typename Solist::value_type> &other )
-<a name="l00079"></a>00079 : my_node_ptr(other.my_node_ptr) {}
-<a name="l00080"></a>00080
-<a name="l00081"></a>00081 reference operator*()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> my_node_ptr->my_element; }
-<a name="l00082"></a>00082 pointer operator->()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> &**<span class="keyword">this</span>; }
-<a name="l00083"></a>00083
-<a name="l00084"></a>00084 flist_iterator& operator++() {
-<a name="l00085"></a>00085 my_node_ptr = my_node_ptr->my_next;
-<a name="l00086"></a>00086 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00087"></a>00087 }
-<a name="l00088"></a>00088
-<a name="l00089"></a>00089 flist_iterator operator++(<span class="keywordtype">int</span>) {
-<a name="l00090"></a>00090 flist_iterator tmp = *<span class="keyword">this</span>;
-<a name="l00091"></a>00091 ++*<span class="keyword">this</span>;
-<a name="l00092"></a>00092 <span class="keywordflow">return</span> tmp;
-<a name="l00093"></a>00093 }
-<a name="l00094"></a>00094
-<a name="l00095"></a>00095 <span class="keyword">protected</span>:
-<a name="l00096"></a>00096 flist_iterator(nodeptr_t pnode) : my_node_ptr(pnode) {}
-<a name="l00097"></a>00097 nodeptr_t get_node_ptr()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> my_node_ptr; }
-<a name="l00098"></a>00098
-<a name="l00099"></a>00099 nodeptr_t my_node_ptr;
-<a name="l00100"></a>00100
-<a name="l00101"></a>00101 <span class="keyword">template</span><<span class="keyword">typename</span> M, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00102"></a>00102 <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> flist_iterator<M,T> &i, <span class="keyword">const</span> flist_iterator<M,U> &j );
-<a name="l00103"></a>00103 <span class="keyword">template</span><<span class="keyword">typename</span> M, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00104"></a>00104 <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator!=( <span class="keyword">const</span> flist_iterator<M,T>& i, <span class="keyword">const</span> flist_iterator<M,U>& j );
-<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> Solist, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00108"></a>00108 <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> flist_iterator<Solist,T> &i, <span class="keyword">const</span> flist_iterator<Solist,U> &j ) {
-<a name="l00109"></a>00109 <span class="keywordflow">return</span> i.my_node_ptr == j.my_node_ptr;
-<a name="l00110"></a>00110 }
-<a name="l00111"></a>00111 <span class="keyword">template</span><<span class="keyword">typename</span> Solist, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00112"></a>00112 <span class="keywordtype">bool</span> operator!=( <span class="keyword">const</span> flist_iterator<Solist,T>& i, <span class="keyword">const</span> flist_iterator<Solist,U>& j ) {
-<a name="l00113"></a>00113 <span class="keywordflow">return</span> i.my_node_ptr != j.my_node_ptr;
-<a name="l00114"></a>00114 }
-<a name="l00115"></a>00115
-<a name="l00116"></a>00116 <span class="comment">// Split-order list iterators, needed to skip dummy elements</span>
-<a name="l00117"></a>00117 <span class="keyword">template</span><<span class="keyword">class</span> Solist, <span class="keyword">typename</span> Value>
-<a name="l00118"></a>00118 <span class="keyword">class </span>solist_iterator : <span class="keyword">public</span> flist_iterator<Solist, Value>
-<a name="l00119"></a>00119 {
-<a name="l00120"></a>00120 <span class="keyword">typedef</span> flist_iterator<Solist, Value> base_type;
-<a name="l00121"></a>00121 <span class="keyword">typedef</span> <span class="keyword">typename</span> Solist::nodeptr_t nodeptr_t;
-<a name="l00122"></a>00122 <span class="keyword">using</span> base_type::get_node_ptr;
-<a name="l00123"></a>00123 <span class="keyword">template</span> <<span class="keyword">typename</span> T, <span class="keyword">typename</span> Allocator>
-<a name="l00124"></a>00124 <span class="keyword">friend</span> <span class="keyword">class </span>split_ordered_list;
-<a name="l00125"></a>00125 <span class="keyword">template</span><<span class="keyword">class</span> M, <span class="keyword">typename</span> V>
-<a name="l00126"></a>00126 <span class="keyword">friend</span> <span class="keyword">class </span>solist_iterator;
-<a name="l00127"></a>00127 <span class="keyword">template</span><<span class="keyword">typename</span> M, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00128"></a>00128 <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> solist_iterator<M,T> &i, <span class="keyword">const</span> solist_iterator<M,U> &j );
-<a name="l00129"></a>00129 <span class="keyword">template</span><<span class="keyword">typename</span> M, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00130"></a>00130 <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator!=( <span class="keyword">const</span> solist_iterator<M,T>& i, <span class="keyword">const</span> solist_iterator<M,U>& j );
-<a name="l00131"></a>00131
-<a name="l00132"></a>00132 <span class="keyword">const</span> Solist *my_list_ptr;
-<a name="l00133"></a>00133 solist_iterator(nodeptr_t pnode, <span class="keyword">const</span> Solist *plist) : base_type(pnode), my_list_ptr(plist) {}
-<a name="l00134"></a>00134
-<a name="l00135"></a>00135 <span class="keyword">public</span>:
-<a name="l00136"></a>00136 <span class="keyword">typedef</span> <span class="keyword">typename</span> Solist::value_type value_type;
-<a name="l00137"></a>00137 <span class="keyword">typedef</span> <span class="keyword">typename</span> Solist::difference_type difference_type;
-<a name="l00138"></a>00138 <span class="keyword">typedef</span> <span class="keyword">typename</span> Solist::pointer pointer;
-<a name="l00139"></a>00139 <span class="keyword">typedef</span> <span class="keyword">typename</span> Solist::reference reference;
-<a name="l00140"></a>00140
-<a name="l00141"></a>00141 solist_iterator() {}
-<a name="l00142"></a>00142 solist_iterator(<span class="keyword">const</span> solist_iterator<Solist, typename Solist::value_type> &other )
-<a name="l00143"></a>00143 : base_type(other), my_list_ptr(other.my_list_ptr) {}
-<a name="l00144"></a>00144
-<a name="l00145"></a>00145 reference operator*()<span class="keyword"> const </span>{
-<a name="l00146"></a>00146 <span class="keywordflow">return</span> this->base_type::operator*();
-<a name="l00147"></a>00147 }
-<a name="l00148"></a>00148
-<a name="l00149"></a>00149 pointer operator->()<span class="keyword"> const </span>{
-<a name="l00150"></a>00150 <span class="keywordflow">return</span> (&**<span class="keyword">this</span>);
-<a name="l00151"></a>00151 }
-<a name="l00152"></a>00152
-<a name="l00153"></a>00153 solist_iterator& operator++() {
-<a name="l00154"></a>00154 <span class="keywordflow">do</span> ++(*(base_type *)<span class="keyword">this</span>);
-<a name="l00155"></a>00155 <span class="keywordflow">while</span> (get_node_ptr() != NULL && get_node_ptr()->is_dummy());
-<a name="l00156"></a>00156
-<a name="l00157"></a>00157 <span class="keywordflow">return</span> (*<span class="keyword">this</span>);
-<a name="l00158"></a>00158 }
-<a name="l00159"></a>00159
-<a name="l00160"></a>00160 solist_iterator operator++(<span class="keywordtype">int</span>) {
-<a name="l00161"></a>00161 solist_iterator tmp = *<span class="keyword">this</span>;
-<a name="l00162"></a>00162 <span class="keywordflow">do</span> ++*<span class="keyword">this</span>;
-<a name="l00163"></a>00163 <span class="keywordflow">while</span> (get_node_ptr() != NULL && get_node_ptr()->is_dummy());
-<a name="l00164"></a>00164
-<a name="l00165"></a>00165 <span class="keywordflow">return</span> (tmp);
-<a name="l00166"></a>00166 }
-<a name="l00167"></a>00167 };
-<a name="l00168"></a>00168
-<a name="l00169"></a>00169 <span class="keyword">template</span><<span class="keyword">typename</span> Solist, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00170"></a>00170 <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> solist_iterator<Solist,T> &i, <span class="keyword">const</span> solist_iterator<Solist,U> &j ) {
-<a name="l00171"></a>00171 <span class="keywordflow">return</span> i.my_node_ptr == j.my_node_ptr && i.my_list_ptr == j.my_list_ptr;
-<a name="l00172"></a>00172 }
-<a name="l00173"></a>00173 <span class="keyword">template</span><<span class="keyword">typename</span> Solist, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00174"></a>00174 <span class="keywordtype">bool</span> operator!=( <span class="keyword">const</span> solist_iterator<Solist,T>& i, <span class="keyword">const</span> solist_iterator<Solist,U>& j ) {
-<a name="l00175"></a>00175 <span class="keywordflow">return</span> i.my_node_ptr != j.my_node_ptr || i.my_list_ptr != j.my_list_ptr;
-<a name="l00176"></a>00176 }
-<a name="l00177"></a>00177
-<a name="l00178"></a>00178 <span class="comment">// Forward type and class definitions</span>
-<a name="l00179"></a>00179 <span class="keyword">typedef</span> size_t sokey_t;
-<a name="l00180"></a>00180
-<a name="l00181"></a>00181 <span class="comment">// Forward list in which elements are sorted in a split-order</span>
-<a name="l00182"></a>00182 <span class="keyword">template</span> <<span class="keyword">typename</span> T, <span class="keyword">typename</span> Allocator>
-<a name="l00183"></a>00183 <span class="keyword">class </span>split_ordered_list
-<a name="l00184"></a>00184 {
-<a name="l00185"></a>00185 <span class="keyword">public</span>:
-<a name="l00186"></a>00186 <span class="keyword">typedef</span> split_ordered_list<T, Allocator> self_type;
-<a name="l00187"></a>00187 <span class="keyword">typedef</span> <span class="keyword">typename</span> Allocator::template rebind<T>::other allocator_type;
-<a name="l00188"></a>00188 <span class="keyword">struct </span>node;
-<a name="l00189"></a>00189 <span class="keyword">typedef</span> node *nodeptr_t;
-<a name="l00190"></a>00190
-<a name="l00191"></a>00191 <span class="keyword">typedef</span> <span class="keyword">typename</span> allocator_type::size_type size_type;
-<a name="l00192"></a>00192 <span class="keyword">typedef</span> <span class="keyword">typename</span> allocator_type::difference_type difference_type;
-<a name="l00193"></a>00193 <span class="keyword">typedef</span> <span class="keyword">typename</span> allocator_type::pointer pointer;
-<a name="l00194"></a>00194 <span class="keyword">typedef</span> <span class="keyword">typename</span> allocator_type::const_pointer const_pointer;
-<a name="l00195"></a>00195 <span class="keyword">typedef</span> <span class="keyword">typename</span> allocator_type::reference reference;
-<a name="l00196"></a>00196 <span class="keyword">typedef</span> <span class="keyword">typename</span> allocator_type::const_reference const_reference;
-<a name="l00197"></a>00197 <span class="keyword">typedef</span> <span class="keyword">typename</span> allocator_type::value_type value_type;
-<a name="l00198"></a>00198
-<a name="l00199"></a>00199 <span class="keyword">typedef</span> solist_iterator<self_type, const value_type> const_iterator;
-<a name="l00200"></a>00200 <span class="keyword">typedef</span> solist_iterator<self_type, value_type> iterator;
-<a name="l00201"></a>00201 <span class="keyword">typedef</span> flist_iterator<self_type, const value_type> raw_const_iterator;
-<a name="l00202"></a>00202 <span class="keyword">typedef</span> flist_iterator<self_type, value_type> raw_iterator;
-<a name="l00203"></a>00203
-<a name="l00204"></a>00204 <span class="comment">// Node that holds the element in a split-ordered list</span>
-<a name="l00205"></a>00205 <span class="keyword">struct </span>node : tbb::internal::no_assign
-<a name="l00206"></a>00206 {
-<a name="l00207"></a>00207 <span class="comment">// Initialize the node with the given order key</span>
-<a name="l00208"></a>00208 <span class="keywordtype">void</span> init(sokey_t order_key) {
-<a name="l00209"></a>00209 my_order_key = order_key;
-<a name="l00210"></a>00210 my_next = NULL;
-<a name="l00211"></a>00211 }
-<a name="l00212"></a>00212
-<a name="l00213"></a>00213 <span class="comment">// Return the order key (needed for hashing)</span>
-<a name="l00214"></a>00214 sokey_t get_order_key()<span class="keyword"> const </span>{ <span class="comment">// TODO: remove</span>
-<a name="l00215"></a>00215 <span class="keywordflow">return</span> my_order_key;
-<a name="l00216"></a>00216 }
-<a name="l00217"></a>00217
-<a name="l00218"></a>00218 <span class="comment">// Inserts the new element in the list in an atomic fashion</span>
-<a name="l00219"></a>00219 nodeptr_t atomic_set_next(nodeptr_t new_node, nodeptr_t current_node)
-<a name="l00220"></a>00220 {
-<a name="l00221"></a>00221 <span class="comment">// Try to change the next pointer on the current element to a new element, only if it still points to the cached next</span>
-<a name="l00222"></a>00222 nodeptr_t exchange_node = (nodeptr_t) __TBB_CompareAndSwapW((<span class="keywordtype">void</span> *) &my_next, (uintptr_t)new_node, (uintptr_t)current_node);
-<a name="l00223"></a>00223
-<a name="l00224"></a>00224 <span class="keywordflow">if</span> (exchange_node == current_node) <span class="comment">// TODO: why this branch?</span>
-<a name="l00225"></a>00225 {
-<a name="l00226"></a>00226 <span class="comment">// Operation succeeded, return the new node</span>
-<a name="l00227"></a>00227 <span class="keywordflow">return</span> new_node;
-<a name="l00228"></a>00228 }
-<a name="l00229"></a>00229 <span class="keywordflow">else</span>
-<a name="l00230"></a>00230 {
-<a name="l00231"></a>00231 <span class="comment">// Operation failed, return the "interfering" node</span>
-<a name="l00232"></a>00232 <span class="keywordflow">return</span> exchange_node;
-<a name="l00233"></a>00233 }
-<a name="l00234"></a>00234 }
-<a name="l00235"></a>00235
-<a name="l00236"></a>00236 <span class="comment">// Checks if this element in the list is a dummy, order enforcing node. Dummy nodes are used by buckets</span>
-<a name="l00237"></a>00237 <span class="comment">// in the hash table to quickly index into the right subsection of the split-ordered list.</span>
-<a name="l00238"></a>00238 <span class="keywordtype">bool</span> is_dummy()<span class="keyword"> const </span>{
-<a name="l00239"></a>00239 <span class="keywordflow">return</span> (my_order_key & 0x1) == 0;
-<a name="l00240"></a>00240 }
-<a name="l00241"></a>00241
-<a name="l00242"></a>00242
-<a name="l00243"></a>00243 nodeptr_t my_next; <span class="comment">// Next element in the list</span>
-<a name="l00244"></a>00244 value_type my_element; <span class="comment">// Element storage</span>
-<a name="l00245"></a>00245 sokey_t my_order_key; <span class="comment">// Order key for this element</span>
-<a name="l00246"></a>00246 };
-<a name="l00247"></a>00247
-<a name="l00248"></a>00248 <span class="comment">// Allocate a new node with the given order key and value</span>
-<a name="l00249"></a>00249 nodeptr_t create_node(sokey_t order_key, <span class="keyword">const</span> T &value) {
-<a name="l00250"></a>00250 nodeptr_t pnode = my_node_allocator.allocate(1);
-<a name="l00251"></a>00251
-<a name="l00252"></a>00252 __TBB_TRY {
-<a name="l00253"></a>00253 <span class="keyword">new</span>(static_cast<void*>(&pnode->my_element)) T(value);
-<a name="l00254"></a>00254 pnode->init(order_key);
-<a name="l00255"></a>00255 } __TBB_CATCH(...) {
-<a name="l00256"></a>00256 my_node_allocator.deallocate(pnode, 1);
-<a name="l00257"></a>00257 __TBB_RETHROW();
-<a name="l00258"></a>00258 }
-<a name="l00259"></a>00259
-<a name="l00260"></a>00260 <span class="keywordflow">return</span> (pnode);
-<a name="l00261"></a>00261 }
-<a name="l00262"></a>00262
-<a name="l00263"></a>00263 <span class="comment">// Allocate a new node with the given order key; used to allocate dummy nodes</span>
-<a name="l00264"></a>00264 nodeptr_t create_node(sokey_t order_key) {
-<a name="l00265"></a>00265 nodeptr_t pnode = my_node_allocator.allocate(1);
-<a name="l00266"></a>00266
-<a name="l00267"></a>00267 __TBB_TRY {
-<a name="l00268"></a>00268 <span class="keyword">new</span>(static_cast<void*>(&pnode->my_element)) T();
-<a name="l00269"></a>00269 pnode->init(order_key);
-<a name="l00270"></a>00270 } __TBB_CATCH(...) {
-<a name="l00271"></a>00271 my_node_allocator.deallocate(pnode, 1);
-<a name="l00272"></a>00272 __TBB_RETHROW();
-<a name="l00273"></a>00273 }
-<a name="l00274"></a>00274
-<a name="l00275"></a>00275 <span class="keywordflow">return</span> (pnode);
-<a name="l00276"></a>00276 }
-<a name="l00277"></a>00277
-<a name="l00278"></a>00278 split_ordered_list(allocator_type a = allocator_type())
-<a name="l00279"></a>00279 : my_node_allocator(a), my_element_count(0)
-<a name="l00280"></a>00280 {
-<a name="l00281"></a>00281 <span class="comment">// Immediately allocate a dummy node with order key of 0. This node</span>
-<a name="l00282"></a>00282 <span class="comment">// will always be the head of the list.</span>
-<a name="l00283"></a>00283 my_head = create_node(0);
-<a name="l00284"></a>00284 }
-<a name="l00285"></a>00285
-<a name="l00286"></a>00286 ~split_ordered_list()
-<a name="l00287"></a>00287 {
-<a name="l00288"></a>00288 <span class="comment">// Clear the list</span>
-<a name="l00289"></a>00289 clear();
-<a name="l00290"></a>00290
-<a name="l00291"></a>00291 <span class="comment">// Remove the head element which is not cleared by clear()</span>
-<a name="l00292"></a>00292 nodeptr_t pnode = my_head;
-<a name="l00293"></a>00293 my_head = NULL;
-<a name="l00294"></a>00294
-<a name="l00295"></a>00295 __TBB_ASSERT(pnode != NULL && pnode->my_next == NULL, <span class="stringliteral">"Invalid head list node"</span>);
-<a name="l00296"></a>00296
-<a name="l00297"></a>00297 destroy_node(pnode);
-<a name="l00298"></a>00298 }
-<a name="l00299"></a>00299
-<a name="l00300"></a>00300 <span class="comment">// Common forward list functions</span>
-<a name="l00301"></a>00301
-<a name="l00302"></a>00302 allocator_type get_allocator()<span class="keyword"> const </span>{
-<a name="l00303"></a>00303 <span class="keywordflow">return</span> (my_node_allocator);
-<a name="l00304"></a>00304 }
-<a name="l00305"></a>00305
-<a name="l00306"></a>00306 <span class="keywordtype">void</span> clear() {
-<a name="l00307"></a>00307 nodeptr_t pnext;
-<a name="l00308"></a>00308 nodeptr_t pnode = my_head;
-<a name="l00309"></a>00309
-<a name="l00310"></a>00310 __TBB_ASSERT(my_head != NULL, <span class="stringliteral">"Invalid head list node"</span>);
-<a name="l00311"></a>00311 pnext = pnode->my_next;
-<a name="l00312"></a>00312 pnode->my_next = NULL;
-<a name="l00313"></a>00313 pnode = pnext;
-<a name="l00314"></a>00314
-<a name="l00315"></a>00315 <span class="keywordflow">while</span> (pnode != NULL)
-<a name="l00316"></a>00316 {
-<a name="l00317"></a>00317 pnext = pnode->my_next;
-<a name="l00318"></a>00318 destroy_node(pnode);
-<a name="l00319"></a>00319 pnode = pnext;
-<a name="l00320"></a>00320 }
-<a name="l00321"></a>00321
-<a name="l00322"></a>00322 my_element_count = 0;
-<a name="l00323"></a>00323 }
-<a name="l00324"></a>00324
-<a name="l00325"></a>00325 <span class="comment">// Returns a first non-dummy element in the SOL</span>
-<a name="l00326"></a>00326 iterator begin() {
-<a name="l00327"></a>00327 <span class="keywordflow">return</span> first_real_iterator(raw_begin());
-<a name="l00328"></a>00328 }
-<a name="l00329"></a>00329
-<a name="l00330"></a>00330 <span class="comment">// Returns a first non-dummy element in the SOL</span>
-<a name="l00331"></a>00331 const_iterator begin()<span class="keyword"> const </span>{
-<a name="l00332"></a>00332 <span class="keywordflow">return</span> first_real_iterator(raw_begin());
-<a name="l00333"></a>00333 }
-<a name="l00334"></a>00334
-<a name="l00335"></a>00335 iterator end() {
-<a name="l00336"></a>00336 <span class="keywordflow">return</span> (iterator(0, <span class="keyword">this</span>));
-<a name="l00337"></a>00337 }
-<a name="l00338"></a>00338
-<a name="l00339"></a>00339 const_iterator end()<span class="keyword"> const </span>{
-<a name="l00340"></a>00340 <span class="keywordflow">return</span> (const_iterator(0, <span class="keyword">this</span>));
-<a name="l00341"></a>00341 }
-<a name="l00342"></a>00342
-<a name="l00343"></a>00343 const_iterator cbegin()<span class="keyword"> const </span>{
-<a name="l00344"></a>00344 <span class="keywordflow">return</span> (((<span class="keyword">const</span> self_type *)<span class="keyword">this</span>)->begin());
-<a name="l00345"></a>00345 }
-<a name="l00346"></a>00346
-<a name="l00347"></a>00347 const_iterator cend()<span class="keyword"> const </span>{
-<a name="l00348"></a>00348 <span class="keywordflow">return</span> (((<span class="keyword">const</span> self_type *)<span class="keyword">this</span>)->end());
-<a name="l00349"></a>00349 }
-<a name="l00350"></a>00350
-<a name="l00351"></a>00351 <span class="comment">// Checks if the number of elements (non-dummy) is 0</span>
-<a name="l00352"></a>00352 <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{
-<a name="l00353"></a>00353 <span class="keywordflow">return</span> (my_element_count == 0);
-<a name="l00354"></a>00354 }
-<a name="l00355"></a>00355
-<a name="l00356"></a>00356 <span class="comment">// Returns the number of non-dummy elements in the list</span>
-<a name="l00357"></a>00357 size_type size()<span class="keyword"> const </span>{
-<a name="l00358"></a>00358 <span class="keywordflow">return</span> my_element_count;
-<a name="l00359"></a>00359 }
-<a name="l00360"></a>00360
-<a name="l00361"></a>00361 <span class="comment">// Returns the maximum size of the list, determined by the allocator</span>
-<a name="l00362"></a>00362 size_type max_size()<span class="keyword"> const </span>{
-<a name="l00363"></a>00363 <span class="keywordflow">return</span> my_node_allocator.max_size();
-<a name="l00364"></a>00364 }
-<a name="l00365"></a>00365
-<a name="l00366"></a>00366 <span class="comment">// Swaps 'this' list with the passed in one</span>
-<a name="l00367"></a>00367 <span class="keywordtype">void</span> swap(self_type& other)
-<a name="l00368"></a>00368 {
-<a name="l00369"></a>00369 <span class="keywordflow">if</span> (<span class="keyword">this</span> == &other)
-<a name="l00370"></a>00370 {
-<a name="l00371"></a>00371 <span class="comment">// Nothing to do</span>
-<a name="l00372"></a>00372 <span class="keywordflow">return</span>;
-<a name="l00373"></a>00373 }
-<a name="l00374"></a>00374
-<a name="l00375"></a>00375 std::swap(my_element_count, other.my_element_count);
-<a name="l00376"></a>00376 std::swap(my_head, other.my_head);
-<a name="l00377"></a>00377 }
-<a name="l00378"></a>00378
-<a name="l00379"></a>00379 <span class="comment">// Split-order list functions</span>
-<a name="l00380"></a>00380
-<a name="l00381"></a>00381 <span class="comment">// Returns a first element in the SOL, which is always a dummy</span>
-<a name="l00382"></a>00382 raw_iterator raw_begin() {
-<a name="l00383"></a>00383 <span class="keywordflow">return</span> raw_iterator(my_head);
-<a name="l00384"></a>00384 }
-<a name="l00385"></a>00385
-<a name="l00386"></a>00386 <span class="comment">// Returns a first element in the SOL, which is always a dummy</span>
-<a name="l00387"></a>00387 raw_const_iterator raw_begin()<span class="keyword"> const </span>{
-<a name="l00388"></a>00388 <span class="keywordflow">return</span> raw_const_iterator(my_head);
-<a name="l00389"></a>00389 }
-<a name="l00390"></a>00390
-<a name="l00391"></a>00391 raw_iterator raw_end() {
-<a name="l00392"></a>00392 <span class="keywordflow">return</span> raw_iterator(0);
-<a name="l00393"></a>00393 }
-<a name="l00394"></a>00394
-<a name="l00395"></a>00395 raw_const_iterator raw_end()<span class="keyword"> const </span>{
-<a name="l00396"></a>00396 <span class="keywordflow">return</span> raw_const_iterator(0);
-<a name="l00397"></a>00397 }
-<a name="l00398"></a>00398
-<a name="l00399"></a>00399 <span class="keyword">static</span> sokey_t get_order_key(<span class="keyword">const</span> raw_const_iterator& it) {
-<a name="l00400"></a>00400 <span class="keywordflow">return</span> it.get_node_ptr()->get_order_key();
-<a name="l00401"></a>00401 }
-<a name="l00402"></a>00402
-<a name="l00403"></a>00403 <span class="keyword">static</span> sokey_t get_safe_order_key(<span class="keyword">const</span> raw_const_iterator& it) {
-<a name="l00404"></a>00404 <span class="keywordflow">if</span>( !it.get_node_ptr() ) <span class="keywordflow">return</span> sokey_t(~0U);
-<a name="l00405"></a>00405 <span class="keywordflow">return</span> it.get_node_ptr()->get_order_key();
-<a name="l00406"></a>00406 }
-<a name="l00407"></a>00407
-<a name="l00408"></a>00408 <span class="comment">// Returns a public iterator version of the internal iterator. Public iterator must not</span>
-<a name="l00409"></a>00409 <span class="comment">// be a dummy private iterator.</span>
-<a name="l00410"></a>00410 iterator get_iterator(raw_iterator it) {
-<a name="l00411"></a>00411 __TBB_ASSERT(it.get_node_ptr() == NULL || !it.get_node_ptr()->is_dummy(), <span class="stringliteral">"Invalid user node (dummy)"</span>);
-<a name="l00412"></a>00412 <span class="keywordflow">return</span> iterator(it.get_node_ptr(), <span class="keyword">this</span>);
-<a name="l00413"></a>00413 }
-<a name="l00414"></a>00414
-<a name="l00415"></a>00415 <span class="comment">// Returns a public iterator version of the internal iterator. Public iterator must not</span>
-<a name="l00416"></a>00416 <span class="comment">// be a dummy private iterator.</span>
-<a name="l00417"></a>00417 const_iterator get_iterator(raw_const_iterator it)<span class="keyword"> const </span>{
-<a name="l00418"></a>00418 __TBB_ASSERT(it.get_node_ptr() == NULL || !it.get_node_ptr()->is_dummy(), <span class="stringliteral">"Invalid user node (dummy)"</span>);
-<a name="l00419"></a>00419 <span class="keywordflow">return</span> const_iterator(it.get_node_ptr(), <span class="keyword">this</span>);
-<a name="l00420"></a>00420 }
-<a name="l00421"></a>00421
-<a name="l00422"></a>00422 <span class="comment">// Returns a non-const version of the raw_iterator</span>
-<a name="l00423"></a>00423 raw_iterator get_iterator(raw_const_iterator it) {
-<a name="l00424"></a>00424 <span class="keywordflow">return</span> raw_iterator(it.get_node_ptr());
-<a name="l00425"></a>00425 }
-<a name="l00426"></a>00426
-<a name="l00427"></a>00427 <span class="comment">// Returns a non-const version of the iterator</span>
-<a name="l00428"></a>00428 <span class="keyword">static</span> iterator get_iterator(const_iterator it) {
-<a name="l00429"></a>00429 <span class="keywordflow">return</span> iterator(it.my_node_ptr, it.my_list_ptr);
-<a name="l00430"></a>00430 }
-<a name="l00431"></a>00431
-<a name="l00432"></a>00432 <span class="comment">// Returns a public iterator version of a first non-dummy internal iterator at or after</span>
-<a name="l00433"></a>00433 <span class="comment">// the passed in internal iterator.</span>
-<a name="l00434"></a>00434 iterator first_real_iterator(raw_iterator it)
-<a name="l00435"></a>00435 {
-<a name="l00436"></a>00436 <span class="comment">// Skip all dummy, internal only iterators</span>
-<a name="l00437"></a>00437 <span class="keywordflow">while</span> (it != raw_end() && it.get_node_ptr()->is_dummy())
-<a name="l00438"></a>00438 ++it;
-<a name="l00439"></a>00439
-<a name="l00440"></a>00440 <span class="keywordflow">return</span> iterator(it.get_node_ptr(), <span class="keyword">this</span>);
-<a name="l00441"></a>00441 }
-<a name="l00442"></a>00442
-<a name="l00443"></a>00443 <span class="comment">// Returns a public iterator version of a first non-dummy internal iterator at or after</span>
-<a name="l00444"></a>00444 <span class="comment">// the passed in internal iterator.</span>
-<a name="l00445"></a>00445 const_iterator first_real_iterator(raw_const_iterator it)<span class="keyword"> const</span>
-<a name="l00446"></a>00446 <span class="keyword"> </span>{
-<a name="l00447"></a>00447 <span class="comment">// Skip all dummy, internal only iterators</span>
-<a name="l00448"></a>00448 <span class="keywordflow">while</span> (it != raw_end() && it.get_node_ptr()->is_dummy())
-<a name="l00449"></a>00449 ++it;
-<a name="l00450"></a>00450
-<a name="l00451"></a>00451 <span class="keywordflow">return</span> const_iterator(it.get_node_ptr(), <span class="keyword">this</span>);
-<a name="l00452"></a>00452 }
-<a name="l00453"></a>00453
-<a name="l00454"></a>00454 <span class="comment">// Erase an element using the allocator</span>
-<a name="l00455"></a>00455 <span class="keywordtype">void</span> destroy_node(nodeptr_t pnode) {
-<a name="l00456"></a>00456 my_node_allocator.destroy(pnode);
-<a name="l00457"></a>00457 my_node_allocator.deallocate(pnode, 1);
-<a name="l00458"></a>00458 }
-<a name="l00459"></a>00459
-<a name="l00460"></a>00460 <span class="comment">// Try to insert a new element in the list. If insert fails, return the node that</span>
-<a name="l00461"></a>00461 <span class="comment">// was inserted instead.</span>
-<a name="l00462"></a>00462 nodeptr_t try_insert(nodeptr_t previous, nodeptr_t new_node, nodeptr_t current_node) {
-<a name="l00463"></a>00463 new_node->my_next = current_node;
-<a name="l00464"></a>00464 <span class="keywordflow">return</span> previous->atomic_set_next(new_node, current_node);
-<a name="l00465"></a>00465 }
-<a name="l00466"></a>00466
-<a name="l00467"></a>00467 <span class="comment">// Insert a new element between passed in iterators</span>
-<a name="l00468"></a>00468 std::pair<iterator, bool> try_insert(raw_iterator it, raw_iterator next, <span class="keyword">const</span> value_type &value, sokey_t order_key, size_type *new_count)
-<a name="l00469"></a>00469 {
-<a name="l00470"></a>00470 nodeptr_t pnode = create_node(order_key, value);
-<a name="l00471"></a>00471 nodeptr_t inserted_node = try_insert(it.get_node_ptr(), pnode, next.get_node_ptr());
-<a name="l00472"></a>00472
-<a name="l00473"></a>00473 <span class="keywordflow">if</span> (inserted_node == pnode)
-<a name="l00474"></a>00474 {
-<a name="l00475"></a>00475 <span class="comment">// If the insert succeeded, check that the order is correct and increment the element count</span>
-<a name="l00476"></a>00476 check_range();
-<a name="l00477"></a>00477 *new_count = __TBB_FetchAndAddW((uintptr_t*)&my_element_count, uintptr_t(1));
-<a name="l00478"></a>00478 <span class="keywordflow">return</span> std::pair<iterator, bool>(iterator(pnode, <span class="keyword">this</span>), <span class="keyword">true</span>);
-<a name="l00479"></a>00479 }
-<a name="l00480"></a>00480 <span class="keywordflow">else</span>
-<a name="l00481"></a>00481 {
-<a name="l00482"></a>00482 <span class="comment">// If the insert failed (element already there), then delete the new one</span>
-<a name="l00483"></a>00483 destroy_node(pnode);
-<a name="l00484"></a>00484 <span class="keywordflow">return</span> std::pair<iterator, bool>(end(), <span class="keyword">false</span>);
-<a name="l00485"></a>00485 }
-<a name="l00486"></a>00486 }
-<a name="l00487"></a>00487
-<a name="l00488"></a>00488 <span class="comment">// Insert a new dummy element, starting search at a parent dummy element</span>
-<a name="l00489"></a>00489 raw_iterator insert_dummy(raw_iterator it, sokey_t order_key)
-<a name="l00490"></a>00490 {
-<a name="l00491"></a>00491 raw_iterator last = raw_end();
-<a name="l00492"></a>00492 raw_iterator where = it;
-<a name="l00493"></a>00493
-<a name="l00494"></a>00494 __TBB_ASSERT(where != last, <span class="stringliteral">"Invalid head node"</span>);
-<a name="l00495"></a>00495
-<a name="l00496"></a>00496 ++where;
-<a name="l00497"></a>00497
-<a name="l00498"></a>00498 <span class="comment">// Create a dummy element up front, even though it may be discarded (due to concurrent insertion)</span>
-<a name="l00499"></a>00499 nodeptr_t dummy_node = create_node(order_key);
-<a name="l00500"></a>00500
-<a name="l00501"></a>00501 <span class="keywordflow">for</span> (;;)
-<a name="l00502"></a>00502 {
-<a name="l00503"></a>00503 __TBB_ASSERT(it != last, <span class="stringliteral">"Invalid head list node"</span>);
-<a name="l00504"></a>00504
-<a name="l00505"></a>00505 <span class="comment">// If the head iterator is at the end of the list, or past the point where this dummy</span>
-<a name="l00506"></a>00506 <span class="comment">// node needs to be inserted, then try to insert it.</span>
-<a name="l00507"></a>00507 <span class="keywordflow">if</span> (where == last || get_order_key(where) > order_key)
-<a name="l00508"></a>00508 {
-<a name="l00509"></a>00509 __TBB_ASSERT(get_order_key(it) < order_key, <span class="stringliteral">"Invalid node order in the list"</span>);
-<a name="l00510"></a>00510
-<a name="l00511"></a>00511 <span class="comment">// Try to insert it in the right place</span>
-<a name="l00512"></a>00512 nodeptr_t inserted_node = try_insert(it.get_node_ptr(), dummy_node, where.get_node_ptr());
-<a name="l00513"></a>00513
-<a name="l00514"></a>00514 <span class="keywordflow">if</span> (inserted_node == dummy_node)
-<a name="l00515"></a>00515 {
-<a name="l00516"></a>00516 <span class="comment">// Insertion succeeded, check the list for order violations</span>
-<a name="l00517"></a>00517 check_range();
-<a name="l00518"></a>00518 <span class="keywordflow">return</span> raw_iterator(dummy_node);
-<a name="l00519"></a>00519 }
-<a name="l00520"></a>00520 <span class="keywordflow">else</span>
-<a name="l00521"></a>00521 {
-<a name="l00522"></a>00522 <span class="comment">// Insertion failed: either dummy node was inserted by another thread, or</span>
-<a name="l00523"></a>00523 <span class="comment">// a real element was inserted at exactly the same place as dummy node.</span>
-<a name="l00524"></a>00524 <span class="comment">// Proceed with the search from the previous location where order key was</span>
-<a name="l00525"></a>00525 <span class="comment">// known to be larger (note: this is legal only because there is no safe</span>
-<a name="l00526"></a>00526 <span class="comment">// concurrent erase operation supported).</span>
-<a name="l00527"></a>00527 where = it;
-<a name="l00528"></a>00528 ++where;
-<a name="l00529"></a>00529 <span class="keywordflow">continue</span>;
-<a name="l00530"></a>00530 }
-<a name="l00531"></a>00531 }
-<a name="l00532"></a>00532 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (get_order_key(where) == order_key)
-<a name="l00533"></a>00533 {
-<a name="l00534"></a>00534 <span class="comment">// Another dummy node with the same value found, discard the new one.</span>
-<a name="l00535"></a>00535 destroy_node(dummy_node);
-<a name="l00536"></a>00536 <span class="keywordflow">return</span> where;
-<a name="l00537"></a>00537 }
-<a name="l00538"></a>00538
-<a name="l00539"></a>00539 <span class="comment">// Move the iterator forward</span>
-<a name="l00540"></a>00540 it = where;
-<a name="l00541"></a>00541 ++where;
-<a name="l00542"></a>00542 }
-<a name="l00543"></a>00543
-<a name="l00544"></a>00544 }
-<a name="l00545"></a>00545
-<a name="l00546"></a>00546 <span class="comment">// This erase function can handle both real and dummy nodes</span>
-<a name="l00547"></a>00547 <span class="keywordtype">void</span> erase_node(raw_iterator previous, raw_const_iterator& where)
-<a name="l00548"></a>00548 {
-<a name="l00549"></a>00549 nodeptr_t pnode = (where++).get_node_ptr();
-<a name="l00550"></a>00550 nodeptr_t prevnode = previous.get_node_ptr();
-<a name="l00551"></a>00551 __TBB_ASSERT(prevnode->my_next == pnode, <span class="stringliteral">"Erase must take consecutive iterators"</span>);
-<a name="l00552"></a>00552 prevnode->my_next = pnode->my_next;
-<a name="l00553"></a>00553
-<a name="l00554"></a>00554 destroy_node(pnode);
-<a name="l00555"></a>00555 }
-<a name="l00556"></a>00556
-<a name="l00557"></a>00557 <span class="comment">// Erase the element (previous node needs to be passed because this is a forward only list)</span>
-<a name="l00558"></a>00558 iterator erase_node(raw_iterator previous, const_iterator where)
-<a name="l00559"></a>00559 {
-<a name="l00560"></a>00560 raw_const_iterator it = where;
-<a name="l00561"></a>00561 erase_node(previous, it);
-<a name="l00562"></a>00562 my_element_count--;
-<a name="l00563"></a>00563
-<a name="l00564"></a>00564 <span class="keywordflow">return</span> get_iterator(first_real_iterator(it));
-<a name="l00565"></a>00565 }
-<a name="l00566"></a>00566
-<a name="l00567"></a>00567 <span class="comment">// Move all elements from the passed in split-ordered list to this one</span>
-<a name="l00568"></a>00568 <span class="keywordtype">void</span> move_all(self_type& source)
-<a name="l00569"></a>00569 {
-<a name="l00570"></a>00570 raw_const_iterator first = source.raw_begin();
-<a name="l00571"></a>00571 raw_const_iterator last = source.raw_end();
-<a name="l00572"></a>00572
-<a name="l00573"></a>00573 <span class="keywordflow">if</span> (first == last)
-<a name="l00574"></a>00574 <span class="keywordflow">return</span>;
-<a name="l00575"></a>00575
-<a name="l00576"></a>00576 nodeptr_t previous_node = my_head;
-<a name="l00577"></a>00577 raw_const_iterator begin_iterator = first++;
-<a name="l00578"></a>00578
-<a name="l00579"></a>00579 <span class="comment">// Move all elements one by one, including dummy ones</span>
-<a name="l00580"></a>00580 <span class="keywordflow">for</span> (raw_const_iterator it = first; it != last;)
-<a name="l00581"></a>00581 {
-<a name="l00582"></a>00582 nodeptr_t pnode = it.get_node_ptr();
-<a name="l00583"></a>00583
-<a name="l00584"></a>00584 nodeptr_t dummy_node = pnode->is_dummy() ? create_node(pnode->get_order_key()) : create_node(pnode->get_order_key(), pnode->my_element);
-<a name="l00585"></a>00585 previous_node = try_insert(previous_node, dummy_node, NULL);
-<a name="l00586"></a>00586 __TBB_ASSERT(previous_node != NULL, <span class="stringliteral">"Insertion must succeed"</span>);
-<a name="l00587"></a>00587 raw_const_iterator where = it++;
-<a name="l00588"></a>00588 source.erase_node(get_iterator(begin_iterator), where);
-<a name="l00589"></a>00589 }
-<a name="l00590"></a>00590 check_range();
-<a name="l00591"></a>00591 }
-<a name="l00592"></a>00592
-<a name="l00593"></a>00593
-<a name="l00594"></a>00594 <span class="keyword">private</span>:
-<a name="l00595"></a>00595
-<a name="l00596"></a>00596 <span class="comment">// Check the list for order violations</span>
-<a name="l00597"></a>00597 <span class="keywordtype">void</span> check_range()
-<a name="l00598"></a>00598 {
-<a name="l00599"></a>00599 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00600"></a>00600 <span class="preprocessor"></span> <span class="keywordflow">for</span> (raw_iterator it = raw_begin(); it != raw_end(); ++it)
-<a name="l00601"></a>00601 {
-<a name="l00602"></a>00602 raw_iterator next_iterator = it;
-<a name="l00603"></a>00603 ++next_iterator;
-<a name="l00604"></a>00604
-<a name="l00605"></a>00605 __TBB_ASSERT(next_iterator == end() || next_iterator.get_node_ptr()->get_order_key() >= it.get_node_ptr()->get_order_key(), <span class="stringliteral">"!!! List order inconsistency !!!"</span>);
-<a name="l00606"></a>00606 }
-<a name="l00607"></a>00607 <span class="preprocessor">#endif</span>
-<a name="l00608"></a>00608 <span class="preprocessor"></span> }
-<a name="l00609"></a>00609
-<a name="l00610"></a>00610 <span class="keyword">typename</span> allocator_type::template rebind<node>::other my_node_allocator; <span class="comment">// allocator object for nodes</span>
-<a name="l00611"></a>00611 size_type my_element_count; <span class="comment">// Total item count, not counting dummy nodes</span>
-<a name="l00612"></a>00612 nodeptr_t my_head; <span class="comment">// pointer to head node</span>
-<a name="l00613"></a>00613 };
-<a name="l00614"></a>00614
-<a name="l00615"></a>00615 <span class="comment">// Template class for hash compare</span>
-<a name="l00616"></a>00616 <span class="keyword">template</span><<span class="keyword">typename</span> Key, <span class="keyword">typename</span> Hasher, <span class="keyword">typename</span> Key_equality>
-<a name="l00617"></a>00617 <span class="keyword">class </span>hash_compare
-<a name="l00618"></a>00618 {
-<a name="l00619"></a>00619 <span class="keyword">public</span>:
-<a name="l00620"></a>00620 hash_compare() {}
-<a name="l00621"></a>00621
-<a name="l00622"></a>00622 hash_compare(Hasher a_hasher) : my_hash_object(a_hasher) {}
-<a name="l00623"></a>00623
-<a name="l00624"></a>00624 hash_compare(Hasher a_hasher, Key_equality a_keyeq) : my_hash_object(a_hasher), my_key_compare_object(a_keyeq) {}
-<a name="l00625"></a>00625
-<a name="l00626"></a>00626 size_t operator()(<span class="keyword">const</span> Key& key)<span class="keyword"> const </span>{
-<a name="l00627"></a>00627 <span class="keywordflow">return</span> ((size_t)my_hash_object(key));
-<a name="l00628"></a>00628 }
-<a name="l00629"></a>00629
-<a name="l00630"></a>00630 <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> Key& key1, <span class="keyword">const</span> Key& key2)<span class="keyword"> const </span>{
-<a name="l00631"></a>00631 <span class="keywordflow">return</span> (!my_key_compare_object(key1, key2));
-<a name="l00632"></a>00632 }
-<a name="l00633"></a>00633
-<a name="l00634"></a>00634 Hasher my_hash_object; <span class="comment">// The hash object</span>
-<a name="l00635"></a>00635 Key_equality my_key_compare_object; <span class="comment">// The equality comparator object</span>
-<a name="l00636"></a>00636 };
-<a name="l00637"></a>00637
-<a name="l00638"></a>00638 <span class="preprocessor">#if _MSC_VER</span>
-<a name="l00639"></a>00639 <span class="preprocessor"></span><span class="preprocessor">#pragma warning(push)</span>
-<a name="l00640"></a>00640 <span class="preprocessor"></span><span class="preprocessor">#pragma warning(disable: 4127) // warning 4127 -- while (true) has a constant expression in it (for allow_multimapping)</span>
-<a name="l00641"></a>00641 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00642"></a>00642 <span class="preprocessor"></span>
-<a name="l00643"></a>00643 <span class="keyword">template</span> <<span class="keyword">typename</span> Traits>
-<a name="l00644"></a>00644 <span class="keyword">class </span>concurrent_unordered_base : <span class="keyword">public</span> Traits
-<a name="l00645"></a>00645 {
-<a name="l00646"></a>00646 <span class="keyword">protected</span>:
-<a name="l00647"></a>00647 <span class="comment">// Type definitions</span>
-<a name="l00648"></a>00648 <span class="keyword">typedef</span> concurrent_unordered_base<Traits> self_type;
-<a name="l00649"></a>00649 <span class="keyword">typedef</span> <span class="keyword">typename</span> Traits::value_type value_type;
-<a name="l00650"></a>00650 <span class="keyword">typedef</span> <span class="keyword">typename</span> Traits::key_type key_type;
-<a name="l00651"></a>00651 <span class="keyword">typedef</span> <span class="keyword">typename</span> Traits::hash_compare hash_compare;
-<a name="l00652"></a>00652 <span class="keyword">typedef</span> <span class="keyword">typename</span> Traits::value_compare value_compare;
-<a name="l00653"></a>00653 <span class="keyword">typedef</span> <span class="keyword">typename</span> Traits::allocator_type allocator_type;
-<a name="l00654"></a>00654 <span class="keyword">typedef</span> <span class="keyword">typename</span> allocator_type::pointer pointer;
-<a name="l00655"></a>00655 <span class="keyword">typedef</span> <span class="keyword">typename</span> allocator_type::const_pointer const_pointer;
-<a name="l00656"></a>00656 <span class="keyword">typedef</span> <span class="keyword">typename</span> allocator_type::reference reference;
-<a name="l00657"></a>00657 <span class="keyword">typedef</span> <span class="keyword">typename</span> allocator_type::const_reference const_reference;
-<a name="l00658"></a>00658 <span class="keyword">typedef</span> <span class="keyword">typename</span> allocator_type::size_type size_type;
-<a name="l00659"></a>00659 <span class="keyword">typedef</span> <span class="keyword">typename</span> allocator_type::difference_type difference_type;
-<a name="l00660"></a>00660 <span class="keyword">typedef</span> split_ordered_list<value_type, typename Traits::allocator_type> solist_t;
-<a name="l00661"></a>00661 <span class="keyword">typedef</span> <span class="keyword">typename</span> solist_t::nodeptr_t nodeptr_t;
-<a name="l00662"></a>00662 <span class="comment">// Iterators that walk the entire split-order list, including dummy nodes</span>
-<a name="l00663"></a>00663 <span class="keyword">typedef</span> <span class="keyword">typename</span> solist_t::raw_iterator raw_iterator;
-<a name="l00664"></a>00664 <span class="keyword">typedef</span> <span class="keyword">typename</span> solist_t::raw_const_iterator raw_const_iterator;
-<a name="l00665"></a>00665 <span class="keyword">typedef</span> <span class="keyword">typename</span> solist_t::iterator iterator; <span class="comment">// TODO: restore const iterator for unordered_sets</span>
-<a name="l00666"></a>00666 <span class="keyword">typedef</span> <span class="keyword">typename</span> solist_t::const_iterator const_iterator;
-<a name="l00667"></a>00667 <span class="keyword">typedef</span> iterator local_iterator;
-<a name="l00668"></a>00668 <span class="keyword">typedef</span> const_iterator const_local_iterator;
-<a name="l00669"></a>00669 <span class="keyword">using</span> Traits::my_hash_compare;
-<a name="l00670"></a>00670 <span class="keyword">using</span> Traits::get_key;
-<a name="l00671"></a>00671 <span class="keyword">using</span> Traits::allow_multimapping;
-<a name="l00672"></a>00672
-<a name="l00673"></a>00673 <span class="keyword">private</span>:
-<a name="l00674"></a>00674 <span class="keyword">typedef</span> std::pair<iterator, iterator> pairii_t;
-<a name="l00675"></a>00675 <span class="keyword">typedef</span> std::pair<const_iterator, const_iterator> paircc_t;
-<a name="l00676"></a>00676
-<a name="l00677"></a>00677 <span class="keyword">static</span> size_type <span class="keyword">const</span> pointers_per_table = <span class="keyword">sizeof</span>(size_type) * 8; <span class="comment">// One bucket segment per bit</span>
-<a name="l00678"></a>00678 <span class="keyword">static</span> <span class="keyword">const</span> size_type initial_bucket_number = 8; <span class="comment">// Initial number of buckets</span>
-<a name="l00679"></a>00679 <span class="keyword">static</span> <span class="keyword">const</span> size_type initial_bucket_load = 4; <span class="comment">// Initial maximum number of elements per bucket</span>
-<a name="l00680"></a>00680
-<a name="l00681"></a>00681 <span class="keyword">protected</span>:
-<a name="l00682"></a>00682 <span class="comment">// Constructors/Destructors</span>
-<a name="l00683"></a>00683 concurrent_unordered_base(size_type n_of_buckets = initial_bucket_number,
-<a name="l00684"></a>00684 <span class="keyword">const</span> hash_compare& hc = hash_compare(), <span class="keyword">const</span> allocator_type& a = allocator_type())
-<a name="l00685"></a>00685 : Traits(hc), my_solist(a),
-<a name="l00686"></a>00686 my_allocator(a), my_maximum_bucket_size((float) initial_bucket_load)
-<a name="l00687"></a>00687 {
-<a name="l00688"></a>00688 <span class="keywordflow">if</span>( n_of_buckets == 0) ++n_of_buckets;
-<a name="l00689"></a>00689 my_number_of_buckets = 1<<__TBB_Log2((uintptr_t)n_of_buckets*2-1); <span class="comment">// round up to power of 2</span>
-<a name="l00690"></a>00690 internal_init();
-<a name="l00691"></a>00691 }
-<a name="l00692"></a>00692
-<a name="l00693"></a>00693 concurrent_unordered_base(<span class="keyword">const</span> concurrent_unordered_base& right, <span class="keyword">const</span> allocator_type& a)
-<a name="l00694"></a>00694 : Traits(right.my_hash_compare), my_solist(a), my_allocator(a)
-<a name="l00695"></a>00695 {
-<a name="l00696"></a>00696 internal_init();
-<a name="l00697"></a>00697 internal_copy(right);
-<a name="l00698"></a>00698 }
-<a name="l00699"></a>00699
-<a name="l00700"></a>00700 concurrent_unordered_base(<span class="keyword">const</span> concurrent_unordered_base& right)
-<a name="l00701"></a>00701 : Traits(right.my_hash_compare), my_solist(right.get_allocator()), my_allocator(right.get_allocator())
-<a name="l00702"></a>00702 {
-<a name="l00703"></a>00703 internal_init();
-<a name="l00704"></a>00704 internal_copy(right);
-<a name="l00705"></a>00705 }
-<a name="l00706"></a>00706
-<a name="l00707"></a>00707 concurrent_unordered_base& operator=(<span class="keyword">const</span> concurrent_unordered_base& right) {
-<a name="l00708"></a>00708 <span class="keywordflow">if</span> (<span class="keyword">this</span> != &right)
-<a name="l00709"></a>00709 internal_copy(right);
-<a name="l00710"></a>00710 <span class="keywordflow">return</span> (*<span class="keyword">this</span>);
-<a name="l00711"></a>00711 }
-<a name="l00712"></a>00712
-<a name="l00713"></a>00713 ~concurrent_unordered_base() {
-<a name="l00714"></a>00714 <span class="comment">// Delete all node segments</span>
-<a name="l00715"></a>00715 internal_clear();
-<a name="l00716"></a>00716 }
-<a name="l00717"></a>00717
-<a name="l00718"></a>00718 <span class="keyword">public</span>:
-<a name="l00719"></a>00719 allocator_type get_allocator()<span class="keyword"> const </span>{
-<a name="l00720"></a>00720 <span class="keywordflow">return</span> my_solist.get_allocator();
-<a name="l00721"></a>00721 }
-<a name="l00722"></a>00722
-<a name="l00723"></a>00723 <span class="comment">// Size and capacity function</span>
-<a name="l00724"></a>00724 <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{
-<a name="l00725"></a>00725 <span class="keywordflow">return</span> my_solist.empty();
-<a name="l00726"></a>00726 }
-<a name="l00727"></a>00727
-<a name="l00728"></a>00728 size_type size()<span class="keyword"> const </span>{
-<a name="l00729"></a>00729 <span class="keywordflow">return</span> my_solist.size();
-<a name="l00730"></a>00730 }
-<a name="l00731"></a>00731
-<a name="l00732"></a>00732 size_type max_size()<span class="keyword"> const </span>{
-<a name="l00733"></a>00733 <span class="keywordflow">return</span> my_solist.max_size();
-<a name="l00734"></a>00734 }
-<a name="l00735"></a>00735
-<a name="l00736"></a>00736 <span class="comment">// Iterators </span>
-<a name="l00737"></a>00737 iterator begin() {
-<a name="l00738"></a>00738 <span class="keywordflow">return</span> my_solist.begin();
-<a name="l00739"></a>00739 }
-<a name="l00740"></a>00740
-<a name="l00741"></a>00741 const_iterator begin()<span class="keyword"> const </span>{
-<a name="l00742"></a>00742 <span class="keywordflow">return</span> my_solist.begin();
-<a name="l00743"></a>00743 }
-<a name="l00744"></a>00744
-<a name="l00745"></a>00745 iterator end() {
-<a name="l00746"></a>00746 <span class="keywordflow">return</span> my_solist.end();
-<a name="l00747"></a>00747 }
-<a name="l00748"></a>00748
-<a name="l00749"></a>00749 const_iterator end()<span class="keyword"> const </span>{
-<a name="l00750"></a>00750 <span class="keywordflow">return</span> my_solist.end();
-<a name="l00751"></a>00751 }
-<a name="l00752"></a>00752
-<a name="l00753"></a>00753 const_iterator cbegin()<span class="keyword"> const </span>{
-<a name="l00754"></a>00754 <span class="keywordflow">return</span> my_solist.cbegin();
-<a name="l00755"></a>00755 }
-<a name="l00756"></a>00756
-<a name="l00757"></a>00757 const_iterator cend()<span class="keyword"> const </span>{
-<a name="l00758"></a>00758 <span class="keywordflow">return</span> my_solist.cend();
-<a name="l00759"></a>00759 }
-<a name="l00760"></a>00760
-<a name="l00761"></a>00761 <span class="comment">// Parallel traversal support</span>
-<a name="l00762"></a>00762 <span class="keyword">class </span>const_range_type : tbb::internal::no_assign {
-<a name="l00763"></a>00763 <span class="keyword">const</span> concurrent_unordered_base &my_table;
-<a name="l00764"></a>00764 raw_const_iterator my_begin_node;
-<a name="l00765"></a>00765 raw_const_iterator my_end_node;
-<a name="l00766"></a>00766 <span class="keyword">mutable</span> raw_const_iterator my_midpoint_node;
-<a name="l00767"></a>00767 <span class="keyword">public</span>:
-<a name="l00769"></a>00769 <span class="keyword">typedef</span> <span class="keyword">typename</span> concurrent_unordered_base::size_type size_type;
-<a name="l00770"></a>00770 <span class="keyword">typedef</span> <span class="keyword">typename</span> concurrent_unordered_base::value_type value_type;
-<a name="l00771"></a>00771 <span class="keyword">typedef</span> <span class="keyword">typename</span> concurrent_unordered_base::reference reference;
-<a name="l00772"></a>00772 <span class="keyword">typedef</span> <span class="keyword">typename</span> concurrent_unordered_base::difference_type difference_type;
-<a name="l00773"></a>00773 <span class="keyword">typedef</span> <span class="keyword">typename</span> concurrent_unordered_base::const_iterator iterator;
-<a name="l00774"></a>00774
-<a name="l00776"></a>00776 <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_begin_node == my_end_node;}
-<a name="l00777"></a>00777
-<a name="l00779"></a>00779 <span class="keywordtype">bool</span> is_divisible()<span class="keyword"> const </span>{
-<a name="l00780"></a>00780 <span class="keywordflow">return</span> my_midpoint_node != my_end_node;
-<a name="l00781"></a>00781 }
-<a name="l00783"></a>00783 const_range_type( const_range_type &r, split ) :
-<a name="l00784"></a>00784 my_table(r.my_table), my_end_node(r.my_end_node)
-<a name="l00785"></a>00785 {
-<a name="l00786"></a>00786 r.my_end_node = my_begin_node = r.my_midpoint_node;
-<a name="l00787"></a>00787 __TBB_ASSERT( !empty(), <span class="stringliteral">"Splitting despite the range is not divisible"</span> );
-<a name="l00788"></a>00788 __TBB_ASSERT( !r.empty(), <span class="stringliteral">"Splitting despite the range is not divisible"</span> );
-<a name="l00789"></a>00789 set_midpoint();
-<a name="l00790"></a>00790 r.set_midpoint();
-<a name="l00791"></a>00791 }
-<a name="l00793"></a>00793 const_range_type( <span class="keyword">const</span> concurrent_unordered_base &a_table ) :
-<a name="l00794"></a>00794 my_table(a_table), my_begin_node(a_table.my_solist.begin()),
-<a name="l00795"></a>00795 my_end_node(a_table.my_solist.end())
-<a name="l00796"></a>00796 {
-<a name="l00797"></a>00797 set_midpoint();
-<a name="l00798"></a>00798 }
-<a name="l00799"></a>00799 iterator begin()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> my_table.my_solist.get_iterator(my_begin_node); }
-<a name="l00800"></a>00800 iterator end()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> my_table.my_solist.get_iterator(my_end_node); }
-<a name="l00802"></a>00802 size_type grainsize()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> 1; }
-<a name="l00803"></a>00803
-<a name="l00805"></a>00805 <span class="keywordtype">void</span> set_midpoint()<span class="keyword"> const </span>{
-<a name="l00806"></a>00806 <span class="keywordflow">if</span>( my_begin_node == my_end_node ) <span class="comment">// not divisible</span>
-<a name="l00807"></a>00807 my_midpoint_node = my_end_node;
-<a name="l00808"></a>00808 <span class="keywordflow">else</span> {
-<a name="l00809"></a>00809 sokey_t begin_key = solist_t::get_safe_order_key(my_begin_node);
-<a name="l00810"></a>00810 sokey_t end_key = solist_t::get_safe_order_key(my_end_node);
-<a name="l00811"></a>00811 size_t mid_bucket = __TBB_ReverseBits( begin_key + (end_key-begin_key)/2 ) % my_table.my_number_of_buckets;
-<a name="l00812"></a>00812 <span class="keywordflow">while</span> ( !my_table.is_initialized(mid_bucket) ) mid_bucket = my_table.get_parent(mid_bucket);
-<a name="l00813"></a>00813 my_midpoint_node = my_table.my_solist.first_real_iterator(my_table.get_bucket( mid_bucket ));
-<a name="l00814"></a>00814 <span class="keywordflow">if</span>( my_midpoint_node == my_begin_node )
-<a name="l00815"></a>00815 my_midpoint_node = my_end_node;
-<a name="l00816"></a>00816 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00817"></a>00817 <span class="preprocessor"></span> <span class="keywordflow">else</span> {
-<a name="l00818"></a>00818 sokey_t mid_key = solist_t::get_safe_order_key(my_midpoint_node);
-<a name="l00819"></a>00819 __TBB_ASSERT( begin_key < mid_key, <span class="stringliteral">"my_begin_node is after my_midpoint_node"</span> );
-<a name="l00820"></a>00820 __TBB_ASSERT( mid_key <= end_key, <span class="stringliteral">"my_midpoint_node is after my_end_node"</span> );
-<a name="l00821"></a>00821 }
-<a name="l00822"></a>00822 <span class="preprocessor">#endif // TBB_USE_ASSERT</span>
-<a name="l00823"></a>00823 <span class="preprocessor"></span> }
-<a name="l00824"></a>00824 }
-<a name="l00825"></a>00825 };
-<a name="l00826"></a>00826
-<a name="l00827"></a>00827 <span class="keyword">class </span>range_type : <span class="keyword">public</span> const_range_type {
-<a name="l00828"></a>00828 <span class="keyword">public</span>:
-<a name="l00829"></a>00829 <span class="keyword">typedef</span> <span class="keyword">typename</span> concurrent_unordered_base::iterator iterator;
-<a name="l00831"></a>00831 range_type( range_type &r, split ) : const_range_type( r, split() ) {}
-<a name="l00833"></a>00833 range_type( <span class="keyword">const</span> concurrent_unordered_base &a_table ) : const_range_type(a_table) {}
-<a name="l00834"></a>00834
-<a name="l00835"></a>00835 iterator begin()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> solist_t::get_iterator( const_range_type::begin() ); }
-<a name="l00836"></a>00836 iterator end()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> solist_t::get_iterator( const_range_type::end() ); }
-<a name="l00837"></a>00837 };
-<a name="l00838"></a>00838
-<a name="l00839"></a>00839 range_type range() {
-<a name="l00840"></a>00840 <span class="keywordflow">return</span> range_type( *<span class="keyword">this</span> );
-<a name="l00841"></a>00841 }
-<a name="l00842"></a>00842
-<a name="l00843"></a>00843 const_range_type range()<span class="keyword"> const </span>{
-<a name="l00844"></a>00844 <span class="keywordflow">return</span> const_range_type( *<span class="keyword">this</span> );
-<a name="l00845"></a>00845 }
-<a name="l00846"></a>00846
-<a name="l00847"></a>00847 <span class="comment">// Modifiers</span>
-<a name="l00848"></a>00848 std::pair<iterator, bool> insert(<span class="keyword">const</span> value_type& value) {
-<a name="l00849"></a>00849 <span class="keywordflow">return</span> internal_insert(value);
-<a name="l00850"></a>00850 }
-<a name="l00851"></a>00851
-<a name="l00852"></a>00852 iterator insert(const_iterator, <span class="keyword">const</span> value_type& value) {
-<a name="l00853"></a>00853 <span class="comment">// Ignore hint</span>
-<a name="l00854"></a>00854 <span class="keywordflow">return</span> insert(value).first;
-<a name="l00855"></a>00855 }
-<a name="l00856"></a>00856
-<a name="l00857"></a>00857 <span class="keyword">template</span><<span class="keyword">class</span> Iterator>
-<a name="l00858"></a>00858 <span class="keywordtype">void</span> insert(Iterator first, Iterator last) {
-<a name="l00859"></a>00859 <span class="keywordflow">for</span> (Iterator it = first; it != last; ++it)
-<a name="l00860"></a>00860 insert(*it);
-<a name="l00861"></a>00861 }
-<a name="l00862"></a>00862
-<a name="l00863"></a>00863 iterator unsafe_erase(const_iterator where) {
-<a name="l00864"></a>00864 <span class="keywordflow">return</span> internal_erase(where);
-<a name="l00865"></a>00865 }
-<a name="l00866"></a>00866
-<a name="l00867"></a>00867 iterator unsafe_erase(const_iterator first, const_iterator last) {
-<a name="l00868"></a>00868 <span class="keywordflow">while</span> (first != last)
-<a name="l00869"></a>00869 unsafe_erase(first++);
-<a name="l00870"></a>00870 <span class="keywordflow">return</span> my_solist.get_iterator(first);
-<a name="l00871"></a>00871 }
-<a name="l00872"></a>00872
-<a name="l00873"></a>00873 size_type unsafe_erase(<span class="keyword">const</span> key_type& key) {
-<a name="l00874"></a>00874 pairii_t where = equal_range(key);
-<a name="l00875"></a>00875 size_type item_count = internal_distance(where.first, where.second);
-<a name="l00876"></a>00876 unsafe_erase(where.first, where.second);
-<a name="l00877"></a>00877 <span class="keywordflow">return</span> item_count;
-<a name="l00878"></a>00878 }
-<a name="l00879"></a>00879
-<a name="l00880"></a>00880 <span class="keywordtype">void</span> swap(concurrent_unordered_base& right) {
-<a name="l00881"></a>00881 <span class="keywordflow">if</span> (<span class="keyword">this</span> != &right) {
-<a name="l00882"></a>00882 std::swap(my_hash_compare, right.my_hash_compare); <span class="comment">// TODO: check what ADL meant here</span>
-<a name="l00883"></a>00883 my_solist.swap(right.my_solist);
-<a name="l00884"></a>00884 internal_swap_buckets(right);
-<a name="l00885"></a>00885 std::swap(my_number_of_buckets, right.my_number_of_buckets);
-<a name="l00886"></a>00886 std::swap(my_maximum_bucket_size, right.my_maximum_bucket_size);
-<a name="l00887"></a>00887 }
-<a name="l00888"></a>00888 }
-<a name="l00889"></a>00889
-<a name="l00890"></a>00890 <span class="comment">// Observers</span>
-<a name="l00891"></a>00891 <span class="keywordtype">void</span> clear() {
-<a name="l00892"></a>00892 <span class="comment">// Clear list</span>
-<a name="l00893"></a>00893 my_solist.clear();
-<a name="l00894"></a>00894
-<a name="l00895"></a>00895 <span class="comment">// Clear buckets</span>
-<a name="l00896"></a>00896 internal_clear();
-<a name="l00897"></a>00897
-<a name="l00898"></a>00898 <span class="comment">// Initialize bucket 0</span>
-<a name="l00899"></a>00899 __TBB_ASSERT(my_buckets[0] == NULL, NULL);
-<a name="l00900"></a>00900 raw_iterator dummy_node = my_solist.raw_begin();
-<a name="l00901"></a>00901 set_bucket(0, dummy_node);
-<a name="l00902"></a>00902 }
-<a name="l00903"></a>00903
-<a name="l00904"></a>00904 <span class="comment">// Lookup</span>
-<a name="l00905"></a>00905 iterator find(<span class="keyword">const</span> key_type& key) {
-<a name="l00906"></a>00906 <span class="keywordflow">return</span> internal_find(key);
-<a name="l00907"></a>00907 }
-<a name="l00908"></a>00908
-<a name="l00909"></a>00909 const_iterator find(<span class="keyword">const</span> key_type& key)<span class="keyword"> const </span>{
-<a name="l00910"></a>00910 <span class="keywordflow">return</span> const_cast<self_type*>(<span class="keyword">this</span>)->internal_find(key);
-<a name="l00911"></a>00911 }
-<a name="l00912"></a>00912
-<a name="l00913"></a>00913 size_type count(<span class="keyword">const</span> key_type& key)<span class="keyword"> const </span>{
-<a name="l00914"></a>00914 <span class="keywordflow">if</span>(allow_multimapping) {
-<a name="l00915"></a>00915 paircc_t answer = equal_range(key);
-<a name="l00916"></a>00916 size_type item_count = internal_distance(answer.first, answer.second);
-<a name="l00917"></a>00917 <span class="keywordflow">return</span> item_count;
-<a name="l00918"></a>00918 } <span class="keywordflow">else</span> {
-<a name="l00919"></a>00919 <span class="keywordflow">return</span> const_cast<self_type*>(<span class="keyword">this</span>)->internal_find(key) == end()?0:1;
-<a name="l00920"></a>00920 }
-<a name="l00921"></a>00921 }
-<a name="l00922"></a>00922
-<a name="l00923"></a>00923 std::pair<iterator, iterator> equal_range(<span class="keyword">const</span> key_type& key) {
-<a name="l00924"></a>00924 <span class="keywordflow">return</span> internal_equal_range(key);
-<a name="l00925"></a>00925 }
-<a name="l00926"></a>00926
-<a name="l00927"></a>00927 std::pair<const_iterator, const_iterator> equal_range(<span class="keyword">const</span> key_type& key)<span class="keyword"> const </span>{
-<a name="l00928"></a>00928 <span class="keywordflow">return</span> const_cast<self_type*>(<span class="keyword">this</span>)->internal_equal_range(key);
-<a name="l00929"></a>00929 }
-<a name="l00930"></a>00930
-<a name="l00931"></a>00931 <span class="comment">// Bucket interface - for debugging </span>
-<a name="l00932"></a>00932 size_type unsafe_bucket_count()<span class="keyword"> const </span>{
-<a name="l00933"></a>00933 <span class="keywordflow">return</span> my_number_of_buckets;
-<a name="l00934"></a>00934 }
-<a name="l00935"></a>00935
-<a name="l00936"></a>00936 size_type unsafe_max_bucket_count()<span class="keyword"> const </span>{
-<a name="l00937"></a>00937 <span class="keywordflow">return</span> segment_size(pointers_per_table-1);
-<a name="l00938"></a>00938 }
-<a name="l00939"></a>00939
-<a name="l00940"></a>00940 size_type unsafe_bucket_size(size_type bucket) {
-<a name="l00941"></a>00941 size_type item_count = 0;
-<a name="l00942"></a>00942 <span class="keywordflow">if</span> (is_initialized(bucket)) {
-<a name="l00943"></a>00943 raw_iterator it = get_bucket(bucket);
-<a name="l00944"></a>00944 ++it;
-<a name="l00945"></a>00945 <span class="keywordflow">for</span> (; it != my_solist.raw_end() && !it.get_node_ptr()->is_dummy(); ++it)
-<a name="l00946"></a>00946 ++item_count;
-<a name="l00947"></a>00947 }
-<a name="l00948"></a>00948 <span class="keywordflow">return</span> item_count;
-<a name="l00949"></a>00949 }
-<a name="l00950"></a>00950
-<a name="l00951"></a>00951 size_type unsafe_bucket(<span class="keyword">const</span> key_type& key)<span class="keyword"> const </span>{
-<a name="l00952"></a>00952 sokey_t order_key = (sokey_t) my_hash_compare(key);
-<a name="l00953"></a>00953 size_type bucket = order_key % my_number_of_buckets;
-<a name="l00954"></a>00954 <span class="keywordflow">return</span> bucket;
-<a name="l00955"></a>00955 }
-<a name="l00956"></a>00956
-<a name="l00957"></a>00957 <span class="comment">// If the bucket is initialized, return a first non-dummy element in it</span>
-<a name="l00958"></a>00958 local_iterator unsafe_begin(size_type bucket) {
-<a name="l00959"></a>00959 <span class="keywordflow">if</span> (!is_initialized(bucket))
-<a name="l00960"></a>00960 <span class="keywordflow">return</span> end();
-<a name="l00961"></a>00961
-<a name="l00962"></a>00962 raw_iterator it = get_bucket(bucket);
-<a name="l00963"></a>00963 <span class="keywordflow">return</span> my_solist.first_real_iterator(it);
-<a name="l00964"></a>00964 }
-<a name="l00965"></a>00965
-<a name="l00966"></a>00966 <span class="comment">// If the bucket is initialized, return a first non-dummy element in it</span>
-<a name="l00967"></a>00967 const_local_iterator unsafe_begin(size_type bucket)<span class="keyword"> const</span>
-<a name="l00968"></a>00968 <span class="keyword"> </span>{
-<a name="l00969"></a>00969 <span class="keywordflow">if</span> (!is_initialized(bucket))
-<a name="l00970"></a>00970 <span class="keywordflow">return</span> end();
-<a name="l00971"></a>00971
-<a name="l00972"></a>00972 raw_const_iterator it = get_bucket(bucket);
-<a name="l00973"></a>00973 <span class="keywordflow">return</span> my_solist.first_real_iterator(it);
-<a name="l00974"></a>00974 }
-<a name="l00975"></a>00975
-<a name="l00976"></a>00976 <span class="comment">// @REVIEW: Takes O(n)</span>
-<a name="l00977"></a>00977 <span class="comment">// Returns the iterator after the last non-dummy element in the bucket</span>
-<a name="l00978"></a>00978 local_iterator unsafe_end(size_type bucket)
-<a name="l00979"></a>00979 {
-<a name="l00980"></a>00980 <span class="keywordflow">if</span> (!is_initialized(bucket))
-<a name="l00981"></a>00981 <span class="keywordflow">return</span> end();
-<a name="l00982"></a>00982
-<a name="l00983"></a>00983 raw_iterator it = get_bucket(bucket);
-<a name="l00984"></a>00984
-<a name="l00985"></a>00985 <span class="comment">// Find the end of the bucket, denoted by the dummy element</span>
-<a name="l00986"></a>00986 <span class="keywordflow">do</span> ++it;
-<a name="l00987"></a>00987 <span class="keywordflow">while</span>(it != my_solist.raw_end() && !it.get_node_ptr()->is_dummy());
-<a name="l00988"></a>00988
-<a name="l00989"></a>00989 <span class="comment">// Return the first real element past the end of the bucket</span>
-<a name="l00990"></a>00990 <span class="keywordflow">return</span> my_solist.first_real_iterator(it);
-<a name="l00991"></a>00991 }
-<a name="l00992"></a>00992
-<a name="l00993"></a>00993 <span class="comment">// @REVIEW: Takes O(n)</span>
-<a name="l00994"></a>00994 <span class="comment">// Returns the iterator after the last non-dummy element in the bucket</span>
-<a name="l00995"></a>00995 const_local_iterator unsafe_end(size_type bucket)<span class="keyword"> const</span>
-<a name="l00996"></a>00996 <span class="keyword"> </span>{
-<a name="l00997"></a>00997 <span class="keywordflow">if</span> (!is_initialized(bucket))
-<a name="l00998"></a>00998 <span class="keywordflow">return</span> end();
-<a name="l00999"></a>00999
-<a name="l01000"></a>01000 raw_const_iterator it = get_bucket(bucket);
-<a name="l01001"></a>01001
-<a name="l01002"></a>01002 <span class="comment">// Find the end of the bucket, denoted by the dummy element</span>
-<a name="l01003"></a>01003 <span class="keywordflow">do</span> ++it;
-<a name="l01004"></a>01004 <span class="keywordflow">while</span>(it != my_solist.raw_end() && !it.get_node_ptr()->is_dummy());
-<a name="l01005"></a>01005
-<a name="l01006"></a>01006 <span class="comment">// Return the first real element past the end of the bucket</span>
-<a name="l01007"></a>01007 <span class="keywordflow">return</span> my_solist.first_real_iterator(it);
-<a name="l01008"></a>01008 }
-<a name="l01009"></a>01009
-<a name="l01010"></a>01010 const_local_iterator unsafe_cbegin(size_type bucket)<span class="keyword"> const </span>{
-<a name="l01011"></a>01011 <span class="keywordflow">return</span> ((<span class="keyword">const</span> self_type *) <span class="keyword">this</span>)->begin();
-<a name="l01012"></a>01012 }
-<a name="l01013"></a>01013
-<a name="l01014"></a>01014 const_local_iterator unsafe_cend(size_type bucket)<span class="keyword"> const </span>{
-<a name="l01015"></a>01015 <span class="keywordflow">return</span> ((<span class="keyword">const</span> self_type *) <span class="keyword">this</span>)->end();
-<a name="l01016"></a>01016 }
-<a name="l01017"></a>01017
-<a name="l01018"></a>01018 <span class="comment">// Hash policy</span>
-<a name="l01019"></a>01019 <span class="keywordtype">float</span> load_factor()<span class="keyword"> const </span>{
-<a name="l01020"></a>01020 <span class="keywordflow">return</span> (<span class="keywordtype">float</span>) size() / (float) unsafe_bucket_count();
-<a name="l01021"></a>01021 }
-<a name="l01022"></a>01022
-<a name="l01023"></a>01023 <span class="keywordtype">float</span> max_load_factor()<span class="keyword"> const </span>{
-<a name="l01024"></a>01024 <span class="keywordflow">return</span> my_maximum_bucket_size;
-<a name="l01025"></a>01025 }
-<a name="l01026"></a>01026
-<a name="l01027"></a>01027 <span class="keywordtype">void</span> max_load_factor(<span class="keywordtype">float</span> newmax) {
-<a name="l01028"></a>01028 <span class="keywordflow">if</span> (newmax != newmax || newmax < 0)
-<a name="l01029"></a>01029 tbb::internal::throw_exception(tbb::internal::eid_invalid_load_factor);
-<a name="l01030"></a>01030 my_maximum_bucket_size = newmax;
-<a name="l01031"></a>01031 }
-<a name="l01032"></a>01032
-<a name="l01033"></a>01033 <span class="comment">// This function is a noop, because the underlying split-ordered list</span>
-<a name="l01034"></a>01034 <span class="comment">// is already sorted, so an increase in the bucket number will be</span>
-<a name="l01035"></a>01035 <span class="comment">// reflected next time this bucket is touched.</span>
-<a name="l01036"></a>01036 <span class="keywordtype">void</span> rehash(size_type buckets) {
-<a name="l01037"></a>01037 size_type current_buckets = my_number_of_buckets;
-<a name="l01038"></a>01038 <span class="keywordflow">if</span> (current_buckets >= buckets)
-<a name="l01039"></a>01039 <span class="keywordflow">return</span>;
-<a name="l01040"></a>01040 my_number_of_buckets = 1<<__TBB_Log2((uintptr_t)buckets*2-1); <span class="comment">// round up to power of 2</span>
-<a name="l01041"></a>01041 }
-<a name="l01042"></a>01042
-<a name="l01043"></a>01043 <span class="keyword">private</span>:
-<a name="l01044"></a>01044
-<a name="l01045"></a>01045 <span class="comment">// Initialize the hash and keep the first bucket open</span>
-<a name="l01046"></a>01046 <span class="keywordtype">void</span> internal_init() {
-<a name="l01047"></a>01047 <span class="comment">// Allocate an array of segment pointers</span>
-<a name="l01048"></a>01048 memset(my_buckets, 0, pointers_per_table * <span class="keyword">sizeof</span>(<span class="keywordtype">void</span> *));
-<a name="l01049"></a>01049
-<a name="l01050"></a>01050 <span class="comment">// Initialize bucket 0</span>
-<a name="l01051"></a>01051 raw_iterator dummy_node = my_solist.raw_begin();
-<a name="l01052"></a>01052 set_bucket(0, dummy_node);
-<a name="l01053"></a>01053 }
-<a name="l01054"></a>01054
-<a name="l01055"></a>01055 <span class="keywordtype">void</span> internal_clear() {
-<a name="l01056"></a>01056 <span class="keywordflow">for</span> (size_type index = 0; index < pointers_per_table; ++index) {
-<a name="l01057"></a>01057 <span class="keywordflow">if</span> (my_buckets[index] != NULL) {
-<a name="l01058"></a>01058 size_type sz = segment_size(index);
-<a name="l01059"></a>01059 <span class="keywordflow">for</span> (size_type index2 = 0; index2 < sz; ++index2)
-<a name="l01060"></a>01060 my_allocator.destroy(&my_buckets[index][index2]);
-<a name="l01061"></a>01061 my_allocator.deallocate(my_buckets[index], sz);
-<a name="l01062"></a>01062 my_buckets[index] = 0;
-<a name="l01063"></a>01063 }
-<a name="l01064"></a>01064 }
-<a name="l01065"></a>01065 }
-<a name="l01066"></a>01066
-<a name="l01067"></a>01067 <span class="keywordtype">void</span> internal_copy(<span class="keyword">const</span> self_type& right) {
-<a name="l01068"></a>01068 clear();
-<a name="l01069"></a>01069
-<a name="l01070"></a>01070 my_maximum_bucket_size = right.my_maximum_bucket_size;
-<a name="l01071"></a>01071 my_number_of_buckets = right.my_number_of_buckets;
-<a name="l01072"></a>01072
-<a name="l01073"></a>01073 __TBB_TRY {
-<a name="l01074"></a>01074 insert(right.begin(), right.end());
-<a name="l01075"></a>01075 my_hash_compare = right.my_hash_compare;
-<a name="l01076"></a>01076 } __TBB_CATCH(...) {
-<a name="l01077"></a>01077 my_solist.clear();
-<a name="l01078"></a>01078 __TBB_RETHROW();
-<a name="l01079"></a>01079 }
-<a name="l01080"></a>01080 }
-<a name="l01081"></a>01081
-<a name="l01082"></a>01082 <span class="keywordtype">void</span> internal_swap_buckets(concurrent_unordered_base& right)
-<a name="l01083"></a>01083 {
-<a name="l01084"></a>01084 <span class="comment">// Swap all node segments</span>
-<a name="l01085"></a>01085 <span class="keywordflow">for</span> (size_type index = 0; index < pointers_per_table; ++index)
-<a name="l01086"></a>01086 {
-<a name="l01087"></a>01087 raw_iterator * iterator_pointer = my_buckets[index];
-<a name="l01088"></a>01088 my_buckets[index] = right.my_buckets[index];
-<a name="l01089"></a>01089 right.my_buckets[index] = iterator_pointer;
-<a name="l01090"></a>01090 }
-<a name="l01091"></a>01091 }
-<a name="l01092"></a>01092
-<a name="l01093"></a>01093 <span class="comment">// Hash APIs</span>
-<a name="l01094"></a>01094 size_type internal_distance(const_iterator first, const_iterator last)<span class="keyword"> const</span>
-<a name="l01095"></a>01095 <span class="keyword"> </span>{
-<a name="l01096"></a>01096 size_type num = 0;
-<a name="l01097"></a>01097
-<a name="l01098"></a>01098 <span class="keywordflow">for</span> (const_iterator it = first; it != last; ++it)
-<a name="l01099"></a>01099 ++num;
-<a name="l01100"></a>01100
-<a name="l01101"></a>01101 <span class="keywordflow">return</span> num;
-<a name="l01102"></a>01102 }
-<a name="l01103"></a>01103
-<a name="l01104"></a>01104 <span class="comment">// Insert an element in the hash given its value</span>
-<a name="l01105"></a>01105 std::pair<iterator, bool> internal_insert(<span class="keyword">const</span> value_type& value)
-<a name="l01106"></a>01106 {
-<a name="l01107"></a>01107 sokey_t order_key = (sokey_t) my_hash_compare(get_key(value));
-<a name="l01108"></a>01108 size_type bucket = order_key % my_number_of_buckets;
-<a name="l01109"></a>01109
-<a name="l01110"></a>01110 <span class="comment">// If bucket is empty, initialize it first</span>
-<a name="l01111"></a>01111 <span class="keywordflow">if</span> (!is_initialized(bucket))
-<a name="l01112"></a>01112 init_bucket(bucket);
-<a name="l01113"></a>01113
-<a name="l01114"></a>01114 size_type new_count;
-<a name="l01115"></a>01115 order_key = split_order_key_regular(order_key);
-<a name="l01116"></a>01116 raw_iterator it = get_bucket(bucket);
-<a name="l01117"></a>01117 raw_iterator last = my_solist.raw_end();
-<a name="l01118"></a>01118 raw_iterator where = it;
-<a name="l01119"></a>01119
-<a name="l01120"></a>01120 __TBB_ASSERT(where != last, <span class="stringliteral">"Invalid head node"</span>);
-<a name="l01121"></a>01121
-<a name="l01122"></a>01122 <span class="comment">// First node is a dummy node</span>
-<a name="l01123"></a>01123 ++where;
-<a name="l01124"></a>01124
-<a name="l01125"></a>01125 <span class="keywordflow">for</span> (;;)
-<a name="l01126"></a>01126 {
-<a name="l01127"></a>01127 <span class="keywordflow">if</span> (where == last || solist_t::get_order_key(where) > order_key)
-<a name="l01128"></a>01128 {
-<a name="l01129"></a>01129 <span class="comment">// Try to insert it in the right place</span>
-<a name="l01130"></a>01130 std::pair<iterator, bool> result = my_solist.try_insert(it, where, value, order_key, &new_count);
-<a name="l01131"></a>01131
-<a name="l01132"></a>01132 <span class="keywordflow">if</span> (result.second)
-<a name="l01133"></a>01133 {
-<a name="l01134"></a>01134 <span class="comment">// Insertion succeeded, adjust the table size, if needed</span>
-<a name="l01135"></a>01135 adjust_table_size(new_count, my_number_of_buckets);
-<a name="l01136"></a>01136 <span class="keywordflow">return</span> result;
-<a name="l01137"></a>01137 }
-<a name="l01138"></a>01138 <span class="keywordflow">else</span>
-<a name="l01139"></a>01139 {
-<a name="l01140"></a>01140 <span class="comment">// Insertion failed: either the same node was inserted by another thread, or</span>
-<a name="l01141"></a>01141 <span class="comment">// another element was inserted at exactly the same place as this node.</span>
-<a name="l01142"></a>01142 <span class="comment">// Proceed with the search from the previous location where order key was</span>
-<a name="l01143"></a>01143 <span class="comment">// known to be larger (note: this is legal only because there is no safe</span>
-<a name="l01144"></a>01144 <span class="comment">// concurrent erase operation supported).</span>
-<a name="l01145"></a>01145 where = it;
-<a name="l01146"></a>01146 ++where;
-<a name="l01147"></a>01147 <span class="keywordflow">continue</span>;
-<a name="l01148"></a>01148 }
-<a name="l01149"></a>01149 }
-<a name="l01150"></a>01150 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!allow_multimapping && solist_t::get_order_key(where) == order_key && my_hash_compare(get_key(*where), get_key(value)) == 0)
-<a name="l01151"></a>01151 {
-<a name="l01152"></a>01152 <span class="comment">// Element already in the list, return it</span>
-<a name="l01153"></a>01153 <span class="keywordflow">return</span> std::pair<iterator, bool>(my_solist.get_iterator(where), <span class="keyword">false</span>);
-<a name="l01154"></a>01154 }
-<a name="l01155"></a>01155
-<a name="l01156"></a>01156 <span class="comment">// Move the iterator forward</span>
-<a name="l01157"></a>01157 it = where;
-<a name="l01158"></a>01158 ++where;
-<a name="l01159"></a>01159 }
-<a name="l01160"></a>01160 }
-<a name="l01161"></a>01161
-<a name="l01162"></a>01162 <span class="comment">// Find the element in the split-ordered list</span>
-<a name="l01163"></a>01163 iterator internal_find(<span class="keyword">const</span> key_type& key)
-<a name="l01164"></a>01164 {
-<a name="l01165"></a>01165 sokey_t order_key = (sokey_t) my_hash_compare(key);
-<a name="l01166"></a>01166 size_type bucket = order_key % my_number_of_buckets;
-<a name="l01167"></a>01167
-<a name="l01168"></a>01168 <span class="comment">// If bucket is empty, initialize it first</span>
-<a name="l01169"></a>01169 <span class="keywordflow">if</span> (!is_initialized(bucket))
-<a name="l01170"></a>01170 init_bucket(bucket);
-<a name="l01171"></a>01171
-<a name="l01172"></a>01172 order_key = split_order_key_regular(order_key);
-<a name="l01173"></a>01173 raw_iterator last = my_solist.raw_end();
-<a name="l01174"></a>01174
-<a name="l01175"></a>01175 <span class="keywordflow">for</span> (raw_iterator it = get_bucket(bucket); it != last; ++it)
-<a name="l01176"></a>01176 {
-<a name="l01177"></a>01177 <span class="keywordflow">if</span> (solist_t::get_order_key(it) > order_key)
-<a name="l01178"></a>01178 {
-<a name="l01179"></a>01179 <span class="comment">// If the order key is smaller than the current order key, the element</span>
-<a name="l01180"></a>01180 <span class="comment">// is not in the hash.</span>
-<a name="l01181"></a>01181 <span class="keywordflow">return</span> end();
-<a name="l01182"></a>01182 }
-<a name="l01183"></a>01183 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (solist_t::get_order_key(it) == order_key)
-<a name="l01184"></a>01184 {
-<a name="l01185"></a>01185 <span class="comment">// The fact that order keys match does not mean that the element is found.</span>
-<a name="l01186"></a>01186 <span class="comment">// Key function comparison has to be performed to check whether this is the</span>
-<a name="l01187"></a>01187 <span class="comment">// right element. If not, keep searching while order key is the same.</span>
-<a name="l01188"></a>01188 <span class="keywordflow">if</span> (!my_hash_compare(get_key(*it), key))
-<a name="l01189"></a>01189 <span class="keywordflow">return</span> my_solist.get_iterator(it);
-<a name="l01190"></a>01190 }
-<a name="l01191"></a>01191 }
-<a name="l01192"></a>01192
-<a name="l01193"></a>01193 <span class="keywordflow">return</span> end();
-<a name="l01194"></a>01194 }
-<a name="l01195"></a>01195
-<a name="l01196"></a>01196 <span class="comment">// Erase an element from the list. This is not a concurrency safe function.</span>
-<a name="l01197"></a>01197 iterator internal_erase(const_iterator it)
-<a name="l01198"></a>01198 {
-<a name="l01199"></a>01199 key_type key = get_key(*it);
-<a name="l01200"></a>01200 sokey_t order_key = (sokey_t) my_hash_compare(key);
-<a name="l01201"></a>01201 size_type bucket = order_key % my_number_of_buckets;
-<a name="l01202"></a>01202
-<a name="l01203"></a>01203 <span class="comment">// If bucket is empty, initialize it first</span>
-<a name="l01204"></a>01204 <span class="keywordflow">if</span> (!is_initialized(bucket))
-<a name="l01205"></a>01205 init_bucket(bucket);
-<a name="l01206"></a>01206
-<a name="l01207"></a>01207 order_key = split_order_key_regular(order_key);
-<a name="l01208"></a>01208
-<a name="l01209"></a>01209 raw_iterator previous = get_bucket(bucket);
-<a name="l01210"></a>01210 raw_iterator last = my_solist.raw_end();
-<a name="l01211"></a>01211 raw_iterator where = previous;
-<a name="l01212"></a>01212
-<a name="l01213"></a>01213 __TBB_ASSERT(where != last, <span class="stringliteral">"Invalid head node"</span>);
-<a name="l01214"></a>01214
-<a name="l01215"></a>01215 <span class="comment">// First node is a dummy node</span>
-<a name="l01216"></a>01216 ++where;
-<a name="l01217"></a>01217
-<a name="l01218"></a>01218 <span class="keywordflow">for</span> (;;) {
-<a name="l01219"></a>01219 <span class="keywordflow">if</span> (where == last)
-<a name="l01220"></a>01220 <span class="keywordflow">return</span> end();
-<a name="l01221"></a>01221 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (my_solist.get_iterator(where) == it)
-<a name="l01222"></a>01222 <span class="keywordflow">return</span> my_solist.erase_node(previous, it);
-<a name="l01223"></a>01223
-<a name="l01224"></a>01224 <span class="comment">// Move the iterator forward</span>
-<a name="l01225"></a>01225 previous = where;
-<a name="l01226"></a>01226 ++where;
-<a name="l01227"></a>01227 }
-<a name="l01228"></a>01228 }
-<a name="l01229"></a>01229
-<a name="l01230"></a>01230 <span class="comment">// Return the [begin, end) pair of iterators with the same key values.</span>
-<a name="l01231"></a>01231 <span class="comment">// This operation makes sense only if mapping is many-to-one.</span>
-<a name="l01232"></a>01232 pairii_t internal_equal_range(<span class="keyword">const</span> key_type& key)
-<a name="l01233"></a>01233 {
-<a name="l01234"></a>01234 sokey_t order_key = (sokey_t) my_hash_compare(key);
-<a name="l01235"></a>01235 size_type bucket = order_key % my_number_of_buckets;
-<a name="l01236"></a>01236
-<a name="l01237"></a>01237 <span class="comment">// If bucket is empty, initialize it first</span>
-<a name="l01238"></a>01238 <span class="keywordflow">if</span> (!is_initialized(bucket))
-<a name="l01239"></a>01239 init_bucket(bucket);
-<a name="l01240"></a>01240
-<a name="l01241"></a>01241 order_key = split_order_key_regular(order_key);
-<a name="l01242"></a>01242 raw_iterator end_it = my_solist.raw_end();
-<a name="l01243"></a>01243
-<a name="l01244"></a>01244 <span class="keywordflow">for</span> (raw_iterator it = get_bucket(bucket); it != end_it; ++it)
-<a name="l01245"></a>01245 {
-<a name="l01246"></a>01246 <span class="keywordflow">if</span> (solist_t::get_order_key(it) > order_key)
-<a name="l01247"></a>01247 {
-<a name="l01248"></a>01248 <span class="comment">// There is no element with the given key</span>
-<a name="l01249"></a>01249 <span class="keywordflow">return</span> pairii_t(end(), end());
-<a name="l01250"></a>01250 }
-<a name="l01251"></a>01251 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (solist_t::get_order_key(it) == order_key && !my_hash_compare(get_key(*it), key))
-<a name="l01252"></a>01252 {
-<a name="l01253"></a>01253 iterator first = my_solist.get_iterator(it);
-<a name="l01254"></a>01254 iterator last = first;
-<a name="l01255"></a>01255 <span class="keywordflow">do</span> ++last; <span class="keywordflow">while</span>( allow_multimapping && last != end() && !my_hash_compare(get_key(*last), key) );
-<a name="l01256"></a>01256 <span class="keywordflow">return</span> pairii_t(first, last);
-<a name="l01257"></a>01257 }
-<a name="l01258"></a>01258 }
-<a name="l01259"></a>01259
-<a name="l01260"></a>01260 <span class="keywordflow">return</span> pairii_t(end(), end());
-<a name="l01261"></a>01261 }
-<a name="l01262"></a>01262
-<a name="l01263"></a>01263 <span class="comment">// Bucket APIs</span>
-<a name="l01264"></a>01264 <span class="keywordtype">void</span> init_bucket(size_type bucket)
-<a name="l01265"></a>01265 {
-<a name="l01266"></a>01266 <span class="comment">// Bucket 0 has no parent.</span>
-<a name="l01267"></a>01267 __TBB_ASSERT( bucket != 0, <span class="stringliteral">"The first bucket must always be initialized"</span>);
-<a name="l01268"></a>01268
-<a name="l01269"></a>01269 size_type parent_bucket = get_parent(bucket);
-<a name="l01270"></a>01270
-<a name="l01271"></a>01271 <span class="comment">// All parent_bucket buckets have to be initialized before this bucket is</span>
-<a name="l01272"></a>01272 <span class="keywordflow">if</span> (!is_initialized(parent_bucket))
-<a name="l01273"></a>01273 init_bucket(parent_bucket);
-<a name="l01274"></a>01274
-<a name="l01275"></a>01275 raw_iterator parent = get_bucket(parent_bucket);
-<a name="l01276"></a>01276
-<a name="l01277"></a>01277 <span class="comment">// Create a dummy first node in this bucket</span>
-<a name="l01278"></a>01278 raw_iterator dummy_node = my_solist.insert_dummy(parent, split_order_key_dummy(bucket));
-<a name="l01279"></a>01279 set_bucket(bucket, dummy_node);
-<a name="l01280"></a>01280 }
-<a name="l01281"></a>01281
-<a name="l01282"></a>01282 <span class="keywordtype">void</span> adjust_table_size(size_type total_elements, size_type current_size)
-<a name="l01283"></a>01283 {
-<a name="l01284"></a>01284 <span class="comment">// Grow the table by a factor of 2 if possible and needed</span>
-<a name="l01285"></a>01285 <span class="keywordflow">if</span> ( ((<span class="keywordtype">float</span>) total_elements / (<span class="keywordtype">float</span>) current_size) > my_maximum_bucket_size )
-<a name="l01286"></a>01286 {
-<a name="l01287"></a>01287 <span class="comment">// Double the size of the hash only if size has not changed inbetween loads</span>
-<a name="l01288"></a>01288 __TBB_CompareAndSwapW((uintptr_t*)&my_number_of_buckets, uintptr_t(2u*current_size), uintptr_t(current_size) );
-<a name="l01289"></a>01289 <span class="comment">//Simple "my_number_of_buckets.compare_and_swap( current_size<<1, current_size );" does not work for VC8</span>
-<a name="l01290"></a>01290 <span class="comment">//due to overzealous compiler warnings in /Wp64 mode</span>
-<a name="l01291"></a>01291 }
-<a name="l01292"></a>01292 }
-<a name="l01293"></a>01293
-<a name="l01294"></a>01294 size_type get_parent(size_type bucket)<span class="keyword"> const</span>
-<a name="l01295"></a>01295 <span class="keyword"> </span>{
-<a name="l01296"></a>01296 <span class="comment">// Unsets bucket's most significant turned-on bit</span>
-<a name="l01297"></a>01297 size_type msb = __TBB_Log2((uintptr_t)bucket);
-<a name="l01298"></a>01298 <span class="keywordflow">return</span> bucket & ~(size_type(1) << msb);
-<a name="l01299"></a>01299 }
-<a name="l01300"></a>01300
-<a name="l01301"></a>01301
-<a name="l01302"></a>01302 <span class="comment">// Dynamic sized array (segments)</span>
-<a name="l01304"></a>01304 <span class="comment"></span> <span class="keyword">static</span> size_type segment_index_of( size_type index ) {
-<a name="l01305"></a>01305 <span class="keywordflow">return</span> size_type( __TBB_Log2( uintptr_t(index|1) ) );
-<a name="l01306"></a>01306 }
-<a name="l01307"></a>01307
-<a name="l01309"></a>01309 <span class="keyword">static</span> size_type segment_base( size_type k ) {
-<a name="l01310"></a>01310 <span class="keywordflow">return</span> (size_type(1)<<k & ~size_type(1));
-<a name="l01311"></a>01311 }
-<a name="l01312"></a>01312
-<a name="l01314"></a>01314 <span class="keyword">static</span> size_type segment_size( size_type k ) {
-<a name="l01315"></a>01315 <span class="keywordflow">return</span> k? size_type(1)<<k : 2;
-<a name="l01316"></a>01316 }
-<a name="l01317"></a>01317
-<a name="l01318"></a>01318 raw_iterator get_bucket(size_type bucket)<span class="keyword"> const </span>{
-<a name="l01319"></a>01319 size_type segment = segment_index_of(bucket);
-<a name="l01320"></a>01320 bucket -= segment_base(segment);
-<a name="l01321"></a>01321 __TBB_ASSERT( my_buckets[segment], <span class="stringliteral">"bucket must be in an allocated segment"</span> );
-<a name="l01322"></a>01322 <span class="keywordflow">return</span> my_buckets[segment][bucket];
-<a name="l01323"></a>01323 }
-<a name="l01324"></a>01324
-<a name="l01325"></a>01325 <span class="keywordtype">void</span> set_bucket(size_type bucket, raw_iterator dummy_head) {
-<a name="l01326"></a>01326 size_type segment = segment_index_of(bucket);
-<a name="l01327"></a>01327 bucket -= segment_base(segment);
-<a name="l01328"></a>01328
-<a name="l01329"></a>01329 <span class="keywordflow">if</span> (my_buckets[segment] == NULL) {
-<a name="l01330"></a>01330 size_type sz = segment_size(segment);
-<a name="l01331"></a>01331 raw_iterator * new_segment = my_allocator.allocate(sz);
-<a name="l01332"></a>01332 std::memset(new_segment, 0, sz*<span class="keyword">sizeof</span>(raw_iterator));
-<a name="l01333"></a>01333
-<a name="l01334"></a>01334 <span class="keywordflow">if</span> (__TBB_CompareAndSwapW((<span class="keywordtype">void</span> *) &my_buckets[segment], (uintptr_t)new_segment, 0) != 0)
-<a name="l01335"></a>01335 my_allocator.deallocate(new_segment, sz);
-<a name="l01336"></a>01336 }
-<a name="l01337"></a>01337
-<a name="l01338"></a>01338 my_buckets[segment][bucket] = dummy_head;
-<a name="l01339"></a>01339 }
-<a name="l01340"></a>01340
-<a name="l01341"></a>01341 <span class="keywordtype">bool</span> is_initialized(size_type bucket)<span class="keyword"> const </span>{
-<a name="l01342"></a>01342 size_type segment = segment_index_of(bucket);
-<a name="l01343"></a>01343 bucket -= segment_base(segment);
-<a name="l01344"></a>01344
-<a name="l01345"></a>01345 <span class="keywordflow">if</span> (my_buckets[segment] == NULL)
-<a name="l01346"></a>01346 <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l01347"></a>01347
-<a name="l01348"></a>01348 raw_iterator it = my_buckets[segment][bucket];
-<a name="l01349"></a>01349 <span class="keywordflow">return</span> (it.get_node_ptr() != NULL);
-<a name="l01350"></a>01350 }
-<a name="l01351"></a>01351
-<a name="l01352"></a>01352 <span class="comment">// Utilities for keys</span>
-<a name="l01353"></a>01353
-<a name="l01354"></a>01354 <span class="comment">// A regular order key has its original hash value reversed and the last bit set</span>
-<a name="l01355"></a>01355 sokey_t split_order_key_regular(sokey_t order_key)<span class="keyword"> const </span>{
-<a name="l01356"></a>01356 <span class="keywordflow">return</span> __TBB_ReverseBits(order_key) | 0x1;
-<a name="l01357"></a>01357 }
-<a name="l01358"></a>01358
-<a name="l01359"></a>01359 <span class="comment">// A dummy order key has its original hash value reversed and the last bit unset</span>
-<a name="l01360"></a>01360 sokey_t split_order_key_dummy(sokey_t order_key)<span class="keyword"> const </span>{
-<a name="l01361"></a>01361 <span class="keywordflow">return</span> __TBB_ReverseBits(order_key) & ~(0x1);
-<a name="l01362"></a>01362 }
-<a name="l01363"></a>01363
-<a name="l01364"></a>01364 <span class="comment">// Shared variables</span>
-<a name="l01365"></a>01365 atomic<size_type> my_number_of_buckets; <span class="comment">// Current table size</span>
-<a name="l01366"></a>01366 solist_t my_solist; <span class="comment">// List where all the elements are kept</span>
-<a name="l01367"></a>01367 <span class="keyword">typename</span> allocator_type::template rebind<raw_iterator>::other my_allocator; <span class="comment">// Allocator object for segments</span>
-<a name="l01368"></a>01368 <span class="keywordtype">float</span> my_maximum_bucket_size; <span class="comment">// Maximum size of the bucket</span>
-<a name="l01369"></a>01369 atomic<raw_iterator*> my_buckets[pointers_per_table]; <span class="comment">// The segment table</span>
-<a name="l01370"></a>01370 };
-<a name="l01371"></a>01371 <span class="preprocessor">#if _MSC_VER</span>
-<a name="l01372"></a>01372 <span class="preprocessor"></span><span class="preprocessor">#pragma warning(pop) // warning 4127 -- while (true) has a constant expression in it</span>
-<a name="l01373"></a>01373 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l01374"></a>01374 <span class="preprocessor"></span>
-<a name="l01376"></a>01376 <span class="keyword">static</span> <span class="keyword">const</span> size_t hash_multiplier = <span class="keyword">sizeof</span>(size_t)==4? 2654435769U : 11400714819323198485ULL;
-<a name="l01377"></a>01377 } <span class="comment">// namespace internal</span>
-<a name="l01380"></a>01380 <span class="comment"></span><span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l01381"></a>01381 <span class="keyword">inline</span> size_t tbb_hasher( <span class="keyword">const</span> T& t ) {
-<a name="l01382"></a>01382 <span class="keywordflow">return</span> static_cast<size_t>( t ) * internal::hash_multiplier;
-<a name="l01383"></a>01383 }
-<a name="l01384"></a>01384 <span class="keyword">template</span><<span class="keyword">typename</span> P>
-<a name="l01385"></a>01385 <span class="keyword">inline</span> size_t tbb_hasher( P* ptr ) {
-<a name="l01386"></a>01386 size_t <span class="keyword">const</span> h = reinterpret_cast<size_t>( ptr );
-<a name="l01387"></a>01387 <span class="keywordflow">return</span> (h >> 3) ^ h;
-<a name="l01388"></a>01388 }
-<a name="l01389"></a>01389 <span class="keyword">template</span><<span class="keyword">typename</span> E, <span class="keyword">typename</span> S, <span class="keyword">typename</span> A>
-<a name="l01390"></a>01390 <span class="keyword">inline</span> size_t tbb_hasher( <span class="keyword">const</span> std::basic_string<E,S,A>& s ) {
-<a name="l01391"></a>01391 size_t h = 0;
-<a name="l01392"></a>01392 <span class="keywordflow">for</span>( <span class="keyword">const</span> E* c = s.c_str(); *c; ++c )
-<a name="l01393"></a>01393 h = static_cast<size_t>(*c) ^ (h * internal::hash_multiplier);
-<a name="l01394"></a>01394 <span class="keywordflow">return</span> h;
-<a name="l01395"></a>01395 }
-<a name="l01396"></a>01396 <span class="keyword">template</span><<span class="keyword">typename</span> F, <span class="keyword">typename</span> S>
-<a name="l01397"></a>01397 <span class="keyword">inline</span> size_t tbb_hasher( <span class="keyword">const</span> std::pair<F,S>& p ) {
-<a name="l01398"></a>01398 <span class="keywordflow">return</span> tbb_hasher(p.first) ^ tbb_hasher(p.second);
-<a name="l01399"></a>01399 }
-<a name="l01400"></a>01400 } <span class="comment">// namespace interface5</span>
-<a name="l01401"></a>01401 <span class="keyword">using</span> interface5::tbb_hasher;
-<a name="l01402"></a>01402 } <span class="comment">// namespace tbb</span>
-<a name="l01403"></a>01403 <span class="preprocessor">#endif// __TBB_concurrent_unordered_internal_H</span>
-</pre></div><hr>
+<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="a00227.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="a00227.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="a00238.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="a00238.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="a00239.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="a00239.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">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="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">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="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="a00299.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="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="a00300.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="a00300.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::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="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="a00318.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="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="a00326.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="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="a00327.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="a00327.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="a00397.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="a00397.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="a00397.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="a00397.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="a00397.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="a00397.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="a00397.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="a00397.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="a00397.html#g0965ce1b4b7835f92869c7fd867265f7">scalable_msize</a> (void *ptr)</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">
+
+<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">
+
+<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">
+
+<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">
+
+<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">
+
+<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)" -->
+<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>
+ </tr>
+ </table>
+</div>
+<div class="memdoc">
+
+<p>
+The "malloc" analogue to allocate block of memory of size bytes.
+</div>
+</div><p>
+<a class="anchor" name="g0965ce1b4b7835f92869c7fd867265f7"></a><!-- doxytag: member="scalable_allocator.h::scalable_msize" ref="g0965ce1b4b7835f92869c7fd867265f7" args="(void *ptr)" -->
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">size_t __TBB_EXPORTED_FUNC scalable_msize </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">
+
+<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">
+
+<p>
+The "realloc" analogue complementing scalable_malloc.
+</div>
+</div><p>
+<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
<p></p>
diff --git a/doc/html/a00374.html b/doc/html/a00398.html
similarity index 74%
rename from doc/html/a00374.html
rename to doc/html/a00398.html
index 9a0d85b..c5e70a7 100644
--- a/doc/html/a00374.html
+++ b/doc/html/a00398.html
@@ -17,36 +17,36 @@
<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="a00216.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="a00228.html">tbb::atomic< T ></a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Primary template for atomic. <a href="a00216.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">tbb::mutex</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Primary template for atomic. <a href="a00228.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::mutex</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Wrapper around the platform's native reader-writer lock. <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="a00260.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="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="a00277.html">tbb::null_mutex</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A mutex which does nothing. <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="a00262.html">tbb::null_rw_mutex</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A mutex which does nothing. <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">tbb::null_rw_mutex</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A rw mutex which does nothing. <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="a00270.html">tbb::queuing_mutex</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A rw mutex which does nothing. <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="a00288.html">tbb::queuing_mutex</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Queuing lock with local-only spinning. <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="a00272.html">tbb::queuing_rw_mutex</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Queuing lock with local-only spinning. <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="a00290.html">tbb::queuing_rw_mutex</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Reader-writer lock with local-only spinning. <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="a00274.html">tbb::interface5::reader_writer_lock</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Reader-writer lock with local-only spinning. <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="a00292.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="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="a00278.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="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="a00296.html">tbb::recursive_mutex</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Mutex that allows recursive mutex acquisition. <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="a00286.html">tbb::spin_mutex</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Mutex that allows recursive mutex acquisition. <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="a00305.html">tbb::spin_mutex</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A lock that occupies a single byte. <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="a00288.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="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">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="a00288.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="a00307.html#_details">More...</a><br></td></tr>
</table>
<hr>
<p></p>
diff --git a/doc/html/a00375.html b/doc/html/a00399.html
similarity index 92%
rename from doc/html/a00375.html
rename to doc/html/a00399.html
index f797583..417436a 100644
--- a/doc/html/a00375.html
+++ b/doc/html/a00399.html
@@ -17,9 +17,9 @@
<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="a00302.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="a00323.html">tbb::tick_count</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Absolute timestamp. <a href="a00302.html#_details">More...</a><br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Absolute timestamp. <a href="a00323.html#_details">More...</a><br></td></tr>
</table>
<hr>
<p></p>
diff --git a/doc/html/a00376.html b/doc/html/a00400.html
similarity index 80%
rename from doc/html/a00376.html
rename to doc/html/a00400.html
index 001c4bc..f7a8d60 100644
--- a/doc/html/a00376.html
+++ b/doc/html/a00400.html
@@ -17,21 +17,21 @@
<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="a00293.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="a00313.html">tbb::task_group_context</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Used to form groups of tasks. <a href="a00293.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::task</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Used to form groups of tasks. <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="a00311.html">tbb::task</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Base class for user-defined tasks. <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="a00242.html">tbb::empty_task</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Base class for user-defined tasks. <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="a00254.html">tbb::empty_task</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">task that does nothing. Useful for synchronization. <a href="a00242.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::task_list</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">task that does nothing. Useful for synchronization. <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="a00315.html">tbb::task_list</a></td></tr>
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A list of children. <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="a00295.html">tbb::task_scheduler_init</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A list of children. <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="a00316.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="a00295.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="a00316.html#_details">More...</a><br></td></tr>
</table>
<hr>
<p></p>
diff --git a/doc/html/a00409.html b/doc/html/a00401.html
similarity index 89%
rename from doc/html/a00409.html
rename to doc/html/a00401.html
index 40b2529..48227c6 100644
--- a/doc/html/a00409.html
+++ b/doc/html/a00401.html
@@ -45,18 +45,18 @@
<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="l00027"></a><a class="code" href="a00383.html">00027</a> <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="a00215.html">00033</a> <span class="keyword">class </span><a class="code" href="a00215.html">aligned_space</a> {
+<a name="l00033"></a><a class="code" href="a00227.html">00033</a> <span class="keyword">class </span><a class="code" href="a00227.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="a00215.html#0d702fc6b9e9d061ace3501b3c861cdf">00039</a> T* <a class="code" href="a00215.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>() {<span class="keywordflow">return</span> internal::punned_cast<T*>(<span class="keyword">this</span>);}
+<a name="l00039"></a><a class="code" href="a00227.html#0d702fc6b9e9d061ace3501b3c861cdf">00039</a> T* <a class="code" href="a00227.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="a00215.html#024be075c23c0394c9a2518d993bcd9e">00042</a> T* <a class="code" href="a00215.html#024be075c23c0394c9a2518d993bcd9e">end</a>() {<span class="keywordflow">return</span> <a class="code" href="a00215.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>()+N;}
+<a name="l00042"></a><a class="code" href="a00227.html#024be075c23c0394c9a2518d993bcd9e">00042</a> T* <a class="code" href="a00227.html#024be075c23c0394c9a2518d993bcd9e">end</a>() {<span class="keywordflow">return</span> <a class="code" href="a00227.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>
diff --git a/doc/html/a00403.html b/doc/html/a00403.html
new file mode 100644
index 0000000..4b66fa4
--- /dev/null
+++ b/doc/html/a00403.html
@@ -0,0 +1,433 @@
+<!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>
+<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>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-2011 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="a00383.html#a8686246bb5d3664bd07563749970fef">00044</a> <span class="keyword">enum</span> <a class="code" href="a00383.html#a8686246bb5d3664bd07563749970fef">memory_semantics</a> {
+<a name="l00046"></a>00046 <a class="code" href="a00383.html#a8686246bb5d3664bd07563749970fef07b959f69a4f70d821c67b85316803ff">full_fence</a>,
+<a name="l00048"></a>00048 <a class="code" href="a00383.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>,
+<a name="l00050"></a>00050 <a class="code" href="a00383.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">release</a>,
+<a name="l00052"></a>00052 <a class="code" href="a00383.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 && __TBB_WORDSIZE==4</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="a00383.html#a8686246bb5d3664bd07563749970fef07b959f69a4f70d821c67b85316803ff">full_fence</a>)
+<a name="l00146"></a>00146 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(2,<a class="code" href="a00383.html#a8686246bb5d3664bd07563749970fef07b959f69a4f70d821c67b85316803ff">full_fence</a>)
+<a name="l00147"></a>00147 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(4,<a class="code" href="a00383.html#a8686246bb5d3664bd07563749970fef07b959f69a4f70d821c67b85316803ff">full_fence</a>)
+<a name="l00148"></a>00148 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(1,<a class="code" href="a00383.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>)
+<a name="l00149"></a>00149 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(2,<a class="code" href="a00383.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>)
+<a name="l00150"></a>00150 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(4,<a class="code" href="a00383.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>)
+<a name="l00151"></a>00151 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(1,<a class="code" href="a00383.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">release</a>)
+<a name="l00152"></a>00152 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(2,<a class="code" href="a00383.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">release</a>)
+<a name="l00153"></a>00153 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(4,<a class="code" href="a00383.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">release</a>)
+<a name="l00154"></a>00154 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(1,<a class="code" href="a00383.html#a8686246bb5d3664bd07563749970fefaba4b1574646947f1b519188a93c1900">relaxed</a>)
+<a name="l00155"></a>00155 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(2,<a class="code" href="a00383.html#a8686246bb5d3664bd07563749970fefaba4b1574646947f1b519188a93c1900">relaxed</a>)
+<a name="l00156"></a>00156 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(4,<a class="code" href="a00383.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="a00383.html#a8686246bb5d3664bd07563749970fef07b959f69a4f70d821c67b85316803ff">full_fence</a>)
+<a name="l00159"></a>00159 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(8,<a class="code" href="a00383.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>)
+<a name="l00160"></a>00160 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(8,<a class="code" href="a00383.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="a00383.html#a8686246bb5d3664bd07563749970fef07b959f69a4f70d821c67b85316803ff">full_fence</a>);
+<a name="l00173"></a>00173 __TBB_DECL_ATOMIC_LOAD_STORE_PRIMITIVES(<a class="code" href="a00383.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>);
+<a name="l00174"></a>00174 __TBB_DECL_ATOMIC_LOAD_STORE_PRIMITIVES(<a class="code" href="a00383.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 addend ) {
+<a name="l00298"></a>00298 <span class="keywordflow">return</span> fetch_and_add(addend)+addend;
+<a name="l00299"></a>00299 }
+<a name="l00300"></a>00300
+<a name="l00301"></a>00301 value_type operator-=( D addend ) {
+<a name="l00302"></a>00302 <span class="comment">// Additive inverse of addend 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)-addend);
+<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="a00228.html">00331</a> <span class="keyword">struct </span><a class="code" href="a00228.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="a00228.html">atomic<T></a>& operator=( <span class="keyword">const</span> <a class="code" href="a00228.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 defined(_MSC_VER) && __TBB_WORDSIZE==4</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="a00383.html#ad165cf61abbe349d413df2589679add">__TBB_DECL_ATOMIC_ALT</a>(<span class="keywordtype">unsigned</span>,size_t)
+<a name="l00366"></a><a class="code" href="a00383.html#ad165cf61abbe349d413df2589679add">00366</a> <a class="code" href="a00383.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">/* defined(_MSC_VER) && __TBB_WORDSIZE==4 */</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 !defined(_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="a00228.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="a00228.html">atomic<T*></a>& operator=( <span class="keyword">const</span> <a class="code" href="a00228.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="a00229.html">00397</a> <span class="keyword">template</span><> <span class="keyword">struct </span><a class="code" href="a00228.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="a00228.html">atomic<void*></a>& operator=( <span class="keyword">const</span> <a class="code" href="a00228.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="a00228.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="comment">// namespace tbb</span>
+<a name="l00417"></a>00417
+<a name="l00418"></a>00418 <span class="preprocessor">#if defined(_MSC_VER) && !defined(__INTEL_COMPILER)</span>
+<a name="l00419"></a>00419 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (pop)</span>
+<a name="l00420"></a>00420 <span class="preprocessor"></span><span class="preprocessor">#endif // warnings 4244, 4267 are back</span>
+<a name="l00421"></a>00421 <span class="preprocessor"></span>
+<a name="l00422"></a>00422 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_atomic_H */</span>
+</pre></div><hr>
+<p></p>
+Copyright © 2005-2011 Intel Corporation. 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/a00407.html b/doc/html/a00407.html
deleted file mode 100644
index 2da113e..0000000
--- a/doc/html/a00407.html
+++ /dev/null
@@ -1,107 +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_windef.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_windef.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-2011 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_windef_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#error Do not #include this file directly. Use "#include tbb/tbb_stddef.h" instead.</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* __TBB_tbb_windef_H */</span>
-<a name="l00024"></a>00024
-<a name="l00025"></a>00025 <span class="comment">// Check that the target Windows version has all API calls requried for TBB.</span>
-<a name="l00026"></a>00026 <span class="comment">// Do not increase the version in condition beyond 0x0500 without prior discussion!</span>
-<a name="l00027"></a>00027 <span class="preprocessor">#if defined(_WIN32_WINNT) && _WIN32_WINNT<0x0400</span>
-<a name="l00028"></a>00028 <span class="preprocessor"></span><span class="preprocessor">#error TBB is unable to run on old Windows versions; _WIN32_WINNT must be 0x0400 or greater.</span>
-<a name="l00029"></a>00029 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00030"></a>00030 <span class="preprocessor"></span>
-<a name="l00031"></a>00031 <span class="preprocessor">#if !defined(_MT)</span>
-<a name="l00032"></a>00032 <span class="preprocessor"></span><span class="preprocessor">#error TBB requires linkage with multithreaded C/C++ runtime library. \</span>
-<a name="l00033"></a>00033 <span class="preprocessor"> Choose multithreaded DLL runtime in project settings, or use /MD[d] compiler switch.</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="comment">// Workaround for the problem with MVSC headers failing to define namespace std</span>
-<a name="l00037"></a>00037 <span class="keyword">namespace </span>std {
-<a name="l00038"></a>00038 using ::size_t; using ::ptrdiff_t;
-<a name="l00039"></a>00039 }
-<a name="l00040"></a>00040
-<a name="l00041"></a>00041 <span class="preprocessor">#define __TBB_STRING_AUX(x) #x</span>
-<a name="l00042"></a>00042 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_STRING(x) __TBB_STRING_AUX(x)</span>
-<a name="l00043"></a>00043 <span class="preprocessor"></span>
-<a name="l00044"></a>00044 <span class="comment">// Default setting of TBB_USE_DEBUG</span>
-<a name="l00045"></a>00045 <span class="preprocessor">#ifdef TBB_USE_DEBUG</span>
-<a name="l00046"></a>00046 <span class="preprocessor"></span><span class="preprocessor"># if TBB_USE_DEBUG </span>
-<a name="l00047"></a>00047 <span class="preprocessor"></span><span class="preprocessor"># if !defined(_DEBUG)</span>
-<a name="l00048"></a>00048 <span class="preprocessor"></span><span class="preprocessor"># pragma message(__FILE__ "(" __TBB_STRING(__LINE__) ") : Warning: Recommend using /MDd if compiling with TBB_USE_DEBUG!=0")</span>
-<a name="l00049"></a>00049 <span class="preprocessor"></span><span class="preprocessor"># endif</span>
-<a name="l00050"></a>00050 <span class="preprocessor"></span><span class="preprocessor"># else</span>
-<a name="l00051"></a>00051 <span class="preprocessor"></span><span class="preprocessor"># if defined(_DEBUG)</span>
-<a name="l00052"></a>00052 <span class="preprocessor"></span><span class="preprocessor"># pragma message(__FILE__ "(" __TBB_STRING(__LINE__) ") : Warning: Recommend using /MD if compiling with TBB_USE_DEBUG==0")</span>
-<a name="l00053"></a>00053 <span class="preprocessor"></span><span class="preprocessor"># endif</span>
-<a name="l00054"></a>00054 <span class="preprocessor"></span><span class="preprocessor"># endif</span>
-<a name="l00055"></a>00055 <span class="preprocessor"></span><span class="preprocessor">#else</span>
-<a name="l00056"></a>00056 <span class="preprocessor"></span><span class="preprocessor"># ifdef _DEBUG</span>
-<a name="l00057"></a>00057 <span class="preprocessor"></span><span class="preprocessor"># define TBB_USE_DEBUG 1</span>
-<a name="l00058"></a>00058 <span class="preprocessor"></span><span class="preprocessor"># endif</span>
-<a name="l00059"></a>00059 <span class="preprocessor"></span><span class="preprocessor">#endif </span>
-<a name="l00060"></a>00060 <span class="preprocessor"></span>
-<a name="l00061"></a>00061 <span class="preprocessor">#if __TBB_BUILD && !defined(__TBB_NO_IMPLICIT_LINKAGE)</span>
-<a name="l00062"></a>00062 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_NO_IMPLICIT_LINKAGE 1</span>
-<a name="l00063"></a>00063 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00064"></a>00064 <span class="preprocessor"></span>
-<a name="l00065"></a>00065 <span class="preprocessor">#if _MSC_VER</span>
-<a name="l00066"></a>00066 <span class="preprocessor"></span><span class="preprocessor"> #if !__TBB_NO_IMPLICIT_LINKAGE</span>
-<a name="l00067"></a>00067 <span class="preprocessor"></span><span class="preprocessor"> #ifdef __TBB_LIB_NAME</span>
-<a name="l00068"></a>00068 <span class="preprocessor"></span><span class="preprocessor"> #pragma comment(lib, __TBB_STRING(__TBB_LIB_NAME))</span>
-<a name="l00069"></a>00069 <span class="preprocessor"></span><span class="preprocessor"> #else</span>
-<a name="l00070"></a>00070 <span class="preprocessor"></span><span class="preprocessor"> #ifdef _DEBUG</span>
-<a name="l00071"></a>00071 <span class="preprocessor"></span><span class="preprocessor"> #pragma comment(lib, "tbb_debug.lib")</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"> #pragma comment(lib, "tbb.lib")</span>
-<a name="l00074"></a>00074 <span class="preprocessor"></span><span class="preprocessor"> #endif</span>
-<a name="l00075"></a>00075 <span class="preprocessor"></span><span class="preprocessor"> #endif</span>
-<a name="l00076"></a>00076 <span class="preprocessor"></span><span class="preprocessor"> #endif</span>
-<a name="l00077"></a>00077 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2011 Intel Corporation. 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/a00410.html b/doc/html/a00410.html
deleted file mode 100644
index f35102f..0000000
--- a/doc/html/a00410.html
+++ /dev/null
@@ -1,376 +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>atomic.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>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-2011 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="a00362.html#a8686246bb5d3664bd07563749970fef">00044</a> <span class="keyword">enum</span> <a class="code" href="a00362.html#a8686246bb5d3664bd07563749970fef">memory_semantics</a> {
-<a name="l00046"></a>00046 <a class="code" href="a00362.html#a8686246bb5d3664bd07563749970fefc6db01678b1749dff7554688d079520c">__TBB_full_fence</a>,
-<a name="l00048"></a>00048 <a class="code" href="a00362.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>,
-<a name="l00050"></a>00050 <a class="code" href="a00362.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">release</a>
-<a name="l00051"></a>00051 };
-<a name="l00052"></a>00052
-<a name="l00054"></a>00054 <span class="keyword">namespace </span>internal {
-<a name="l00055"></a>00055
-<a name="l00056"></a>00056 <span class="preprocessor">#if __GNUC__ || __SUNPRO_CC || __IBMCPP__</span>
-<a name="l00057"></a>00057 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_DECL_ATOMIC_FIELD(t,f,a) t f __attribute__ ((aligned(a)));</span>
-<a name="l00058"></a>00058 <span class="preprocessor"></span><span class="preprocessor">#elif defined(__INTEL_COMPILER)||_MSC_VER >= 1300</span>
-<a name="l00059"></a>00059 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_DECL_ATOMIC_FIELD(t,f,a) __declspec(align(a)) t f;</span>
-<a name="l00060"></a>00060 <span class="preprocessor"></span><span class="preprocessor">#else </span>
-<a name="l00061"></a>00061 <span class="preprocessor"></span><span class="preprocessor">#error Do not know syntax for forcing alignment.</span>
-<a name="l00062"></a>00062 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* __GNUC__ */</span>
-<a name="l00063"></a>00063
-<a name="l00064"></a>00064 <span class="keyword">template</span><size_t S>
-<a name="l00065"></a>00065 <span class="keyword">struct </span>atomic_rep; <span class="comment">// Primary template declared, but never defined.</span>
-<a name="l00066"></a>00066
-<a name="l00067"></a>00067 <span class="keyword">template</span><>
-<a name="l00068"></a>00068 <span class="keyword">struct </span>atomic_rep<1> { <span class="comment">// Specialization</span>
-<a name="l00069"></a>00069 <span class="keyword">typedef</span> int8_t word;
-<a name="l00070"></a>00070 int8_t value;
-<a name="l00071"></a>00071 };
-<a name="l00072"></a>00072 <span class="keyword">template</span><>
-<a name="l00073"></a>00073 <span class="keyword">struct </span>atomic_rep<2> { <span class="comment">// Specialization</span>
-<a name="l00074"></a>00074 <span class="keyword">typedef</span> int16_t word;
-<a name="l00075"></a>00075 __TBB_DECL_ATOMIC_FIELD(int16_t,value,2)
-<a name="l00076"></a>00076 };
-<a name="l00077"></a>00077 <span class="keyword">template</span><>
-<a name="l00078"></a>00078 <span class="keyword">struct </span>atomic_rep<4> { <span class="comment">// Specialization</span>
-<a name="l00079"></a>00079 <span class="preprocessor">#if _MSC_VER && __TBB_WORDSIZE==4</span>
-<a name="l00080"></a>00080 <span class="preprocessor"></span> <span class="comment">// Work-around that avoids spurious /Wp64 warnings</span>
-<a name="l00081"></a>00081 <span class="keyword">typedef</span> intptr_t word;
-<a name="l00082"></a>00082 <span class="preprocessor">#else</span>
-<a name="l00083"></a>00083 <span class="preprocessor"></span> <span class="keyword">typedef</span> int32_t word;
-<a name="l00084"></a>00084 <span class="preprocessor">#endif</span>
-<a name="l00085"></a>00085 <span class="preprocessor"></span> __TBB_DECL_ATOMIC_FIELD(int32_t,value,4)
-<a name="l00086"></a>00086 };
-<a name="l00087"></a>00087 <span class="preprocessor">#if __TBB_64BIT_ATOMICS</span>
-<a name="l00088"></a>00088 <span class="preprocessor"></span><span class="keyword">template</span><>
-<a name="l00089"></a>00089 <span class="keyword">struct </span>atomic_rep<8> { <span class="comment">// Specialization</span>
-<a name="l00090"></a>00090 <span class="keyword">typedef</span> int64_t word;
-<a name="l00091"></a>00091 __TBB_DECL_ATOMIC_FIELD(int64_t,value,8)
-<a name="l00092"></a>00092 };
-<a name="l00093"></a>00093 <span class="preprocessor">#endif</span>
-<a name="l00094"></a>00094 <span class="preprocessor"></span>
-<a name="l00095"></a>00095 <span class="keyword">template</span><size_t Size, memory_semantics M>
-<a name="l00096"></a>00096 <span class="keyword">struct </span>atomic_traits; <span class="comment">// Primary template declared, but not defined.</span>
-<a name="l00097"></a>00097
-<a name="l00098"></a>00098 <span class="preprocessor">#define __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(S,M) \</span>
-<a name="l00099"></a>00099 <span class="preprocessor"> template<> struct atomic_traits<S,M> { \</span>
-<a name="l00100"></a>00100 <span class="preprocessor"> typedef atomic_rep<S>::word word; \</span>
-<a name="l00101"></a>00101 <span class="preprocessor"> inline static word compare_and_swap( volatile void* location, word new_value, word comparand ) {\</span>
-<a name="l00102"></a>00102 <span class="preprocessor"> return __TBB_CompareAndSwap##S##M(location,new_value,comparand); \</span>
-<a name="l00103"></a>00103 <span class="preprocessor"> } \</span>
-<a name="l00104"></a>00104 <span class="preprocessor"> inline static word fetch_and_add( volatile void* location, word addend ) { \</span>
-<a name="l00105"></a>00105 <span class="preprocessor"> return __TBB_FetchAndAdd##S##M(location,addend); \</span>
-<a name="l00106"></a>00106 <span class="preprocessor"> } \</span>
-<a name="l00107"></a>00107 <span class="preprocessor"> inline static word fetch_and_store( volatile void* location, word value ) {\</span>
-<a name="l00108"></a>00108 <span class="preprocessor"> return __TBB_FetchAndStore##S##M(location,value); \</span>
-<a name="l00109"></a>00109 <span class="preprocessor"> } \</span>
-<a name="l00110"></a>00110 <span class="preprocessor"> };</span>
-<a name="l00111"></a>00111 <span class="preprocessor"></span>
-<a name="l00112"></a>00112 <span class="preprocessor">#define __TBB_DECL_ATOMIC_PRIMITIVES(S) \</span>
-<a name="l00113"></a>00113 <span class="preprocessor"> template<memory_semantics M> \</span>
-<a name="l00114"></a>00114 <span class="preprocessor"> struct atomic_traits<S,M> { \</span>
-<a name="l00115"></a>00115 <span class="preprocessor"> typedef atomic_rep<S>::word word; \</span>
-<a name="l00116"></a>00116 <span class="preprocessor"> inline static word compare_and_swap( volatile void* location, word new_value, word comparand ) {\</span>
-<a name="l00117"></a>00117 <span class="preprocessor"> return __TBB_CompareAndSwap##S(location,new_value,comparand); \</span>
-<a name="l00118"></a>00118 <span class="preprocessor"> } \</span>
-<a name="l00119"></a>00119 <span class="preprocessor"> inline static word fetch_and_add( volatile void* location, word addend ) { \</span>
-<a name="l00120"></a>00120 <span class="preprocessor"> return __TBB_FetchAndAdd##S(location,addend); \</span>
-<a name="l00121"></a>00121 <span class="preprocessor"> } \</span>
-<a name="l00122"></a>00122 <span class="preprocessor"> inline static word fetch_and_store( volatile void* location, word value ) {\</span>
-<a name="l00123"></a>00123 <span class="preprocessor"> return __TBB_FetchAndStore##S(location,value); \</span>
-<a name="l00124"></a>00124 <span class="preprocessor"> } \</span>
-<a name="l00125"></a>00125 <span class="preprocessor"> };</span>
-<a name="l00126"></a>00126 <span class="preprocessor"></span>
-<a name="l00127"></a>00127 <span class="preprocessor">#if __TBB_DECL_FENCED_ATOMICS</span>
-<a name="l00128"></a>00128 <span class="preprocessor"></span>__TBB_DECL_FENCED_ATOMIC_PRIMITIVES(1,<a class="code" href="a00362.html#a8686246bb5d3664bd07563749970fefc6db01678b1749dff7554688d079520c">__TBB_full_fence</a>)
-<a name="l00129"></a>00129 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(2,<a class="code" href="a00362.html#a8686246bb5d3664bd07563749970fefc6db01678b1749dff7554688d079520c">__TBB_full_fence</a>)
-<a name="l00130"></a>00130 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(4,<a class="code" href="a00362.html#a8686246bb5d3664bd07563749970fefc6db01678b1749dff7554688d079520c">__TBB_full_fence</a>)
-<a name="l00131"></a>00131 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(8,<a class="code" href="a00362.html#a8686246bb5d3664bd07563749970fefc6db01678b1749dff7554688d079520c">__TBB_full_fence</a>)
-<a name="l00132"></a>00132 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(1,<a class="code" href="a00362.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>)
-<a name="l00133"></a>00133 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(2,<a class="code" href="a00362.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>)
-<a name="l00134"></a>00134 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(4,<a class="code" href="a00362.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>)
-<a name="l00135"></a>00135 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(1,<a class="code" href="a00362.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">release</a>)
-<a name="l00136"></a>00136 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(2,<a class="code" href="a00362.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">release</a>)
-<a name="l00137"></a>00137 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(4,<a class="code" href="a00362.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">release</a>)
-<a name="l00138"></a>00138 <span class="preprocessor">#if __TBB_64BIT_ATOMICS</span>
-<a name="l00139"></a>00139 <span class="preprocessor"></span>__TBB_DECL_FENCED_ATOMIC_PRIMITIVES(8,<a class="code" href="a00362.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>)
-<a name="l00140"></a>00140 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(8,release)
-<a name="l00141"></a>00141 <span class="preprocessor">#endif</span>
-<a name="l00142"></a>00142 <span class="preprocessor"></span><span class="preprocessor">#else</span>
-<a name="l00143"></a>00143 <span class="preprocessor"></span>__TBB_DECL_ATOMIC_PRIMITIVES(1)
-<a name="l00144"></a>00144 __TBB_DECL_ATOMIC_PRIMITIVES(2)
-<a name="l00145"></a>00145 __TBB_DECL_ATOMIC_PRIMITIVES(4)
-<a name="l00146"></a>00146 <span class="preprocessor">#if __TBB_64BIT_ATOMICS</span>
-<a name="l00147"></a>00147 <span class="preprocessor"></span>__TBB_DECL_ATOMIC_PRIMITIVES(8)
-<a name="l00148"></a>00148 <span class="preprocessor">#endif</span>
-<a name="l00149"></a>00149 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00150"></a>00150 <span class="preprocessor"></span>
-<a name="l00152"></a>00152
-<a name="l00154"></a>00154 <span class="preprocessor">#define __TBB_MINUS_ONE(T) (T(T(0)-T(1)))</span>
-<a name="l00155"></a>00155 <span class="preprocessor"></span>
-<a name="l00157"></a>00157
-<a name="l00159"></a>00159 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00160"></a>00160 <span class="keyword">struct </span>atomic_impl {
-<a name="l00161"></a>00161 <span class="keyword">protected</span>:
-<a name="l00162"></a>00162 atomic_rep<sizeof(T)> rep;
-<a name="l00163"></a>00163 <span class="keyword">private</span>:
-<a name="l00165"></a>00165 <span class="keyword">union </span>converter {
-<a name="l00166"></a>00166 T value;
-<a name="l00167"></a>00167 <span class="keyword">typename</span> atomic_rep<sizeof(T)>::word bits;
-<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> T value_type;
-<a name="l00171"></a>00171
-<a name="l00172"></a>00172 <span class="keyword">template</span><memory_semantics M>
-<a name="l00173"></a>00173 value_type fetch_and_store( value_type value ) {
-<a name="l00174"></a>00174 converter u, w;
-<a name="l00175"></a>00175 u.value = value;
-<a name="l00176"></a>00176 w.bits = internal::atomic_traits<sizeof(value_type),M>::fetch_and_store(&rep.value,u.bits);
-<a name="l00177"></a>00177 <span class="keywordflow">return</span> w.value;
-<a name="l00178"></a>00178 }
-<a name="l00179"></a>00179
-<a name="l00180"></a>00180 value_type fetch_and_store( value_type value ) {
-<a name="l00181"></a>00181 <span class="keywordflow">return</span> fetch_and_store<__TBB_full_fence>(value);
-<a name="l00182"></a>00182 }
-<a name="l00183"></a>00183
-<a name="l00184"></a>00184 <span class="keyword">template</span><memory_semantics M>
-<a name="l00185"></a>00185 value_type compare_and_swap( value_type value, value_type comparand ) {
-<a name="l00186"></a>00186 converter u, v, w;
-<a name="l00187"></a>00187 u.value = value;
-<a name="l00188"></a>00188 v.value = comparand;
-<a name="l00189"></a>00189 w.bits = internal::atomic_traits<sizeof(value_type),M>::compare_and_swap(&rep.value,u.bits,v.bits);
-<a name="l00190"></a>00190 <span class="keywordflow">return</span> w.value;
-<a name="l00191"></a>00191 }
-<a name="l00192"></a>00192
-<a name="l00193"></a>00193 value_type compare_and_swap( value_type value, value_type comparand ) {
-<a name="l00194"></a>00194 <span class="keywordflow">return</span> compare_and_swap<__TBB_full_fence>(value,comparand);
-<a name="l00195"></a>00195 }
-<a name="l00196"></a>00196
-<a name="l00197"></a>00197 operator value_type()<span class="keyword"> const volatile </span>{ <span class="comment">// volatile qualifier here for backwards compatibility </span>
-<a name="l00198"></a>00198 converter w;
-<a name="l00199"></a>00199 w.bits = __TBB_load_with_acquire( rep.value );
-<a name="l00200"></a>00200 <span class="keywordflow">return</span> w.value;
-<a name="l00201"></a>00201 }
-<a name="l00202"></a>00202
-<a name="l00203"></a>00203 <span class="keyword">protected</span>:
-<a name="l00204"></a>00204 value_type store_with_release( value_type rhs ) {
-<a name="l00205"></a>00205 converter u;
-<a name="l00206"></a>00206 u.value = rhs;
-<a name="l00207"></a>00207 __TBB_store_with_release(rep.value,u.bits);
-<a name="l00208"></a>00208 <span class="keywordflow">return</span> rhs;
-<a name="l00209"></a>00209 }
-<a name="l00210"></a>00210 };
-<a name="l00211"></a>00211
-<a name="l00213"></a>00213
-<a name="l00216"></a>00216 <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="l00217"></a>00217 <span class="keyword">struct </span>atomic_impl_with_arithmetic: atomic_impl<I> {
-<a name="l00218"></a>00218 <span class="keyword">public</span>:
-<a name="l00219"></a>00219 <span class="keyword">typedef</span> I value_type;
-<a name="l00220"></a>00220
-<a name="l00221"></a>00221 <span class="keyword">template</span><memory_semantics M>
-<a name="l00222"></a>00222 value_type fetch_and_add( D addend ) {
-<a name="l00223"></a>00223 <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="l00224"></a>00224 }
-<a name="l00225"></a>00225
-<a name="l00226"></a>00226 value_type fetch_and_add( D addend ) {
-<a name="l00227"></a>00227 <span class="keywordflow">return</span> fetch_and_add<__TBB_full_fence>(addend);
-<a name="l00228"></a>00228 }
-<a name="l00229"></a>00229
-<a name="l00230"></a>00230 <span class="keyword">template</span><memory_semantics M>
-<a name="l00231"></a>00231 value_type fetch_and_increment() {
-<a name="l00232"></a>00232 <span class="keywordflow">return</span> fetch_and_add<M>(1);
-<a name="l00233"></a>00233 }
-<a name="l00234"></a>00234
-<a name="l00235"></a>00235 value_type fetch_and_increment() {
-<a name="l00236"></a>00236 <span class="keywordflow">return</span> fetch_and_add(1);
-<a name="l00237"></a>00237 }
-<a name="l00238"></a>00238
-<a name="l00239"></a>00239 <span class="keyword">template</span><memory_semantics M>
-<a name="l00240"></a>00240 value_type fetch_and_decrement() {
-<a name="l00241"></a>00241 <span class="keywordflow">return</span> fetch_and_add<M>(__TBB_MINUS_ONE(D));
-<a name="l00242"></a>00242 }
-<a name="l00243"></a>00243
-<a name="l00244"></a>00244 value_type fetch_and_decrement() {
-<a name="l00245"></a>00245 <span class="keywordflow">return</span> fetch_and_add(__TBB_MINUS_ONE(D));
-<a name="l00246"></a>00246 }
-<a name="l00247"></a>00247
-<a name="l00248"></a>00248 <span class="keyword">public</span>:
-<a name="l00249"></a>00249 value_type operator+=( D addend ) {
-<a name="l00250"></a>00250 <span class="keywordflow">return</span> fetch_and_add(addend)+addend;
-<a name="l00251"></a>00251 }
-<a name="l00252"></a>00252
-<a name="l00253"></a>00253 value_type operator-=( D addend ) {
-<a name="l00254"></a>00254 <span class="comment">// Additive inverse of addend computed using binary minus,</span>
-<a name="l00255"></a>00255 <span class="comment">// instead of unary minus, for sake of avoiding compiler warnings.</span>
-<a name="l00256"></a>00256 <span class="keywordflow">return</span> operator+=(D(0)-addend);
-<a name="l00257"></a>00257 }
-<a name="l00258"></a>00258
-<a name="l00259"></a>00259 value_type operator++() {
-<a name="l00260"></a>00260 <span class="keywordflow">return</span> fetch_and_add(1)+1;
-<a name="l00261"></a>00261 }
-<a name="l00262"></a>00262
-<a name="l00263"></a>00263 value_type operator--() {
-<a name="l00264"></a>00264 <span class="keywordflow">return</span> fetch_and_add(__TBB_MINUS_ONE(D))-1;
-<a name="l00265"></a>00265 }
-<a name="l00266"></a>00266
-<a name="l00267"></a>00267 value_type operator++(<span class="keywordtype">int</span>) {
-<a name="l00268"></a>00268 <span class="keywordflow">return</span> fetch_and_add(1);
-<a name="l00269"></a>00269 }
-<a name="l00270"></a>00270
-<a name="l00271"></a>00271 value_type operator--(<span class="keywordtype">int</span>) {
-<a name="l00272"></a>00272 <span class="keywordflow">return</span> fetch_and_add(__TBB_MINUS_ONE(D));
-<a name="l00273"></a>00273 }
-<a name="l00274"></a>00274 };
-<a name="l00275"></a>00275
-<a name="l00276"></a>00276 } <span class="comment">/* Internal */</span>
-<a name="l00278"></a>00278
-<a name="l00280"></a>00280
-<a name="l00282"></a>00282 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00283"></a><a class="code" href="a00216.html">00283</a> <span class="keyword">struct </span><a class="code" href="a00216.html">atomic</a>: internal::atomic_impl<T> {
-<a name="l00284"></a>00284 T operator=( T rhs ) {
-<a name="l00285"></a>00285 <span class="comment">// "this" required here in strict ISO C++ because store_with_release is a dependent name</span>
-<a name="l00286"></a>00286 <span class="keywordflow">return</span> this->store_with_release(rhs);
-<a name="l00287"></a>00287 }
-<a name="l00288"></a>00288 <a class="code" href="a00216.html">atomic<T></a>& operator=( <span class="keyword">const</span> <a class="code" href="a00216.html">atomic<T></a>& rhs ) {this->store_with_release(rhs); <span class="keywordflow">return</span> *<span class="keyword">this</span>;}
-<a name="l00289"></a>00289 };
-<a name="l00290"></a>00290
-<a name="l00291"></a>00291 <span class="preprocessor">#define __TBB_DECL_ATOMIC(T) \</span>
-<a name="l00292"></a>00292 <span class="preprocessor"> template<> struct atomic<T>: internal::atomic_impl_with_arithmetic<T,T,char> { \</span>
-<a name="l00293"></a>00293 <span class="preprocessor"> T operator=( T rhs ) {return store_with_release(rhs);} \</span>
-<a name="l00294"></a>00294 <span class="preprocessor"> atomic<T>& operator=( const atomic<T>& rhs ) {store_with_release(rhs); return *this;} \</span>
-<a name="l00295"></a>00295 <span class="preprocessor"> };</span>
-<a name="l00296"></a>00296 <span class="preprocessor"></span>
-<a name="l00297"></a>00297 <span class="preprocessor">#if __TBB_64BIT_ATOMICS</span>
-<a name="l00298"></a>00298 <span class="preprocessor"></span><span class="comment">// otherwise size is verified by test_atomic</span>
-<a name="l00299"></a>00299 __TBB_DECL_ATOMIC(__TBB_LONG_LONG)
-<a name="l00300"></a>00300 __TBB_DECL_ATOMIC(<span class="keywordtype">unsigned</span> __TBB_LONG_LONG)
-<a name="l00301"></a>00301 <span class="preprocessor">#endif</span>
-<a name="l00302"></a>00302 <span class="preprocessor"></span>__TBB_DECL_ATOMIC(<span class="keywordtype">long</span>)
-<a name="l00303"></a>00303 __TBB_DECL_ATOMIC(<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span>)
-<a name="l00304"></a>00304
-<a name="l00305"></a>00305 <span class="preprocessor">#if defined(_MSC_VER) && __TBB_WORDSIZE==4</span>
-<a name="l00306"></a>00306 <span class="preprocessor"></span><span class="comment">/* Special version of __TBB_DECL_ATOMIC that avoids gratuitous warnings from cl /Wp64 option. </span>
-<a name="l00307"></a>00307 <span class="comment"> It is identical to __TBB_DECL_ATOMIC(unsigned) except that it replaces operator=(T) </span>
-<a name="l00308"></a>00308 <span class="comment"> with an operator=(U) that explicitly converts the U to a T. Types T and U should be</span>
-<a name="l00309"></a>00309 <span class="comment"> type synonyms on the platform. Type U should be the wider variant of T from the</span>
-<a name="l00310"></a>00310 <span class="comment"> perspective of /Wp64. */</span>
-<a name="l00311"></a>00311 <span class="preprocessor">#define __TBB_DECL_ATOMIC_ALT(T,U) \</span>
-<a name="l00312"></a>00312 <span class="preprocessor"> template<> struct atomic<T>: internal::atomic_impl_with_arithmetic<T,T,char> { \</span>
-<a name="l00313"></a>00313 <span class="preprocessor"> T operator=( U rhs ) {return store_with_release(T(rhs));} \</span>
-<a name="l00314"></a>00314 <span class="preprocessor"> atomic<T>& operator=( const atomic<T>& rhs ) {store_with_release(rhs); return *this;} \</span>
-<a name="l00315"></a>00315 <span class="preprocessor"> };</span>
-<a name="l00316"></a>00316 <span class="preprocessor"></span><a class="code" href="a00362.html#ad165cf61abbe349d413df2589679add">__TBB_DECL_ATOMIC_ALT</a>(<span class="keywordtype">unsigned</span>,size_t)
-<a name="l00317"></a><a class="code" href="a00362.html#ad165cf61abbe349d413df2589679add">00317</a> <a class="code" href="a00362.html#ad165cf61abbe349d413df2589679add">__TBB_DECL_ATOMIC_ALT</a>(<span class="keywordtype">int</span>,ptrdiff_t)
-<a name="l00318"></a>00318 <span class="preprocessor">#else</span>
-<a name="l00319"></a>00319 <span class="preprocessor"></span>__TBB_DECL_ATOMIC(<span class="keywordtype">unsigned</span>)
-<a name="l00320"></a>00320 __TBB_DECL_ATOMIC(<span class="keywordtype">int</span>)
-<a name="l00321"></a>00321 <span class="preprocessor">#endif </span><span class="comment">/* defined(_MSC_VER) && __TBB_WORDSIZE==4 */</span>
-<a name="l00322"></a>00322
-<a name="l00323"></a>00323 __TBB_DECL_ATOMIC(<span class="keywordtype">unsigned</span> <span class="keywordtype">short</span>)
-<a name="l00324"></a>00324 __TBB_DECL_ATOMIC(<span class="keywordtype">short</span>)
-<a name="l00325"></a>00325 __TBB_DECL_ATOMIC(<span class="keywordtype">char</span>)
-<a name="l00326"></a>00326 __TBB_DECL_ATOMIC(<span class="keywordtype">signed</span> <span class="keywordtype">char</span>)
-<a name="l00327"></a>00327 __TBB_DECL_ATOMIC(<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>)
-<a name="l00328"></a>00328
-<a name="l00329"></a>00329 <span class="preprocessor">#if !defined(_MSC_VER)||defined(_NATIVE_WCHAR_T_DEFINED) </span>
-<a name="l00330"></a>00330 <span class="preprocessor"></span>__TBB_DECL_ATOMIC(<span class="keywordtype">wchar_t</span>)
-<a name="l00331"></a>00331 <span class="preprocessor">#endif </span><span class="comment">/* _MSC_VER||!defined(_NATIVE_WCHAR_T_DEFINED) */</span>
-<a name="l00332"></a>00332
-<a name="l00334"></a>00334 <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">struct </span><a class="code" href="a00216.html">atomic</a><T*>: internal::atomic_impl_with_arithmetic<T*,ptrdiff_t,T> {
-<a name="l00335"></a>00335 T* operator=( T* rhs ) {
-<a name="l00336"></a>00336 <span class="comment">// "this" required here in strict ISO C++ because store_with_release is a dependent name</span>
-<a name="l00337"></a>00337 <span class="keywordflow">return</span> this->store_with_release(rhs);
-<a name="l00338"></a>00338 }
-<a name="l00339"></a>00339 <a class="code" href="a00216.html">atomic<T*></a>& operator=( <span class="keyword">const</span> <a class="code" href="a00216.html">atomic<T*></a>& rhs ) {
-<a name="l00340"></a>00340 this->store_with_release(rhs); <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00341"></a>00341 }
-<a name="l00342"></a>00342 T* operator->()<span class="keyword"> const </span>{
-<a name="l00343"></a>00343 <span class="keywordflow">return</span> (*<span class="keyword">this</span>);
-<a name="l00344"></a>00344 }
-<a name="l00345"></a>00345 };
-<a name="l00346"></a>00346
-<a name="l00348"></a><a class="code" href="a00217.html">00348</a> <span class="keyword">template</span><> <span class="keyword">struct </span><a class="code" href="a00216.html">atomic</a><void*>: internal::atomic_impl<void*> {
-<a name="l00349"></a>00349 <span class="keywordtype">void</span>* operator=( <span class="keywordtype">void</span>* rhs ) {
-<a name="l00350"></a>00350 <span class="comment">// "this" required here in strict ISO C++ because store_with_release is a dependent name</span>
-<a name="l00351"></a>00351 <span class="keywordflow">return</span> this->store_with_release(rhs);
-<a name="l00352"></a>00352 }
-<a name="l00353"></a>00353 <a class="code" href="a00216.html">atomic<void*></a>& operator=( <span class="keyword">const</span> <a class="code" href="a00216.html">atomic<void*></a>& rhs ) {
-<a name="l00354"></a>00354 this->store_with_release(rhs); <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00355"></a>00355 }
-<a name="l00356"></a>00356 };
-<a name="l00357"></a>00357
-<a name="l00358"></a>00358 } <span class="comment">// namespace tbb</span>
-<a name="l00359"></a>00359
-<a name="l00360"></a>00360 <span class="preprocessor">#if defined(_MSC_VER) && !defined(__INTEL_COMPILER)</span>
-<a name="l00361"></a>00361 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (pop)</span>
-<a name="l00362"></a>00362 <span class="preprocessor"></span><span class="preprocessor">#endif // warnings 4244, 4267 are back</span>
-<a name="l00363"></a>00363 <span class="preprocessor"></span>
-<a name="l00364"></a>00364 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_atomic_H */</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2011 Intel Corporation. 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/a00418.html b/doc/html/a00412.html
similarity index 76%
copy from doc/html/a00418.html
copy to doc/html/a00412.html
index 8d93ac8..d4d404c 100644
--- a/doc/html/a00418.html
+++ b/doc/html/a00412.html
@@ -49,45 +49,45 @@
<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="a00221.html">00040</a> <span class="keyword">class </span><a class="code" href="a00221.html">blocked_range</a> {
+<a name="l00040"></a><a class="code" href="a00233.html">00040</a> <span class="keyword">class </span><a class="code" href="a00233.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="a00221.html#1a8d05842c2b3dfc177bc4d347e4cef7">00045</a> <span class="keyword">typedef</span> Value <a class="code" href="a00221.html#1a8d05842c2b3dfc177bc4d347e4cef7">const_iterator</a>;
+<a name="l00045"></a><a class="code" href="a00233.html#1a8d05842c2b3dfc177bc4d347e4cef7">00045</a> <span class="keyword">typedef</span> Value <a class="code" href="a00233.html#1a8d05842c2b3dfc177bc4d347e4cef7">const_iterator</a>;
<a name="l00046"></a>00046
-<a name="l00048"></a><a class="code" href="a00221.html#f5707bffea38eee5c9680f37358afb8e">00048</a> <span class="keyword">typedef</span> std::size_t <a class="code" href="a00221.html#f5707bffea38eee5c9680f37358afb8e">size_type</a>;
+<a name="l00048"></a><a class="code" href="a00233.html#f5707bffea38eee5c9680f37358afb8e">00048</a> <span class="keyword">typedef</span> std::size_t <a class="code" href="a00233.html#f5707bffea38eee5c9680f37358afb8e">size_type</a>;
<a name="l00049"></a>00049
<a name="l00051"></a>00051
-<a name="l00052"></a><a class="code" href="a00221.html#94607755c5110d199202234d58d022ac">00052</a> <a class="code" href="a00221.html#94607755c5110d199202234d58d022ac">blocked_range</a>() : my_end(), my_begin() {}
+<a name="l00052"></a><a class="code" href="a00233.html#94607755c5110d199202234d58d022ac">00052</a> <a class="code" href="a00233.html#94607755c5110d199202234d58d022ac">blocked_range</a>() : my_end(), my_begin() {}
<a name="l00053"></a>00053
-<a name="l00055"></a><a class="code" href="a00221.html#14795a36ead1414b4371dbe1a4656359">00055</a> <a class="code" href="a00221.html#94607755c5110d199202234d58d022ac">blocked_range</a>( Value begin_, Value end_, <a class="code" href="a00221.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> grainsize_=1 ) :
+<a name="l00055"></a><a class="code" href="a00233.html#14795a36ead1414b4371dbe1a4656359">00055</a> <a class="code" href="a00233.html#94607755c5110d199202234d58d022ac">blocked_range</a>( Value begin_, Value end_, <a class="code" href="a00233.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="a00221.html#18d2258400756ac1446dac7676b18df3">00062</a> <a class="code" href="a00221.html#1a8d05842c2b3dfc177bc4d347e4cef7">const_iterator</a> <a class="code" href="a00221.html#18d2258400756ac1446dac7676b18df3">begin</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_begin;}
+<a name="l00062"></a><a class="code" href="a00233.html#18d2258400756ac1446dac7676b18df3">00062</a> <a class="code" href="a00233.html#1a8d05842c2b3dfc177bc4d347e4cef7">const_iterator</a> <a class="code" href="a00233.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="a00221.html#8b929d93ddc13f148b11bceef3a3bdf8">00065</a> <a class="code" href="a00221.html#1a8d05842c2b3dfc177bc4d347e4cef7">const_iterator</a> <a class="code" href="a00221.html#8b929d93ddc13f148b11bceef3a3bdf8">end</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_end;}
+<a name="l00065"></a><a class="code" href="a00233.html#8b929d93ddc13f148b11bceef3a3bdf8">00065</a> <a class="code" href="a00233.html#1a8d05842c2b3dfc177bc4d347e4cef7">const_iterator</a> <a class="code" href="a00233.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="a00221.html#9eaa0b6beff1420f688570bbf6b8c462">00069</a> <a class="code" href="a00221.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> <a class="code" href="a00221.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()<span class="keyword"> const </span>{
-<a name="l00070"></a>00070 __TBB_ASSERT( !(<a class="code" href="a00221.html#8b929d93ddc13f148b11bceef3a3bdf8">end</a>()<<a class="code" href="a00221.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="a00221.html#f5707bffea38eee5c9680f37358afb8e">size_type</a>(my_end-my_begin);
+<a name="l00069"></a><a class="code" href="a00233.html#9eaa0b6beff1420f688570bbf6b8c462">00069</a> <a class="code" href="a00233.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> <a class="code" href="a00233.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()<span class="keyword"> const </span>{
+<a name="l00070"></a>00070 __TBB_ASSERT( !(<a class="code" href="a00233.html#8b929d93ddc13f148b11bceef3a3bdf8">end</a>()<<a class="code" href="a00233.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="a00233.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="a00221.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">00075</a> <a class="code" href="a00221.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> <a class="code" href="a00221.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_grainsize;}
+<a name="l00075"></a><a class="code" href="a00233.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">00075</a> <a class="code" href="a00233.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> <a class="code" href="a00233.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="a00221.html#8f4f02f530eb3f2e7ea26e06f76aef9d">00082</a> <span class="keywordtype">bool</span> <a class="code" href="a00221.html#8f4f02f530eb3f2e7ea26e06f76aef9d">empty</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> !(my_begin<my_end);}
+<a name="l00082"></a><a class="code" href="a00233.html#8f4f02f530eb3f2e7ea26e06f76aef9d">00082</a> <span class="keywordtype">bool</span> <a class="code" href="a00233.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="a00221.html#41a58b703d574b6e1ca155df3576f578">00086</a> <span class="keywordtype">bool</span> <a class="code" href="a00221.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_grainsize<<a class="code" href="a00221.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>();}
+<a name="l00086"></a><a class="code" href="a00233.html#41a58b703d574b6e1ca155df3576f578">00086</a> <span class="keywordtype">bool</span> <a class="code" href="a00233.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_grainsize<<a class="code" href="a00233.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>();}
<a name="l00087"></a>00087
<a name="l00089"></a>00089
-<a name="l00091"></a><a class="code" href="a00221.html#4c0efd2be3f96a0ab3ba5085e8b3fcc7">00091</a> <a class="code" href="a00221.html#94607755c5110d199202234d58d022ac">blocked_range</a>( <a class="code" href="a00221.html">blocked_range</a>& r, <a class="code" href="a00290.html">split</a> ) :
+<a name="l00091"></a><a class="code" href="a00233.html#4c0efd2be3f96a0ab3ba5085e8b3fcc7">00091</a> <a class="code" href="a00233.html#94607755c5110d199202234d58d022ac">blocked_range</a>( <a class="code" href="a00233.html">blocked_range</a>& r, <a class="code" href="a00309.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)
@@ -96,13 +96,13 @@
<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="a00221.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> my_grainsize;
+<a name="l00101"></a>00101 <a class="code" href="a00233.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="a00221.html">blocked_range</a>& r ) {
-<a name="l00106"></a>00106 __TBB_ASSERT( r.<a class="code" href="a00221.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="a00221.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a> + (r.<a class="code" href="a00221.html#1ec95c8988b50064dd603998b16f3930">my_end</a>-r.<a class="code" href="a00221.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a>)/2u;
-<a name="l00108"></a>00108 r.<a class="code" href="a00221.html#1ec95c8988b50064dd603998b16f3930">my_end</a> = middle;
+<a name="l00105"></a>00105 <span class="keyword">static</span> Value do_split( <a class="code" href="a00233.html">blocked_range</a>& r ) {
+<a name="l00106"></a>00106 __TBB_ASSERT( r.<a class="code" href="a00233.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="a00233.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a> + (r.<a class="code" href="a00233.html#1ec95c8988b50064dd603998b16f3930">my_end</a>-r.<a class="code" href="a00233.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a>)/2u;
+<a name="l00108"></a>00108 r.<a class="code" href="a00233.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
diff --git a/doc/html/a00419.html b/doc/html/a00413.html
similarity index 76%
rename from doc/html/a00419.html
rename to doc/html/a00413.html
index 92ed076..286df5b 100644
--- a/doc/html/a00419.html
+++ b/doc/html/a00413.html
@@ -49,54 +49,54 @@
<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="a00222.html">00032</a> <span class="keyword">class </span><a class="code" href="a00222.html">blocked_range2d</a> {
+<a name="l00032"></a><a class="code" href="a00234.html">00032</a> <span class="keyword">class </span><a class="code" href="a00234.html">blocked_range2d</a> {
<a name="l00033"></a>00033 <span class="keyword">public</span>:
-<a name="l00035"></a><a class="code" href="a00222.html#a807a22fe658ec38b8edfd69521d0383">00035</a> <span class="keyword">typedef</span> <a class="code" href="a00221.html">blocked_range<RowValue></a> <a class="code" href="a00221.html">row_range_type</a>;
-<a name="l00036"></a>00036 <span class="keyword">typedef</span> <a class="code" href="a00221.html">blocked_range<ColValue></a> <a class="code" href="a00221.html">col_range_type</a>;
+<a name="l00035"></a><a class="code" href="a00234.html#a807a22fe658ec38b8edfd69521d0383">00035</a> <span class="keyword">typedef</span> <a class="code" href="a00233.html">blocked_range<RowValue></a> <a class="code" href="a00233.html">row_range_type</a>;
+<a name="l00036"></a>00036 <span class="keyword">typedef</span> <a class="code" href="a00233.html">blocked_range<ColValue></a> <a class="code" href="a00233.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="a00221.html">row_range_type</a> my_rows;
-<a name="l00040"></a>00040 <a class="code" href="a00221.html">col_range_type</a> my_cols;
+<a name="l00039"></a>00039 <a class="code" href="a00233.html">row_range_type</a> my_rows;
+<a name="l00040"></a>00040 <a class="code" href="a00233.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="a00222.html">blocked_range2d</a>( RowValue row_begin, RowValue row_end, <span class="keyword">typename</span> <a class="code" href="a00221.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="a00221.html#f5707bffea38eee5c9680f37358afb8e">col_range_type::size_type</a> col_grainsize ) :
+<a name="l00044"></a>00044 <a class="code" href="a00234.html">blocked_range2d</a>( RowValue row_begin, RowValue row_end, <span class="keyword">typename</span> <a class="code" href="a00233.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="a00233.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="a00222.html">blocked_range2d</a>( RowValue row_begin, RowValue row_end,
+<a name="l00051"></a>00051 <a class="code" href="a00234.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="a00222.html#d144cb2d88cef553420311aca8667a44">00059</a> <span class="keywordtype">bool</span> <a class="code" href="a00222.html#d144cb2d88cef553420311aca8667a44">empty</a>()<span class="keyword"> const </span>{
+<a name="l00059"></a><a class="code" href="a00234.html#d144cb2d88cef553420311aca8667a44">00059</a> <span class="keywordtype">bool</span> <a class="code" href="a00234.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="a00221.html#8f4f02f530eb3f2e7ea26e06f76aef9d">empty</a>() || my_cols.<a class="code" href="a00221.html#8f4f02f530eb3f2e7ea26e06f76aef9d">empty</a>();
+<a name="l00061"></a>00061 <span class="keywordflow">return</span> my_rows.<a class="code" href="a00233.html#8f4f02f530eb3f2e7ea26e06f76aef9d">empty</a>() || my_cols.<a class="code" href="a00233.html#8f4f02f530eb3f2e7ea26e06f76aef9d">empty</a>();
<a name="l00062"></a>00062 }
<a name="l00063"></a>00063
-<a name="l00065"></a><a class="code" href="a00222.html#ad36a9b38e4fef26d376f99552ce2d92">00065</a> <span class="keywordtype">bool</span> <a class="code" href="a00222.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="a00221.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a>() || my_cols.<a class="code" href="a00221.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a>();
+<a name="l00065"></a><a class="code" href="a00234.html#ad36a9b38e4fef26d376f99552ce2d92">00065</a> <span class="keywordtype">bool</span> <a class="code" href="a00234.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="a00233.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a>() || my_cols.<a class="code" href="a00233.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a>();
<a name="l00067"></a>00067 }
<a name="l00068"></a>00068
-<a name="l00069"></a>00069 <a class="code" href="a00222.html">blocked_range2d</a>( <a class="code" href="a00222.html">blocked_range2d</a>& r, <a class="code" href="a00290.html">split</a> ) :
+<a name="l00069"></a>00069 <a class="code" href="a00234.html">blocked_range2d</a>( <a class="code" href="a00234.html">blocked_range2d</a>& r, <a class="code" href="a00309.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="a00221.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()*double(my_cols.<a class="code" href="a00221.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()) < my_cols.<a class="code" href="a00221.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()*double(my_rows.<a class="code" href="a00221.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()) ) {
-<a name="l00074"></a>00074 my_cols.<a class="code" href="a00221.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a> = col_range_type::do_split(r.<a class="code" href="a00222.html#9837bbaabc5836741fde79512ea1131d">my_cols</a>);
+<a name="l00073"></a>00073 <span class="keywordflow">if</span>( my_rows.<a class="code" href="a00233.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()*double(my_cols.<a class="code" href="a00233.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()) < my_cols.<a class="code" href="a00233.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()*double(my_rows.<a class="code" href="a00233.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()) ) {
+<a name="l00074"></a>00074 my_cols.<a class="code" href="a00233.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a> = col_range_type::do_split(r.<a class="code" href="a00234.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="a00221.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a> = row_range_type::do_split(r.<a class="code" href="a00222.html#4be7c7b39da256afe9c67be735b6f788">my_rows</a>);
+<a name="l00076"></a>00076 my_rows.<a class="code" href="a00233.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a> = row_range_type::do_split(r.<a class="code" href="a00234.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="a00222.html#f496e7348a82652fba581203477cc07c">00081</a> <span class="keyword">const</span> <a class="code" href="a00221.html">row_range_type</a>& <a class="code" href="a00222.html#f496e7348a82652fba581203477cc07c">rows</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_rows;}
+<a name="l00081"></a><a class="code" href="a00234.html#f496e7348a82652fba581203477cc07c">00081</a> <span class="keyword">const</span> <a class="code" href="a00233.html">row_range_type</a>& <a class="code" href="a00234.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="a00222.html#392a46759af2c884957115771affa7f4">00084</a> <span class="keyword">const</span> <a class="code" href="a00221.html">col_range_type</a>& <a class="code" href="a00222.html#392a46759af2c884957115771affa7f4">cols</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_cols;}
+<a name="l00084"></a><a class="code" href="a00234.html#392a46759af2c884957115771affa7f4">00084</a> <span class="keyword">const</span> <a class="code" href="a00233.html">col_range_type</a>& <a class="code" href="a00234.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>
diff --git a/doc/html/a00420.html b/doc/html/a00414.html
similarity index 71%
rename from doc/html/a00420.html
rename to doc/html/a00414.html
index 19b0f7b..2816ac7 100644
--- a/doc/html/a00420.html
+++ b/doc/html/a00414.html
@@ -49,20 +49,20 @@
<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="a00223.html">00032</a> <span class="keyword">class </span><a class="code" href="a00223.html">blocked_range3d</a> {
+<a name="l00032"></a><a class="code" href="a00235.html">00032</a> <span class="keyword">class </span><a class="code" href="a00235.html">blocked_range3d</a> {
<a name="l00033"></a>00033 <span class="keyword">public</span>:
-<a name="l00035"></a><a class="code" href="a00223.html#b8ebf17a552ba47825e9b3887855b719">00035</a> <span class="keyword">typedef</span> <a class="code" href="a00221.html">blocked_range<PageValue></a> <a class="code" href="a00221.html">page_range_type</a>;
-<a name="l00036"></a>00036 <span class="keyword">typedef</span> <a class="code" href="a00221.html">blocked_range<RowValue></a> <a class="code" href="a00221.html">row_range_type</a>;
-<a name="l00037"></a>00037 <span class="keyword">typedef</span> <a class="code" href="a00221.html">blocked_range<ColValue></a> <a class="code" href="a00221.html">col_range_type</a>;
+<a name="l00035"></a><a class="code" href="a00235.html#b8ebf17a552ba47825e9b3887855b719">00035</a> <span class="keyword">typedef</span> <a class="code" href="a00233.html">blocked_range<PageValue></a> <a class="code" href="a00233.html">page_range_type</a>;
+<a name="l00036"></a>00036 <span class="keyword">typedef</span> <a class="code" href="a00233.html">blocked_range<RowValue></a> <a class="code" href="a00233.html">row_range_type</a>;
+<a name="l00037"></a>00037 <span class="keyword">typedef</span> <a class="code" href="a00233.html">blocked_range<ColValue></a> <a class="code" href="a00233.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="a00221.html">page_range_type</a> my_pages;
-<a name="l00041"></a>00041 <a class="code" href="a00221.html">row_range_type</a> my_rows;
-<a name="l00042"></a>00042 <a class="code" href="a00221.html">col_range_type</a> my_cols;
+<a name="l00040"></a>00040 <a class="code" href="a00233.html">page_range_type</a> my_pages;
+<a name="l00041"></a>00041 <a class="code" href="a00233.html">row_range_type</a> my_rows;
+<a name="l00042"></a>00042 <a class="code" href="a00233.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="a00223.html">blocked_range3d</a>( PageValue page_begin, PageValue page_end,
+<a name="l00046"></a>00046 <a class="code" href="a00235.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),
@@ -71,49 +71,49 @@
<a name="l00052"></a>00052 {
<a name="l00053"></a>00053 }
<a name="l00054"></a>00054
-<a name="l00055"></a>00055 <a class="code" href="a00223.html">blocked_range3d</a>( PageValue page_begin, PageValue page_end, <span class="keyword">typename</span> <a class="code" href="a00221.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="a00221.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="a00221.html#f5707bffea38eee5c9680f37358afb8e">col_range_type::size_type</a> col_grainsize ) :
+<a name="l00055"></a>00055 <a class="code" href="a00235.html">blocked_range3d</a>( PageValue page_begin, PageValue page_end, <span class="keyword">typename</span> <a class="code" href="a00233.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="a00233.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="a00233.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="a00223.html#356860e1c977d91711e8216bd55c0b25">00065</a> <span class="keywordtype">bool</span> <a class="code" href="a00223.html#356860e1c977d91711e8216bd55c0b25">empty</a>()<span class="keyword"> const </span>{
+<a name="l00065"></a><a class="code" href="a00235.html#356860e1c977d91711e8216bd55c0b25">00065</a> <span class="keywordtype">bool</span> <a class="code" href="a00235.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="a00221.html#8f4f02f530eb3f2e7ea26e06f76aef9d">empty</a>() || my_rows.<a class="code" href="a00221.html#8f4f02f530eb3f2e7ea26e06f76aef9d">empty</a>() || my_cols.<a class="code" href="a00221.html#8f4f02f530eb3f2e7ea26e06f76aef9d">empty</a>();
+<a name="l00067"></a>00067 <span class="keywordflow">return</span> my_pages.<a class="code" href="a00233.html#8f4f02f530eb3f2e7ea26e06f76aef9d">empty</a>() || my_rows.<a class="code" href="a00233.html#8f4f02f530eb3f2e7ea26e06f76aef9d">empty</a>() || my_cols.<a class="code" href="a00233.html#8f4f02f530eb3f2e7ea26e06f76aef9d">empty</a>();
<a name="l00068"></a>00068 }
<a name="l00069"></a>00069
-<a name="l00071"></a><a class="code" href="a00223.html#39d69191721c488e737ae5d9c5336b9c">00071</a> <span class="keywordtype">bool</span> <a class="code" href="a00223.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="a00221.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a>() || my_rows.<a class="code" href="a00221.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a>() || my_cols.<a class="code" href="a00221.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a>();
+<a name="l00071"></a><a class="code" href="a00235.html#39d69191721c488e737ae5d9c5336b9c">00071</a> <span class="keywordtype">bool</span> <a class="code" href="a00235.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="a00233.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a>() || my_rows.<a class="code" href="a00233.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a>() || my_cols.<a class="code" href="a00233.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a>();
<a name="l00073"></a>00073 }
<a name="l00074"></a>00074
-<a name="l00075"></a>00075 <a class="code" href="a00223.html">blocked_range3d</a>( <a class="code" href="a00223.html">blocked_range3d</a>& r, <a class="code" href="a00290.html">split</a> ) :
+<a name="l00075"></a>00075 <a class="code" href="a00235.html">blocked_range3d</a>( <a class="code" href="a00235.html">blocked_range3d</a>& r, <a class="code" href="a00309.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="a00221.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()*double(my_rows.<a class="code" href="a00221.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()) < my_rows.<a class="code" href="a00221.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()*double(my_pages.<a class="code" href="a00221.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()) ) {
-<a name="l00081"></a>00081 <span class="keywordflow">if</span> ( my_rows.<a class="code" href="a00221.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()*double(my_cols.<a class="code" href="a00221.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()) < my_cols.<a class="code" href="a00221.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()*double(my_rows.<a class="code" href="a00221.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()) ) {
-<a name="l00082"></a>00082 my_cols.<a class="code" href="a00221.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a> = col_range_type::do_split(r.<a class="code" href="a00223.html#ef7143ddf8f5b1265b5a6d05be00cde5">my_cols</a>);
+<a name="l00080"></a>00080 <span class="keywordflow">if</span>( my_pages.<a class="code" href="a00233.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()*double(my_rows.<a class="code" href="a00233.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()) < my_rows.<a class="code" href="a00233.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()*double(my_pages.<a class="code" href="a00233.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()) ) {
+<a name="l00081"></a>00081 <span class="keywordflow">if</span> ( my_rows.<a class="code" href="a00233.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()*double(my_cols.<a class="code" href="a00233.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()) < my_cols.<a class="code" href="a00233.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()*double(my_rows.<a class="code" href="a00233.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()) ) {
+<a name="l00082"></a>00082 my_cols.<a class="code" href="a00233.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a> = col_range_type::do_split(r.<a class="code" href="a00235.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="a00221.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a> = row_range_type::do_split(r.<a class="code" href="a00223.html#76ead25c280ef630b88a1c8846471707">my_rows</a>);
+<a name="l00084"></a>00084 my_rows.<a class="code" href="a00233.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a> = row_range_type::do_split(r.<a class="code" href="a00235.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="a00221.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()*double(my_cols.<a class="code" href="a00221.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()) < my_cols.<a class="code" href="a00221.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()*double(my_pages.<a class="code" href="a00221.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()) ) {
-<a name="l00088"></a>00088 my_cols.<a class="code" href="a00221.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a> = col_range_type::do_split(r.<a class="code" href="a00223.html#ef7143ddf8f5b1265b5a6d05be00cde5">my_cols</a>);
+<a name="l00087"></a>00087 <span class="keywordflow">if</span> ( my_pages.<a class="code" href="a00233.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()*double(my_cols.<a class="code" href="a00233.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()) < my_cols.<a class="code" href="a00233.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()*double(my_pages.<a class="code" href="a00233.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()) ) {
+<a name="l00088"></a>00088 my_cols.<a class="code" href="a00233.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a> = col_range_type::do_split(r.<a class="code" href="a00235.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="a00221.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a> = page_range_type::do_split(r.<a class="code" href="a00223.html#b18ae46a01d42745078d9e287ab87baa">my_pages</a>);
+<a name="l00090"></a>00090 my_pages.<a class="code" href="a00233.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a> = page_range_type::do_split(r.<a class="code" href="a00235.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="a00223.html#cf971430aa12361d3ed245344b7c6764">00096</a> <span class="keyword">const</span> <a class="code" href="a00221.html">page_range_type</a>& <a class="code" href="a00223.html#cf971430aa12361d3ed245344b7c6764">pages</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_pages;}
+<a name="l00096"></a><a class="code" href="a00235.html#cf971430aa12361d3ed245344b7c6764">00096</a> <span class="keyword">const</span> <a class="code" href="a00233.html">page_range_type</a>& <a class="code" href="a00235.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="a00223.html#1584623e59ff32a8aa82006827508be4">00099</a> <span class="keyword">const</span> <a class="code" href="a00221.html">row_range_type</a>& <a class="code" href="a00223.html#1584623e59ff32a8aa82006827508be4">rows</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_rows;}
+<a name="l00099"></a><a class="code" href="a00235.html#1584623e59ff32a8aa82006827508be4">00099</a> <span class="keyword">const</span> <a class="code" href="a00233.html">row_range_type</a>& <a class="code" href="a00235.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="a00223.html#3336ba9480fd6c43e158f9beb024c050">00102</a> <span class="keyword">const</span> <a class="code" href="a00221.html">col_range_type</a>& <a class="code" href="a00223.html#3336ba9480fd6c43e158f9beb024c050">cols</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_cols;}
+<a name="l00102"></a><a class="code" href="a00235.html#3336ba9480fd6c43e158f9beb024c050">00102</a> <span class="keyword">const</span> <a class="code" href="a00233.html">col_range_type</a>& <a class="code" href="a00235.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
diff --git a/doc/html/a00421.html b/doc/html/a00415.html
similarity index 88%
rename from doc/html/a00421.html
rename to doc/html/a00415.html
index ed92d3f..ddaf487 100644
--- a/doc/html/a00421.html
+++ b/doc/html/a00415.html
@@ -66,7 +66,7 @@
<a name="l00051"></a>00051 <span class="preprocessor"></span>
<a name="l00053"></a>00053
<a name="l00056"></a>00056 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00057"></a><a class="code" href="a00226.html">00057</a> <span class="keyword">class </span><a class="code" href="a00226.html">cache_aligned_allocator</a> {
+<a name="l00057"></a><a class="code" href="a00238.html">00057</a> <span class="keyword">class </span><a class="code" href="a00238.html">cache_aligned_allocator</a> {
<a name="l00058"></a>00058 <span class="keyword">public</span>:
<a name="l00059"></a>00059 <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::allocator_type<T>::value_type value_type;
<a name="l00060"></a>00060 <span class="keyword">typedef</span> value_type* pointer;
@@ -76,32 +76,32 @@
<a name="l00064"></a>00064 <span class="keyword">typedef</span> size_t size_type;
<a name="l00065"></a>00065 <span class="keyword">typedef</span> ptrdiff_t difference_type;
<a name="l00066"></a>00066 <span class="keyword">template</span><<span class="keyword">typename</span> U> <span class="keyword">struct </span>rebind {
-<a name="l00067"></a>00067 <span class="keyword">typedef</span> <a class="code" href="a00226.html">cache_aligned_allocator<U></a> other;
+<a name="l00067"></a>00067 <span class="keyword">typedef</span> <a class="code" href="a00238.html">cache_aligned_allocator<U></a> other;
<a name="l00068"></a>00068 };
<a name="l00069"></a>00069
-<a name="l00070"></a>00070 <a class="code" href="a00226.html">cache_aligned_allocator</a>() <span class="keywordflow">throw</span>() {}
-<a name="l00071"></a>00071 <a class="code" href="a00226.html">cache_aligned_allocator</a>( <span class="keyword">const</span> <a class="code" href="a00226.html">cache_aligned_allocator</a>& ) <span class="keywordflow">throw</span>() {}
-<a name="l00072"></a>00072 <span class="keyword">template</span><<span class="keyword">typename</span> U> <a class="code" href="a00226.html">cache_aligned_allocator</a>(<span class="keyword">const</span> <a class="code" href="a00226.html">cache_aligned_allocator<U></a>&) <span class="keywordflow">throw</span>() {}
+<a name="l00070"></a>00070 <a class="code" href="a00238.html">cache_aligned_allocator</a>() <span class="keywordflow">throw</span>() {}
+<a name="l00071"></a>00071 <a class="code" href="a00238.html">cache_aligned_allocator</a>( <span class="keyword">const</span> <a class="code" href="a00238.html">cache_aligned_allocator</a>& ) <span class="keywordflow">throw</span>() {}
+<a name="l00072"></a>00072 <span class="keyword">template</span><<span class="keyword">typename</span> U> <a class="code" href="a00238.html">cache_aligned_allocator</a>(<span class="keyword">const</span> <a class="code" href="a00238.html">cache_aligned_allocator<U></a>&) <span class="keywordflow">throw</span>() {}
<a name="l00073"></a>00073
<a name="l00074"></a>00074 pointer address(reference x)<span class="keyword"> const </span>{<span class="keywordflow">return</span> &x;}
<a name="l00075"></a>00075 const_pointer address(const_reference x)<span class="keyword"> const </span>{<span class="keywordflow">return</span> &x;}
<a name="l00076"></a>00076
-<a name="l00078"></a><a class="code" href="a00226.html#4cdeea67af6c1fcd8f1d5e9c4cab61e8">00078</a> pointer <a class="code" href="a00226.html#4cdeea67af6c1fcd8f1d5e9c4cab61e8">allocate</a>( size_type n, <span class="keyword">const</span> <span class="keywordtype">void</span>* hint=0 ) {
+<a name="l00078"></a><a class="code" href="a00238.html#4cdeea67af6c1fcd8f1d5e9c4cab61e8">00078</a> pointer <a class="code" href="a00238.html#4cdeea67af6c1fcd8f1d5e9c4cab61e8">allocate</a>( size_type n, <span class="keyword">const</span> <span class="keywordtype">void</span>* hint=0 ) {
<a name="l00079"></a>00079 <span class="comment">// The "hint" argument is always ignored in NFS_Allocate thus const_cast shouldn't hurt</span>
<a name="l00080"></a>00080 <span class="keywordflow">return</span> pointer(internal::NFS_Allocate( n, <span class="keyword">sizeof</span>(value_type), const_cast<void*>(hint) ));
<a name="l00081"></a>00081 }
<a name="l00082"></a>00082
-<a name="l00084"></a><a class="code" href="a00226.html#3d4eadf188f7d85d3805ae534e0b8e1c">00084</a> <span class="keywordtype">void</span> <a class="code" href="a00226.html#3d4eadf188f7d85d3805ae534e0b8e1c">deallocate</a>( pointer p, size_type ) {
+<a name="l00084"></a><a class="code" href="a00238.html#3d4eadf188f7d85d3805ae534e0b8e1c">00084</a> <span class="keywordtype">void</span> <a class="code" href="a00238.html#3d4eadf188f7d85d3805ae534e0b8e1c">deallocate</a>( pointer p, size_type ) {
<a name="l00085"></a>00085 internal::NFS_Free(p);
<a name="l00086"></a>00086 }
<a name="l00087"></a>00087
-<a name="l00089"></a><a class="code" href="a00226.html#fb23b687b4c0429dab4c7f8017266cf0">00089</a> size_type <a class="code" href="a00226.html#fb23b687b4c0429dab4c7f8017266cf0">max_size</a>() const throw() {
+<a name="l00089"></a><a class="code" href="a00238.html#fb23b687b4c0429dab4c7f8017266cf0">00089</a> size_type <a class="code" href="a00238.html#fb23b687b4c0429dab4c7f8017266cf0">max_size</a>() const throw() {
<a name="l00090"></a>00090 <span class="keywordflow">return</span> (~size_t(0)-internal::NFS_MaxLineSize)/<span class="keyword">sizeof</span>(value_type);
<a name="l00091"></a>00091 }
<a name="l00092"></a>00092
-<a name="l00094"></a><a class="code" href="a00226.html#958ee8745c86c275bfc9533af565e017">00094</a> <span class="keywordtype">void</span> <a class="code" href="a00226.html#958ee8745c86c275bfc9533af565e017">construct</a>( pointer p, <span class="keyword">const</span> value_type& value ) {::new((<span class="keywordtype">void</span>*)(p)) value_type(value);}
+<a name="l00094"></a><a class="code" href="a00238.html#958ee8745c86c275bfc9533af565e017">00094</a> <span class="keywordtype">void</span> <a class="code" href="a00238.html#958ee8745c86c275bfc9533af565e017">construct</a>( pointer p, <span class="keyword">const</span> value_type& value ) {::new((<span class="keywordtype">void</span>*)(p)) value_type(value);}
<a name="l00095"></a>00095
-<a name="l00097"></a><a class="code" href="a00226.html#cd298895a4f1654b5149ec84b591ecb5">00097</a> <span class="keywordtype">void</span> <a class="code" href="a00226.html#cd298895a4f1654b5149ec84b591ecb5">destroy</a>( pointer p ) {p->~value_type();}
+<a name="l00097"></a><a class="code" href="a00238.html#cd298895a4f1654b5149ec84b591ecb5">00097</a> <span class="keywordtype">void</span> <a class="code" href="a00238.html#cd298895a4f1654b5149ec84b591ecb5">destroy</a>( pointer p ) {p->~value_type();}
<a name="l00098"></a>00098 };
<a name="l00099"></a>00099
<a name="l00100"></a>00100 <span class="preprocessor">#if _MSC_VER && !defined(__INTEL_COMPILER)</span>
@@ -110,18 +110,18 @@
<a name="l00103"></a>00103 <span class="preprocessor"></span>
<a name="l00105"></a>00105
<a name="l00106"></a>00106 <span class="keyword">template</span><>
-<a name="l00107"></a><a class="code" href="a00227.html">00107</a> <span class="keyword">class </span><a class="code" href="a00226.html">cache_aligned_allocator</a><void> {
+<a name="l00107"></a><a class="code" href="a00239.html">00107</a> <span class="keyword">class </span><a class="code" href="a00238.html">cache_aligned_allocator</a><void> {
<a name="l00108"></a>00108 <span class="keyword">public</span>:
<a name="l00109"></a>00109 <span class="keyword">typedef</span> <span class="keywordtype">void</span>* pointer;
<a name="l00110"></a>00110 <span class="keyword">typedef</span> <span class="keyword">const</span> <span class="keywordtype">void</span>* const_pointer;
<a name="l00111"></a>00111 <span class="keyword">typedef</span> <span class="keywordtype">void</span> value_type;
<a name="l00112"></a>00112 <span class="keyword">template</span><<span class="keyword">typename</span> U> <span class="keyword">struct </span>rebind {
-<a name="l00113"></a>00113 <span class="keyword">typedef</span> <a class="code" href="a00226.html">cache_aligned_allocator<U></a> other;
+<a name="l00113"></a>00113 <span class="keyword">typedef</span> <a class="code" href="a00238.html">cache_aligned_allocator<U></a> other;
<a name="l00114"></a>00114 };
<a name="l00115"></a>00115 };
<a name="l00116"></a>00116
<a name="l00117"></a>00117 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00118"></a>00118 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> <a class="code" href="a00226.html">cache_aligned_allocator<T></a>&, <span class="keyword">const</span> <a class="code" href="a00226.html">cache_aligned_allocator<U></a>& ) {<span class="keywordflow">return</span> <span class="keyword">true</span>;}
+<a name="l00118"></a>00118 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> <a class="code" href="a00238.html">cache_aligned_allocator<T></a>&, <span class="keyword">const</span> <a class="code" href="a00238.html">cache_aligned_allocator<U></a>& ) {<span class="keywordflow">return</span> <span class="keyword">true</span>;}
<a name="l00119"></a>00119
<a name="l00120"></a>00120 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
<a name="l00121"></a>00121 <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>;}
diff --git a/doc/html/a00423.html b/doc/html/a00417.html
similarity index 92%
rename from doc/html/a00423.html
rename to doc/html/a00417.html
index a836bb6..f2e13e5 100644
--- a/doc/html/a00423.html
+++ b/doc/html/a00417.html
@@ -49,24 +49,24 @@
<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="a00229.html">00034</a> <span class="keyword">class </span><a class="code" href="a00229.html">combinable</a> {
+<a name="l00034"></a><a class="code" href="a00241.html">00034</a> <span class="keyword">class </span><a class="code" href="a00241.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="a00226.html">tbb::cache_aligned_allocator<T></a> <a class="code" href="a00226.html">my_alloc</a>;
+<a name="l00036"></a>00036 <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00238.html">tbb::cache_aligned_allocator<T></a> <a class="code" href="a00238.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="a00229.html">combinable</a>() { }
+<a name="l00043"></a>00043 <a class="code" href="a00241.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="a00229.html">combinable</a>( finit _finit) : my_ets(_finit) { }
+<a name="l00046"></a>00046 <a class="code" href="a00241.html">combinable</a>( finit _finit) : my_ets(_finit) { }
<a name="l00047"></a>00047
-<a name="l00049"></a><a class="code" href="a00229.html#2c87e79ae98588a5780f708773388843">00049</a> <a class="code" href="a00229.html#2c87e79ae98588a5780f708773388843">~combinable</a>() {
+<a name="l00049"></a><a class="code" href="a00241.html#2c87e79ae98588a5780f708773388843">00049</a> <a class="code" href="a00241.html#2c87e79ae98588a5780f708773388843">~combinable</a>() {
<a name="l00050"></a>00050 }
<a name="l00051"></a>00051
-<a name="l00052"></a>00052 <a class="code" href="a00229.html">combinable</a>(<span class="keyword">const</span> <a class="code" href="a00229.html">combinable</a>& other) : my_ets(other.my_ets) { }
+<a name="l00052"></a>00052 <a class="code" href="a00241.html">combinable</a>(<span class="keyword">const</span> <a class="code" href="a00241.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
diff --git a/doc/html/a00418.html b/doc/html/a00418.html
index 8d93ac8..9e50f24 100644
--- a/doc/html/a00418.html
+++ b/doc/html/a00418.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>blocked_range.h Source File</title>
+<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>
@@ -19,7 +19,7 @@
<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>
+<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-2011 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>
@@ -39,83 +39,1175 @@
<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="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="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="a00221.html">00040</a> <span class="keyword">class </span><a class="code" href="a00221.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="a00221.html#1a8d05842c2b3dfc177bc4d347e4cef7">00045</a> <span class="keyword">typedef</span> Value <a class="code" href="a00221.html#1a8d05842c2b3dfc177bc4d347e4cef7">const_iterator</a>;
-<a name="l00046"></a>00046
-<a name="l00048"></a><a class="code" href="a00221.html#f5707bffea38eee5c9680f37358afb8e">00048</a> <span class="keyword">typedef</span> std::size_t <a class="code" href="a00221.html#f5707bffea38eee5c9680f37358afb8e">size_type</a>;
-<a name="l00049"></a>00049
-<a name="l00051"></a>00051
-<a name="l00052"></a><a class="code" href="a00221.html#94607755c5110d199202234d58d022ac">00052</a> <a class="code" href="a00221.html#94607755c5110d199202234d58d022ac">blocked_range</a>() : my_end(), my_begin() {}
-<a name="l00053"></a>00053
-<a name="l00055"></a><a class="code" href="a00221.html#14795a36ead1414b4371dbe1a4656359">00055</a> <a class="code" href="a00221.html#94607755c5110d199202234d58d022ac">blocked_range</a>( Value begin_, Value end_, <a class="code" href="a00221.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="a00221.html#18d2258400756ac1446dac7676b18df3">00062</a> <a class="code" href="a00221.html#1a8d05842c2b3dfc177bc4d347e4cef7">const_iterator</a> <a class="code" href="a00221.html#18d2258400756ac1446dac7676b18df3">begin</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_begin;}
+<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="a00321.html">00059</a> <span class="keyword">struct </span><a class="code" href="a00321.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="l00065"></a><a class="code" href="a00221.html#8b929d93ddc13f148b11bceef3a3bdf8">00065</a> <a class="code" href="a00221.html#1a8d05842c2b3dfc177bc4d347e4cef7">const_iterator</a> <a class="code" href="a00221.html#8b929d93ddc13f148b11bceef3a3bdf8">end</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_end;}
-<a name="l00066"></a>00066
+<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="a00243.html">concurrent_hash_map</a>;
<a name="l00068"></a>00068
-<a name="l00069"></a><a class="code" href="a00221.html#9eaa0b6beff1420f688570bbf6b8c462">00069</a> <a class="code" href="a00221.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> <a class="code" href="a00221.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()<span class="keyword"> const </span>{
-<a name="l00070"></a>00070 __TBB_ASSERT( !(<a class="code" href="a00221.html#8b929d93ddc13f148b11bceef3a3bdf8">end</a>()<<a class="code" href="a00221.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="a00221.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="a00221.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">00075</a> <a class="code" href="a00221.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> <a class="code" href="a00221.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="a00221.html#8f4f02f530eb3f2e7ea26e06f76aef9d">00082</a> <span class="keywordtype">bool</span> <a class="code" href="a00221.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="a00221.html#41a58b703d574b6e1ca155df3576f578">00086</a> <span class="keywordtype">bool</span> <a class="code" href="a00221.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_grainsize<<a class="code" href="a00221.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>();}
-<a name="l00087"></a>00087
-<a name="l00089"></a>00089
-<a name="l00091"></a><a class="code" href="a00221.html#4c0efd2be3f96a0ab3ba5085e8b3fcc7">00091</a> <a class="code" href="a00221.html#94607755c5110d199202234d58d022ac">blocked_range</a>( <a class="code" href="a00221.html">blocked_range</a>& r, <a class="code" href="a00290.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="a00221.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="a00221.html">blocked_range</a>& r ) {
-<a name="l00106"></a>00106 __TBB_ASSERT( r.<a class="code" href="a00221.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="a00221.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a> + (r.<a class="code" href="a00221.html#1ec95c8988b50064dd603998b16f3930">my_end</a>-r.<a class="code" href="a00221.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a>)/2u;
-<a name="l00108"></a>00108 r.<a class="code" href="a00221.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>
+<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="a00307.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="a00275.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<size_t>(ptr) > size_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 {
+<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="a00243.html">00549</a> <span class="keyword">class </span><a class="code" href="a00243.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="a00246.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="a00245.html">00608</a> <span class="keyword">class </span><a class="code" href="a00245.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="a00245.html">bucket_accessor</a>( <a class="code" href="a00243.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="a00383.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>( base, h, writer ); }
+<a name="l00613"></a><a class="code" href="a00245.html#d11c77f4d70a94d4fb344492bbf18007">00613</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="a00383.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>( <a class="code" href="a00243.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="a00243.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="a00245.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="a00245.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="a00246.html">00667</a> <span class="keyword">class </span><a class="code" href="a00246.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="a00243.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="a00244.html">accessor</a>;
+<a name="l00670"></a>00670 <span class="keyword">public</span>:
+<a name="l00672"></a><a class="code" href="a00246.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="a00246.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="a00246.html#7db006d41b49dc5f1716a913769d4698">00678</a> <span class="keywordtype">void</span> <a class="code" href="a00383.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="a00246.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="a00246.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="a00246.html#27399c613eb1aecd4660803955dda09d">00697</a> <a class="code" href="a00246.html">const_accessor</a>() : my_node(NULL) {}
+<a name="l00698"></a>00698
+<a name="l00700"></a><a class="code" href="a00246.html#928769b139d53427e7075c1f86148e4c">00700</a> ~<a class="code" href="a00246.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="a00244.html">00710</a> <span class="keyword">class </span><a class="code" href="a00244.html">accessor</a>: <span class="keyword">public</span> <a class="code" href="a00246.html">const_accessor</a> {
+<a name="l00711"></a>00711 <span class="keyword">public</span>:
+<a name="l00713"></a><a class="code" href="a00244.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="a00244.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="a00244.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="a00243.html#1ad413f5b666176e7669bf4c87d1ff3f">00728</a> <a class="code" href="a00243.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="a00243.html#46b9896317662c3cfa3c876ad7592a7c">00733</a> <a class="code" href="a00243.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="a00243.html#6fb14710893308fb47aaeee55ee30dc3">00740</a> <a class="code" href="a00243.html">concurrent_hash_map</a>( <span class="keyword">const</span> <a class="code" href="a00243.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="a00243.html#83c40f2053f208861b90390e12a36436">00748</a> <a class="code" href="a00243.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="a00243.html#088d1aaccc816884a49e38f7065622c8">00756</a> <a class="code" href="a00243.html">concurrent_hash_map</a>& operator=( <span class="keyword">const</span> <a class="code" href="a00243.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="a00243.html#2aa8e2d28d5af1284cf78d20a9c22731">00774</a> ~<a class="code" href="a00243.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="a00243.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="a00243.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="a00243.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="a00243.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="a00243.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="a00243.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="a00243.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="a00243.html#2afcc33dade7bb24e008d60c0df38230">00825</a> <span class="keywordtype">bool</span> find( <a class="code" href="a00246.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="a00246.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="a00243.html#7bc475d1968f7f0af3d736d7e8a0d7df">00832</a> <span class="keywordtype">bool</span> find( <a class="code" href="a00244.html">accessor</a> &result, <span class="keyword">const</span> Key &key ) {
+<a name="l00833"></a>00833 result.<a class="code" href="a00246.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="a00243.html#47fe0e60151a9bd7a444db827772a4e6">00839</a> <span class="keywordtype">bool</span> insert( <a class="code" href="a00246.html">const_accessor</a> &result, <span class="keyword">const</span> Key &key ) {
+<a name="l00840"></a>00840 result.<a class="code" href="a00246.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="a00243.html#54e0955ecd11575b4c07166838a72893">00846</a> <span class="keywordtype">bool</span> insert( <a class="code" href="a00244.html">accessor</a> &result, <span class="keyword">const</span> Key &key ) {
+<a name="l00847"></a>00847 result.<a class="code" href="a00246.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="a00243.html#091efd2d12fdad4fe9e54d9629a9dfc3">00853</a> <span class="keywordtype">bool</span> insert( <a class="code" href="a00246.html">const_accessor</a> &result, <span class="keyword">const</span> value_type &value ) {
+<a name="l00854"></a>00854 result.<a class="code" href="a00246.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="a00243.html#39183d78d6e8425917555ab542ab92de">00860</a> <span class="keywordtype">bool</span> insert( <a class="code" href="a00244.html">accessor</a> &result, <span class="keyword">const</span> value_type &value ) {
+<a name="l00861"></a>00861 result.<a class="code" href="a00246.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="a00243.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="a00243.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="a00243.html#e698ef3d70b2d1a29a7a5551784d3653">00884</a> <span class="keywordtype">bool</span> erase( <a class="code" href="a00246.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="a00243.html#5f12d150d421420965db07368666a84f">00890</a> <span class="keywordtype">bool</span> erase( <a class="code" href="a00244.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="a00243.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="a00243.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="a00243.html#3f3413264a99174a224ef96f6c4ea769">00948</a> <span class="keywordtype">bool</span> <a class="code" href="a00243.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="a00246.html">const_accessor</a> *result, <span class="keywordtype">bool</span> write ) {
+<a name="l00949"></a>00949 __TBB_ASSERT( !result || !result-><a class="code" href="a00246.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="a00245.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="a00245.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="a00230.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="a00246.html#21856da696b0765cc3db90663160d95e">my_node</a> = n;
+<a name="l01014"></a>01014 result-><a class="code" href="a00246.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="a00243.html#8f5373b8e1864619d1ffcf3bf3f1f13d">01030</a> std::pair<I, I> <a class="code" href="a00243.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="a00243.html#0c964214eb38f54603aa75fdff6d2709">01048</a> <span class="keywordtype">bool</span> <a class="code" href="a00243.html">concurrent_hash_map<Key,T,HashCompare,A>::exclude</a>( <a class="code" href="a00246.html">const_accessor</a> &item_accessor ) {
+<a name="l01049"></a>01049 __TBB_ASSERT( item_accessor.<a class="code" href="a00246.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="a00246.html#21856da696b0765cc3db90663160d95e">my_node</a>;
+<a name="l01051"></a>01051 hashcode_t <span class="keyword">const</span> h = item_accessor.<a class="code" href="a00246.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="a00245.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 the 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="a00246.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="a00246.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="a00246.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="a00243.html#f27802b3a8d1863c29e743e9c6b4e870">01078</a> <span class="keywordtype">bool</span> <a class="code" href="a00243.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="a00245.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="a00245.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="a00243.html">concurrent_hash_map<Key,T,HashCompare,A>::swap</a>(<a class="code" href="a00243.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="a00243.html#a72cb6e9873e5541295682179e5a7f74">my_allocator</a>);
+<a name="l01117"></a>01117 std::swap(this->my_hash_compare, table.<a class="code" href="a00243.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="a00243.html#94758113d8993cfe5afdf2d63a728869">01122</a> <span class="keywordtype">void</span> <a class="code" href="a00243.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);
+<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="a00243.html#220686fe17b197eedf19dd856cd02e36">01188</a> <span class="keywordtype">void</span> <a class="code" href="a00243.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="a00238.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="a00238.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="a00238.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="a00243.html#72c9c9e9655fcf096f5f0ed9c8ba6669">01260</a> <span class="keywordtype">void</span> <a class="code" href="a00243.html">concurrent_hash_map<Key,T,HashCompare,A>::internal_copy</a>( <span class="keyword">const</span> <a class="code" href="a00243.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="a00243.html#94758113d8993cfe5afdf2d63a728869">rehash</a>();
+<a name="l01280"></a>01280 } <span class="keywordflow">else</span> <a class="code" href="a00243.html#72c9c9e9655fcf096f5f0ed9c8ba6669">internal_copy</a>( source.<a class="code" href="a00243.html#35a8c373fc3d52099ae18f0553162491">begin</a>(), source.<a class="code" href="a00243.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="a00243.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-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00424.html b/doc/html/a00424.html
deleted file mode 100644
index 211159c..0000000
--- a/doc/html/a00424.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-2011 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 "_concurrent_unordered_internal.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="a00300.html">00059</a> <span class="keyword">struct </span><a class="code" href="a00300.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="a00231.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="a00288.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="a00258.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<size_t>(ptr) > size_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 {
-<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="a00231.html">00549</a> <span class="keyword">class </span><a class="code" href="a00231.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="a00234.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="a00233.html">00608</a> <span class="keyword">class </span><a class="code" href="a00233.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="a00233.html">bucket_accessor</a>( <a class="code" href="a00231.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="a00362.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>( base, h, writer ); }
-<a name="l00613"></a><a class="code" href="a00233.html#d11c77f4d70a94d4fb344492bbf18007">00613</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="a00362.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>( <a class="code" href="a00231.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="a00231.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="a00233.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="a00233.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="a00234.html">00667</a> <span class="keyword">class </span><a class="code" href="a00234.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="a00231.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="a00232.html">accessor</a>;
-<a name="l00670"></a>00670 <span class="keyword">public</span>:
-<a name="l00672"></a><a class="code" href="a00234.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="a00234.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="a00234.html#7db006d41b49dc5f1716a913769d4698">00678</a> <span class="keywordtype">void</span> <a class="code" href="a00362.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="a00234.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="a00234.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="a00234.html#27399c613eb1aecd4660803955dda09d">00697</a> <a class="code" href="a00234.html">const_accessor</a>() : my_node(NULL) {}
-<a name="l00698"></a>00698
-<a name="l00700"></a><a class="code" href="a00234.html#928769b139d53427e7075c1f86148e4c">00700</a> ~<a class="code" href="a00234.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="a00232.html">00710</a> <span class="keyword">class </span><a class="code" href="a00232.html">accessor</a>: <span class="keyword">public</span> <a class="code" href="a00234.html">const_accessor</a> {
-<a name="l00711"></a>00711 <span class="keyword">public</span>:
-<a name="l00713"></a><a class="code" href="a00232.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="a00232.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="a00232.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="a00231.html#1ad413f5b666176e7669bf4c87d1ff3f">00728</a> <a class="code" href="a00231.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="a00231.html#46b9896317662c3cfa3c876ad7592a7c">00733</a> <a class="code" href="a00231.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="a00231.html#6fb14710893308fb47aaeee55ee30dc3">00740</a> <a class="code" href="a00231.html">concurrent_hash_map</a>( <span class="keyword">const</span> <a class="code" href="a00231.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="a00231.html#83c40f2053f208861b90390e12a36436">00748</a> <a class="code" href="a00231.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="a00231.html#088d1aaccc816884a49e38f7065622c8">00756</a> <a class="code" href="a00231.html">concurrent_hash_map</a>& operator=( <span class="keyword">const</span> <a class="code" href="a00231.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="a00231.html#2aa8e2d28d5af1284cf78d20a9c22731">00774</a> ~<a class="code" href="a00231.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="a00231.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="a00231.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="a00231.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="a00231.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="a00231.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="a00231.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="a00231.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="a00231.html#2afcc33dade7bb24e008d60c0df38230">00825</a> <span class="keywordtype">bool</span> find( <a class="code" href="a00234.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="a00234.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="a00231.html#7bc475d1968f7f0af3d736d7e8a0d7df">00832</a> <span class="keywordtype">bool</span> find( <a class="code" href="a00232.html">accessor</a> &result, <span class="keyword">const</span> Key &key ) {
-<a name="l00833"></a>00833 result.<a class="code" href="a00234.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="a00231.html#47fe0e60151a9bd7a444db827772a4e6">00839</a> <span class="keywordtype">bool</span> insert( <a class="code" href="a00234.html">const_accessor</a> &result, <span class="keyword">const</span> Key &key ) {
-<a name="l00840"></a>00840 result.<a class="code" href="a00234.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="a00231.html#54e0955ecd11575b4c07166838a72893">00846</a> <span class="keywordtype">bool</span> insert( <a class="code" href="a00232.html">accessor</a> &result, <span class="keyword">const</span> Key &key ) {
-<a name="l00847"></a>00847 result.<a class="code" href="a00234.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="a00231.html#091efd2d12fdad4fe9e54d9629a9dfc3">00853</a> <span class="keywordtype">bool</span> insert( <a class="code" href="a00234.html">const_accessor</a> &result, <span class="keyword">const</span> value_type &value ) {
-<a name="l00854"></a>00854 result.<a class="code" href="a00234.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="a00231.html#39183d78d6e8425917555ab542ab92de">00860</a> <span class="keywordtype">bool</span> insert( <a class="code" href="a00232.html">accessor</a> &result, <span class="keyword">const</span> value_type &value ) {
-<a name="l00861"></a>00861 result.<a class="code" href="a00234.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="a00231.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="a00231.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="a00231.html#e698ef3d70b2d1a29a7a5551784d3653">00884</a> <span class="keywordtype">bool</span> erase( <a class="code" href="a00234.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="a00231.html#5f12d150d421420965db07368666a84f">00890</a> <span class="keywordtype">bool</span> erase( <a class="code" href="a00232.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="a00231.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="a00231.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="a00231.html#3f3413264a99174a224ef96f6c4ea769">00948</a> <span class="keywordtype">bool</span> <a class="code" href="a00231.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="a00234.html">const_accessor</a> *result, <span class="keywordtype">bool</span> write ) {
-<a name="l00949"></a>00949 __TBB_ASSERT( !result || !result-><a class="code" href="a00234.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="a00233.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="a00233.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="a00218.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="a00234.html#21856da696b0765cc3db90663160d95e">my_node</a> = n;
-<a name="l01014"></a>01014 result-><a class="code" href="a00234.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="a00231.html#8f5373b8e1864619d1ffcf3bf3f1f13d">01030</a> std::pair<I, I> <a class="code" href="a00231.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="a00231.html#0c964214eb38f54603aa75fdff6d2709">01048</a> <span class="keywordtype">bool</span> <a class="code" href="a00231.html">concurrent_hash_map<Key,T,HashCompare,A>::exclude</a>( <a class="code" href="a00234.html">const_accessor</a> &item_accessor ) {
-<a name="l01049"></a>01049 __TBB_ASSERT( item_accessor.<a class="code" href="a00234.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="a00234.html#21856da696b0765cc3db90663160d95e">my_node</a>;
-<a name="l01051"></a>01051 hashcode_t <span class="keyword">const</span> h = item_accessor.<a class="code" href="a00234.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="a00233.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 the 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="a00234.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="a00234.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="a00234.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="a00231.html#f27802b3a8d1863c29e743e9c6b4e870">01078</a> <span class="keywordtype">bool</span> <a class="code" href="a00231.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="a00233.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="a00233.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="a00231.html">concurrent_hash_map<Key,T,HashCompare,A>::swap</a>(<a class="code" href="a00231.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="a00231.html#a72cb6e9873e5541295682179e5a7f74">my_allocator</a>);
-<a name="l01117"></a>01117 std::swap(this->my_hash_compare, table.<a class="code" href="a00231.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="a00231.html#94758113d8993cfe5afdf2d63a728869">01122</a> <span class="keywordtype">void</span> <a class="code" href="a00231.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);
-<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="a00231.html#220686fe17b197eedf19dd856cd02e36">01188</a> <span class="keywordtype">void</span> <a class="code" href="a00231.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="a00226.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="a00226.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="a00226.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="a00231.html#72c9c9e9655fcf096f5f0ed9c8ba6669">01260</a> <span class="keywordtype">void</span> <a class="code" href="a00231.html">concurrent_hash_map<Key,T,HashCompare,A>::internal_copy</a>( <span class="keyword">const</span> <a class="code" href="a00231.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="a00231.html#94758113d8993cfe5afdf2d63a728869">rehash</a>();
-<a name="l01280"></a>01280 } <span class="keywordflow">else</span> <a class="code" href="a00231.html#72c9c9e9655fcf096f5f0ed9c8ba6669">internal_copy</a>( source.<a class="code" href="a00231.html#35a8c373fc3d52099ae18f0553162491">begin</a>(), source.<a class="code" href="a00231.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="a00231.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-2011 Intel Corporation. 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/a00429.html b/doc/html/a00429.html
new file mode 100644
index 0000000..916715f
--- /dev/null
+++ b/doc/html/a00429.html
@@ -0,0 +1,328 @@
+<!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-2011 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="a00247.html">00041</a> <span class="keyword">class </span><a class="code" href="a00247.html">concurrent_priority_queue</a> {
+<a name="l00042"></a>00042 <span class="keyword">public</span>:
+<a name="l00044"></a><a class="code" href="a00247.html#7c611a6b5b8f94b0e7f2afc97e31efb1">00044</a> <span class="keyword">typedef</span> T <a class="code" href="a00247.html#7c611a6b5b8f94b0e7f2afc97e31efb1">value_type</a>;
+<a name="l00045"></a>00045
+<a name="l00047"></a><a class="code" href="a00247.html#5804b3c708ef4e50d603f918ef2b9e58">00047</a> <span class="keyword">typedef</span> T& <a class="code" href="a00247.html#5804b3c708ef4e50d603f918ef2b9e58">reference</a>;
+<a name="l00048"></a>00048
+<a name="l00050"></a><a class="code" href="a00247.html#a4ded8601a434098605be0dcc4febc60">00050</a> <span class="keyword">typedef</span> <span class="keyword">const</span> T& <a class="code" href="a00247.html#a4ded8601a434098605be0dcc4febc60">const_reference</a>;
+<a name="l00051"></a>00051
+<a name="l00053"></a><a class="code" href="a00247.html#b679eea8d01d041625a39f719ca2b7ed">00053</a> <span class="keyword">typedef</span> size_t <a class="code" href="a00247.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a>;
+<a name="l00054"></a>00054
+<a name="l00056"></a><a class="code" href="a00247.html#77399bc76b3ecd60e33f7e35a5becd87">00056</a> <span class="keyword">typedef</span> ptrdiff_t <a class="code" href="a00247.html#77399bc76b3ecd60e33f7e35a5becd87">difference_type</a>;
+<a name="l00057"></a>00057
+<a name="l00059"></a><a class="code" href="a00247.html#1712cb3a46bc1821fccc5e2cd83d5cd7">00059</a> <span class="keyword">typedef</span> A <a class="code" href="a00247.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a>;
+<a name="l00060"></a>00060
+<a name="l00062"></a><a class="code" href="a00247.html#eefa40599afe00ea393897d8f5662e65">00062</a> <span class="keyword">explicit</span> <a class="code" href="a00247.html#eefa40599afe00ea393897d8f5662e65">concurrent_priority_queue</a>(<span class="keyword">const</span> <a class="code" href="a00247.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a>& a = <a class="code" href="a00247.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="a00247.html#4555b4a55415a70024c4004b51e9f385">00068</a> <span class="keyword">explicit</span> <a class="code" href="a00247.html#eefa40599afe00ea393897d8f5662e65">concurrent_priority_queue</a>(<a class="code" href="a00247.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a> init_capacity, <span class="keyword">const</span> <a class="code" href="a00247.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="a00247.html#9147cb4207017c260a0c3929c12cd40f">00077</a> <a class="code" href="a00247.html#eefa40599afe00ea393897d8f5662e65">concurrent_priority_queue</a>(InputIterator begin, InputIterator end, <span class="keyword">const</span> <a class="code" href="a00247.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a>& a = <a class="code" href="a00247.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="a00247.html#509419e320f200456d89dc54a65140b3">00088</a> <span class="keyword">explicit</span> <a class="code" href="a00247.html#eefa40599afe00ea393897d8f5662e65">concurrent_priority_queue</a>(<span class="keyword">const</span> <a class="code" href="a00247.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="a00247.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="a00247.html#c8b20e7430c5302936030bef59a562be">00097</a> <a class="code" href="a00247.html#eefa40599afe00ea393897d8f5662e65">concurrent_priority_queue</a>(<span class="keyword">const</span> <a class="code" href="a00247.html">concurrent_priority_queue</a>& src, <span class="keyword">const</span> <a class="code" href="a00247.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="a00247.html#2ab7f7808891027ac0f0f5b3a4be51e9">00106</a> <a class="code" href="a00247.html">concurrent_priority_queue</a>& <a class="code" href="a00247.html#2ab7f7808891027ac0f0f5b3a4be51e9">operator=</a>(<span class="keyword">const</span> <a class="code" href="a00247.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="a00247.html#384fd94d6b4d4dfce7aa64b531be7545">data</a>.begin(), src.<a class="code" href="a00247.html#384fd94d6b4d4dfce7aa64b531be7545">data</a>.end(), src.<a class="code" href="a00247.html#384fd94d6b4d4dfce7aa64b531be7545">data</a>.get_allocator()).<a class="code" href="a00247.html#0ecdc6a04aa259374425d424ca2a6082">swap</a>(data);
+<a name="l00109"></a>00109 mark = src.<a class="code" href="a00247.html#7fcd8d21ea4228b6079a2f2723550af0">mark</a>;
+<a name="l00110"></a>00110 my_size = src.<a class="code" href="a00247.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="a00247.html#317c508fa92df218be5d014c26c09bb7">00118</a> <span class="keywordtype">bool</span> <a class="code" href="a00247.html#317c508fa92df218be5d014c26c09bb7">empty</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="a00247.html#8b2ae25c61338c6fd59e94fe09822ba5">size</a>()==0; }
+<a name="l00119"></a>00119
+<a name="l00121"></a>00121
+<a name="l00123"></a><a class="code" href="a00247.html#8b2ae25c61338c6fd59e94fe09822ba5">00123</a> <a class="code" href="a00247.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a> <a class="code" href="a00247.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="a00247.html#d905af7b8f6defff562f5ae9c3275763">00127</a> <span class="keywordtype">void</span> <a class="code" href="a00247.html#d905af7b8f6defff562f5ae9c3275763">push</a>(<a class="code" href="a00247.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="a00247.html#e036461a29cc40902a2bb79abf9f5146">00138</a> <span class="keywordtype">bool</span> <a class="code" href="a00247.html#e036461a29cc40902a2bb79abf9f5146">try_pop</a>(<a class="code" href="a00247.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="a00247.html#0bdcdf7cde9fd369edca845bec34ca94">00149</a> <span class="keywordtype">void</span> <a class="code" href="a00247.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="a00247.html#0ecdc6a04aa259374425d424ca2a6082">00157</a> <span class="keywordtype">void</span> <a class="code" href="a00247.html#0ecdc6a04aa259374425d424ca2a6082">swap</a>(<a class="code" href="a00247.html">concurrent_priority_queue</a>& q) {
+<a name="l00158"></a>00158 data.swap(q.<a class="code" href="a00247.html#384fd94d6b4d4dfce7aa64b531be7545">data</a>);
+<a name="l00159"></a>00159 std::swap(mark, q.<a class="code" href="a00247.html#7fcd8d21ea4228b6079a2f2723550af0">mark</a>);
+<a name="l00160"></a>00160 std::swap(my_size, q.<a class="code" href="a00247.html#9e480a4ce8950a0729a642cdac2bec41">my_size</a>);
+<a name="l00161"></a>00161 }
+<a name="l00162"></a>00162
+<a name="l00164"></a><a class="code" href="a00247.html#d545d444fb0d16148f9b61fd89f9a337">00164</a> <a class="code" href="a00247.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a> <a class="code" href="a00247.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="a00247.html#7c611a6b5b8f94b0e7f2afc97e31efb1">value_type</a> *elem;
+<a name="l00175"></a>00175 <a class="code" href="a00247.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a> sz;
+<a name="l00176"></a>00176 };
+<a name="l00177"></a>00177 cpq_operation(<a class="code" href="a00247.html#a4ded8601a434098605be0dcc4febc60">const_reference</a> e, operation_type t) :
+<a name="l00178"></a>00178 type(t), elem(const_cast<<a class="code" href="a00247.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="a00247.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a> mark;
+<a name="l00197"></a>00197 __TBB_atomic <a class="code" href="a00247.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="a00247.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 time operations: pushes,</span>
+<a name="l00227"></a>00227 <span class="comment">// tops, some pops. Also reserve.</span>
+<a name="l00228"></a>00228 <span class="keywordflow">while</span> (op_list) {
+<a name="l00229"></a>00229 <span class="comment">// ITT note: &(op_list->status) tag is used to cover accesses to op_list</span>
+<a name="l00230"></a>00230 <span class="comment">// node. This thread is going to handle the operation, and so will acquire it</span>
+<a name="l00231"></a>00231 <span class="comment">// and perform the associated operation w/o triggering a race condition; the</span>
+<a name="l00232"></a>00232 <span class="comment">// thread that created the operation is waiting on the status field, so when</span>
+<a name="l00233"></a>00233 <span class="comment">// this thread is done with the operation, it will perform a</span>
+<a name="l00234"></a>00234 <span class="comment">// store_with_release to give control back to the waiting thread in</span>
+<a name="l00235"></a>00235 <span class="comment">// aggregator::insert_operation.</span>
+<a name="l00236"></a>00236 call_itt_notify(acquired, &(op_list->status));
+<a name="l00237"></a>00237 __TBB_ASSERT(op_list->type != INVALID_OP, NULL);
+<a name="l00238"></a>00238 tmp = op_list;
+<a name="l00239"></a>00239 op_list = itt_hide_load_word(op_list->next);
+<a name="l00240"></a>00240 <span class="keywordflow">if</span> (tmp->type == PUSH_OP) {
+<a name="l00241"></a>00241 __TBB_TRY {
+<a name="l00242"></a>00242 data.push_back(*(tmp->elem));
+<a name="l00243"></a>00243 __TBB_store_with_release(my_size, my_size+1);
+<a name="l00244"></a>00244 itt_store_word_with_release(tmp->status, uintptr_t(SUCCEEDED));
+<a name="l00245"></a>00245 } __TBB_CATCH(...) {
+<a name="l00246"></a>00246 itt_store_word_with_release(tmp->status, uintptr_t(FAILED));
+<a name="l00247"></a>00247 }
+<a name="l00248"></a>00248 }
+<a name="l00249"></a>00249 <span class="keywordflow">else</span> { <span class="comment">// tmp->type == POP_OP</span>
+<a name="l00250"></a>00250 __TBB_ASSERT(tmp->type == POP_OP, NULL);
+<a name="l00251"></a>00251 <span class="keywordflow">if</span> (mark < data.size() &&
+<a name="l00252"></a>00252 compare(data[0], data[data.size()-1])) {
+<a name="l00253"></a>00253 <span class="comment">// there are newly pushed elems and the last one</span>
+<a name="l00254"></a>00254 <span class="comment">// is higher than top</span>
+<a name="l00255"></a>00255 *(tmp->elem) = data[data.size()-1]; <span class="comment">// copy the data</span>
+<a name="l00256"></a>00256 __TBB_store_with_release(my_size, my_size-1);
+<a name="l00257"></a>00257 itt_store_word_with_release(tmp->status, uintptr_t(SUCCEEDED));
+<a name="l00258"></a>00258 data.pop_back();
+<a name="l00259"></a>00259 __TBB_ASSERT(mark<=data.size(), NULL);
+<a name="l00260"></a>00260 }
+<a name="l00261"></a>00261 <span class="keywordflow">else</span> { <span class="comment">// no convenient item to pop; postpone</span>
+<a name="l00262"></a>00262 itt_hide_store_word(tmp->next, pop_list);
+<a name="l00263"></a>00263 pop_list = tmp;
+<a name="l00264"></a>00264 }
+<a name="l00265"></a>00265 }
+<a name="l00266"></a>00266 }
+<a name="l00267"></a>00267
+<a name="l00268"></a>00268 <span class="comment">// second pass processes pop operations</span>
+<a name="l00269"></a>00269 <span class="keywordflow">while</span> (pop_list) {
+<a name="l00270"></a>00270 tmp = pop_list;
+<a name="l00271"></a>00271 pop_list = itt_hide_load_word(pop_list->next);
+<a name="l00272"></a>00272 __TBB_ASSERT(tmp->type == POP_OP, NULL);
+<a name="l00273"></a>00273 <span class="keywordflow">if</span> (data.empty()) {
+<a name="l00274"></a>00274 itt_store_word_with_release(tmp->status, uintptr_t(FAILED));
+<a name="l00275"></a>00275 }
+<a name="l00276"></a>00276 <span class="keywordflow">else</span> {
+<a name="l00277"></a>00277 __TBB_ASSERT(mark<=data.size(), NULL);
+<a name="l00278"></a>00278 <span class="keywordflow">if</span> (mark < data.size() &&
+<a name="l00279"></a>00279 compare(data[0], data[data.size()-1])) {
+<a name="l00280"></a>00280 <span class="comment">// there are newly pushed elems and the last one is</span>
+<a name="l00281"></a>00281 <span class="comment">// higher than top</span>
+<a name="l00282"></a>00282 *(tmp->elem) = data[data.size()-1]; <span class="comment">// copy the data</span>
+<a name="l00283"></a>00283 __TBB_store_with_release(my_size, my_size-1);
+<a name="l00284"></a>00284 itt_store_word_with_release(tmp->status, uintptr_t(SUCCEEDED));
+<a name="l00285"></a>00285 data.pop_back();
+<a name="l00286"></a>00286 }
+<a name="l00287"></a>00287 <span class="keywordflow">else</span> { <span class="comment">// extract top and push last element down heap</span>
+<a name="l00288"></a>00288 *(tmp->elem) = data[0]; <span class="comment">// copy the data</span>
+<a name="l00289"></a>00289 __TBB_store_with_release(my_size, my_size-1);
+<a name="l00290"></a>00290 itt_store_word_with_release(tmp->status, uintptr_t(SUCCEEDED));
+<a name="l00291"></a>00291 reheap();
+<a name="l00292"></a>00292 }
+<a name="l00293"></a>00293 }
+<a name="l00294"></a>00294 }
+<a name="l00295"></a>00295
+<a name="l00296"></a>00296 <span class="comment">// heapify any leftover pushed elements before doing the next</span>
+<a name="l00297"></a>00297 <span class="comment">// batch of operations</span>
+<a name="l00298"></a>00298 <span class="keywordflow">if</span> (mark<data.size()) heapify();
+<a name="l00299"></a>00299 __TBB_ASSERT(mark == data.size(), NULL);
+<a name="l00300"></a>00300 }
+<a name="l00301"></a>00301
+<a name="l00303"></a>00303 <span class="keywordtype">void</span> heapify() {
+<a name="l00304"></a>00304 <span class="keywordflow">if</span> (!mark && data.size()>0) mark = 1;
+<a name="l00305"></a>00305 <span class="keywordflow">for</span> (; mark<data.size(); ++mark) {
+<a name="l00306"></a>00306 <span class="comment">// for each unheapified element under size</span>
+<a name="l00307"></a>00307 <a class="code" href="a00247.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a> cur_pos = mark;
+<a name="l00308"></a>00308 <a class="code" href="a00247.html#7c611a6b5b8f94b0e7f2afc97e31efb1">value_type</a> to_place = data[mark];
+<a name="l00309"></a>00309 <span class="keywordflow">do</span> { <span class="comment">// push to_place up the heap</span>
+<a name="l00310"></a>00310 <a class="code" href="a00247.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a> parent = (cur_pos-1)>>1;
+<a name="l00311"></a>00311 <span class="keywordflow">if</span> (!compare(data[parent], to_place)) <span class="keywordflow">break</span>;
+<a name="l00312"></a>00312 data[cur_pos] = data[parent];
+<a name="l00313"></a>00313 cur_pos = parent;
+<a name="l00314"></a>00314 } <span class="keywordflow">while</span>( cur_pos );
+<a name="l00315"></a>00315 data[cur_pos] = to_place;
+<a name="l00316"></a>00316 }
+<a name="l00317"></a>00317 }
+<a name="l00318"></a>00318
+<a name="l00320"></a>00320
+<a name="l00321"></a>00321 <span class="keywordtype">void</span> reheap() {
+<a name="l00322"></a>00322 <a class="code" href="a00247.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a> cur_pos=0, child=1;
+<a name="l00323"></a>00323
+<a name="l00324"></a>00324 <span class="keywordflow">while</span> (child < mark) {
+<a name="l00325"></a>00325 <a class="code" href="a00247.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a> target = child;
+<a name="l00326"></a>00326 <span class="keywordflow">if</span> (child+1 < mark && compare(data[child], data[child+1]))
+<a name="l00327"></a>00327 ++target;
+<a name="l00328"></a>00328 <span class="comment">// target now has the higher priority child</span>
+<a name="l00329"></a>00329 <span class="keywordflow">if</span> (compare(data[target], data[data.size()-1])) <span class="keywordflow">break</span>;
+<a name="l00330"></a>00330 data[cur_pos] = data[target];
+<a name="l00331"></a>00331 cur_pos = target;
+<a name="l00332"></a>00332 child = (cur_pos<<1)+1;
+<a name="l00333"></a>00333 }
+<a name="l00334"></a>00334 data[cur_pos] = data[data.size()-1];
+<a name="l00335"></a>00335 data.pop_back();
+<a name="l00336"></a>00336 <span class="keywordflow">if</span> (mark > data.size()) mark = data.size();
+<a name="l00337"></a>00337 }
+<a name="l00338"></a>00338 };
+<a name="l00339"></a>00339
+<a name="l00340"></a>00340 } <span class="comment">// namespace interface5</span>
+<a name="l00341"></a>00341
+<a name="l00342"></a>00342 <span class="keyword">using</span> interface5::concurrent_priority_queue;
+<a name="l00343"></a>00343
+<a name="l00344"></a>00344 } <span class="comment">// namespace tbb</span>
+<a name="l00345"></a>00345
+<a name="l00346"></a>00346 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_concurrent_priority_queue_H */</span>
+</pre></div><hr>
+<p></p>
+Copyright © 2005-2011 Intel Corporation. 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/a00436.html b/doc/html/a00432.html
similarity index 76%
copy from doc/html/a00436.html
copy to doc/html/a00432.html
index 1c366bc..63aa4a7 100644
--- a/doc/html/a00436.html
+++ b/doc/html/a00432.html
@@ -42,7 +42,7 @@
<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 "_concurrent_queue_internal.h"</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
@@ -50,13 +50,13 @@
<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="a00236.html">00035</a> <span class="keyword">class </span><a class="code" href="a00236.html">concurrent_queue</a>: <span class="keyword">public</span> internal::concurrent_queue_base_v3<T> {
+<a name="l00035"></a><a class="code" href="a00248.html">00035</a> <span class="keyword">class </span><a class="code" href="a00248.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">/*overide*/</span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> *allocate_block( size_t n ) {
+<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);
@@ -68,55 +68,55 @@
<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="a00236.html#682c3978d5cb0620000994f11c44a476">00057</a> <span class="keyword">typedef</span> T <a class="code" href="a00236.html#682c3978d5cb0620000994f11c44a476">value_type</a>;
+<a name="l00057"></a><a class="code" href="a00248.html#682c3978d5cb0620000994f11c44a476">00057</a> <span class="keyword">typedef</span> T <a class="code" href="a00248.html#682c3978d5cb0620000994f11c44a476">value_type</a>;
<a name="l00058"></a>00058
-<a name="l00060"></a><a class="code" href="a00236.html#a8d725c50a9834bb7af5b67c0aff92b8">00060</a> <span class="keyword">typedef</span> T& <a class="code" href="a00236.html#a8d725c50a9834bb7af5b67c0aff92b8">reference</a>;
+<a name="l00060"></a><a class="code" href="a00248.html#a8d725c50a9834bb7af5b67c0aff92b8">00060</a> <span class="keyword">typedef</span> T& <a class="code" href="a00248.html#a8d725c50a9834bb7af5b67c0aff92b8">reference</a>;
<a name="l00061"></a>00061
-<a name="l00063"></a><a class="code" href="a00236.html#4d48e7ff93f81636bca2c74f7da34750">00063</a> <span class="keyword">typedef</span> <span class="keyword">const</span> T& <a class="code" href="a00236.html#4d48e7ff93f81636bca2c74f7da34750">const_reference</a>;
+<a name="l00063"></a><a class="code" href="a00248.html#4d48e7ff93f81636bca2c74f7da34750">00063</a> <span class="keyword">typedef</span> <span class="keyword">const</span> T& <a class="code" href="a00248.html#4d48e7ff93f81636bca2c74f7da34750">const_reference</a>;
<a name="l00064"></a>00064
-<a name="l00066"></a><a class="code" href="a00236.html#8fc30e93f8342a1960357f71e4fe8a2b">00066</a> <span class="keyword">typedef</span> size_t <a class="code" href="a00236.html#8fc30e93f8342a1960357f71e4fe8a2b">size_type</a>;
+<a name="l00066"></a><a class="code" href="a00248.html#8fc30e93f8342a1960357f71e4fe8a2b">00066</a> <span class="keyword">typedef</span> size_t <a class="code" href="a00248.html#8fc30e93f8342a1960357f71e4fe8a2b">size_type</a>;
<a name="l00067"></a>00067
-<a name="l00069"></a><a class="code" href="a00236.html#068576d16c7e4e05d52f9db7a45b5b65">00069</a> <span class="keyword">typedef</span> ptrdiff_t <a class="code" href="a00236.html#068576d16c7e4e05d52f9db7a45b5b65">difference_type</a>;
+<a name="l00069"></a><a class="code" href="a00248.html#068576d16c7e4e05d52f9db7a45b5b65">00069</a> <span class="keyword">typedef</span> ptrdiff_t <a class="code" href="a00248.html#068576d16c7e4e05d52f9db7a45b5b65">difference_type</a>;
<a name="l00070"></a>00070
-<a name="l00072"></a><a class="code" href="a00236.html#5a3956341728eaa558d8827063718cac">00072</a> <span class="keyword">typedef</span> A <a class="code" href="a00236.html#5a3956341728eaa558d8827063718cac">allocator_type</a>;
+<a name="l00072"></a><a class="code" href="a00248.html#5a3956341728eaa558d8827063718cac">00072</a> <span class="keyword">typedef</span> A <a class="code" href="a00248.html#5a3956341728eaa558d8827063718cac">allocator_type</a>;
<a name="l00073"></a>00073
-<a name="l00075"></a><a class="code" href="a00236.html#7c48a05a94a1f4f98fdfadfbef98ecf6">00075</a> <span class="keyword">explicit</span> <a class="code" href="a00236.html#7c48a05a94a1f4f98fdfadfbef98ecf6">concurrent_queue</a>(<span class="keyword">const</span> <a class="code" href="a00236.html#5a3956341728eaa558d8827063718cac">allocator_type</a>& a = <a class="code" href="a00236.html#5a3956341728eaa558d8827063718cac">allocator_type</a>()) :
+<a name="l00075"></a><a class="code" href="a00248.html#7c48a05a94a1f4f98fdfadfbef98ecf6">00075</a> <span class="keyword">explicit</span> <a class="code" href="a00248.html#7c48a05a94a1f4f98fdfadfbef98ecf6">concurrent_queue</a>(<span class="keyword">const</span> <a class="code" href="a00248.html#5a3956341728eaa558d8827063718cac">allocator_type</a>& a = <a class="code" href="a00248.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="a00236.html#25209656c84f2f9b030e2f9162713341">00082</a> <a class="code" href="a00236.html#7c48a05a94a1f4f98fdfadfbef98ecf6">concurrent_queue</a>( InputIterator begin, InputIterator end, <span class="keyword">const</span> <a class="code" href="a00236.html#5a3956341728eaa558d8827063718cac">allocator_type</a>& a = <a class="code" href="a00236.html#5a3956341728eaa558d8827063718cac">allocator_type</a>()) :
+<a name="l00082"></a><a class="code" href="a00248.html#25209656c84f2f9b030e2f9162713341">00082</a> <a class="code" href="a00248.html#7c48a05a94a1f4f98fdfadfbef98ecf6">concurrent_queue</a>( InputIterator begin, InputIterator end, <span class="keyword">const</span> <a class="code" href="a00248.html#5a3956341728eaa558d8827063718cac">allocator_type</a>& a = <a class="code" href="a00248.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="a00236.html#8a6b98ea11a867db8ac868f0113ca429">00090</a> <a class="code" href="a00236.html#7c48a05a94a1f4f98fdfadfbef98ecf6">concurrent_queue</a>( <span class="keyword">const</span> <a class="code" href="a00236.html">concurrent_queue</a>& src, <span class="keyword">const</span> <a class="code" href="a00236.html#5a3956341728eaa558d8827063718cac">allocator_type</a>& a = <a class="code" href="a00236.html#5a3956341728eaa558d8827063718cac" [...]
+<a name="l00090"></a><a class="code" href="a00248.html#8a6b98ea11a867db8ac868f0113ca429">00090</a> <a class="code" href="a00248.html#7c48a05a94a1f4f98fdfadfbef98ecf6">concurrent_queue</a>( <span class="keyword">const</span> <a class="code" href="a00248.html">concurrent_queue</a>& src, <span class="keyword">const</span> <a class="code" href="a00248.html#5a3956341728eaa558d8827063718cac">allocator_type</a>& a = <a class="code" href="a00248.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="a00236.html#830b33753d6b149c366344e29b2edd8c">~concurrent_queue</a>();
+<a name="l00097"></a>00097 <a class="code" href="a00248.html#830b33753d6b149c366344e29b2edd8c">~concurrent_queue</a>();
<a name="l00098"></a>00098
-<a name="l00100"></a><a class="code" href="a00236.html#73c47563ffcc4c2f6452f25a04ebe2e2">00100</a> <span class="keywordtype">void</span> <a class="code" href="a00236.html#73c47563ffcc4c2f6452f25a04ebe2e2">push</a>( <span class="keyword">const</span> T& source ) {
+<a name="l00100"></a><a class="code" href="a00248.html#73c47563ffcc4c2f6452f25a04ebe2e2">00100</a> <span class="keywordtype">void</span> <a class="code" href="a00248.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="a00236.html#ae31ca0db34ef96ef1e74aa0d28c95f8">00107</a> <span class="keywordtype">bool</span> <a class="code" href="a00236.html#ae31ca0db34ef96ef1e74aa0d28c95f8">try_pop</a>( T& result ) {
+<a name="l00107"></a><a class="code" href="a00248.html#ae31ca0db34ef96ef1e74aa0d28c95f8">00107</a> <span class="keywordtype">bool</span> <a class="code" href="a00248.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="a00236.html#eaa35a5274606779802e9a669a706260">00112</a> <a class="code" href="a00236.html#8fc30e93f8342a1960357f71e4fe8a2b">size_type</a> <a class="code" href="a00236.html#eaa35a5274606779802e9a669a706260">unsafe_size</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> this->internal_size();}
+<a name="l00112"></a><a class="code" href="a00248.html#eaa35a5274606779802e9a669a706260">00112</a> <a class="code" href="a00248.html#8fc30e93f8342a1960357f71e4fe8a2b">size_type</a> <a class="code" href="a00248.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="a00236.html#f3f6fce0cfa2d581d6f3b47e0613ad64">00115</a> <span class="keywordtype">bool</span> <a class="code" href="a00236.html#f3f6fce0cfa2d581d6f3b47e0613ad64">empty</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> this->internal_empty();}
+<a name="l00115"></a><a class="code" href="a00248.html#f3f6fce0cfa2d581d6f3b47e0613ad64">00115</a> <span class="keywordtype">bool</span> <a class="code" href="a00248.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="a00236.html#c32e8e84c0524155133b4aae32d2a827">clear</a>() ;
+<a name="l00118"></a>00118 <span class="keywordtype">void</span> <a class="code" href="a00248.html#c32e8e84c0524155133b4aae32d2a827">clear</a>() ;
<a name="l00119"></a>00119
-<a name="l00121"></a><a class="code" href="a00236.html#f034f70caef445fe8abc9113ec926a8d">00121</a> <a class="code" href="a00236.html#5a3956341728eaa558d8827063718cac">allocator_type</a> <a class="code" href="a00236.html#f034f70caef445fe8abc9113ec926a8d">get_allocator</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> this->my_allocator; }
+<a name="l00121"></a><a class="code" href="a00248.html#f034f70caef445fe8abc9113ec926a8d">00121</a> <a class="code" href="a00248.html#5a3956341728eaa558d8827063718cac">allocator_type</a> <a class="code" href="a00248.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;
@@ -131,14 +131,14 @@
<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="a00236.html#830b33753d6b149c366344e29b2edd8c">00136</a> <a class="code" href="a00236.html">concurrent_queue<T,A>::~concurrent_queue</a>() {
-<a name="l00137"></a>00137 <a class="code" href="a00236.html#c32e8e84c0524155133b4aae32d2a827">clear</a>();
+<a name="l00136"></a><a class="code" href="a00248.html#830b33753d6b149c366344e29b2edd8c">00136</a> <a class="code" href="a00248.html">concurrent_queue<T,A>::~concurrent_queue</a>() {
+<a name="l00137"></a>00137 <a class="code" href="a00248.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="a00236.html#c32e8e84c0524155133b4aae32d2a827">00142</a> <span class="keywordtype">void</span> <a class="code" href="a00236.html">concurrent_queue<T,A>::clear</a>() {
-<a name="l00143"></a>00143 <span class="keywordflow">while</span>( !<a class="code" href="a00236.html#f3f6fce0cfa2d581d6f3b47e0613ad64">empty</a>() ) {
+<a name="l00142"></a><a class="code" href="a00248.html#c32e8e84c0524155133b4aae32d2a827">00142</a> <span class="keywordtype">void</span> <a class="code" href="a00248.html">concurrent_queue<T,A>::clear</a>() {
+<a name="l00143"></a>00143 <span class="keywordflow">while</span>( !<a class="code" href="a00248.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 }
@@ -148,7 +148,7 @@
<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="a00230.html">00158</a> <span class="keyword">class </span><a class="code" href="a00230.html">concurrent_bounded_queue</a>: <span class="keyword">public</span> internal::concurrent_queue_base_v3 {
+<a name="l00158"></a><a class="code" href="a00242.html">00158</a> <span class="keyword">class </span><a class="code" href="a00242.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;
@@ -182,7 +182,7 @@
<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">/*overide*/</span> <span class="keyword">virtual</span> page *allocate_page() {
+<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 )
@@ -191,81 +191,81 @@
<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*<span class="keyword">sizeof</span>(T);
+<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="a00230.html#98245517a931e5893f6601e66c51fc75">00209</a> <span class="keyword">typedef</span> T <a class="code" href="a00230.html#98245517a931e5893f6601e66c51fc75">value_type</a>;
+<a name="l00209"></a><a class="code" href="a00242.html#98245517a931e5893f6601e66c51fc75">00209</a> <span class="keyword">typedef</span> T <a class="code" href="a00242.html#98245517a931e5893f6601e66c51fc75">value_type</a>;
<a name="l00210"></a>00210
-<a name="l00212"></a><a class="code" href="a00230.html#2e2726fccf6d975dc1071608cc0bbf90">00212</a> <span class="keyword">typedef</span> A <a class="code" href="a00230.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>;
+<a name="l00212"></a><a class="code" href="a00242.html#2e2726fccf6d975dc1071608cc0bbf90">00212</a> <span class="keyword">typedef</span> A <a class="code" href="a00242.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>;
<a name="l00213"></a>00213
-<a name="l00215"></a><a class="code" href="a00230.html#dcd44ca6a88c0dc7a847a47a10811f0c">00215</a> <span class="keyword">typedef</span> T& <a class="code" href="a00230.html#dcd44ca6a88c0dc7a847a47a10811f0c">reference</a>;
+<a name="l00215"></a><a class="code" href="a00242.html#dcd44ca6a88c0dc7a847a47a10811f0c">00215</a> <span class="keyword">typedef</span> T& <a class="code" href="a00242.html#dcd44ca6a88c0dc7a847a47a10811f0c">reference</a>;
<a name="l00216"></a>00216
-<a name="l00218"></a><a class="code" href="a00230.html#796713d0b9ba93a4721cbe13e4474068">00218</a> <span class="keyword">typedef</span> <span class="keyword">const</span> T& <a class="code" href="a00230.html#796713d0b9ba93a4721cbe13e4474068">const_reference</a>;
+<a name="l00218"></a><a class="code" href="a00242.html#796713d0b9ba93a4721cbe13e4474068">00218</a> <span class="keyword">typedef</span> <span class="keyword">const</span> T& <a class="code" href="a00242.html#796713d0b9ba93a4721cbe13e4474068">const_reference</a>;
<a name="l00219"></a>00219
<a name="l00221"></a>00221
-<a name="l00223"></a><a class="code" href="a00230.html#a80e4c11dbb324e4b92a24a77bbcde68">00223</a> <span class="keyword">typedef</span> std::ptrdiff_t <a class="code" href="a00230.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a>;
+<a name="l00223"></a><a class="code" href="a00242.html#a80e4c11dbb324e4b92a24a77bbcde68">00223</a> <span class="keyword">typedef</span> std::ptrdiff_t <a class="code" href="a00242.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a>;
<a name="l00224"></a>00224
-<a name="l00226"></a><a class="code" href="a00230.html#4b45c91297e69515d83d5eef85ae1f49">00226</a> <span class="keyword">typedef</span> std::ptrdiff_t <a class="code" href="a00230.html#4b45c91297e69515d83d5eef85ae1f49">difference_type</a>;
+<a name="l00226"></a><a class="code" href="a00242.html#4b45c91297e69515d83d5eef85ae1f49">00226</a> <span class="keyword">typedef</span> std::ptrdiff_t <a class="code" href="a00242.html#4b45c91297e69515d83d5eef85ae1f49">difference_type</a>;
<a name="l00227"></a>00227
-<a name="l00229"></a><a class="code" href="a00230.html#e3525226732963ff0f13e89d8e6dab5b">00229</a> <span class="keyword">explicit</span> <a class="code" href="a00230.html#e3525226732963ff0f13e89d8e6dab5b">concurrent_bounded_queue</a>(<span class="keyword">const</span> <a class="code" href="a00230.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>& a = <a class="code" href="a00230.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>()) :
+<a name="l00229"></a><a class="code" href="a00242.html#e3525226732963ff0f13e89d8e6dab5b">00229</a> <span class="keyword">explicit</span> <a class="code" href="a00242.html#e3525226732963ff0f13e89d8e6dab5b">concurrent_bounded_queue</a>(<span class="keyword">const</span> <a class="code" href="a00242.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>& a = <a class="code" href="a00242.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="a00230.html#7b7fb414d2eaa8a7f5d68fc4cd63ac50">00235</a> <a class="code" href="a00230.html#e3525226732963ff0f13e89d8e6dab5b">concurrent_bounded_queue</a>( <span class="keyword">const</span> <a class="code" href="a00230.html">concurrent_bounded_queue</a>& src, <span class="keyword">const</span> <a class="code" href="a00230.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>& a = <a class="code" href="a00230.html#2e2726fccf6d975dc [...]
+<a name="l00235"></a><a class="code" href="a00242.html#7b7fb414d2eaa8a7f5d68fc4cd63ac50">00235</a> <a class="code" href="a00242.html#e3525226732963ff0f13e89d8e6dab5b">concurrent_bounded_queue</a>( <span class="keyword">const</span> <a class="code" href="a00242.html">concurrent_bounded_queue</a>& src, <span class="keyword">const</span> <a class="code" href="a00242.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>& a = <a class="code" href="a00242.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="a00230.html#a5e04dcd7db9fd9b583b4e7df832246a">00243</a> <a class="code" href="a00230.html#e3525226732963ff0f13e89d8e6dab5b">concurrent_bounded_queue</a>( InputIterator begin, InputIterator end, <span class="keyword">const</span> <a class="code" href="a00230.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>& a = <a class="code" href="a00230.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>()) :
+<a name="l00243"></a><a class="code" href="a00242.html#a5e04dcd7db9fd9b583b4e7df832246a">00243</a> <a class="code" href="a00242.html#e3525226732963ff0f13e89d8e6dab5b">concurrent_bounded_queue</a>( InputIterator begin, InputIterator end, <span class="keyword">const</span> <a class="code" href="a00242.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>& a = <a class="code" href="a00242.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="a00230.html#acaf5b510dc0dfc7780b8c956cf773cf">~concurrent_bounded_queue</a>();
+<a name="l00251"></a>00251 <a class="code" href="a00242.html#acaf5b510dc0dfc7780b8c956cf773cf">~concurrent_bounded_queue</a>();
<a name="l00252"></a>00252
-<a name="l00254"></a><a class="code" href="a00230.html#ceb08c743b11ba88c878e73fff8af20b">00254</a> <span class="keywordtype">void</span> <a class="code" href="a00230.html#ceb08c743b11ba88c878e73fff8af20b">push</a>( <span class="keyword">const</span> T& source ) {
+<a name="l00254"></a><a class="code" href="a00242.html#ceb08c743b11ba88c878e73fff8af20b">00254</a> <span class="keywordtype">void</span> <a class="code" href="a00242.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="a00230.html#41f4c6bd7a82ab070e840bbf81b0b123">00260</a> <span class="keywordtype">void</span> <a class="code" href="a00230.html#41f4c6bd7a82ab070e840bbf81b0b123">pop</a>( T& destination ) {
+<a name="l00260"></a><a class="code" href="a00242.html#41f4c6bd7a82ab070e840bbf81b0b123">00260</a> <span class="keywordtype">void</span> <a class="code" href="a00242.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="l00265"></a>00265
-<a name="l00267"></a><a class="code" href="a00230.html#2bd6232531279fb3ccbd296bea23066b">00267</a> <span class="keywordtype">bool</span> <a class="code" href="a00230.html#2bd6232531279fb3ccbd296bea23066b">try_push</a>( <span class="keyword">const</span> T& source ) {
+<a name="l00267"></a><a class="code" href="a00242.html#2bd6232531279fb3ccbd296bea23066b">00267</a> <span class="keywordtype">bool</span> <a class="code" href="a00242.html#2bd6232531279fb3ccbd296bea23066b">try_push</a>( <span class="keyword">const</span> T& source ) {
<a name="l00268"></a>00268 <span class="keywordflow">return</span> internal_push_if_not_full( &source );
<a name="l00269"></a>00269 }
<a name="l00270"></a>00270
<a name="l00272"></a>00272
-<a name="l00274"></a><a class="code" href="a00230.html#0ca487019bbb00a196442aff78a1e4f7">00274</a> <span class="keywordtype">bool</span> <a class="code" href="a00230.html#0ca487019bbb00a196442aff78a1e4f7">try_pop</a>( T& destination ) {
+<a name="l00274"></a><a class="code" href="a00242.html#0ca487019bbb00a196442aff78a1e4f7">00274</a> <span class="keywordtype">bool</span> <a class="code" href="a00242.html#0ca487019bbb00a196442aff78a1e4f7">try_pop</a>( T& destination ) {
<a name="l00275"></a>00275 <span class="keywordflow">return</span> internal_pop_if_present( &destination );
<a name="l00276"></a>00276 }
<a name="l00277"></a>00277
<a name="l00279"></a>00279
-<a name="l00282"></a><a class="code" href="a00230.html#7dc14d1a579a4cccda9f857585e1768d">00282</a> <a class="code" href="a00230.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> <a class="code" href="a00230.html#7dc14d1a579a4cccda9f857585e1768d">size</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> internal_size();}
+<a name="l00282"></a><a class="code" href="a00242.html#7dc14d1a579a4cccda9f857585e1768d">00282</a> <a class="code" href="a00242.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> <a class="code" href="a00242.html#7dc14d1a579a4cccda9f857585e1768d">size</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> internal_size();}
<a name="l00283"></a>00283
-<a name="l00285"></a><a class="code" href="a00230.html#f64924f2ee9225c368a270fc3c394db9">00285</a> <span class="keywordtype">bool</span> <a class="code" href="a00230.html#f64924f2ee9225c368a270fc3c394db9">empty</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> internal_empty();}
+<a name="l00285"></a><a class="code" href="a00242.html#f64924f2ee9225c368a270fc3c394db9">00285</a> <span class="keywordtype">bool</span> <a class="code" href="a00242.html#f64924f2ee9225c368a270fc3c394db9">empty</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> internal_empty();}
<a name="l00286"></a>00286
-<a name="l00288"></a><a class="code" href="a00230.html#b2888b3e4e837d7e03f2c731963a402b">00288</a> <a class="code" href="a00230.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> <a class="code" href="a00230.html#b2888b3e4e837d7e03f2c731963a402b">capacity</a>()<span class="keyword"> const </span>{
+<a name="l00288"></a><a class="code" href="a00242.html#b2888b3e4e837d7e03f2c731963a402b">00288</a> <a class="code" href="a00242.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> <a class="code" href="a00242.html#b2888b3e4e837d7e03f2c731963a402b">capacity</a>()<span class="keyword"> const </span>{
<a name="l00289"></a>00289 <span class="keywordflow">return</span> my_capacity;
<a name="l00290"></a>00290 }
<a name="l00291"></a>00291
<a name="l00293"></a>00293
-<a name="l00295"></a><a class="code" href="a00230.html#f3c6c934f85fd02aedbc83a16943193b">00295</a> <span class="keywordtype">void</span> <a class="code" href="a00230.html#f3c6c934f85fd02aedbc83a16943193b">set_capacity</a>( <a class="code" href="a00230.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> new_capacity ) {
+<a name="l00295"></a><a class="code" href="a00242.html#f3c6c934f85fd02aedbc83a16943193b">00295</a> <span class="keywordtype">void</span> <a class="code" href="a00242.html#f3c6c934f85fd02aedbc83a16943193b">set_capacity</a>( <a class="code" href="a00242.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> new_capacity ) {
<a name="l00296"></a>00296 internal_set_capacity( new_capacity, <span class="keyword">sizeof</span>(T) );
<a name="l00297"></a>00297 }
<a name="l00298"></a>00298
-<a name="l00300"></a><a class="code" href="a00230.html#415eb87e53b1c6a266de06ecbc490d16">00300</a> <a class="code" href="a00230.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a> <a class="code" href="a00230.html#415eb87e53b1c6a266de06ecbc490d16">get_allocator</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> this->my_allocator; }
+<a name="l00300"></a><a class="code" href="a00242.html#415eb87e53b1c6a266de06ecbc490d16">00300</a> <a class="code" href="a00242.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a> <a class="code" href="a00242.html#415eb87e53b1c6a266de06ecbc490d16">get_allocator</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> this->my_allocator; }
<a name="l00301"></a>00301
-<a name="l00303"></a>00303 <span class="keywordtype">void</span> <a class="code" href="a00230.html#90b31e2954c6e4596c7900435a5f4bc1">clear</a>() ;
+<a name="l00303"></a>00303 <span class="keywordtype">void</span> <a class="code" href="a00242.html#90b31e2954c6e4596c7900435a5f4bc1">clear</a>() ;
<a name="l00304"></a>00304
<a name="l00305"></a>00305 <span class="keyword">typedef</span> internal::concurrent_queue_iterator<concurrent_bounded_queue,T> iterator;
<a name="l00306"></a>00306 <span class="keyword">typedef</span> internal::concurrent_queue_iterator<concurrent_bounded_queue,const T> const_iterator;
@@ -281,14 +281,14 @@
<a name="l00316"></a>00316 };
<a name="l00317"></a>00317
<a name="l00318"></a>00318 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l00319"></a><a class="code" href="a00230.html#acaf5b510dc0dfc7780b8c956cf773cf">00319</a> <a class="code" href="a00230.html">concurrent_bounded_queue<T,A>::~concurrent_bounded_queue</a>() {
-<a name="l00320"></a>00320 <a class="code" href="a00230.html#90b31e2954c6e4596c7900435a5f4bc1">clear</a>();
+<a name="l00319"></a><a class="code" href="a00242.html#acaf5b510dc0dfc7780b8c956cf773cf">00319</a> <a class="code" href="a00242.html">concurrent_bounded_queue<T,A>::~concurrent_bounded_queue</a>() {
+<a name="l00320"></a>00320 <a class="code" href="a00242.html#90b31e2954c6e4596c7900435a5f4bc1">clear</a>();
<a name="l00321"></a>00321 internal_finish_clear();
<a name="l00322"></a>00322 }
<a name="l00323"></a>00323
<a name="l00324"></a>00324 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l00325"></a><a class="code" href="a00230.html#90b31e2954c6e4596c7900435a5f4bc1">00325</a> <span class="keywordtype">void</span> <a class="code" href="a00230.html">concurrent_bounded_queue<T,A>::clear</a>() {
-<a name="l00326"></a>00326 <span class="keywordflow">while</span>( !<a class="code" href="a00230.html#f64924f2ee9225c368a270fc3c394db9">empty</a>() ) {
+<a name="l00325"></a><a class="code" href="a00242.html#90b31e2954c6e4596c7900435a5f4bc1">00325</a> <span class="keywordtype">void</span> <a class="code" href="a00242.html">concurrent_bounded_queue<T,A>::clear</a>() {
+<a name="l00326"></a>00326 <span class="keywordflow">while</span>( !<a class="code" href="a00242.html#f64924f2ee9225c368a270fc3c394db9">empty</a>() ) {
<a name="l00327"></a>00327 T value;
<a name="l00328"></a>00328 internal_pop_if_present(&value);
<a name="l00329"></a>00329 }
@@ -298,40 +298,40 @@
<a name="l00333"></a>00333
<a name="l00335"></a>00335
<a name="l00340"></a>00340 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A = cache_aligned_allocator<T> >
-<a name="l00341"></a><a class="code" href="a00237.html">00341</a> <span class="keyword">class </span><a class="code" href="a00237.html">concurrent_queue</a>: <span class="keyword">public</span> <a class="code" href="a00230.html">concurrent_bounded_queue</a><T,A> {
+<a name="l00341"></a><a class="code" href="a00249.html">00341</a> <span class="keyword">class </span><a class="code" href="a00249.html">concurrent_queue</a>: <span class="keyword">public</span> <a class="code" href="a00242.html">concurrent_bounded_queue</a><T,A> {
<a name="l00342"></a>00342 <span class="preprocessor">#if !__TBB_TEMPLATE_FRIENDS_BROKEN</span>
<a name="l00343"></a>00343 <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="l00344"></a>00344 <span class="preprocessor">#endif </span>
<a name="l00345"></a>00345 <span class="preprocessor"></span>
<a name="l00346"></a>00346 <span class="keyword">public</span>:
-<a name="l00348"></a><a class="code" href="a00237.html#aaf19bd7337b72f3131ece60f7315ef7">00348</a> <span class="keyword">explicit</span> <a class="code" href="a00237.html#aaf19bd7337b72f3131ece60f7315ef7">concurrent_queue</a>(<span class="keyword">const</span> A& a = A()) :
-<a name="l00349"></a>00349 <a class="code" href="a00230.html">concurrent_bounded_queue</a><T,A>( a )
+<a name="l00348"></a><a class="code" href="a00249.html#aaf19bd7337b72f3131ece60f7315ef7">00348</a> <span class="keyword">explicit</span> <a class="code" href="a00249.html#aaf19bd7337b72f3131ece60f7315ef7">concurrent_queue</a>(<span class="keyword">const</span> A& a = A()) :
+<a name="l00349"></a>00349 <a class="code" href="a00242.html">concurrent_bounded_queue</a><T,A>( a )
<a name="l00350"></a>00350 {
<a name="l00351"></a>00351 }
<a name="l00352"></a>00352
-<a name="l00354"></a><a class="code" href="a00237.html#fc092b9082f233482f3513fc3bb670f7">00354</a> <a class="code" href="a00237.html#aaf19bd7337b72f3131ece60f7315ef7">concurrent_queue</a>( <span class="keyword">const</span> <a class="code" href="a00237.html">concurrent_queue</a>& src, <span class="keyword">const</span> A& a = A()) :
-<a name="l00355"></a>00355 <a class="code" href="a00230.html">concurrent_bounded_queue</a><T,A>( src, a )
+<a name="l00354"></a><a class="code" href="a00249.html#fc092b9082f233482f3513fc3bb670f7">00354</a> <a class="code" href="a00249.html#aaf19bd7337b72f3131ece60f7315ef7">concurrent_queue</a>( <span class="keyword">const</span> <a class="code" href="a00249.html">concurrent_queue</a>& src, <span class="keyword">const</span> A& a = A()) :
+<a name="l00355"></a>00355 <a class="code" href="a00242.html">concurrent_bounded_queue</a><T,A>( src, a )
<a name="l00356"></a>00356 {
<a name="l00357"></a>00357 }
<a name="l00358"></a>00358
<a name="l00360"></a>00360 <span class="keyword">template</span><<span class="keyword">typename</span> InputIterator>
-<a name="l00361"></a><a class="code" href="a00237.html#9102b897776bd2d9e908e6604ff16b5f">00361</a> <a class="code" href="a00237.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="l00362"></a>00362 <a class="code" href="a00230.html">concurrent_bounded_queue</a><T,A>( b, e, a )
+<a name="l00361"></a><a class="code" href="a00249.html#9102b897776bd2d9e908e6604ff16b5f">00361</a> <a class="code" href="a00249.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="l00362"></a>00362 <a class="code" href="a00242.html">concurrent_bounded_queue</a><T,A>( b, e, a )
<a name="l00363"></a>00363 {
<a name="l00364"></a>00364 }
<a name="l00365"></a>00365
<a name="l00367"></a>00367
-<a name="l00369"></a><a class="code" href="a00237.html#7c45561bafe71107d09b2bc1b8f4e681">00369</a> <span class="keywordtype">bool</span> <a class="code" href="a00237.html#7c45561bafe71107d09b2bc1b8f4e681">push_if_not_full</a>( <span class="keyword">const</span> T& source ) {
-<a name="l00370"></a>00370 <span class="keywordflow">return</span> this-><a class="code" href="a00230.html#2bd6232531279fb3ccbd296bea23066b">try_push</a>( source );
+<a name="l00369"></a><a class="code" href="a00249.html#7c45561bafe71107d09b2bc1b8f4e681">00369</a> <span class="keywordtype">bool</span> <a class="code" href="a00249.html#7c45561bafe71107d09b2bc1b8f4e681">push_if_not_full</a>( <span class="keyword">const</span> T& source ) {
+<a name="l00370"></a>00370 <span class="keywordflow">return</span> this-><a class="code" href="a00242.html#2bd6232531279fb3ccbd296bea23066b">try_push</a>( source );
<a name="l00371"></a>00371 }
<a name="l00372"></a>00372
<a name="l00374"></a>00374
-<a name="l00378"></a><a class="code" href="a00237.html#48da3536245318af6cb5fd58bac78039">00378</a> <span class="keywordtype">bool</span> <a class="code" href="a00237.html#48da3536245318af6cb5fd58bac78039">pop_if_present</a>( T& destination ) {
-<a name="l00379"></a>00379 <span class="keywordflow">return</span> this-><a class="code" href="a00230.html#0ca487019bbb00a196442aff78a1e4f7">try_pop</a>( destination );
+<a name="l00378"></a><a class="code" href="a00249.html#48da3536245318af6cb5fd58bac78039">00378</a> <span class="keywordtype">bool</span> <a class="code" href="a00249.html#48da3536245318af6cb5fd58bac78039">pop_if_present</a>( T& destination ) {
+<a name="l00379"></a>00379 <span class="keywordflow">return</span> this-><a class="code" href="a00242.html#0ca487019bbb00a196442aff78a1e4f7">try_pop</a>( destination );
<a name="l00380"></a>00380 }
<a name="l00381"></a>00381
-<a name="l00382"></a>00382 <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00230.html">concurrent_bounded_queue<T,A>::iterator</a> iterator;
-<a name="l00383"></a>00383 <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00230.html">concurrent_bounded_queue<T,A>::const_iterator</a> const_iterator;
+<a name="l00382"></a>00382 <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00242.html">concurrent_bounded_queue<T,A>::iterator</a> iterator;
+<a name="l00383"></a>00383 <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00242.html">concurrent_bounded_queue<T,A>::const_iterator</a> const_iterator;
<a name="l00384"></a>00384 <span class="comment">//</span>
<a name="l00385"></a>00385 <span class="comment">//------------------------------------------------------------------------</span>
<a name="l00386"></a>00386 <span class="comment">// The iterators are intended only for debugging. They are slow and not thread safe.</span>
diff --git a/doc/html/a00433.html b/doc/html/a00433.html
deleted file mode 100644
index fb6f085..0000000
--- a/doc/html/a00433.html
+++ /dev/null
@@ -1,337 +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-2011 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">#if !TBB_PREVIEW_CONCURRENT_PRIORITY_QUEUE</span>
-<a name="l00025"></a>00025 <span class="preprocessor"></span><span class="preprocessor">#error Set TBB_PREVIEW_CONCURRENT_PRIORITY_QUEUE to include concurrent_priority_queue.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 "cache_aligned_allocator.h"</span>
-<a name="l00030"></a>00030 <span class="preprocessor">#include "tbb_exception.h"</span>
-<a name="l00031"></a>00031 <span class="preprocessor">#include "tbb_stddef.h"</span>
-<a name="l00032"></a>00032 <span class="preprocessor">#include "tbb_profiling.h"</span>
-<a name="l00033"></a>00033 <span class="preprocessor">#include "_aggregator_internal.h"</span>
-<a name="l00034"></a>00034 <span class="preprocessor">#include <vector></span>
-<a name="l00035"></a>00035 <span class="preprocessor">#include <iterator></span>
-<a name="l00036"></a>00036 <span class="preprocessor">#include <functional></span>
-<a name="l00037"></a>00037
-<a name="l00038"></a>00038 <span class="keyword">namespace </span>tbb {
-<a name="l00039"></a>00039 <span class="keyword">namespace </span>interface5 {
-<a name="l00040"></a>00040
-<a name="l00041"></a>00041 <span class="keyword">using namespace </span>tbb::internal;
-<a name="l00042"></a>00042
-<a name="l00044"></a>00044 <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="l00045"></a><a class="code" href="a00235.html">00045</a> <span class="keyword">class </span><a class="code" href="a00235.html">concurrent_priority_queue</a> {
-<a name="l00046"></a>00046 <span class="keyword">public</span>:
-<a name="l00048"></a><a class="code" href="a00235.html#7c611a6b5b8f94b0e7f2afc97e31efb1">00048</a> <span class="keyword">typedef</span> T <a class="code" href="a00235.html#7c611a6b5b8f94b0e7f2afc97e31efb1">value_type</a>;
-<a name="l00049"></a>00049
-<a name="l00051"></a><a class="code" href="a00235.html#5804b3c708ef4e50d603f918ef2b9e58">00051</a> <span class="keyword">typedef</span> T& <a class="code" href="a00235.html#5804b3c708ef4e50d603f918ef2b9e58">reference</a>;
-<a name="l00052"></a>00052
-<a name="l00054"></a><a class="code" href="a00235.html#a4ded8601a434098605be0dcc4febc60">00054</a> <span class="keyword">typedef</span> <span class="keyword">const</span> T& <a class="code" href="a00235.html#a4ded8601a434098605be0dcc4febc60">const_reference</a>;
-<a name="l00055"></a>00055
-<a name="l00057"></a><a class="code" href="a00235.html#b679eea8d01d041625a39f719ca2b7ed">00057</a> <span class="keyword">typedef</span> size_t <a class="code" href="a00235.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a>;
-<a name="l00058"></a>00058
-<a name="l00060"></a><a class="code" href="a00235.html#77399bc76b3ecd60e33f7e35a5becd87">00060</a> <span class="keyword">typedef</span> ptrdiff_t <a class="code" href="a00235.html#77399bc76b3ecd60e33f7e35a5becd87">difference_type</a>;
-<a name="l00061"></a>00061
-<a name="l00063"></a><a class="code" href="a00235.html#1712cb3a46bc1821fccc5e2cd83d5cd7">00063</a> <span class="keyword">typedef</span> A <a class="code" href="a00235.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a>;
-<a name="l00064"></a>00064
-<a name="l00066"></a><a class="code" href="a00235.html#eefa40599afe00ea393897d8f5662e65">00066</a> <span class="keyword">explicit</span> <a class="code" href="a00235.html#eefa40599afe00ea393897d8f5662e65">concurrent_priority_queue</a>(<span class="keyword">const</span> <a class="code" href="a00235.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a>& a = <a class="code" href="a00235.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a>()) : mark(0), data(a) {
-<a name="l00067"></a>00067 my_aggregator.initialize_handler(my_functor_t(<span class="keyword">this</span>));
-<a name="l00068"></a>00068 }
-<a name="l00069"></a>00069
-<a name="l00071"></a><a class="code" href="a00235.html#4555b4a55415a70024c4004b51e9f385">00071</a> <span class="keyword">explicit</span> <a class="code" href="a00235.html#eefa40599afe00ea393897d8f5662e65">concurrent_priority_queue</a>(<a class="code" href="a00235.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a> init_capacity, <span class="keyword">const</span> <a class="code" href="a00235.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a>& a = <a class="code" href="a00 [...]
-<a name="l00072"></a>00072 data.reserve(init_capacity);
-<a name="l00073"></a>00073 my_aggregator.initialize_handler(my_functor_t(<span class="keyword">this</span>));
-<a name="l00074"></a>00074 }
-<a name="l00075"></a>00075
-<a name="l00077"></a>00077 <span class="keyword">template</span><<span class="keyword">typename</span> InputIterator>
-<a name="l00078"></a><a class="code" href="a00235.html#9147cb4207017c260a0c3929c12cd40f">00078</a> <a class="code" href="a00235.html#eefa40599afe00ea393897d8f5662e65">concurrent_priority_queue</a>(InputIterator begin, InputIterator end, <span class="keyword">const</span> <a class="code" href="a00235.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a>& a = <a class="code" href="a00235.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a>()) : data(begin, end, a)
-<a name="l00079"></a>00079 {
-<a name="l00080"></a>00080 mark = data.size();
-<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 }
-<a name="l00084"></a>00084
-<a name="l00086"></a>00086
-<a name="l00088"></a><a class="code" href="a00235.html#509419e320f200456d89dc54a65140b3">00088</a> <span class="keyword">explicit</span> <a class="code" href="a00235.html#eefa40599afe00ea393897d8f5662e65">concurrent_priority_queue</a>(<span class="keyword">const</span> <a class="code" href="a00235.html">concurrent_priority_queue</a>& src) : mark(src.mark), data(src.data.begin(), src.data.end(), src.data.<a class="code" href="a00235.html#d545d444fb0d16148f9b61fd89f9a337">get_alloc [...]
-<a name="l00089"></a>00089 {
-<a name="l00090"></a>00090 my_aggregator.initialize_handler(my_functor_t(<span class="keyword">this</span>));
-<a name="l00091"></a>00091 heapify();
-<a name="l00092"></a>00092 }
-<a name="l00093"></a>00093
-<a name="l00094"></a>00094 <a class="code" href="a00235.html#eefa40599afe00ea393897d8f5662e65">concurrent_priority_queue</a>(<span class="keyword">const</span> <a class="code" href="a00235.html">concurrent_priority_queue</a>& src, <span class="keyword">const</span> <a class="code" href="a00235.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a>& a) : mark(src.mark), data(src.data.begin(), src.data.end(), a)
-<a name="l00095"></a>00095 {
-<a name="l00096"></a>00096 my_aggregator.initialize_handler(my_functor_t(<span class="keyword">this</span>));
-<a name="l00097"></a>00097 heapify();
-<a name="l00098"></a>00098 }
-<a name="l00099"></a>00099
-<a name="l00101"></a>00101
-<a name="l00103"></a><a class="code" href="a00235.html#2ab7f7808891027ac0f0f5b3a4be51e9">00103</a> <a class="code" href="a00235.html">concurrent_priority_queue</a>& <a class="code" href="a00235.html#2ab7f7808891027ac0f0f5b3a4be51e9">operator=</a>(<span class="keyword">const</span> <a class="code" href="a00235.html">concurrent_priority_queue</a>& src) {
-<a name="l00104"></a>00104 <span class="keywordflow">if</span> (<span class="keyword">this</span> != &src) {
-<a name="l00105"></a>00105 std::vector<value_type, allocator_type>(src.<a class="code" href="a00235.html#384fd94d6b4d4dfce7aa64b531be7545">data</a>.begin(), src.<a class="code" href="a00235.html#384fd94d6b4d4dfce7aa64b531be7545">data</a>.end(), src.<a class="code" href="a00235.html#384fd94d6b4d4dfce7aa64b531be7545">data</a>.get_allocator()).<a class="code" href="a00235.html#0ecdc6a04aa259374425d424ca2a6082">swap</a>(data);
-<a name="l00106"></a>00106 mark = src.<a class="code" href="a00235.html#7fcd8d21ea4228b6079a2f2723550af0">mark</a>;
-<a name="l00107"></a>00107 }
-<a name="l00108"></a>00108 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00109"></a>00109 }
-<a name="l00110"></a>00110
-<a name="l00112"></a>00112
-<a name="l00113"></a><a class="code" href="a00235.html#317c508fa92df218be5d014c26c09bb7">00113</a> <span class="keywordtype">bool</span> <a class="code" href="a00235.html#317c508fa92df218be5d014c26c09bb7">empty</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> data.empty(); }
-<a name="l00114"></a>00114
-<a name="l00116"></a>00116
-<a name="l00117"></a><a class="code" href="a00235.html#8b2ae25c61338c6fd59e94fe09822ba5">00117</a> <a class="code" href="a00235.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a> <a class="code" href="a00235.html#8b2ae25c61338c6fd59e94fe09822ba5">size</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> data.size(); }
-<a name="l00118"></a>00118
-<a name="l00120"></a>00120
-<a name="l00121"></a><a class="code" href="a00235.html#e5d6a0aca1579ecebb716bbe53514963">00121</a> <a class="code" href="a00235.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a> <a class="code" href="a00235.html#e5d6a0aca1579ecebb716bbe53514963">capacity</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> data.capacity(); }
-<a name="l00122"></a>00122
-<a name="l00124"></a><a class="code" href="a00235.html#d905af7b8f6defff562f5ae9c3275763">00124</a> <span class="keywordtype">void</span> <a class="code" href="a00235.html#d905af7b8f6defff562f5ae9c3275763">push</a>(<a class="code" href="a00235.html#a4ded8601a434098605be0dcc4febc60">const_reference</a> elem) {
-<a name="l00125"></a>00125 cpq_operation op_data(elem, PUSH_OP);
-<a name="l00126"></a>00126 my_aggregator.execute(&op_data);
-<a name="l00127"></a>00127 <span class="keywordflow">if</span> (op_data.status == FAILED) <span class="comment">// exception thrown</span>
-<a name="l00128"></a>00128 throw_exception(eid_bad_alloc);
-<a name="l00129"></a>00129 }
-<a name="l00130"></a>00130
-<a name="l00132"></a>00132
-<a name="l00134"></a><a class="code" href="a00235.html#e036461a29cc40902a2bb79abf9f5146">00134</a> <span class="keywordtype">bool</span> <a class="code" href="a00235.html#e036461a29cc40902a2bb79abf9f5146">try_pop</a>(<a class="code" href="a00235.html#5804b3c708ef4e50d603f918ef2b9e58">reference</a> elem) {
-<a name="l00135"></a>00135 cpq_operation op_data(POP_OP);
-<a name="l00136"></a>00136 op_data.elem = &elem;
-<a name="l00137"></a>00137 my_aggregator.execute(&op_data);
-<a name="l00138"></a>00138 <span class="keywordflow">return</span> op_data.status==SUCCEEDED;
-<a name="l00139"></a>00139 }
-<a name="l00140"></a>00140
-<a name="l00142"></a><a class="code" href="a00235.html#e7c59f011c4cca83ff210aefe7c9d868">00142</a> <span class="keywordtype">void</span> <a class="code" href="a00235.html#e7c59f011c4cca83ff210aefe7c9d868">reserve</a>(<a class="code" href="a00235.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a> new_cap) {
-<a name="l00143"></a>00143 cpq_operation op_data(RESERVE_OP);
-<a name="l00144"></a>00144 op_data.sz = new_cap;
-<a name="l00145"></a>00145 my_aggregator.execute(&op_data);
-<a name="l00146"></a>00146 <span class="keywordflow">if</span> (op_data.status == FAILED) <span class="comment">// exception thrown</span>
-<a name="l00147"></a>00147 throw_exception(eid_bad_alloc);
-<a name="l00148"></a>00148 }
-<a name="l00149"></a>00149
-<a name="l00151"></a>00151
-<a name="l00153"></a><a class="code" href="a00235.html#0bdcdf7cde9fd369edca845bec34ca94">00153</a> <span class="keywordtype">void</span> <a class="code" href="a00235.html#0bdcdf7cde9fd369edca845bec34ca94">clear</a>() {
-<a name="l00154"></a>00154 data.clear();
-<a name="l00155"></a>00155 mark = 0;
-<a name="l00156"></a>00156 }
-<a name="l00157"></a>00157
-<a name="l00159"></a><a class="code" href="a00235.html#28d113288fc7e0c04c9053ec7de61368">00159</a> <span class="keywordtype">void</span> <a class="code" href="a00235.html#28d113288fc7e0c04c9053ec7de61368">shrink_to_fit</a>() {
-<a name="l00160"></a>00160 std::vector<value_type, allocator_type>(data.begin(), data.end(), data.get_allocator()).<a class="code" href="a00235.html#0ecdc6a04aa259374425d424ca2a6082">swap</a>(data);
-<a name="l00161"></a>00161 }
-<a name="l00162"></a>00162
-<a name="l00164"></a><a class="code" href="a00235.html#0ecdc6a04aa259374425d424ca2a6082">00164</a> <span class="keywordtype">void</span> <a class="code" href="a00235.html#0ecdc6a04aa259374425d424ca2a6082">swap</a>(<a class="code" href="a00235.html">concurrent_priority_queue</a>& q) {
-<a name="l00165"></a>00165 data.swap(q.<a class="code" href="a00235.html#384fd94d6b4d4dfce7aa64b531be7545">data</a>);
-<a name="l00166"></a>00166 std::swap(mark, q.<a class="code" href="a00235.html#7fcd8d21ea4228b6079a2f2723550af0">mark</a>);
-<a name="l00167"></a>00167 }
-<a name="l00168"></a>00168
-<a name="l00170"></a><a class="code" href="a00235.html#d545d444fb0d16148f9b61fd89f9a337">00170</a> <a class="code" href="a00235.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a> <a class="code" href="a00235.html#d545d444fb0d16148f9b61fd89f9a337">get_allocator</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> data.get_allocator(); }
-<a name="l00171"></a>00171
-<a name="l00172"></a>00172 <span class="keyword">private</span>:
-<a name="l00173"></a>00173 <span class="keyword">enum</span> operation_type {INVALID_OP, PUSH_OP, POP_OP, RESERVE_OP};
-<a name="l00174"></a>00174 <span class="keyword">enum</span> operation_status { WAIT=0, SUCCEEDED, FAILED };
-<a name="l00175"></a>00175
-<a name="l00176"></a>00176 <span class="keyword">class </span>cpq_operation : <span class="keyword">public</span> aggregated_operation<cpq_operation> {
-<a name="l00177"></a>00177 <span class="keyword">public</span>:
-<a name="l00178"></a>00178 operation_type type;
-<a name="l00179"></a>00179 <span class="keyword">union </span>{
-<a name="l00180"></a>00180 <a class="code" href="a00235.html#7c611a6b5b8f94b0e7f2afc97e31efb1">value_type</a> *elem;
-<a name="l00181"></a>00181 <a class="code" href="a00235.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a> sz;
-<a name="l00182"></a>00182 };
-<a name="l00183"></a>00183 cpq_operation(<a class="code" href="a00235.html#a4ded8601a434098605be0dcc4febc60">const_reference</a> e, operation_type t) :
-<a name="l00184"></a>00184 type(t), elem(const_cast<<a class="code" href="a00235.html#7c611a6b5b8f94b0e7f2afc97e31efb1">value_type</a>*>(&e)) {}
-<a name="l00185"></a>00185 cpq_operation(operation_type t) : type(t) {}
-<a name="l00186"></a>00186 };
-<a name="l00187"></a>00187
-<a name="l00188"></a>00188 <span class="keyword">class </span>my_functor_t {
-<a name="l00189"></a>00189 concurrent_priority_queue<T, Compare, A> *cpq;
-<a name="l00190"></a>00190 <span class="keyword">public</span>:
-<a name="l00191"></a>00191 my_functor_t() {}
-<a name="l00192"></a>00192 my_functor_t(concurrent_priority_queue<T, Compare, A> *cpq_) : cpq(cpq_) {}
-<a name="l00193"></a>00193 <span class="keywordtype">void</span> operator()(cpq_operation* op_list) {
-<a name="l00194"></a>00194 cpq->handle_operations(op_list);
-<a name="l00195"></a>00195 }
-<a name="l00196"></a>00196 };
-<a name="l00197"></a>00197
-<a name="l00198"></a>00198 aggregator< my_functor_t, cpq_operation> my_aggregator;
-<a name="l00200"></a>00200 <span class="keywordtype">char</span> padding1[NFS_MaxLineSize - <span class="keyword">sizeof</span>(aggregator< my_functor_t, cpq_operation >)];
-<a name="l00202"></a>00202 <a class="code" href="a00235.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a> mark;
-<a name="l00203"></a>00203 Compare compare;
-<a name="l00205"></a>00205 <span class="keywordtype">char</span> padding2[NFS_MaxLineSize - <span class="keyword">sizeof</span>(<a class="code" href="a00235.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a>) - <span class="keyword">sizeof</span>(Compare)];
-<a name="l00207"></a>00207
-<a name="l00225"></a>00225 std::vector<value_type, allocator_type> data;
-<a name="l00226"></a>00226
-<a name="l00227"></a>00227 <span class="keywordtype">void</span> handle_operations(cpq_operation *op_list) {
-<a name="l00228"></a>00228 cpq_operation *tmp, *pop_list=NULL;
-<a name="l00229"></a>00229
-<a name="l00230"></a>00230 __TBB_ASSERT(mark == data.size(), NULL);
-<a name="l00231"></a>00231
-<a name="l00232"></a>00232 <span class="comment">// first pass processes all constant time operations: pushes,</span>
-<a name="l00233"></a>00233 <span class="comment">// tops, some pops. Also reserve.</span>
-<a name="l00234"></a>00234 <span class="keywordflow">while</span> (op_list) {
-<a name="l00235"></a>00235 <span class="comment">// ITT note: &(op_list->status) tag is used to cover accesses to op_list</span>
-<a name="l00236"></a>00236 <span class="comment">// node. This thread is going to handle the operation, and so will acquire it</span>
-<a name="l00237"></a>00237 <span class="comment">// and perform the associated operation w/o triggering a race condition; the</span>
-<a name="l00238"></a>00238 <span class="comment">// thread that created the operation is waiting on the status field, so when</span>
-<a name="l00239"></a>00239 <span class="comment">// this thread is done with the operation, it will perform a</span>
-<a name="l00240"></a>00240 <span class="comment">// store_with_release to give control back to the waiting thread in</span>
-<a name="l00241"></a>00241 <span class="comment">// aggregator::insert_operation.</span>
-<a name="l00242"></a>00242 call_itt_notify(acquired, &(op_list->status));
-<a name="l00243"></a>00243 __TBB_ASSERT(op_list->type != INVALID_OP, NULL);
-<a name="l00244"></a>00244 tmp = op_list;
-<a name="l00245"></a>00245 op_list = itt_hide_load_word(op_list->next);
-<a name="l00246"></a>00246 <span class="keywordflow">if</span> (tmp->type == PUSH_OP) {
-<a name="l00247"></a>00247 __TBB_TRY {
-<a name="l00248"></a>00248 data.push_back(*(tmp->elem));
-<a name="l00249"></a>00249 itt_store_word_with_release(tmp->status, uintptr_t(SUCCEEDED));
-<a name="l00250"></a>00250 } __TBB_CATCH(...) {
-<a name="l00251"></a>00251 itt_store_word_with_release(tmp->status, uintptr_t(FAILED));
-<a name="l00252"></a>00252 }
-<a name="l00253"></a>00253 }
-<a name="l00254"></a>00254 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (tmp->type == POP_OP) {
-<a name="l00255"></a>00255 <span class="keywordflow">if</span> (mark < data.size() &&
-<a name="l00256"></a>00256 compare(data[0], data[data.size()-1])) {
-<a name="l00257"></a>00257 <span class="comment">// there are newly pushed elems and the last one</span>
-<a name="l00258"></a>00258 <span class="comment">// is higher than top</span>
-<a name="l00259"></a>00259 *(tmp->elem) = data[data.size()-1]; <span class="comment">// copy the data</span>
-<a name="l00260"></a>00260 itt_store_word_with_release(tmp->status, uintptr_t(SUCCEEDED));
-<a name="l00261"></a>00261 data.pop_back();
-<a name="l00262"></a>00262 __TBB_ASSERT(mark<=data.size(), NULL);
-<a name="l00263"></a>00263 }
-<a name="l00264"></a>00264 <span class="keywordflow">else</span> { <span class="comment">// no convenient item to pop; postpone</span>
-<a name="l00265"></a>00265 itt_hide_store_word(tmp->next, pop_list);
-<a name="l00266"></a>00266 pop_list = tmp;
-<a name="l00267"></a>00267 }
-<a name="l00268"></a>00268 }
-<a name="l00269"></a>00269 <span class="keywordflow">else</span> {
-<a name="l00270"></a>00270 __TBB_ASSERT(tmp->type == RESERVE_OP, NULL);
-<a name="l00271"></a>00271 __TBB_TRY {
-<a name="l00272"></a>00272 data.reserve(tmp->sz);
-<a name="l00273"></a>00273 itt_store_word_with_release(tmp->status, uintptr_t(SUCCEEDED));
-<a name="l00274"></a>00274 } __TBB_CATCH(...) {
-<a name="l00275"></a>00275 itt_store_word_with_release(tmp->status, uintptr_t(FAILED));
-<a name="l00276"></a>00276 }
-<a name="l00277"></a>00277 }
-<a name="l00278"></a>00278 }
-<a name="l00279"></a>00279
-<a name="l00280"></a>00280 <span class="comment">// second pass processes pop operations</span>
-<a name="l00281"></a>00281 <span class="keywordflow">while</span> (pop_list) {
-<a name="l00282"></a>00282 tmp = pop_list;
-<a name="l00283"></a>00283 pop_list = itt_hide_load_word(pop_list->next);
-<a name="l00284"></a>00284 __TBB_ASSERT(tmp->type == POP_OP, NULL);
-<a name="l00285"></a>00285 <span class="keywordflow">if</span> (data.empty()) {
-<a name="l00286"></a>00286 itt_store_word_with_release(tmp->status, uintptr_t(FAILED));
-<a name="l00287"></a>00287 }
-<a name="l00288"></a>00288 <span class="keywordflow">else</span> {
-<a name="l00289"></a>00289 __TBB_ASSERT(mark<=data.size(), NULL);
-<a name="l00290"></a>00290 <span class="keywordflow">if</span> (mark < data.size() &&
-<a name="l00291"></a>00291 compare(data[0], data[data.size()-1])) {
-<a name="l00292"></a>00292 <span class="comment">// there are newly pushed elems and the last one is</span>
-<a name="l00293"></a>00293 <span class="comment">// higher than top</span>
-<a name="l00294"></a>00294 *(tmp->elem) = data[data.size()-1]; <span class="comment">// copy the data</span>
-<a name="l00295"></a>00295 itt_store_word_with_release(tmp->status, uintptr_t(SUCCEEDED));
-<a name="l00296"></a>00296 data.pop_back();
-<a name="l00297"></a>00297 }
-<a name="l00298"></a>00298 <span class="keywordflow">else</span> { <span class="comment">// extract top and push last element down heap</span>
-<a name="l00299"></a>00299 *(tmp->elem) = data[0]; <span class="comment">// copy the data</span>
-<a name="l00300"></a>00300 itt_store_word_with_release(tmp->status, uintptr_t(SUCCEEDED));
-<a name="l00301"></a>00301 reheap();
-<a name="l00302"></a>00302 }
-<a name="l00303"></a>00303 }
-<a name="l00304"></a>00304 }
-<a name="l00305"></a>00305
-<a name="l00306"></a>00306 <span class="comment">// heapify any leftover pushed elements before doing the next</span>
-<a name="l00307"></a>00307 <span class="comment">// batch of operations</span>
-<a name="l00308"></a>00308 <span class="keywordflow">if</span> (mark<data.size()) heapify();
-<a name="l00309"></a>00309 __TBB_ASSERT(mark == data.size(), NULL);
-<a name="l00310"></a>00310 }
-<a name="l00311"></a>00311
-<a name="l00313"></a>00313 <span class="keywordtype">void</span> heapify() {
-<a name="l00314"></a>00314 <span class="keywordflow">if</span> (!mark) mark = 1;
-<a name="l00315"></a>00315 <span class="keywordflow">for</span> (; mark<data.size(); ++mark) {
-<a name="l00316"></a>00316 <span class="comment">// for each unheapified element under size</span>
-<a name="l00317"></a>00317 <a class="code" href="a00235.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a> cur_pos = mark;
-<a name="l00318"></a>00318 <a class="code" href="a00235.html#7c611a6b5b8f94b0e7f2afc97e31efb1">value_type</a> to_place = data[mark];
-<a name="l00319"></a>00319 <span class="keywordflow">do</span> { <span class="comment">// push to_place up the heap</span>
-<a name="l00320"></a>00320 <a class="code" href="a00235.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a> parent = (cur_pos-1)>>1;
-<a name="l00321"></a>00321 <span class="keywordflow">if</span> (!compare(data[parent], to_place)) <span class="keywordflow">break</span>;
-<a name="l00322"></a>00322 data[cur_pos] = data[parent];
-<a name="l00323"></a>00323 cur_pos = parent;
-<a name="l00324"></a>00324 } <span class="keywordflow">while</span>( cur_pos );
-<a name="l00325"></a>00325 data[cur_pos] = to_place;
-<a name="l00326"></a>00326 }
-<a name="l00327"></a>00327 }
-<a name="l00328"></a>00328
-<a name="l00330"></a>00330
-<a name="l00331"></a>00331 <span class="keywordtype">void</span> reheap() {
-<a name="l00332"></a>00332 <a class="code" href="a00235.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a> cur_pos=0, child=1;
-<a name="l00333"></a>00333
-<a name="l00334"></a>00334 <span class="keywordflow">while</span> (child < mark) {
-<a name="l00335"></a>00335 <a class="code" href="a00235.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a> target = child;
-<a name="l00336"></a>00336 <span class="keywordflow">if</span> (child+1 < mark && compare(data[child], data[child+1]))
-<a name="l00337"></a>00337 ++target;
-<a name="l00338"></a>00338 <span class="comment">// target now has the higher priority child</span>
-<a name="l00339"></a>00339 <span class="keywordflow">if</span> (compare(data[target], data[data.size()-1])) <span class="keywordflow">break</span>;
-<a name="l00340"></a>00340 data[cur_pos] = data[target];
-<a name="l00341"></a>00341 cur_pos = target;
-<a name="l00342"></a>00342 child = (cur_pos<<1)+1;
-<a name="l00343"></a>00343 }
-<a name="l00344"></a>00344 data[cur_pos] = data[data.size()-1];
-<a name="l00345"></a>00345 data.pop_back();
-<a name="l00346"></a>00346 <span class="keywordflow">if</span> (mark > data.size()) mark = data.size();
-<a name="l00347"></a>00347 }
-<a name="l00348"></a>00348 };
-<a name="l00349"></a>00349
-<a name="l00350"></a>00350 } <span class="comment">// namespace interface5</span>
-<a name="l00351"></a>00351
-<a name="l00352"></a>00352 <span class="keyword">using</span> interface5::concurrent_priority_queue;
-<a name="l00353"></a>00353
-<a name="l00354"></a>00354 } <span class="comment">// namespace tbb</span>
-<a name="l00355"></a>00355
-<a name="l00356"></a>00356 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_concurrent_priority_queue_H */</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2011 Intel Corporation. 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/a00436.html b/doc/html/a00436.html
index 1c366bc..27ab313 100644
--- a/doc/html/a00436.html
+++ b/doc/html/a00436.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>concurrent_queue.h Source File</title>
+<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>
@@ -19,7 +19,7 @@
<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>
+<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-2011 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>
@@ -39,321 +39,206 @@
<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 "_concurrent_queue_internal.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="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="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="a00236.html">00035</a> <span class="keyword">class </span><a class="code" href="a00236.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">/*overide*/</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="a00236.html#682c3978d5cb0620000994f11c44a476">00057</a> <span class="keyword">typedef</span> T <a class="code" href="a00236.html#682c3978d5cb0620000994f11c44a476">value_type</a>;
-<a name="l00058"></a>00058
-<a name="l00060"></a><a class="code" href="a00236.html#a8d725c50a9834bb7af5b67c0aff92b8">00060</a> <span class="keyword">typedef</span> T& <a class="code" href="a00236.html#a8d725c50a9834bb7af5b67c0aff92b8">reference</a>;
-<a name="l00061"></a>00061
-<a name="l00063"></a><a class="code" href="a00236.html#4d48e7ff93f81636bca2c74f7da34750">00063</a> <span class="keyword">typedef</span> <span class="keyword">const</span> T& <a class="code" href="a00236.html#4d48e7ff93f81636bca2c74f7da34750">const_reference</a>;
-<a name="l00064"></a>00064
-<a name="l00066"></a><a class="code" href="a00236.html#8fc30e93f8342a1960357f71e4fe8a2b">00066</a> <span class="keyword">typedef</span> size_t <a class="code" href="a00236.html#8fc30e93f8342a1960357f71e4fe8a2b">size_type</a>;
-<a name="l00067"></a>00067
-<a name="l00069"></a><a class="code" href="a00236.html#068576d16c7e4e05d52f9db7a45b5b65">00069</a> <span class="keyword">typedef</span> ptrdiff_t <a class="code" href="a00236.html#068576d16c7e4e05d52f9db7a45b5b65">difference_type</a>;
-<a name="l00070"></a>00070
-<a name="l00072"></a><a class="code" href="a00236.html#5a3956341728eaa558d8827063718cac">00072</a> <span class="keyword">typedef</span> A <a class="code" href="a00236.html#5a3956341728eaa558d8827063718cac">allocator_type</a>;
-<a name="l00073"></a>00073
-<a name="l00075"></a><a class="code" href="a00236.html#7c48a05a94a1f4f98fdfadfbef98ecf6">00075</a> <span class="keyword">explicit</span> <a class="code" href="a00236.html#7c48a05a94a1f4f98fdfadfbef98ecf6">concurrent_queue</a>(<span class="keyword">const</span> <a class="code" href="a00236.html#5a3956341728eaa558d8827063718cac">allocator_type</a>& a = <a class="code" href="a00236.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="a00236.html#25209656c84f2f9b030e2f9162713341">00082</a> <a class="code" href="a00236.html#7c48a05a94a1f4f98fdfadfbef98ecf6">concurrent_queue</a>( InputIterator begin, InputIterator end, <span class="keyword">const</span> <a class="code" href="a00236.html#5a3956341728eaa558d8827063718cac">allocator_type</a>& a = <a class="code" href="a00236.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="a00236.html#8a6b98ea11a867db8ac868f0113ca429">00090</a> <a class="code" href="a00236.html#7c48a05a94a1f4f98fdfadfbef98ecf6">concurrent_queue</a>( <span class="keyword">const</span> <a class="code" href="a00236.html">concurrent_queue</a>& src, <span class="keyword">const</span> <a class="code" href="a00236.html#5a3956341728eaa558d8827063718cac">allocator_type</a>& a = <a class="code" href="a00236.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="a00236.html#830b33753d6b149c366344e29b2edd8c">~concurrent_queue</a>();
-<a name="l00098"></a>00098
-<a name="l00100"></a><a class="code" href="a00236.html#73c47563ffcc4c2f6452f25a04ebe2e2">00100</a> <span class="keywordtype">void</span> <a class="code" href="a00236.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="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="l00107"></a><a class="code" href="a00236.html#ae31ca0db34ef96ef1e74aa0d28c95f8">00107</a> <span class="keywordtype">bool</span> <a class="code" href="a00236.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="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="l00112"></a><a class="code" href="a00236.html#eaa35a5274606779802e9a669a706260">00112</a> <a class="code" href="a00236.html#8fc30e93f8342a1960357f71e4fe8a2b">size_type</a> <a class="code" href="a00236.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="a00236.html#f3f6fce0cfa2d581d6f3b47e0613ad64">00115</a> <span class="keywordtype">bool</span> <a class="code" href="a00236.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="a00236.html#c32e8e84c0524155133b4aae32d2a827">clear</a>() ;
-<a name="l00119"></a>00119
-<a name="l00121"></a><a class="code" href="a00236.html#f034f70caef445fe8abc9113ec926a8d">00121</a> <a class="code" href="a00236.html#5a3956341728eaa558d8827063718cac">allocator_type</a> <a class="code" href="a00236.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="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 <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="a00236.html#830b33753d6b149c366344e29b2edd8c">00136</a> <a class="code" href="a00236.html">concurrent_queue<T,A>::~concurrent_queue</a>() {
-<a name="l00137"></a>00137 <a class="code" href="a00236.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="a00236.html#c32e8e84c0524155133b4aae32d2a827">00142</a> <span class="keywordtype">void</span> <a class="code" href="a00236.html">concurrent_queue<T,A>::clear</a>() {
-<a name="l00143"></a>00143 <span class="keywordflow">while</span>( !<a class="code" href="a00236.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="a00230.html">00158</a> <span class="keyword">class </span><a class="code" href="a00230.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="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="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">/*overide*/</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*<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="a00230.html#98245517a931e5893f6601e66c51fc75">00209</a> <span class="keyword">typedef</span> T <a class="code" href="a00230.html#98245517a931e5893f6601e66c51fc75">value_type</a>;
-<a name="l00210"></a>00210
-<a name="l00212"></a><a class="code" href="a00230.html#2e2726fccf6d975dc1071608cc0bbf90">00212</a> <span class="keyword">typedef</span> A <a class="code" href="a00230.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>;
+<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="l00215"></a><a class="code" href="a00230.html#dcd44ca6a88c0dc7a847a47a10811f0c">00215</a> <span class="keyword">typedef</span> T& <a class="code" href="a00230.html#dcd44ca6a88c0dc7a847a47a10811f0c">reference</a>;
-<a name="l00216"></a>00216
-<a name="l00218"></a><a class="code" href="a00230.html#796713d0b9ba93a4721cbe13e4474068">00218</a> <span class="keyword">typedef</span> <span class="keyword">const</span> T& <a class="code" href="a00230.html#796713d0b9ba93a4721cbe13e4474068">const_reference</a>;
+<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="l00221"></a>00221
-<a name="l00223"></a><a class="code" href="a00230.html#a80e4c11dbb324e4b92a24a77bbcde68">00223</a> <span class="keyword">typedef</span> std::ptrdiff_t <a class="code" href="a00230.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a>;
-<a name="l00224"></a>00224
-<a name="l00226"></a><a class="code" href="a00230.html#4b45c91297e69515d83d5eef85ae1f49">00226</a> <span class="keyword">typedef</span> std::ptrdiff_t <a class="code" href="a00230.html#4b45c91297e69515d83d5eef85ae1f49">difference_type</a>;
-<a name="l00227"></a>00227
-<a name="l00229"></a><a class="code" href="a00230.html#e3525226732963ff0f13e89d8e6dab5b">00229</a> <span class="keyword">explicit</span> <a class="code" href="a00230.html#e3525226732963ff0f13e89d8e6dab5b">concurrent_bounded_queue</a>(<span class="keyword">const</span> <a class="code" href="a00230.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>& a = <a class="code" href="a00230.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="a00230.html#7b7fb414d2eaa8a7f5d68fc4cd63ac50">00235</a> <a class="code" href="a00230.html#e3525226732963ff0f13e89d8e6dab5b">concurrent_bounded_queue</a>( <span class="keyword">const</span> <a class="code" href="a00230.html">concurrent_bounded_queue</a>& src, <span class="keyword">const</span> <a class="code" href="a00230.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>& a = <a class="code" href="a00230.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="a00230.html#a5e04dcd7db9fd9b583b4e7df832246a">00243</a> <a class="code" href="a00230.html#e3525226732963ff0f13e89d8e6dab5b">concurrent_bounded_queue</a>( InputIterator begin, InputIterator end, <span class="keyword">const</span> <a class="code" href="a00230.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>& a = <a class="code" href="a00230.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="a00230.html#acaf5b510dc0dfc7780b8c956cf773cf">~concurrent_bounded_queue</a>();
-<a name="l00252"></a>00252
-<a name="l00254"></a><a class="code" href="a00230.html#ceb08c743b11ba88c878e73fff8af20b">00254</a> <span class="keywordtype">void</span> <a class="code" href="a00230.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="a00230.html#41f4c6bd7a82ab070e840bbf81b0b123">00260</a> <span class="keywordtype">void</span> <a class="code" href="a00230.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="l00265"></a>00265
-<a name="l00267"></a><a class="code" href="a00230.html#2bd6232531279fb3ccbd296bea23066b">00267</a> <span class="keywordtype">bool</span> <a class="code" href="a00230.html#2bd6232531279fb3ccbd296bea23066b">try_push</a>( <span class="keyword">const</span> T& source ) {
-<a name="l00268"></a>00268 <span class="keywordflow">return</span> internal_push_if_not_full( &source );
-<a name="l00269"></a>00269 }
-<a name="l00270"></a>00270
-<a name="l00272"></a>00272
-<a name="l00274"></a><a class="code" href="a00230.html#0ca487019bbb00a196442aff78a1e4f7">00274</a> <span class="keywordtype">bool</span> <a class="code" href="a00230.html#0ca487019bbb00a196442aff78a1e4f7">try_pop</a>( T& destination ) {
-<a name="l00275"></a>00275 <span class="keywordflow">return</span> internal_pop_if_present( &destination );
-<a name="l00276"></a>00276 }
-<a name="l00277"></a>00277
-<a name="l00279"></a>00279
-<a name="l00282"></a><a class="code" href="a00230.html#7dc14d1a579a4cccda9f857585e1768d">00282</a> <a class="code" href="a00230.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> <a class="code" href="a00230.html#7dc14d1a579a4cccda9f857585e1768d">size</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> internal_size();}
-<a name="l00283"></a>00283
-<a name="l00285"></a><a class="code" href="a00230.html#f64924f2ee9225c368a270fc3c394db9">00285</a> <span class="keywordtype">bool</span> <a class="code" href="a00230.html#f64924f2ee9225c368a270fc3c394db9">empty</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> internal_empty();}
-<a name="l00286"></a>00286
-<a name="l00288"></a><a class="code" href="a00230.html#b2888b3e4e837d7e03f2c731963a402b">00288</a> <a class="code" href="a00230.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> <a class="code" href="a00230.html#b2888b3e4e837d7e03f2c731963a402b">capacity</a>()<span class="keyword"> const </span>{
-<a name="l00289"></a>00289 <span class="keywordflow">return</span> my_capacity;
-<a name="l00290"></a>00290 }
-<a name="l00291"></a>00291
-<a name="l00293"></a>00293
-<a name="l00295"></a><a class="code" href="a00230.html#f3c6c934f85fd02aedbc83a16943193b">00295</a> <span class="keywordtype">void</span> <a class="code" href="a00230.html#f3c6c934f85fd02aedbc83a16943193b">set_capacity</a>( <a class="code" href="a00230.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> new_capacity ) {
-<a name="l00296"></a>00296 internal_set_capacity( new_capacity, <span class="keyword">sizeof</span>(T) );
-<a name="l00297"></a>00297 }
-<a name="l00298"></a>00298
-<a name="l00300"></a><a class="code" href="a00230.html#415eb87e53b1c6a266de06ecbc490d16">00300</a> <a class="code" href="a00230.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a> <a class="code" href="a00230.html#415eb87e53b1c6a266de06ecbc490d16">get_allocator</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> this->my_allocator; }
-<a name="l00301"></a>00301
-<a name="l00303"></a>00303 <span class="keywordtype">void</span> <a class="code" href="a00230.html#90b31e2954c6e4596c7900435a5f4bc1">clear</a>() ;
-<a name="l00304"></a>00304
-<a name="l00305"></a>00305 <span class="keyword">typedef</span> internal::concurrent_queue_iterator<concurrent_bounded_queue,T> iterator;
-<a name="l00306"></a>00306 <span class="keyword">typedef</span> internal::concurrent_queue_iterator<concurrent_bounded_queue,const T> const_iterator;
-<a name="l00307"></a>00307
-<a name="l00308"></a>00308 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00309"></a>00309 <span class="comment">// The iterators are intended only for debugging. They are slow and not thread safe.</span>
-<a name="l00310"></a>00310 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00311"></a>00311 iterator unsafe_begin() {<span class="keywordflow">return</span> iterator(*<span class="keyword">this</span>);}
-<a name="l00312"></a>00312 iterator unsafe_end() {<span class="keywordflow">return</span> iterator();}
-<a name="l00313"></a>00313 const_iterator unsafe_begin()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_iterator(*<span class="keyword">this</span>);}
-<a name="l00314"></a>00314 const_iterator unsafe_end()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_iterator();}
-<a name="l00315"></a>00315
-<a name="l00316"></a>00316 };
-<a name="l00317"></a>00317
-<a name="l00318"></a>00318 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l00319"></a><a class="code" href="a00230.html#acaf5b510dc0dfc7780b8c956cf773cf">00319</a> <a class="code" href="a00230.html">concurrent_bounded_queue<T,A>::~concurrent_bounded_queue</a>() {
-<a name="l00320"></a>00320 <a class="code" href="a00230.html#90b31e2954c6e4596c7900435a5f4bc1">clear</a>();
-<a name="l00321"></a>00321 internal_finish_clear();
-<a name="l00322"></a>00322 }
-<a name="l00323"></a>00323
-<a name="l00324"></a>00324 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l00325"></a><a class="code" href="a00230.html#90b31e2954c6e4596c7900435a5f4bc1">00325</a> <span class="keywordtype">void</span> <a class="code" href="a00230.html">concurrent_bounded_queue<T,A>::clear</a>() {
-<a name="l00326"></a>00326 <span class="keywordflow">while</span>( !<a class="code" href="a00230.html#f64924f2ee9225c368a270fc3c394db9">empty</a>() ) {
-<a name="l00327"></a>00327 T value;
-<a name="l00328"></a>00328 internal_pop_if_present(&value);
-<a name="l00329"></a>00329 }
-<a name="l00330"></a>00330 }
-<a name="l00331"></a>00331
-<a name="l00332"></a>00332 <span class="keyword">namespace </span>deprecated {
-<a name="l00333"></a>00333
-<a name="l00335"></a>00335
-<a name="l00340"></a>00340 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A = cache_aligned_allocator<T> >
-<a name="l00341"></a><a class="code" href="a00237.html">00341</a> <span class="keyword">class </span><a class="code" href="a00237.html">concurrent_queue</a>: <span class="keyword">public</span> <a class="code" href="a00230.html">concurrent_bounded_queue</a><T,A> {
-<a name="l00342"></a>00342 <span class="preprocessor">#if !__TBB_TEMPLATE_FRIENDS_BROKEN</span>
-<a name="l00343"></a>00343 <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="l00344"></a>00344 <span class="preprocessor">#endif </span>
-<a name="l00345"></a>00345 <span class="preprocessor"></span>
-<a name="l00346"></a>00346 <span class="keyword">public</span>:
-<a name="l00348"></a><a class="code" href="a00237.html#aaf19bd7337b72f3131ece60f7315ef7">00348</a> <span class="keyword">explicit</span> <a class="code" href="a00237.html#aaf19bd7337b72f3131ece60f7315ef7">concurrent_queue</a>(<span class="keyword">const</span> A& a = A()) :
-<a name="l00349"></a>00349 <a class="code" href="a00230.html">concurrent_bounded_queue</a><T,A>( a )
-<a name="l00350"></a>00350 {
-<a name="l00351"></a>00351 }
-<a name="l00352"></a>00352
-<a name="l00354"></a><a class="code" href="a00237.html#fc092b9082f233482f3513fc3bb670f7">00354</a> <a class="code" href="a00237.html#aaf19bd7337b72f3131ece60f7315ef7">concurrent_queue</a>( <span class="keyword">const</span> <a class="code" href="a00237.html">concurrent_queue</a>& src, <span class="keyword">const</span> A& a = A()) :
-<a name="l00355"></a>00355 <a class="code" href="a00230.html">concurrent_bounded_queue</a><T,A>( src, a )
-<a name="l00356"></a>00356 {
-<a name="l00357"></a>00357 }
-<a name="l00358"></a>00358
-<a name="l00360"></a>00360 <span class="keyword">template</span><<span class="keyword">typename</span> InputIterator>
-<a name="l00361"></a><a class="code" href="a00237.html#9102b897776bd2d9e908e6604ff16b5f">00361</a> <a class="code" href="a00237.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="l00362"></a>00362 <a class="code" href="a00230.html">concurrent_bounded_queue</a><T,A>( b, e, a )
-<a name="l00363"></a>00363 {
-<a name="l00364"></a>00364 }
-<a name="l00365"></a>00365
-<a name="l00367"></a>00367
-<a name="l00369"></a><a class="code" href="a00237.html#7c45561bafe71107d09b2bc1b8f4e681">00369</a> <span class="keywordtype">bool</span> <a class="code" href="a00237.html#7c45561bafe71107d09b2bc1b8f4e681">push_if_not_full</a>( <span class="keyword">const</span> T& source ) {
-<a name="l00370"></a>00370 <span class="keywordflow">return</span> this-><a class="code" href="a00230.html#2bd6232531279fb3ccbd296bea23066b">try_push</a>( source );
-<a name="l00371"></a>00371 }
-<a name="l00372"></a>00372
-<a name="l00374"></a>00374
-<a name="l00378"></a><a class="code" href="a00237.html#48da3536245318af6cb5fd58bac78039">00378</a> <span class="keywordtype">bool</span> <a class="code" href="a00237.html#48da3536245318af6cb5fd58bac78039">pop_if_present</a>( T& destination ) {
-<a name="l00379"></a>00379 <span class="keywordflow">return</span> this-><a class="code" href="a00230.html#0ca487019bbb00a196442aff78a1e4f7">try_pop</a>( destination );
-<a name="l00380"></a>00380 }
-<a name="l00381"></a>00381
-<a name="l00382"></a>00382 <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00230.html">concurrent_bounded_queue<T,A>::iterator</a> iterator;
-<a name="l00383"></a>00383 <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00230.html">concurrent_bounded_queue<T,A>::const_iterator</a> const_iterator;
-<a name="l00384"></a>00384 <span class="comment">//</span>
-<a name="l00385"></a>00385 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00386"></a>00386 <span class="comment">// The iterators are intended only for debugging. They are slow and not thread safe.</span>
-<a name="l00387"></a>00387 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00388"></a>00388 iterator begin() {<span class="keywordflow">return</span> this->unsafe_begin();}
-<a name="l00389"></a>00389 iterator end() {<span class="keywordflow">return</span> this->unsafe_end();}
-<a name="l00390"></a>00390 const_iterator begin()<span class="keyword"> const </span>{<span class="keywordflow">return</span> this->unsafe_begin();}
-<a name="l00391"></a>00391 const_iterator end()<span class="keyword"> const </span>{<span class="keywordflow">return</span> this->unsafe_end();}
-<a name="l00392"></a>00392 };
-<a name="l00393"></a>00393
-<a name="l00394"></a>00394 }
-<a name="l00395"></a>00395
-<a name="l00396"></a>00396
-<a name="l00397"></a>00397 <span class="preprocessor">#if TBB_DEPRECATED</span>
-<a name="l00398"></a>00398 <span class="preprocessor"></span><span class="keyword">using</span> deprecated::concurrent_queue;
-<a name="l00399"></a>00399 <span class="preprocessor">#else</span>
-<a name="l00400"></a>00400 <span class="preprocessor"></span><span class="keyword">using</span> strict_ppl::concurrent_queue;
-<a name="l00401"></a>00401 <span class="preprocessor">#endif</span>
-<a name="l00402"></a>00402 <span class="preprocessor"></span>
-<a name="l00403"></a>00403 } <span class="comment">// namespace tbb</span>
-<a name="l00404"></a>00404
-<a name="l00405"></a>00405 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_concurrent_queue_H */</span>
+<a name="l00220"></a>00220 <span class="preprocessor">#endif// __TBB_concurrent_unordered_map_H</span>
</pre></div><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00437.html b/doc/html/a00437.html
deleted file mode 100644
index d686a92..0000000
--- a/doc/html/a00437.html
+++ /dev/null
@@ -1,263 +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-2011 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 "_concurrent_unordered_internal.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="comment">// Template class for hash compare</span>
-<a name="l00033"></a>00033 <span class="keyword">template</span><<span class="keyword">typename</span> Key>
-<a name="l00034"></a>00034 <span class="keyword">class </span>tbb_hash
-<a name="l00035"></a>00035 {
-<a name="l00036"></a>00036 <span class="keyword">public</span>:
-<a name="l00037"></a>00037 tbb_hash() {}
-<a name="l00038"></a>00038
-<a name="l00039"></a>00039 size_t operator()(<span class="keyword">const</span> Key& key)<span class="keyword"> const</span>
-<a name="l00040"></a>00040 <span class="keyword"> </span>{
-<a name="l00041"></a>00041 <span class="keywordflow">return</span> tbb_hasher(key);
-<a name="l00042"></a>00042 }
-<a name="l00043"></a>00043 };
-<a name="l00044"></a>00044
-<a name="l00045"></a>00045 <span class="keyword">namespace </span>interface5 {
-<a name="l00046"></a>00046
-<a name="l00047"></a>00047 <span class="comment">// Template class for hash map traits</span>
-<a name="l00048"></a>00048 <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="l00049"></a>00049 <span class="keyword">class </span>concurrent_unordered_map_traits
-<a name="l00050"></a>00050 {
-<a name="l00051"></a>00051 <span class="keyword">protected</span>:
-<a name="l00052"></a>00052 <span class="keyword">typedef</span> std::pair<const Key, T> value_type;
-<a name="l00053"></a>00053 <span class="keyword">typedef</span> Key key_type;
-<a name="l00054"></a>00054 <span class="keyword">typedef</span> Hash_compare hash_compare;
-<a name="l00055"></a>00055 <span class="keyword">typedef</span> <span class="keyword">typename</span> Allocator::template rebind<value_type>::other allocator_type;
-<a name="l00056"></a>00056 <span class="keyword">enum</span> { allow_multimapping = Allow_multimapping };
-<a name="l00057"></a>00057
-<a name="l00058"></a>00058 concurrent_unordered_map_traits() : my_hash_compare() {}
-<a name="l00059"></a>00059 concurrent_unordered_map_traits(<span class="keyword">const</span> hash_compare& hc) : my_hash_compare(hc) {}
-<a name="l00060"></a>00060
-<a name="l00061"></a>00061 <span class="keyword">class </span>value_compare : <span class="keyword">public</span> std::binary_function<value_type, value_type, bool>
-<a name="l00062"></a>00062 {
-<a name="l00063"></a>00063 <span class="keyword">friend</span> <span class="keyword">class </span>concurrent_unordered_map_traits<Key, T, Hash_compare, Allocator, Allow_multimapping>;
-<a name="l00064"></a>00064
-<a name="l00065"></a>00065 <span class="keyword">public</span>:
-<a name="l00066"></a>00066 <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="l00067"></a>00067 <span class="keyword"> </span>{
-<a name="l00068"></a>00068 <span class="keywordflow">return</span> (my_hash_compare(left.first, right.first));
-<a name="l00069"></a>00069 }
-<a name="l00070"></a>00070
-<a name="l00071"></a>00071 value_compare(<span class="keyword">const</span> hash_compare& comparator) : my_hash_compare(comparator) {}
-<a name="l00072"></a>00072
-<a name="l00073"></a>00073 <span class="keyword">protected</span>:
-<a name="l00074"></a>00074 hash_compare my_hash_compare; <span class="comment">// the comparator predicate for keys</span>
-<a name="l00075"></a>00075 };
-<a name="l00076"></a>00076
-<a name="l00077"></a>00077 <span class="keyword">template</span><<span class="keyword">class</span> Type1, <span class="keyword">class</span> Type2>
-<a name="l00078"></a>00078 <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="l00079"></a>00079 <span class="keywordflow">return</span> (value.first);
-<a name="l00080"></a>00080 }
-<a name="l00081"></a>00081
-<a name="l00082"></a>00082 hash_compare my_hash_compare; <span class="comment">// the comparator predicate for keys</span>
-<a name="l00083"></a>00083 };
-<a name="l00084"></a>00084
-<a name="l00085"></a>00085 <span class="keyword">template</span> <<span class="keyword">typename</span> Key, <span class="keyword">typename</span> T, <span class="keyword">typename</span> Hasher = 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="l00086"></a>00086 <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="l00087"></a>00087 {
-<a name="l00088"></a>00088 <span class="comment">// Base type definitions</span>
-<a name="l00089"></a>00089 <span class="keyword">typedef</span> internal::hash_compare<Key, Hasher, Key_equality> hash_compare;
-<a name="l00090"></a>00090 <span class="keyword">typedef</span> internal::concurrent_unordered_base< concurrent_unordered_map_traits<Key, T, hash_compare, Allocator, false> > base_type;
-<a name="l00091"></a>00091 <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="l00092"></a>00092 <span class="keyword">using</span> traits_type::my_hash_compare;
-<a name="l00093"></a>00093 <span class="preprocessor">#if __TBB_EXTRA_DEBUG</span>
-<a name="l00094"></a>00094 <span class="preprocessor"></span><span class="keyword">public</span>:
-<a name="l00095"></a>00095 <span class="preprocessor">#endif</span>
-<a name="l00096"></a>00096 <span class="preprocessor"></span> <span class="keyword">using</span> traits_type::allow_multimapping;
-<a name="l00097"></a>00097 <span class="keyword">public</span>:
-<a name="l00098"></a>00098 <span class="keyword">using</span> base_type::end;
-<a name="l00099"></a>00099 <span class="keyword">using</span> base_type::find;
-<a name="l00100"></a>00100 <span class="keyword">using</span> base_type::insert;
-<a name="l00101"></a>00101
-<a name="l00102"></a>00102 <span class="comment">// Type definitions</span>
-<a name="l00103"></a>00103 <span class="keyword">typedef</span> Key key_type;
-<a name="l00104"></a>00104 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::value_type value_type;
-<a name="l00105"></a>00105 <span class="keyword">typedef</span> T mapped_type;
-<a name="l00106"></a>00106 <span class="keyword">typedef</span> Hasher hasher;
-<a name="l00107"></a>00107 <span class="keyword">typedef</span> Key_equality key_equal;
-<a name="l00108"></a>00108 <span class="keyword">typedef</span> hash_compare key_compare;
-<a name="l00109"></a>00109
-<a name="l00110"></a>00110 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::allocator_type allocator_type;
-<a name="l00111"></a>00111 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::pointer pointer;
-<a name="l00112"></a>00112 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::const_pointer const_pointer;
-<a name="l00113"></a>00113 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::reference reference;
-<a name="l00114"></a>00114 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::const_reference const_reference;
-<a name="l00115"></a>00115
-<a name="l00116"></a>00116 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::size_type size_type;
-<a name="l00117"></a>00117 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::difference_type difference_type;
-<a name="l00118"></a>00118
-<a name="l00119"></a>00119 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::iterator iterator;
-<a name="l00120"></a>00120 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::const_iterator const_iterator;
-<a name="l00121"></a>00121 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::iterator local_iterator;
-<a name="l00122"></a>00122 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::const_iterator const_local_iterator;
-<a name="l00123"></a>00123
-<a name="l00124"></a>00124 <span class="comment">// Construction/destruction/copying</span>
-<a name="l00125"></a>00125 <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="l00126"></a>00126 <span class="keyword">const</span> key_equal& a_keyeq = key_equal(), <span class="keyword">const</span> allocator_type& a = allocator_type())
-<a name="l00127"></a>00127 : base_type(n_of_buckets, key_compare(a_hasher, a_keyeq), a)
-<a name="l00128"></a>00128 {
-<a name="l00129"></a>00129 }
-<a name="l00130"></a>00130
-<a name="l00131"></a>00131 concurrent_unordered_map(<span class="keyword">const</span> Allocator& a) : base_type(8, key_compare(), a)
-<a name="l00132"></a>00132 {
-<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> Iterator>
-<a name="l00136"></a>00136 concurrent_unordered_map(Iterator first, Iterator last, size_type n_of_buckets = 8, <span class="keyword">const</span> hasher& a_hasher = hasher(),
-<a name="l00137"></a>00137 <span class="keyword">const</span> key_equal& a_keyeq = key_equal(), <span class="keyword">const</span> allocator_type& a = allocator_type())
-<a name="l00138"></a>00138 : base_type(n_of_buckets, key_compare(a_hasher, a_keyeq), a)
-<a name="l00139"></a>00139 {
-<a name="l00140"></a>00140 <span class="keywordflow">for</span> (; first != last; ++first)
-<a name="l00141"></a>00141 base_type::insert(*first);
-<a name="l00142"></a>00142 }
-<a name="l00143"></a>00143
-<a name="l00144"></a>00144 concurrent_unordered_map(<span class="keyword">const</span> concurrent_unordered_map& table) : base_type(table)
-<a name="l00145"></a>00145 {
-<a name="l00146"></a>00146 }
-<a name="l00147"></a>00147
-<a name="l00148"></a>00148 concurrent_unordered_map(<span class="keyword">const</span> concurrent_unordered_map& table, <span class="keyword">const</span> Allocator& a)
-<a name="l00149"></a>00149 : base_type(table, a)
-<a name="l00150"></a>00150 {
-<a name="l00151"></a>00151 }
-<a name="l00152"></a>00152
-<a name="l00153"></a>00153 concurrent_unordered_map& operator=(<span class="keyword">const</span> concurrent_unordered_map& table)
-<a name="l00154"></a>00154 {
-<a name="l00155"></a>00155 base_type::operator=(table);
-<a name="l00156"></a>00156 <span class="keywordflow">return</span> (*<span class="keyword">this</span>);
-<a name="l00157"></a>00157 }
-<a name="l00158"></a>00158
-<a name="l00159"></a>00159 iterator unsafe_erase(const_iterator where)
-<a name="l00160"></a>00160 {
-<a name="l00161"></a>00161 <span class="keywordflow">return</span> base_type::unsafe_erase(where);
-<a name="l00162"></a>00162 }
-<a name="l00163"></a>00163
-<a name="l00164"></a>00164 size_type unsafe_erase(<span class="keyword">const</span> key_type& key)
-<a name="l00165"></a>00165 {
-<a name="l00166"></a>00166 <span class="keywordflow">return</span> base_type::unsafe_erase(key);
-<a name="l00167"></a>00167 }
-<a name="l00168"></a>00168
-<a name="l00169"></a>00169 iterator unsafe_erase(const_iterator first, const_iterator last)
-<a name="l00170"></a>00170 {
-<a name="l00171"></a>00171 <span class="keywordflow">return</span> base_type::unsafe_erase(first, last);
-<a name="l00172"></a>00172 }
-<a name="l00173"></a>00173
-<a name="l00174"></a>00174 <span class="keywordtype">void</span> swap(concurrent_unordered_map& table)
-<a name="l00175"></a>00175 {
-<a name="l00176"></a>00176 base_type::swap(table);
-<a name="l00177"></a>00177 }
-<a name="l00178"></a>00178
-<a name="l00179"></a>00179 <span class="comment">// Observers</span>
-<a name="l00180"></a>00180 hasher hash_function()<span class="keyword"> const</span>
-<a name="l00181"></a>00181 <span class="keyword"> </span>{
-<a name="l00182"></a>00182 <span class="keywordflow">return</span> my_hash_compare.my_hash_object;
-<a name="l00183"></a>00183 }
-<a name="l00184"></a>00184
-<a name="l00185"></a>00185 key_equal key_eq()<span class="keyword"> const</span>
-<a name="l00186"></a>00186 <span class="keyword"> </span>{
-<a name="l00187"></a>00187 <span class="keywordflow">return</span> my_hash_compare.my_key_compare_object;
-<a name="l00188"></a>00188 }
-<a name="l00189"></a>00189
-<a name="l00190"></a>00190 mapped_type& operator[](<span class="keyword">const</span> key_type& key)
-<a name="l00191"></a>00191 {
-<a name="l00192"></a>00192 iterator where = find(key);
-<a name="l00193"></a>00193
-<a name="l00194"></a>00194 <span class="keywordflow">if</span> (where == end())
-<a name="l00195"></a>00195 {
-<a name="l00196"></a>00196 where = insert(std::pair<key_type, mapped_type>(key, mapped_type())).first;
-<a name="l00197"></a>00197 }
-<a name="l00198"></a>00198
-<a name="l00199"></a>00199 <span class="keywordflow">return</span> ((*where).second);
-<a name="l00200"></a>00200 }
-<a name="l00201"></a>00201
-<a name="l00202"></a>00202 mapped_type& at(<span class="keyword">const</span> key_type& key)
-<a name="l00203"></a>00203 {
-<a name="l00204"></a>00204 iterator where = find(key);
-<a name="l00205"></a>00205
-<a name="l00206"></a>00206 <span class="keywordflow">if</span> (where == end())
-<a name="l00207"></a>00207 {
-<a name="l00208"></a>00208 tbb::internal::throw_exception(tbb::internal::eid_invalid_key);
-<a name="l00209"></a>00209 }
-<a name="l00210"></a>00210
-<a name="l00211"></a>00211 <span class="keywordflow">return</span> ((*where).second);
-<a name="l00212"></a>00212 }
-<a name="l00213"></a>00213
-<a name="l00214"></a>00214 <span class="keyword">const</span> mapped_type& at(<span class="keyword">const</span> key_type& key)<span class="keyword"> const</span>
-<a name="l00215"></a>00215 <span class="keyword"> </span>{
-<a name="l00216"></a>00216 const_iterator where = find(key);
-<a name="l00217"></a>00217
-<a name="l00218"></a>00218 <span class="keywordflow">if</span> (where == end())
-<a name="l00219"></a>00219 {
-<a name="l00220"></a>00220 tbb::internal::throw_exception(tbb::internal::eid_invalid_key);
-<a name="l00221"></a>00221 }
-<a name="l00222"></a>00222
-<a name="l00223"></a>00223 <span class="keywordflow">return</span> ((*where).second);
-<a name="l00224"></a>00224 }
-<a name="l00225"></a>00225 };
-<a name="l00226"></a>00226
-<a name="l00227"></a>00227 } <span class="comment">// namespace interface5</span>
-<a name="l00228"></a>00228
-<a name="l00229"></a>00229 <span class="keyword">using</span> interface5::concurrent_unordered_map;
-<a name="l00230"></a>00230
-<a name="l00231"></a>00231 } <span class="comment">// namespace tbb</span>
-<a name="l00232"></a>00232
-<a name="l00233"></a>00233 <span class="preprocessor">#endif// __TBB_concurrent_unordered_map_H</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2011 Intel Corporation. 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
new file mode 100644
index 0000000..d332046
--- /dev/null
+++ b/doc/html/a00440.html
@@ -0,0 +1,199 @@
+<!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-2011 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-2011 Intel Corporation. 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/a00442.html b/doc/html/a00442.html
deleted file mode 100644
index 976fb09..0000000
--- a/doc/html/a00442.html
+++ /dev/null
@@ -1,926 +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-2011 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
-<a name="l00033"></a>00033 <span class="preprocessor">#if !TBB_USE_EXCEPTIONS && _MSC_VER</span>
-<a name="l00034"></a>00034 <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="l00035"></a>00035 <span class="preprocessor"> #pragma warning (push)</span>
-<a name="l00036"></a>00036 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (disable: 4530)</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="preprocessor">#include <algorithm></span>
-<a name="l00040"></a>00040 <span class="preprocessor">#include <iterator></span>
-<a name="l00041"></a>00041
-<a name="l00042"></a>00042 <span class="preprocessor">#if !TBB_USE_EXCEPTIONS && _MSC_VER</span>
-<a name="l00043"></a>00043 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (pop)</span>
-<a name="l00044"></a>00044 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00045"></a>00045 <span class="preprocessor"></span>
-<a name="l00046"></a>00046 <span class="preprocessor">#if _MSC_VER==1500 && !__INTEL_COMPILER</span>
-<a name="l00047"></a>00047 <span class="preprocessor"></span> <span class="comment">// VS2008/VC9 seems to have an issue; limits pull in math.h</span>
-<a name="l00048"></a>00048 <span class="preprocessor"> #pragma warning( push )</span>
-<a name="l00049"></a>00049 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning( disable: 4985 )</span>
-<a name="l00050"></a>00050 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00051"></a>00051 <span class="preprocessor"></span><span class="preprocessor">#include <limits></span> <span class="comment">/* std::numeric_limits */</span>
-<a name="l00052"></a>00052 <span class="preprocessor">#if _MSC_VER==1500 && !__INTEL_COMPILER</span>
-<a name="l00053"></a>00053 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning( pop )</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">#if defined(_MSC_VER) && !defined(__INTEL_COMPILER) && defined(_Wp64)</span>
-<a name="l00057"></a>00057 <span class="preprocessor"></span> <span class="comment">// Workaround for overzealous compiler warnings in /Wp64 mode</span>
-<a name="l00058"></a>00058 <span class="preprocessor"> #pragma warning (push)</span>
-<a name="l00059"></a>00059 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (disable: 4267)</span>
-<a name="l00060"></a>00060 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00061"></a>00061 <span class="preprocessor"></span>
-<a name="l00062"></a>00062 <span class="keyword">namespace </span>tbb {
-<a name="l00063"></a>00063
-<a name="l00064"></a>00064 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A = cache_aligned_allocator<T> >
-<a name="l00065"></a>00065 <span class="keyword">class </span>concurrent_vector;
-<a name="l00066"></a>00066
-<a name="l00068"></a>00068 <span class="keyword">namespace </span>internal {
-<a name="l00069"></a>00069
-<a name="l00071"></a>00071 <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="l00072"></a>00072
-<a name="l00074"></a>00074
-<a name="l00075"></a>00075 <span class="keyword">class </span>concurrent_vector_base_v3 {
-<a name="l00076"></a>00076 <span class="keyword">protected</span>:
-<a name="l00077"></a>00077
-<a name="l00078"></a>00078 <span class="comment">// Basic types declarations</span>
-<a name="l00079"></a>00079 <span class="keyword">typedef</span> size_t segment_index_t;
-<a name="l00080"></a>00080 <span class="keyword">typedef</span> size_t size_type;
-<a name="l00081"></a>00081
-<a name="l00082"></a>00082 <span class="comment">// Using enumerations due to Mac linking problems of static const variables</span>
-<a name="l00083"></a>00083 <span class="keyword">enum</span> {
-<a name="l00084"></a>00084 <span class="comment">// Size constants</span>
-<a name="l00085"></a>00085 default_initial_segments = 1, <span class="comment">// 2 initial items</span>
-<a name="l00087"></a>00087 <span class="comment"></span> pointers_per_short_table = 3, <span class="comment">// to fit into 8 words of entire structure</span>
-<a name="l00088"></a>00088 pointers_per_long_table = <span class="keyword">sizeof</span>(segment_index_t) * 8 <span class="comment">// one segment per bit</span>
-<a name="l00089"></a>00089 };
-<a name="l00090"></a>00090
-<a name="l00091"></a>00091 <span class="comment">// Segment pointer. Can be zero-initialized</span>
-<a name="l00092"></a>00092 <span class="keyword">struct </span>segment_t {
-<a name="l00093"></a>00093 <span class="keywordtype">void</span>* array;
-<a name="l00094"></a>00094 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00095"></a>00095 <span class="preprocessor"></span> ~segment_t() {
-<a name="l00096"></a>00096 __TBB_ASSERT( array <= internal::vector_allocation_error_flag, <span class="stringliteral">"should have been freed by clear"</span> );
-<a name="l00097"></a>00097 }
-<a name="l00098"></a>00098 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
-<a name="l00099"></a>00099 };
-<a name="l00100"></a>00100
-<a name="l00101"></a>00101 <span class="comment">// Data fields</span>
-<a name="l00102"></a>00102
-<a name="l00104"></a>00104 <span class="keywordtype">void</span>* (*vector_allocator_ptr)(concurrent_vector_base_v3 &, size_t);
-<a name="l00105"></a>00105
-<a name="l00107"></a>00107 atomic<size_type> my_first_block;
-<a name="l00108"></a>00108
-<a name="l00110"></a>00110 atomic<size_type> my_early_size;
-<a name="l00111"></a>00111
-<a name="l00113"></a>00113 atomic<segment_t*> my_segment;
-<a name="l00114"></a>00114
-<a name="l00116"></a>00116 segment_t my_storage[pointers_per_short_table];
-<a name="l00117"></a>00117
-<a name="l00118"></a>00118 <span class="comment">// Methods</span>
-<a name="l00119"></a>00119
-<a name="l00120"></a>00120 concurrent_vector_base_v3() {
-<a name="l00121"></a>00121 my_early_size = 0;
-<a name="l00122"></a>00122 my_first_block = 0; <span class="comment">// here is not default_initial_segments</span>
-<a name="l00123"></a>00123 <span class="keywordflow">for</span>( segment_index_t i = 0; i < pointers_per_short_table; i++)
-<a name="l00124"></a>00124 my_storage[i].array = NULL;
-<a name="l00125"></a>00125 my_segment = my_storage;
-<a name="l00126"></a>00126 }
-<a name="l00127"></a>00127 __TBB_EXPORTED_METHOD ~concurrent_vector_base_v3();
-<a name="l00128"></a>00128
-<a name="l00129"></a>00129 <span class="keyword">static</span> segment_index_t segment_index_of( size_type index ) {
-<a name="l00130"></a>00130 <span class="keywordflow">return</span> segment_index_t( __TBB_Log2( index|1 ) );
-<a name="l00131"></a>00131 }
-<a name="l00132"></a>00132
-<a name="l00133"></a>00133 <span class="keyword">static</span> segment_index_t segment_base( segment_index_t k ) {
-<a name="l00134"></a>00134 <span class="keywordflow">return</span> (segment_index_t(1)<<k & ~segment_index_t(1));
-<a name="l00135"></a>00135 }
-<a name="l00136"></a>00136
-<a name="l00137"></a>00137 <span class="keyword">static</span> <span class="keyword">inline</span> segment_index_t segment_base_index_of( segment_index_t &index ) {
-<a name="l00138"></a>00138 segment_index_t k = segment_index_of( index );
-<a name="l00139"></a>00139 index -= segment_base(k);
-<a name="l00140"></a>00140 <span class="keywordflow">return</span> k;
-<a name="l00141"></a>00141 }
-<a name="l00142"></a>00142
-<a name="l00143"></a>00143 <span class="keyword">static</span> size_type segment_size( segment_index_t k ) {
-<a name="l00144"></a>00144 <span class="keywordflow">return</span> segment_index_t(1)<<k; <span class="comment">// fake value for k==0</span>
-<a name="l00145"></a>00145 }
-<a name="l00146"></a>00146
-<a name="l00148"></a>00148 <span class="keyword">typedef</span> void (__TBB_EXPORTED_FUNC *internal_array_op1)(<span class="keywordtype">void</span>* begin, size_type n );
-<a name="l00149"></a>00149
-<a name="l00151"></a>00151 <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="l00152"></a>00152
-<a name="l00154"></a>00154 <span class="keyword">struct </span>internal_segments_table {
-<a name="l00155"></a>00155 segment_index_t first_block;
-<a name="l00156"></a>00156 <span class="keywordtype">void</span>* table[pointers_per_long_table];
-<a name="l00157"></a>00157 };
-<a name="l00158"></a>00158
-<a name="l00159"></a>00159 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_reserve( size_type n, size_type element_size, size_type max_size );
-<a name="l00160"></a>00160 size_type __TBB_EXPORTED_METHOD internal_capacity() <span class="keyword">const</span>;
-<a name="l00161"></a>00161 <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="l00162"></a>00162 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="l00163"></a>00163 <span class="keywordtype">void</span>* __TBB_EXPORTED_METHOD internal_push_back( size_type element_size, size_type& index );
-<a name="l00164"></a>00164 segment_index_t __TBB_EXPORTED_METHOD internal_clear( internal_array_op1 destroy );
-<a name="l00165"></a>00165 <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="l00166"></a>00166 <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="l00167"></a>00167 <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="l00168"></a>00168 internal_array_op1 destroy, internal_array_op2 assign, internal_array_op2 copy );
-<a name="l00170"></a>00170 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_throw_exception(size_type) <span class="keyword">const</span>;
-<a name="l00171"></a>00171 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_swap(concurrent_vector_base_v3& v);
-<a name="l00172"></a>00172
-<a name="l00173"></a>00173 <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="l00174"></a>00174 internal_array_op1 destroy, internal_array_op2 init );
-<a name="l00175"></a>00175 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="l00176"></a>00176
-<a name="l00178"></a>00178 <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="l00179"></a>00179 <span class="keyword">private</span>:
-<a name="l00181"></a>00181 <span class="keyword">class </span>helper;
-<a name="l00182"></a>00182 <span class="keyword">friend</span> <span class="keyword">class </span>helper;
-<a name="l00183"></a>00183 };
-<a name="l00184"></a>00184
-<a name="l00185"></a>00185 <span class="keyword">typedef</span> concurrent_vector_base_v3 concurrent_vector_base;
-<a name="l00186"></a>00186
-<a name="l00188"></a>00188
-<a name="l00190"></a>00190 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> Value>
-<a name="l00191"></a>00191 <span class="keyword">class </span>vector_iterator
-<a name="l00192"></a>00192 {
-<a name="l00194"></a>00194 Container* my_vector;
-<a name="l00195"></a>00195
-<a name="l00197"></a>00197 size_t my_index;
-<a name="l00198"></a>00198
-<a name="l00200"></a>00200
-<a name="l00201"></a>00201 <span class="keyword">mutable</span> Value* my_item;
-<a name="l00202"></a>00202
-<a name="l00203"></a>00203 <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> T>
-<a name="l00204"></a>00204 <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="l00205"></a>00205
-<a name="l00206"></a>00206 <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="l00207"></a>00207 <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="l00208"></a>00208
-<a name="l00209"></a>00209 <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="l00210"></a>00210 <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="l00211"></a>00211
-<a name="l00212"></a>00212 <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="l00213"></a>00213 <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="l00214"></a>00214
-<a name="l00215"></a>00215 <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> U>
-<a name="l00216"></a>00216 <span class="keyword">friend</span> <span class="keyword">class </span>internal::vector_iterator;
-<a name="l00217"></a>00217
-<a name="l00218"></a>00218 <span class="preprocessor">#if !defined(_MSC_VER) || defined(__INTEL_COMPILER)</span>
-<a name="l00219"></a>00219 <span class="preprocessor"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l00220"></a>00220 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00238.html">tbb::concurrent_vector</a>;
-<a name="l00221"></a>00221 <span class="preprocessor">#else</span>
-<a name="l00222"></a>00222 <span class="preprocessor"></span><span class="keyword">public</span>: <span class="comment">// workaround for MSVC</span>
-<a name="l00223"></a>00223 <span class="preprocessor">#endif </span>
-<a name="l00224"></a>00224 <span class="preprocessor"></span>
-<a name="l00225"></a>00225 vector_iterator( <span class="keyword">const</span> Container& vector, size_t index, <span class="keywordtype">void</span> *ptr = 0 ) :
-<a name="l00226"></a>00226 my_vector(const_cast<Container*>(&vector)),
-<a name="l00227"></a>00227 my_index(index),
-<a name="l00228"></a>00228 my_item(static_cast<Value*>(ptr))
-<a name="l00229"></a>00229 {}
-<a name="l00230"></a>00230
-<a name="l00231"></a>00231 <span class="keyword">public</span>:
-<a name="l00233"></a>00233 vector_iterator() : my_vector(NULL), my_index(~size_t(0)), my_item(NULL) {}
-<a name="l00234"></a>00234
-<a name="l00235"></a>00235 vector_iterator( <span class="keyword">const</span> vector_iterator<Container,typename Container::value_type>& other ) :
-<a name="l00236"></a>00236 my_vector(other.my_vector),
-<a name="l00237"></a>00237 my_index(other.my_index),
-<a name="l00238"></a>00238 my_item(other.my_item)
-<a name="l00239"></a>00239 {}
-<a name="l00240"></a>00240
-<a name="l00241"></a>00241 vector_iterator operator+( ptrdiff_t offset )<span class="keyword"> const </span>{
-<a name="l00242"></a>00242 <span class="keywordflow">return</span> vector_iterator( *my_vector, my_index+offset );
-<a name="l00243"></a>00243 }
-<a name="l00244"></a>00244 vector_iterator &operator+=( ptrdiff_t offset ) {
-<a name="l00245"></a>00245 my_index+=offset;
-<a name="l00246"></a>00246 my_item = NULL;
-<a name="l00247"></a>00247 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00248"></a>00248 }
-<a name="l00249"></a>00249 vector_iterator operator-( ptrdiff_t offset )<span class="keyword"> const </span>{
-<a name="l00250"></a>00250 <span class="keywordflow">return</span> vector_iterator( *my_vector, my_index-offset );
-<a name="l00251"></a>00251 }
-<a name="l00252"></a>00252 vector_iterator &operator-=( ptrdiff_t offset ) {
-<a name="l00253"></a>00253 my_index-=offset;
-<a name="l00254"></a>00254 my_item = NULL;
-<a name="l00255"></a>00255 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00256"></a>00256 }
-<a name="l00257"></a>00257 Value& operator*()<span class="keyword"> const </span>{
-<a name="l00258"></a>00258 Value* item = my_item;
-<a name="l00259"></a>00259 <span class="keywordflow">if</span>( !item ) {
-<a name="l00260"></a>00260 item = my_item = &my_vector->internal_subscript(my_index);
-<a name="l00261"></a>00261 }
-<a name="l00262"></a>00262 __TBB_ASSERT( item==&my_vector->internal_subscript(my_index), <span class="stringliteral">"corrupt cache"</span> );
-<a name="l00263"></a>00263 <span class="keywordflow">return</span> *item;
-<a name="l00264"></a>00264 }
-<a name="l00265"></a>00265 Value& <a class="code" href="a00238.html#4c52f2950bb1832886bd4458eb09d7eb">operator[]</a>( ptrdiff_t k )<span class="keyword"> const </span>{
-<a name="l00266"></a>00266 <span class="keywordflow">return</span> my_vector->internal_subscript(my_index+k);
-<a name="l00267"></a>00267 }
-<a name="l00268"></a>00268 Value* operator->()<span class="keyword"> const </span>{<span class="keywordflow">return</span> &operator*();}
-<a name="l00269"></a>00269
-<a name="l00271"></a>00271 vector_iterator& operator++() {
-<a name="l00272"></a>00272 size_t k = ++my_index;
-<a name="l00273"></a>00273 <span class="keywordflow">if</span>( my_item ) {
-<a name="l00274"></a>00274 <span class="comment">// Following test uses 2's-complement wizardry</span>
-<a name="l00275"></a>00275 <span class="keywordflow">if</span>( (k& (k-2))==0 ) {
-<a name="l00276"></a>00276 <span class="comment">// k is a power of two that is at least k-2</span>
-<a name="l00277"></a>00277 my_item= NULL;
-<a name="l00278"></a>00278 } <span class="keywordflow">else</span> {
-<a name="l00279"></a>00279 ++my_item;
-<a name="l00280"></a>00280 }
-<a name="l00281"></a>00281 }
-<a name="l00282"></a>00282 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00283"></a>00283 }
-<a name="l00284"></a>00284
-<a name="l00286"></a>00286 vector_iterator& operator--() {
-<a name="l00287"></a>00287 __TBB_ASSERT( my_index>0, <span class="stringliteral">"operator--() applied to iterator already at beginning of concurrent_vector"</span> );
-<a name="l00288"></a>00288 size_t k = my_index--;
-<a name="l00289"></a>00289 <span class="keywordflow">if</span>( my_item ) {
-<a name="l00290"></a>00290 <span class="comment">// Following test uses 2's-complement wizardry</span>
-<a name="l00291"></a>00291 <span class="keywordflow">if</span>( (k& (k-2))==0 ) {
-<a name="l00292"></a>00292 <span class="comment">// k is a power of two that is at least k-2 </span>
-<a name="l00293"></a>00293 my_item= NULL;
-<a name="l00294"></a>00294 } <span class="keywordflow">else</span> {
-<a name="l00295"></a>00295 --my_item;
-<a name="l00296"></a>00296 }
-<a name="l00297"></a>00297 }
-<a name="l00298"></a>00298 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00299"></a>00299 }
-<a name="l00300"></a>00300
-<a name="l00302"></a>00302 vector_iterator operator++(<span class="keywordtype">int</span>) {
-<a name="l00303"></a>00303 vector_iterator result = *<span class="keyword">this</span>;
-<a name="l00304"></a>00304 operator++();
-<a name="l00305"></a>00305 <span class="keywordflow">return</span> result;
-<a name="l00306"></a>00306 }
-<a name="l00307"></a>00307
-<a name="l00309"></a>00309 vector_iterator operator--(<span class="keywordtype">int</span>) {
-<a name="l00310"></a>00310 vector_iterator result = *<span class="keyword">this</span>;
-<a name="l00311"></a>00311 operator--();
-<a name="l00312"></a>00312 <span class="keywordflow">return</span> result;
-<a name="l00313"></a>00313 }
-<a name="l00314"></a>00314
-<a name="l00315"></a>00315 <span class="comment">// STL support</span>
-<a name="l00316"></a>00316
-<a name="l00317"></a>00317 <span class="keyword">typedef</span> ptrdiff_t difference_type;
-<a name="l00318"></a>00318 <span class="keyword">typedef</span> Value value_type;
-<a name="l00319"></a>00319 <span class="keyword">typedef</span> Value* pointer;
-<a name="l00320"></a>00320 <span class="keyword">typedef</span> Value& reference;
-<a name="l00321"></a>00321 <span class="keyword">typedef</span> std::random_access_iterator_tag iterator_category;
-<a name="l00322"></a>00322 };
-<a name="l00323"></a>00323
-<a name="l00324"></a>00324 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> T>
-<a name="l00325"></a>00325 vector_iterator<Container,T> operator+( ptrdiff_t offset, <span class="keyword">const</span> vector_iterator<Container,T>& v ) {
-<a name="l00326"></a>00326 <span class="keywordflow">return</span> vector_iterator<Container,T>( *v.my_vector, v.my_index+offset );
-<a name="l00327"></a>00327 }
-<a name="l00328"></a>00328
-<a name="l00329"></a>00329 <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="l00330"></a>00330 <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="l00331"></a>00331 <span class="keywordflow">return</span> i.my_index==j.my_index && i.my_vector == j.my_vector;
-<a name="l00332"></a>00332 }
-<a name="l00333"></a>00333
-<a name="l00334"></a>00334 <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="l00335"></a>00335 <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="l00336"></a>00336 <span class="keywordflow">return</span> !(i==j);
-<a name="l00337"></a>00337 }
-<a name="l00338"></a>00338
-<a name="l00339"></a>00339 <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="l00340"></a>00340 <span class="keywordtype">bool</span> operator<( const vector_iterator<Container,T>& i, <span class="keyword">const</span> vector_iterator<Container,U>& j ) {
-<a name="l00341"></a>00341 <span class="keywordflow">return</span> i.my_index<j.my_index;
-<a name="l00342"></a>00342 }
-<a name="l00343"></a>00343
-<a name="l00344"></a>00344 <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="l00345"></a>00345 <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="l00346"></a>00346 <span class="keywordflow">return</span> j<i;
-<a name="l00347"></a>00347 }
-<a name="l00348"></a>00348
-<a name="l00349"></a>00349 <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="l00350"></a>00350 <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="l00351"></a>00351 <span class="keywordflow">return</span> !(i<j);
-<a name="l00352"></a>00352 }
-<a name="l00353"></a>00353
-<a name="l00354"></a>00354 <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="l00355"></a>00355 <span class="keywordtype">bool</span> operator<=( const vector_iterator<Container,T>& i, <span class="keyword">const</span> vector_iterator<Container,U>& j ) {
-<a name="l00356"></a>00356 <span class="keywordflow">return</span> !(j<i);
-<a name="l00357"></a>00357 }
-<a name="l00358"></a>00358
-<a name="l00359"></a>00359 <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="l00360"></a>00360 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="l00361"></a>00361 <span class="keywordflow">return</span> ptrdiff_t(i.my_index)-ptrdiff_t(j.my_index);
-<a name="l00362"></a>00362 }
-<a name="l00363"></a>00363
-<a name="l00364"></a>00364 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l00365"></a>00365 <span class="keyword">class </span>allocator_base {
-<a name="l00366"></a>00366 <span class="keyword">public</span>:
-<a name="l00367"></a>00367 <span class="keyword">typedef</span> <span class="keyword">typename</span> A::template
-<a name="l00368"></a>00368 rebind<T>::other allocator_type;
-<a name="l00369"></a>00369 allocator_type my_allocator;
-<a name="l00370"></a>00370
-<a name="l00371"></a>00371 allocator_base(<span class="keyword">const</span> allocator_type &a = allocator_type() ) : my_allocator(a) {}
-<a name="l00372"></a>00372 };
-<a name="l00373"></a>00373
-<a name="l00374"></a>00374 } <span class="comment">// namespace internal</span>
-<a name="l00376"></a>00376 <span class="comment"></span>
-<a name="l00378"></a>00378
-<a name="l00439"></a>00439 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l00440"></a><a class="code" href="a00238.html">00440</a> <span class="keyword">class </span><a class="code" href="a00238.html">concurrent_vector</a>: <span class="keyword">protected</span> internal::allocator_base<T, A>,
-<a name="l00441"></a>00441 <span class="keyword">private</span> internal::concurrent_vector_base {
-<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> I>
-<a name="l00444"></a>00444 <span class="keyword">class </span>generic_range_type: <span class="keyword">public</span> <a class="code" href="a00221.html">blocked_range</a><I> {
-<a name="l00445"></a>00445 <span class="keyword">public</span>:
-<a name="l00446"></a>00446 <span class="keyword">typedef</span> T value_type;
-<a name="l00447"></a>00447 <span class="keyword">typedef</span> T& reference;
-<a name="l00448"></a>00448 <span class="keyword">typedef</span> <span class="keyword">const</span> T& const_reference;
-<a name="l00449"></a>00449 <span class="keyword">typedef</span> I iterator;
-<a name="l00450"></a>00450 <span class="keyword">typedef</span> ptrdiff_t difference_type;
-<a name="l00451"></a>00451 generic_range_type( I begin_, I end_, size_t grainsize_ = 1) : <a class="code" href="a00221.html">blocked_range<I></a>(begin_,end_,grainsize_) {}
-<a name="l00452"></a>00452 template<typename U>
-<a name="l00453"></a>00453 generic_range_type( <span class="keyword">const</span> generic_range_type<U>& r) : <a class="code" href="a00221.html">blocked_range<I></a>(r.begin(),r.end(),r.grainsize()) {}
-<a name="l00454"></a>00454 generic_range_type( generic_range_type& r, <a class="code" href="a00290.html">split</a> ) : <a class="code" href="a00221.html">blocked_range<I></a>(r,<a class="code" href="a00290.html">split</a>()) {}
-<a name="l00455"></a>00455 };
-<a name="l00456"></a>00456
-<a name="l00457"></a>00457 <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> U>
-<a name="l00458"></a>00458 <span class="keyword">friend</span> <span class="keyword">class </span>internal::vector_iterator;
-<a name="l00459"></a>00459 <span class="keyword">public</span>:
-<a name="l00460"></a>00460 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00461"></a>00461 <span class="comment">// STL compatible types</span>
-<a name="l00462"></a>00462 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00463"></a>00463 <span class="keyword">typedef</span> internal::concurrent_vector_base_v3::size_type size_type;
-<a name="l00464"></a>00464 <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::allocator_base<T, A>::allocator_type allocator_type;
-<a name="l00465"></a>00465
-<a name="l00466"></a>00466 <span class="keyword">typedef</span> T value_type;
-<a name="l00467"></a>00467 <span class="keyword">typedef</span> ptrdiff_t difference_type;
-<a name="l00468"></a>00468 <span class="keyword">typedef</span> T& reference;
-<a name="l00469"></a>00469 <span class="keyword">typedef</span> <span class="keyword">const</span> T& const_reference;
-<a name="l00470"></a>00470 <span class="keyword">typedef</span> T *pointer;
-<a name="l00471"></a>00471 <span class="keyword">typedef</span> <span class="keyword">const</span> T *const_pointer;
-<a name="l00472"></a>00472
-<a name="l00473"></a>00473 <span class="keyword">typedef</span> internal::vector_iterator<concurrent_vector,T> iterator;
-<a name="l00474"></a>00474 <span class="keyword">typedef</span> internal::vector_iterator<concurrent_vector,const T> const_iterator;
-<a name="l00475"></a>00475
-<a name="l00476"></a>00476 <span class="preprocessor">#if !defined(_MSC_VER) || _CPPLIB_VER>=300 </span>
-<a name="l00477"></a>00477 <span class="preprocessor"></span> <span class="comment">// Assume ISO standard definition of std::reverse_iterator</span>
-<a name="l00478"></a>00478 <span class="keyword">typedef</span> std::reverse_iterator<iterator> reverse_iterator;
-<a name="l00479"></a>00479 <span class="keyword">typedef</span> std::reverse_iterator<const_iterator> const_reverse_iterator;
-<a name="l00480"></a>00480 <span class="preprocessor">#else</span>
-<a name="l00481"></a>00481 <span class="preprocessor"></span> <span class="comment">// Use non-standard std::reverse_iterator</span>
-<a name="l00482"></a>00482 <span class="keyword">typedef</span> std::reverse_iterator<iterator,T,T&,T*> reverse_iterator;
-<a name="l00483"></a>00483 <span class="keyword">typedef</span> std::reverse_iterator<const_iterator,T,const T&,const T*> const_reverse_iterator;
-<a name="l00484"></a>00484 <span class="preprocessor">#endif </span><span class="comment">/* defined(_MSC_VER) && (_MSC_VER<1300) */</span>
-<a name="l00485"></a>00485
-<a name="l00486"></a>00486 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00487"></a>00487 <span class="comment">// Parallel algorithm support</span>
-<a name="l00488"></a>00488 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00489"></a>00489 <span class="keyword">typedef</span> generic_range_type<iterator> range_type;
-<a name="l00490"></a>00490 <span class="keyword">typedef</span> generic_range_type<const_iterator> const_range_type;
-<a name="l00491"></a>00491
-<a name="l00492"></a>00492 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00493"></a>00493 <span class="comment">// STL compatible constructors & destructors</span>
-<a name="l00494"></a>00494 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00495"></a>00495
-<a name="l00497"></a><a class="code" href="a00238.html#2c8ca9cabfcd30ad5943324c853664b5">00497</a> <span class="keyword">explicit</span> <a class="code" href="a00238.html">concurrent_vector</a>(<span class="keyword">const</span> allocator_type &a = allocator_type())
-<a name="l00498"></a>00498 : internal::allocator_base<T, A>(a), internal::concurrent_vector_base()
-<a name="l00499"></a>00499 {
-<a name="l00500"></a>00500 vector_allocator_ptr = &internal_allocator;
-<a name="l00501"></a>00501 }
-<a name="l00502"></a>00502
-<a name="l00504"></a><a class="code" href="a00238.html#dd8a200b99a8088435a37934b58fe335">00504</a> <a class="code" href="a00238.html">concurrent_vector</a>( <span class="keyword">const</span> <a class="code" href="a00238.html">concurrent_vector</a>& vector, <span class="keyword">const</span> allocator_type& a = allocator_type() )
-<a name="l00505"></a>00505 : internal::allocator_base<T, A>(a), internal::concurrent_vector_base()
-<a name="l00506"></a>00506 {
-<a name="l00507"></a>00507 vector_allocator_ptr = &internal_allocator;
-<a name="l00508"></a>00508 __TBB_TRY {
-<a name="l00509"></a>00509 internal_copy(vector, <span class="keyword">sizeof</span>(T), ©_array);
-<a name="l00510"></a>00510 } __TBB_CATCH(...) {
-<a name="l00511"></a>00511 segment_t *table = my_segment;
-<a name="l00512"></a>00512 internal_free_segments( reinterpret_cast<void**>(table), internal_clear(&destroy_array), my_first_block );
-<a name="l00513"></a>00513 __TBB_RETHROW();
-<a name="l00514"></a>00514 }
-<a name="l00515"></a>00515 }
-<a name="l00516"></a>00516
-<a name="l00518"></a>00518 <span class="keyword">template</span><<span class="keyword">class</span> M>
-<a name="l00519"></a><a class="code" href="a00238.html#64432f13f7b29bfe4acfb5568f34f3a8">00519</a> <a class="code" href="a00238.html">concurrent_vector</a>( <span class="keyword">const</span> <a class="code" href="a00238.html">concurrent_vector<T, M></a>& vector, <span class="keyword">const</span> allocator_type& a = allocator_type() )
-<a name="l00520"></a>00520 : internal::allocator_base<T, A>(a), internal::concurrent_vector_base()
-<a name="l00521"></a>00521 {
-<a name="l00522"></a>00522 vector_allocator_ptr = &internal_allocator;
-<a name="l00523"></a>00523 __TBB_TRY {
-<a name="l00524"></a>00524 internal_copy(vector.<a class="code" href="a00238.html#bb5ae659871478f1f5c68039e1273e12">internal_vector_base</a>(), <span class="keyword">sizeof</span>(T), ©_array);
-<a name="l00525"></a>00525 } __TBB_CATCH(...) {
-<a name="l00526"></a>00526 segment_t *table = my_segment;
-<a name="l00527"></a>00527 internal_free_segments( reinterpret_cast<void**>(table), internal_clear(&destroy_array), my_first_block );
-<a name="l00528"></a>00528 __TBB_RETHROW();
-<a name="l00529"></a>00529 }
-<a name="l00530"></a>00530 }
-<a name="l00531"></a>00531
-<a name="l00533"></a><a class="code" href="a00238.html#2a2e261dfe1cab3f73f7b1a94137cfca">00533</a> <span class="keyword">explicit</span> <a class="code" href="a00238.html">concurrent_vector</a>(size_type n)
-<a name="l00534"></a>00534 {
-<a name="l00535"></a>00535 vector_allocator_ptr = &internal_allocator;
-<a name="l00536"></a>00536 __TBB_TRY {
-<a name="l00537"></a>00537 internal_resize( n, <span class="keyword">sizeof</span>(T), max_size(), NULL, &destroy_array, &initialize_array );
-<a name="l00538"></a>00538 } __TBB_CATCH(...) {
-<a name="l00539"></a>00539 segment_t *table = my_segment;
-<a name="l00540"></a>00540 internal_free_segments( reinterpret_cast<void**>(table), internal_clear(&destroy_array), my_first_block );
-<a name="l00541"></a>00541 __TBB_RETHROW();
-<a name="l00542"></a>00542 }
-<a name="l00543"></a>00543 }
-<a name="l00544"></a>00544
-<a name="l00546"></a><a class="code" href="a00238.html#3883a8a908b44e249a57f454de3f55d8">00546</a> <a class="code" href="a00238.html">concurrent_vector</a>(size_type n, const_reference t, <span class="keyword">const</span> allocator_type& a = allocator_type())
-<a name="l00547"></a>00547 : internal::allocator_base<T, A>(a)
-<a name="l00548"></a>00548 {
-<a name="l00549"></a>00549 vector_allocator_ptr = &internal_allocator;
-<a name="l00550"></a>00550 __TBB_TRY {
-<a name="l00551"></a>00551 internal_resize( n, <span class="keyword">sizeof</span>(T), max_size(), static_cast<const void*>(&t), &destroy_array, &initialize_array_by );
-<a name="l00552"></a>00552 } __TBB_CATCH(...) {
-<a name="l00553"></a>00553 segment_t *table = my_segment;
-<a name="l00554"></a>00554 internal_free_segments( reinterpret_cast<void**>(table), internal_clear(&destroy_array), my_first_block );
-<a name="l00555"></a>00555 __TBB_RETHROW();
-<a name="l00556"></a>00556 }
-<a name="l00557"></a>00557 }
-<a name="l00558"></a>00558
-<a name="l00560"></a>00560 <span class="keyword">template</span><<span class="keyword">class</span> I>
-<a name="l00561"></a><a class="code" href="a00238.html#4450de83c5862ea4bcd9443fd7e67419">00561</a> <a class="code" href="a00238.html">concurrent_vector</a>(I first, I last, <span class="keyword">const</span> allocator_type &a = allocator_type())
-<a name="l00562"></a>00562 : internal::allocator_base<T, A>(a)
-<a name="l00563"></a>00563 {
-<a name="l00564"></a>00564 vector_allocator_ptr = &internal_allocator;
-<a name="l00565"></a>00565 __TBB_TRY {
-<a name="l00566"></a>00566 internal_assign_range(first, last, <span class="keyword">static_cast</span><is_integer_tag<std::numeric_limits<I>::is_integer> *>(0) );
-<a name="l00567"></a>00567 } __TBB_CATCH(...) {
-<a name="l00568"></a>00568 segment_t *table = my_segment;
-<a name="l00569"></a>00569 internal_free_segments( reinterpret_cast<void**>(table), internal_clear(&destroy_array), my_first_block );
-<a name="l00570"></a>00570 __TBB_RETHROW();
-<a name="l00571"></a>00571 }
-<a name="l00572"></a>00572 }
-<a name="l00573"></a>00573
-<a name="l00575"></a><a class="code" href="a00238.html#691f0f3cda3e489c37a657016e375eaf">00575</a> <a class="code" href="a00238.html">concurrent_vector</a>& operator=( <span class="keyword">const</span> <a class="code" href="a00238.html">concurrent_vector</a>& vector ) {
-<a name="l00576"></a>00576 <span class="keywordflow">if</span>( <span class="keyword">this</span> != &vector )
-<a name="l00577"></a>00577 internal_assign(vector, <span class="keyword">sizeof</span>(T), &destroy_array, &assign_array, ©_array);
-<a name="l00578"></a>00578 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00579"></a>00579 }
-<a name="l00580"></a>00580
-<a name="l00582"></a>00582 <span class="keyword">template</span><<span class="keyword">class</span> M>
-<a name="l00583"></a><a class="code" href="a00238.html#19f4ab88a01b0fd056af3bba463e7bd6">00583</a> <a class="code" href="a00238.html">concurrent_vector</a>& operator=( <span class="keyword">const</span> <a class="code" href="a00238.html">concurrent_vector<T, M></a>& vector ) {
-<a name="l00584"></a>00584 <span class="keywordflow">if</span>( static_cast<void*>( <span class="keyword">this</span> ) != static_cast<const void*>( &vector ) )
-<a name="l00585"></a>00585 internal_assign(vector.internal_vector_base(),
-<a name="l00586"></a>00586 <span class="keyword">sizeof</span>(T), &destroy_array, &assign_array, ©_array);
-<a name="l00587"></a>00587 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00588"></a>00588 }
-<a name="l00589"></a>00589
-<a name="l00590"></a>00590 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00591"></a>00591 <span class="comment">// Concurrent operations</span>
-<a name="l00592"></a>00592 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00594"></a>00594 <span class="comment"></span><span class="preprocessor">#if TBB_DEPRECATED</span>
-<a name="l00595"></a>00595 <span class="preprocessor"></span>
-<a name="l00596"></a><a class="code" href="a00238.html#30484e3959892fd5392fa93c873c31f0">00596</a> size_type grow_by( size_type delta ) {
-<a name="l00597"></a>00597 <span class="keywordflow">return</span> delta ? internal_grow_by( delta, <span class="keyword">sizeof</span>(T), &initialize_array, NULL ) : my_early_size;
-<a name="l00598"></a>00598 }
-<a name="l00599"></a>00599 <span class="preprocessor">#else</span>
-<a name="l00600"></a>00600 <span class="preprocessor"></span>
-<a name="l00601"></a><a class="code" href="a00238.html#c8177b1865270ea68aa1ab9148e5e35e">00601</a> iterator grow_by( size_type delta ) {
-<a name="l00602"></a>00602 <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="l00603"></a>00603 }
-<a name="l00604"></a>00604 <span class="preprocessor">#endif</span>
-<a name="l00605"></a>00605 <span class="preprocessor"></span>
-<a name="l00607"></a>00607 <span class="preprocessor">#if TBB_DEPRECATED</span>
-<a name="l00608"></a>00608 <span class="preprocessor"></span>
-<a name="l00609"></a><a class="code" href="a00238.html#38274ab3f772ecba600c7daca7690102">00609</a> size_type grow_by( size_type delta, const_reference t ) {
-<a name="l00610"></a>00610 <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="l00611"></a>00611 }
-<a name="l00612"></a>00612 <span class="preprocessor">#else</span>
-<a name="l00613"></a>00613 <span class="preprocessor"></span>
-<a name="l00614"></a><a class="code" href="a00238.html#473a59a4c9308b93411b898b3110d26c">00614</a> iterator grow_by( size_type delta, const_reference t ) {
-<a name="l00615"></a>00615 <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="l00616"></a>00616 }
-<a name="l00617"></a>00617 <span class="preprocessor">#endif</span>
-<a name="l00618"></a>00618 <span class="preprocessor"></span>
-<a name="l00620"></a>00620 <span class="preprocessor">#if TBB_DEPRECATED</span>
-<a name="l00621"></a>00621 <span class="preprocessor"></span>
-<a name="l00623"></a><a class="code" href="a00238.html#47fe588214dd5fa06ab6e8ab78d83874">00623</a> <span class="keywordtype">void</span> grow_to_at_least( size_type n ) {
-<a name="l00624"></a>00624 <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="l00625"></a>00625 };
-<a name="l00626"></a>00626 <span class="preprocessor">#else</span>
-<a name="l00627"></a>00627 <span class="preprocessor"></span>
-<a name="l00631"></a><a class="code" href="a00238.html#a7e3b67c8ccab16d0aecc80899ae799d">00631</a> iterator grow_to_at_least( size_type n ) {
-<a name="l00632"></a>00632 size_type m=0;
-<a name="l00633"></a>00633 <span class="keywordflow">if</span>( n ) {
-<a name="l00634"></a>00634 m = internal_grow_to_at_least_with_result( n, <span class="keyword">sizeof</span>(T), &initialize_array, NULL );
-<a name="l00635"></a>00635 <span class="keywordflow">if</span>( m>n ) m=n;
-<a name="l00636"></a>00636 }
-<a name="l00637"></a>00637 <span class="keywordflow">return</span> iterator(*<span class="keyword">this</span>, m);
-<a name="l00638"></a>00638 };
-<a name="l00639"></a>00639 <span class="preprocessor">#endif</span>
-<a name="l00640"></a>00640 <span class="preprocessor"></span>
-<a name="l00642"></a>00642 <span class="preprocessor">#if TBB_DEPRECATED</span>
-<a name="l00643"></a><a class="code" href="a00238.html#e94e038f915c0268fdf2d3d7f87d81b8">00643</a> <span class="preprocessor"></span> size_type push_back( const_reference item )
-<a name="l00644"></a>00644 <span class="preprocessor">#else</span>
-<a name="l00645"></a>00645 <span class="preprocessor"></span>
-<a name="l00646"></a>00646 iterator push_back( const_reference item )
-<a name="l00647"></a>00647 <span class="preprocessor">#endif</span>
-<a name="l00648"></a>00648 <span class="preprocessor"></span> {
-<a name="l00649"></a>00649 size_type k;
-<a name="l00650"></a>00650 <span class="keywordtype">void</span> *ptr = internal_push_back(<span class="keyword">sizeof</span>(T),k);
-<a name="l00651"></a>00651 internal_loop_guide loop(1, ptr);
-<a name="l00652"></a>00652 loop.init(&item);
-<a name="l00653"></a>00653 <span class="preprocessor">#if TBB_DEPRECATED</span>
-<a name="l00654"></a>00654 <span class="preprocessor"></span> <span class="keywordflow">return</span> k;
-<a name="l00655"></a>00655 <span class="preprocessor">#else</span>
-<a name="l00656"></a>00656 <span class="preprocessor"></span> <span class="keywordflow">return</span> iterator(*<span class="keyword">this</span>, k, ptr);
-<a name="l00657"></a>00657 <span class="preprocessor">#endif</span>
-<a name="l00658"></a>00658 <span class="preprocessor"></span> }
-<a name="l00659"></a>00659
-<a name="l00661"></a>00661
-<a name="l00663"></a><a class="code" href="a00238.html#4c52f2950bb1832886bd4458eb09d7eb">00663</a> reference operator[]( size_type index ) {
-<a name="l00664"></a>00664 <span class="keywordflow">return</span> internal_subscript(index);
-<a name="l00665"></a>00665 }
-<a name="l00666"></a>00666
-<a name="l00668"></a><a class="code" href="a00238.html#c6fade5c732cc95274d1d8277ea619d1">00668</a> const_reference operator[]( size_type index )<span class="keyword"> const </span>{
-<a name="l00669"></a>00669 <span class="keywordflow">return</span> internal_subscript(index);
-<a name="l00670"></a>00670 }
-<a name="l00671"></a>00671
-<a name="l00673"></a><a class="code" href="a00238.html#0c073ca43e787c7cbf7b0e26d2221748">00673</a> reference at( size_type index ) {
-<a name="l00674"></a>00674 <span class="keywordflow">return</span> internal_subscript_with_exceptions(index);
-<a name="l00675"></a>00675 }
-<a name="l00676"></a>00676
-<a name="l00678"></a><a class="code" href="a00238.html#23e14a38af748edff96a7adc3a0f1c58">00678</a> const_reference at( size_type index )<span class="keyword"> const </span>{
-<a name="l00679"></a>00679 <span class="keywordflow">return</span> internal_subscript_with_exceptions(index);
-<a name="l00680"></a>00680 }
-<a name="l00681"></a>00681
-<a name="l00683"></a><a class="code" href="a00238.html#a4c6ffff3bf08b92939aa2fc516edfba">00683</a> range_type range( size_t grainsize = 1) {
-<a name="l00684"></a>00684 <span class="keywordflow">return</span> range_type( begin(), end(), grainsize );
-<a name="l00685"></a>00685 }
-<a name="l00686"></a>00686
-<a name="l00688"></a><a class="code" href="a00238.html#3d09ccfb581b879ae64203741035e193">00688</a> const_range_type range( size_t grainsize = 1 )<span class="keyword"> const </span>{
-<a name="l00689"></a>00689 <span class="keywordflow">return</span> const_range_type( begin(), end(), grainsize );
-<a name="l00690"></a>00690 }
-<a name="l00691"></a>00691 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00692"></a>00692 <span class="comment">// Capacity</span>
-<a name="l00693"></a>00693 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00695"></a><a class="code" href="a00238.html#715fe313c4a9c22731cc404dd80c9ec9">00695</a> <span class="comment"></span> size_type size()<span class="keyword"> const </span>{
-<a name="l00696"></a>00696 size_type sz = my_early_size, cp = internal_capacity();
-<a name="l00697"></a>00697 <span class="keywordflow">return</span> cp < sz ? cp : sz;
-<a name="l00698"></a>00698 }
-<a name="l00699"></a>00699
-<a name="l00701"></a><a class="code" href="a00238.html#c6426cb93cf20d3af40f3c90f1f0481a">00701</a> <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{<span class="keywordflow">return</span> !my_early_size;}
-<a name="l00702"></a>00702
-<a name="l00704"></a><a class="code" href="a00238.html#3ed6b9ae7217af5103d974045b6f5cd5">00704</a> size_type capacity()<span class="keyword"> const </span>{<span class="keywordflow">return</span> internal_capacity();}
-<a name="l00705"></a>00705
-<a name="l00707"></a>00707
-<a name="l00709"></a><a class="code" href="a00238.html#5a0ce05026994b010018f72cfdeb72c1">00709</a> <span class="keywordtype">void</span> reserve( size_type n ) {
-<a name="l00710"></a>00710 <span class="keywordflow">if</span>( n )
-<a name="l00711"></a>00711 internal_reserve(n, <span class="keyword">sizeof</span>(T), max_size());
-<a name="l00712"></a>00712 }
-<a name="l00713"></a>00713
-<a name="l00715"></a><a class="code" href="a00238.html#8dfb0cb0eef96d440b4dcf801807a718">00715</a> <span class="keywordtype">void</span> resize( size_type n ) {
-<a name="l00716"></a>00716 internal_resize( n, <span class="keyword">sizeof</span>(T), max_size(), NULL, &destroy_array, &initialize_array );
-<a name="l00717"></a>00717 }
-<a name="l00718"></a>00718
-<a name="l00720"></a><a class="code" href="a00238.html#98ce6b2c6d2622f0c030b46dfac3880c">00720</a> <span class="keywordtype">void</span> resize( size_type n, const_reference t ) {
-<a name="l00721"></a>00721 internal_resize( n, <span class="keyword">sizeof</span>(T), max_size(), static_cast<const void*>(&t), &destroy_array, &initialize_array_by );
-<a name="l00722"></a>00722 }
-<a name="l00723"></a>00723
-<a name="l00724"></a>00724 <span class="preprocessor">#if TBB_DEPRECATED </span>
-<a name="l00726"></a><a class="code" href="a00238.html#1693d1da41b1a8235871be9c6633be35">00726</a> <span class="preprocessor"> void compact() {shrink_to_fit();}</span>
-<a name="l00727"></a>00727 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* TBB_DEPRECATED */</span>
-<a name="l00728"></a>00728
-<a name="l00730"></a>00730 <span class="keywordtype">void</span> shrink_to_fit();
-<a name="l00731"></a>00731
-<a name="l00733"></a><a class="code" href="a00238.html#2c248a017f0576df3e7cd99627836fd6">00733</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="l00734"></a>00734
-<a name="l00735"></a>00735 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00736"></a>00736 <span class="comment">// STL support</span>
-<a name="l00737"></a>00737 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00738"></a>00738
-<a name="l00740"></a><a class="code" href="a00238.html#730b23a251ecb6d37f692fb22f38e029">00740</a> iterator begin() {<span class="keywordflow">return</span> iterator(*<span class="keyword">this</span>,0);}
-<a name="l00742"></a><a class="code" href="a00238.html#c0b51160e5a764982ec97a455f94f2c6">00742</a> iterator end() {<span class="keywordflow">return</span> iterator(*<span class="keyword">this</span>,size());}
-<a name="l00744"></a><a class="code" href="a00238.html#78a06182276ff758788d4c0623ae0d71">00744</a> const_iterator begin()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_iterator(*<span class="keyword">this</span>,0);}
-<a name="l00746"></a><a class="code" href="a00238.html#1e6aa764ce5a1cbd24526f68bc0a2f6b">00746</a> const_iterator end()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_iterator(*<span class="keyword">this</span>,size());}
-<a name="l00748"></a><a class="code" href="a00238.html#f88fcf1c920693c39bd9709db33c199f">00748</a> const_iterator cbegin()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_iterator(*<span class="keyword">this</span>,0);}
-<a name="l00750"></a><a class="code" href="a00238.html#0c15a5d0f1cf75d687dabba07da1d46b">00750</a> const_iterator cend()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_iterator(*<span class="keyword">this</span>,size());}
-<a name="l00752"></a><a class="code" href="a00238.html#5e220926d09236d98f04fe0721e5f9a1">00752</a> reverse_iterator rbegin() {<span class="keywordflow">return</span> reverse_iterator(end());}
-<a name="l00754"></a><a class="code" href="a00238.html#290119a4eb43cd6a9e98fa17016ba3c2">00754</a> reverse_iterator rend() {<span class="keywordflow">return</span> reverse_iterator(begin());}
-<a name="l00756"></a><a class="code" href="a00238.html#9f9c103e18d5f212703805354074ad44">00756</a> const_reverse_iterator rbegin()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_reverse_iterator(end());}
-<a name="l00758"></a><a class="code" href="a00238.html#d438b9b32ea3a8ffb703015b6dce055b">00758</a> const_reverse_iterator rend()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_reverse_iterator(begin());}
-<a name="l00760"></a><a class="code" href="a00238.html#db78a1d28c9c966050e8a2926d834a33">00760</a> const_reverse_iterator crbegin()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_reverse_iterator(end());}
-<a name="l00762"></a><a class="code" href="a00238.html#fff9cece89438587997ebedf93c5e962">00762</a> const_reverse_iterator crend()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_reverse_iterator(begin());}
-<a name="l00764"></a><a class="code" href="a00238.html#15181759c0bfa2ddce5d10c7550e0002">00764</a> reference front() {
-<a name="l00765"></a>00765 __TBB_ASSERT( size()>0, NULL);
-<a name="l00766"></a>00766 <span class="keywordflow">return</span> static_cast<T*>(my_segment[0].array)[0];
-<a name="l00767"></a>00767 }
-<a name="l00769"></a><a class="code" href="a00238.html#502615a858eb9fa0390ee59169065e90">00769</a> const_reference front()<span class="keyword"> const </span>{
-<a name="l00770"></a>00770 __TBB_ASSERT( size()>0, NULL);
-<a name="l00771"></a>00771 <span class="keywordflow">return</span> static_cast<const T*>(my_segment[0].array)[0];
-<a name="l00772"></a>00772 }
-<a name="l00774"></a><a class="code" href="a00238.html#41ce48d6015a1a2812d41cf620ec3476">00774</a> reference back() {
-<a name="l00775"></a>00775 __TBB_ASSERT( size()>0, NULL);
-<a name="l00776"></a>00776 <span class="keywordflow">return</span> internal_subscript( size()-1 );
-<a name="l00777"></a>00777 }
-<a name="l00779"></a><a class="code" href="a00238.html#bd518e204107d07fd08d0ec5bdfd383d">00779</a> const_reference back()<span class="keyword"> const </span>{
-<a name="l00780"></a>00780 __TBB_ASSERT( size()>0, NULL);
-<a name="l00781"></a>00781 <span class="keywordflow">return</span> internal_subscript( size()-1 );
-<a name="l00782"></a>00782 }
-<a name="l00784"></a><a class="code" href="a00238.html#2fdba8e90de6a4d2300222236d46758e">00784</a> allocator_type get_allocator()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> this->my_allocator; }
-<a name="l00785"></a>00785
-<a name="l00787"></a><a class="code" href="a00238.html#423e5aa15e0e3309ad86d026fd85f6f6">00787</a> <span class="keywordtype">void</span> assign(size_type n, const_reference t) {
-<a name="l00788"></a>00788 clear();
-<a name="l00789"></a>00789 internal_resize( n, <span class="keyword">sizeof</span>(T), max_size(), static_cast<const void*>(&t), &destroy_array, &initialize_array_by );
-<a name="l00790"></a>00790 }
-<a name="l00791"></a>00791
-<a name="l00793"></a>00793 <span class="keyword">template</span><<span class="keyword">class</span> I>
-<a name="l00794"></a><a class="code" href="a00238.html#93a06b3112cb804f42f40efb5e7387b4">00794</a> <span class="keywordtype">void</span> assign(I first, I last) {
-<a name="l00795"></a>00795 clear(); internal_assign_range( first, last, <span class="keyword">static_cast</span><is_integer_tag<std::numeric_limits<I>::is_integer> *>(0) );
-<a name="l00796"></a>00796 }
-<a name="l00797"></a>00797
-<a name="l00799"></a><a class="code" href="a00238.html#96c9c4bd968ed3edb8dd276854d2dae0">00799</a> <span class="keywordtype">void</span> swap(<a class="code" href="a00238.html">concurrent_vector</a> &vector) {
-<a name="l00800"></a>00800 <span class="keywordflow">if</span>( <span class="keyword">this</span> != &vector ) {
-<a name="l00801"></a>00801 concurrent_vector_base_v3::internal_swap(static_cast<concurrent_vector_base_v3&>(vector));
-<a name="l00802"></a>00802 std::swap(this->my_allocator, vector.my_allocator);
-<a name="l00803"></a>00803 }
-<a name="l00804"></a>00804 }
-<a name="l00805"></a>00805
-<a name="l00807"></a>00807
-<a name="l00808"></a><a class="code" href="a00238.html#26f937a359a66b6aae904c3cd9a3c444">00808</a> <span class="keywordtype">void</span> clear() {
-<a name="l00809"></a>00809 internal_clear(&destroy_array);
-<a name="l00810"></a>00810 }
-<a name="l00811"></a>00811
-<a name="l00813"></a><a class="code" href="a00238.html#da2444b28bb840d38f60d0030333a5fc">00813</a> ~<a class="code" href="a00238.html">concurrent_vector</a>() {
-<a name="l00814"></a>00814 segment_t *table = my_segment;
-<a name="l00815"></a>00815 internal_free_segments( reinterpret_cast<void**>(table), internal_clear(&destroy_array), my_first_block );
-<a name="l00816"></a>00816 <span class="comment">// base class destructor call should be then</span>
-<a name="l00817"></a>00817 }
-<a name="l00818"></a>00818
-<a name="l00819"></a>00819 <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="l00820"></a>00820 <span class="keyword">private</span>:
-<a name="l00822"></a>00822 <span class="keyword">static</span> <span class="keywordtype">void</span> *internal_allocator(internal::concurrent_vector_base_v3 &vb, size_t k) {
-<a name="l00823"></a>00823 <span class="keywordflow">return</span> static_cast<concurrent_vector<T, A>&>(vb).my_allocator.allocate(k);
-<a name="l00824"></a>00824 }
-<a name="l00826"></a>00826 <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="l00827"></a>00827
-<a name="l00829"></a>00829 T& internal_subscript( size_type index ) <span class="keyword">const</span>;
-<a name="l00830"></a>00830
-<a name="l00832"></a>00832 T& internal_subscript_with_exceptions( size_type index ) <span class="keyword">const</span>;
-<a name="l00833"></a>00833
-<a name="l00835"></a>00835 <span class="keywordtype">void</span> internal_assign_n(size_type n, const_pointer p) {
-<a name="l00836"></a>00836 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="l00837"></a>00837 }
-<a name="l00838"></a>00838
-<a name="l00840"></a>00840 <span class="keyword">template</span><<span class="keywordtype">bool</span> B> <span class="keyword">class </span>is_integer_tag;
-<a name="l00841"></a>00841
-<a name="l00843"></a>00843 <span class="keyword">template</span><<span class="keyword">class</span> I>
-<a name="l00844"></a>00844 <span class="keywordtype">void</span> internal_assign_range(I first, I last, is_integer_tag<true> *) {
-<a name="l00845"></a>00845 internal_assign_n(static_cast<size_type>(first), &static_cast<T&>(last));
-<a name="l00846"></a>00846 }
-<a name="l00848"></a>00848 <span class="keyword">template</span><<span class="keyword">class</span> I>
-<a name="l00849"></a>00849 <span class="keywordtype">void</span> internal_assign_range(I first, I last, is_integer_tag<false> *) {
-<a name="l00850"></a>00850 internal_assign_iterators(first, last);
-<a name="l00851"></a>00851 }
-<a name="l00853"></a>00853 <span class="keyword">template</span><<span class="keyword">class</span> I>
-<a name="l00854"></a>00854 <span class="keywordtype">void</span> internal_assign_iterators(I first, I last);
-<a name="l00855"></a>00855
-<a name="l00857"></a>00857 <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="l00858"></a>00858
-<a name="l00860"></a>00860 <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="l00861"></a>00861
-<a name="l00863"></a>00863 <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="l00864"></a>00864
-<a name="l00866"></a>00866 <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="l00867"></a>00867
-<a name="l00869"></a>00869 <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="l00870"></a>00870
-<a name="l00872"></a>00872 <span class="keyword">class </span>internal_loop_guide : internal::no_copy {
-<a name="l00873"></a>00873 <span class="keyword">public</span>:
-<a name="l00874"></a>00874 <span class="keyword">const</span> pointer array;
-<a name="l00875"></a>00875 <span class="keyword">const</span> size_type n;
-<a name="l00876"></a>00876 size_type i;
-<a name="l00877"></a>00877 internal_loop_guide(size_type ntrials, <span class="keywordtype">void</span> *ptr)
-<a name="l00878"></a>00878 : array(static_cast<pointer>(ptr)), n(ntrials), i(0) {}
-<a name="l00879"></a>00879 <span class="keywordtype">void</span> init() { <span class="keywordflow">for</span>(; i < n; ++i) <span class="keyword">new</span>( &array[i] ) T(); }
-<a name="l00880"></a>00880 <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="l00881"></a>00881 <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="l00882"></a>00882 <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="l00883"></a>00883 <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="l00884"></a>00884 ~internal_loop_guide() {
-<a name="l00885"></a>00885 <span class="keywordflow">if</span>(i < n) <span class="comment">// if exception raised, do zerroing on the rest of items</span>
-<a name="l00886"></a>00886 std::memset(array+i, 0, (n-i)*<span class="keyword">sizeof</span>(value_type));
-<a name="l00887"></a>00887 }
-<a name="l00888"></a>00888 };
-<a name="l00889"></a>00889 };
-<a name="l00890"></a>00890
-<a name="l00891"></a>00891 <span class="preprocessor">#if defined(_MSC_VER) && !defined(__INTEL_COMPILER) </span>
-<a name="l00892"></a>00892 <span class="preprocessor"></span><span class="preprocessor">#pragma warning (push)</span>
-<a name="l00893"></a>00893 <span class="preprocessor"></span><span class="preprocessor">#pragma warning (disable: 4701) // potentially uninitialized local variable "old"</span>
-<a name="l00894"></a>00894 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00895"></a>00895 <span class="preprocessor"></span><span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l00896"></a><a class="code" href="a00238.html#03c6f4cf66532bf4cc907ee738a9a186">00896</a> <span class="keywordtype">void</span> <a class="code" href="a00238.html">concurrent_vector<T, A>::shrink_to_fit</a>() {
-<a name="l00897"></a>00897 internal_segments_table old;
-<a name="l00898"></a>00898 __TBB_TRY {
-<a name="l00899"></a>00899 <span class="keywordflow">if</span>( internal_compact( <span class="keyword">sizeof</span>(T), &old, &destroy_array, ©_array ) )
-<a name="l00900"></a>00900 internal_free_segments( old.table, pointers_per_long_table, old.first_block ); <span class="comment">// free joined and unnecessary segments</span>
-<a name="l00901"></a>00901 } __TBB_CATCH(...) {
-<a name="l00902"></a>00902 <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="l00903"></a>00903 internal_free_segments( old.table, 1, old.first_block );
-<a name="l00904"></a>00904 __TBB_RETHROW();
-<a name="l00905"></a>00905 }
-<a name="l00906"></a>00906 }
-<a name="l00907"></a>00907 <span class="preprocessor">#if defined(_MSC_VER) && !defined(__INTEL_COMPILER) </span>
-<a name="l00908"></a>00908 <span class="preprocessor"></span><span class="preprocessor">#pragma warning (pop)</span>
-<a name="l00909"></a>00909 <span class="preprocessor"></span><span class="preprocessor">#endif // warning 4701 is back </span>
-<a name="l00910"></a>00910 <span class="preprocessor"></span>
-<a name="l00911"></a>00911 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l00912"></a>00912 <span class="keywordtype">void</span> <a class="code" href="a00238.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="l00913"></a>00913 <span class="comment">// Free the arrays</span>
-<a name="l00914"></a>00914 <span class="keywordflow">while</span>( k > first_block ) {
-<a name="l00915"></a>00915 --k;
-<a name="l00916"></a>00916 T* array = static_cast<T*>(table[k]);
-<a name="l00917"></a>00917 table[k] = NULL;
-<a name="l00918"></a>00918 <span class="keywordflow">if</span>( array > internal::vector_allocation_error_flag ) <span class="comment">// check for correct segment pointer</span>
-<a name="l00919"></a>00919 this->my_allocator.deallocate( array, segment_size(k) );
-<a name="l00920"></a>00920 }
-<a name="l00921"></a>00921 T* array = static_cast<T*>(table[0]);
-<a name="l00922"></a>00922 <span class="keywordflow">if</span>( array > internal::vector_allocation_error_flag ) {
-<a name="l00923"></a>00923 __TBB_ASSERT( first_block > 0, NULL );
-<a name="l00924"></a>00924 <span class="keywordflow">while</span>(k > 0) table[--k] = NULL;
-<a name="l00925"></a>00925 this->my_allocator.deallocate( array, segment_size(first_block) );
-<a name="l00926"></a>00926 }
-<a name="l00927"></a>00927 }
-<a name="l00928"></a>00928
-<a name="l00929"></a>00929 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l00930"></a>00930 T& concurrent_vector<T, A>::internal_subscript( size_type index )<span class="keyword"> const </span>{
-<a name="l00931"></a>00931 __TBB_ASSERT( index < my_early_size, <span class="stringliteral">"index out of bounds"</span> );
-<a name="l00932"></a>00932 size_type j = index;
-<a name="l00933"></a>00933 segment_index_t k = segment_base_index_of( j );
-<a name="l00934"></a>00934 __TBB_ASSERT( (segment_t*)my_segment != my_storage || k < pointers_per_short_table, <span class="stringliteral">"index is being allocated"</span> );
-<a name="l00935"></a>00935 <span class="comment">// no need in __TBB_load_with_acquire since thread works in own space or gets </span>
-<a name="l00936"></a>00936 T* array = static_cast<T*>( tbb::internal::itt_hide_load_word(my_segment[k].array));
-<a name="l00937"></a>00937 __TBB_ASSERT( array != internal::vector_allocation_error_flag, <span class="stringliteral">"the instance is broken by bad allocation. Use at() instead"</span> );
-<a name="l00938"></a>00938 __TBB_ASSERT( array, <span class="stringliteral">"index is being allocated"</span> );
-<a name="l00939"></a>00939 <span class="keywordflow">return</span> array[j];
-<a name="l00940"></a>00940 }
-<a name="l00941"></a>00941
-<a name="l00942"></a>00942 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l00943"></a>00943 T& concurrent_vector<T, A>::internal_subscript_with_exceptions( size_type index )<span class="keyword"> const </span>{
-<a name="l00944"></a>00944 <span class="keywordflow">if</span>( index >= my_early_size )
-<a name="l00945"></a>00945 internal::throw_exception(internal::eid_out_of_range); <span class="comment">// throw std::out_of_range</span>
-<a name="l00946"></a>00946 size_type j = index;
-<a name="l00947"></a>00947 segment_index_t k = segment_base_index_of( j );
-<a name="l00948"></a>00948 <span class="keywordflow">if</span>( (segment_t*)my_segment == my_storage && k >= pointers_per_short_table )
-<a name="l00949"></a>00949 internal::throw_exception(internal::eid_segment_range_error); <span class="comment">// throw std::range_error</span>
-<a name="l00950"></a>00950 <span class="keywordtype">void</span> *array = my_segment[k].array; <span class="comment">// no need in __TBB_load_with_acquire</span>
-<a name="l00951"></a>00951 <span class="keywordflow">if</span>( array <= internal::vector_allocation_error_flag ) <span class="comment">// check for correct segment pointer</span>
-<a name="l00952"></a>00952 internal::throw_exception(internal::eid_index_range_error); <span class="comment">// throw std::range_error</span>
-<a name="l00953"></a>00953 <span class="keywordflow">return</span> static_cast<T*>(array)[j];
-<a name="l00954"></a>00954 }
-<a name="l00955"></a>00955
-<a name="l00956"></a>00956 <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="l00957"></a>00957 <span class="keywordtype">void</span> concurrent_vector<T, A>::internal_assign_iterators(I first, I last) {
-<a name="l00958"></a>00958 __TBB_ASSERT(my_early_size == 0, NULL);
-<a name="l00959"></a>00959 size_type n = std::distance(first, last);
-<a name="l00960"></a>00960 <span class="keywordflow">if</span>( !n ) <span class="keywordflow">return</span>;
-<a name="l00961"></a>00961 internal_reserve(n, <span class="keyword">sizeof</span>(T), <a class="code" href="a00238.html#2c248a017f0576df3e7cd99627836fd6">max_size</a>());
-<a name="l00962"></a>00962 my_early_size = n;
-<a name="l00963"></a>00963 segment_index_t k = 0;
-<a name="l00964"></a>00964 size_type sz = segment_size( my_first_block );
-<a name="l00965"></a>00965 <span class="keywordflow">while</span>( sz < n ) {
-<a name="l00966"></a>00966 internal_loop_guide loop(sz, my_segment[k].array);
-<a name="l00967"></a>00967 loop.iterate(first);
-<a name="l00968"></a>00968 n -= sz;
-<a name="l00969"></a>00969 <span class="keywordflow">if</span>( !k ) k = my_first_block;
-<a name="l00970"></a>00970 <span class="keywordflow">else</span> { ++k; sz <<= 1; }
-<a name="l00971"></a>00971 }
-<a name="l00972"></a>00972 internal_loop_guide loop(n, my_segment[k].array);
-<a name="l00973"></a>00973 loop.iterate(first);
-<a name="l00974"></a>00974 }
-<a name="l00975"></a>00975
-<a name="l00976"></a>00976 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l00977"></a>00977 <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="l00978"></a>00978 internal_loop_guide loop(n, begin); loop.init();
-<a name="l00979"></a>00979 }
-<a name="l00980"></a>00980
-<a name="l00981"></a>00981 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l00982"></a>00982 <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="l00983"></a>00983 internal_loop_guide loop(n, begin); loop.init(src);
-<a name="l00984"></a>00984 }
-<a name="l00985"></a>00985
-<a name="l00986"></a>00986 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l00987"></a>00987 <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="l00988"></a>00988 internal_loop_guide loop(n, dst); loop.copy(src);
-<a name="l00989"></a>00989 }
-<a name="l00990"></a>00990
-<a name="l00991"></a>00991 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l00992"></a>00992 <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="l00993"></a>00993 internal_loop_guide loop(n, dst); loop.assign(src);
-<a name="l00994"></a>00994 }
-<a name="l00995"></a>00995
-<a name="l00996"></a>00996 <span class="preprocessor">#if defined(_MSC_VER) && !defined(__INTEL_COMPILER) </span>
-<a name="l00997"></a>00997 <span class="preprocessor"></span> <span class="comment">// Workaround for overzealous compiler warning</span>
-<a name="l00998"></a>00998 <span class="preprocessor"> #pragma warning (push)</span>
-<a name="l00999"></a>00999 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (disable: 4189)</span>
-<a name="l01000"></a>01000 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l01001"></a>01001 <span class="preprocessor"></span><span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l01002"></a>01002 <span class="keywordtype">void</span> concurrent_vector<T, A>::destroy_array( <span class="keywordtype">void</span>* begin, size_type n ) {
-<a name="l01003"></a>01003 T* array = static_cast<T*>(begin);
-<a name="l01004"></a>01004 <span class="keywordflow">for</span>( size_type j=n; j>0; --j )
-<a name="l01005"></a>01005 array[j-1].~T(); <span class="comment">// destructors are supposed to not throw any exceptions</span>
-<a name="l01006"></a>01006 }
-<a name="l01007"></a>01007 <span class="preprocessor">#if defined(_MSC_VER) && !defined(__INTEL_COMPILER) </span>
-<a name="l01008"></a>01008 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (pop)</span>
-<a name="l01009"></a>01009 <span class="preprocessor"></span><span class="preprocessor">#endif // warning 4189 is back </span>
-<a name="l01010"></a>01010 <span class="preprocessor"></span>
-<a name="l01011"></a>01011 <span class="comment">// concurrent_vector's template functions</span>
-<a name="l01012"></a>01012 <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="l01013"></a>01013 <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="l01014"></a>01014 <span class="comment">// Simply: return a.size() == b.size() && std::equal(a.begin(), a.end(), b.begin());</span>
-<a name="l01015"></a>01015 <span class="keywordflow">if</span>(a.size() != b.size()) <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l01016"></a>01016 <span class="keyword">typename</span> concurrent_vector<T, A1>::const_iterator i(a.begin());
-<a name="l01017"></a>01017 <span class="keyword">typename</span> concurrent_vector<T, A2>::const_iterator j(b.begin());
-<a name="l01018"></a>01018 <span class="keywordflow">for</span>(; i != a.end(); ++i, ++j)
-<a name="l01019"></a>01019 <span class="keywordflow">if</span>( !(*i == *j) ) <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l01020"></a>01020 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l01021"></a>01021 }
-<a name="l01022"></a>01022
-<a name="l01023"></a>01023 <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="l01024"></a>01024 <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="l01025"></a>01025 { <span class="keywordflow">return</span> !(a == b); }
-<a name="l01026"></a>01026
-<a name="l01027"></a>01027 <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="l01028"></a>01028 <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="l01029"></a>01029 { <span class="keywordflow">return</span> (std::lexicographical_compare(a.begin(), a.end(), b.begin(), b.end())); }
-<a name="l01030"></a>01030
-<a name="l01031"></a>01031 <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="l01032"></a>01032 <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="l01033"></a>01033 { <span class="keywordflow">return</span> b < a; }
-<a name="l01034"></a>01034
-<a name="l01035"></a>01035 <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="l01036"></a>01036 <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="l01037"></a>01037 { <span class="keywordflow">return</span> !(b < a); }
-<a name="l01038"></a>01038
-<a name="l01039"></a>01039 <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="l01040"></a>01040 <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="l01041"></a>01041 { <span class="keywordflow">return</span> !(a < b); }
-<a name="l01042"></a>01042
-<a name="l01043"></a>01043 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l01044"></a>01044 <span class="keyword">inline</span> <span class="keywordtype">void</span> swap(concurrent_vector<T, A> &a, concurrent_vector<T, A> &b)
-<a name="l01045"></a>01045 { a.swap( b ); }
-<a name="l01046"></a>01046
-<a name="l01047"></a>01047 } <span class="comment">// namespace tbb</span>
-<a name="l01048"></a>01048
-<a name="l01049"></a>01049 <span class="preprocessor">#if defined(_MSC_VER) && !defined(__INTEL_COMPILER) && defined(_Wp64)</span>
-<a name="l01050"></a>01050 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (pop)</span>
-<a name="l01051"></a>01051 <span class="preprocessor"></span><span class="preprocessor">#endif // warning 4267 is back</span>
-<a name="l01052"></a>01052 <span class="preprocessor"></span>
-<a name="l01053"></a>01053 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_concurrent_vector_H */</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2011 Intel Corporation. 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/a00443.html b/doc/html/a00443.html
new file mode 100644
index 0000000..491e645
--- /dev/null
+++ b/doc/html/a00443.html
@@ -0,0 +1,927 @@
+<!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-2011 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="a00250.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="a00250.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="a00250.html">00441</a> <span class="keyword">class </span><a class="code" href="a00250.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="a00233.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="a00233.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="a00233.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="a00309.html">split</a> ) : <a class="code" href="a00233.html">blocked_range<I></a>(r,<a class="code" href="a00309.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="a00250.html#2c8ca9cabfcd30ad5943324c853664b5">00498</a> <span class="keyword">explicit</span> <a class="code" href="a00250.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="a00250.html#dd8a200b99a8088435a37934b58fe335">00505</a> <a class="code" href="a00250.html">concurrent_vector</a>( <span class="keyword">const</span> <a class="code" href="a00250.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="a00250.html#64432f13f7b29bfe4acfb5568f34f3a8">00520</a> <a class="code" href="a00250.html">concurrent_vector</a>( <span class="keyword">const</span> <a class="code" href="a00250.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="a00250.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="a00250.html#2a2e261dfe1cab3f73f7b1a94137cfca">00534</a> <span class="keyword">explicit</span> <a class="code" href="a00250.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="a00250.html#3883a8a908b44e249a57f454de3f55d8">00547</a> <a class="code" href="a00250.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="a00250.html#4450de83c5862ea4bcd9443fd7e67419">00562</a> <a class="code" href="a00250.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="a00250.html#691f0f3cda3e489c37a657016e375eaf">00576</a> <a class="code" href="a00250.html">concurrent_vector</a>& operator=( <span class="keyword">const</span> <a class="code" href="a00250.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="a00250.html#19f4ab88a01b0fd056af3bba463e7bd6">00584</a> <a class="code" href="a00250.html">concurrent_vector</a>& operator=( <span class="keyword">const</span> <a class="code" href="a00250.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="a00250.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="a00250.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="a00250.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="a00250.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="a00250.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="a00250.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="a00250.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="a00250.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="a00250.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="a00250.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="a00250.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="a00250.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="a00250.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 <span class="comment">//------------------------------------------------------------------------</span>
+<a name="l00693"></a>00693 <span class="comment">// Capacity</span>
+<a name="l00694"></a>00694 <span class="comment">//------------------------------------------------------------------------</span>
+<a name="l00696"></a><a class="code" href="a00250.html#715fe313c4a9c22731cc404dd80c9ec9">00696</a> <span class="comment"></span> size_type size()<span class="keyword"> const </span>{
+<a name="l00697"></a>00697 size_type sz = my_early_size, cp = internal_capacity();
+<a name="l00698"></a>00698 <span class="keywordflow">return</span> cp < sz ? cp : sz;
+<a name="l00699"></a>00699 }
+<a name="l00700"></a>00700
+<a name="l00702"></a><a class="code" href="a00250.html#c6426cb93cf20d3af40f3c90f1f0481a">00702</a> <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{<span class="keywordflow">return</span> !my_early_size;}
+<a name="l00703"></a>00703
+<a name="l00705"></a><a class="code" href="a00250.html#3ed6b9ae7217af5103d974045b6f5cd5">00705</a> size_type capacity()<span class="keyword"> const </span>{<span class="keywordflow">return</span> internal_capacity();}
+<a name="l00706"></a>00706
+<a name="l00708"></a>00708
+<a name="l00710"></a><a class="code" href="a00250.html#5a0ce05026994b010018f72cfdeb72c1">00710</a> <span class="keywordtype">void</span> reserve( size_type n ) {
+<a name="l00711"></a>00711 <span class="keywordflow">if</span>( n )
+<a name="l00712"></a>00712 internal_reserve(n, <span class="keyword">sizeof</span>(T), max_size());
+<a name="l00713"></a>00713 }
+<a name="l00714"></a>00714
+<a name="l00716"></a><a class="code" href="a00250.html#8dfb0cb0eef96d440b4dcf801807a718">00716</a> <span class="keywordtype">void</span> resize( size_type n ) {
+<a name="l00717"></a>00717 internal_resize( n, <span class="keyword">sizeof</span>(T), max_size(), NULL, &destroy_array, &initialize_array );
+<a name="l00718"></a>00718 }
+<a name="l00719"></a>00719
+<a name="l00721"></a><a class="code" href="a00250.html#98ce6b2c6d2622f0c030b46dfac3880c">00721</a> <span class="keywordtype">void</span> resize( size_type n, const_reference t ) {
+<a name="l00722"></a>00722 internal_resize( n, <span class="keyword">sizeof</span>(T), max_size(), static_cast<const void*>(&t), &destroy_array, &initialize_array_by );
+<a name="l00723"></a>00723 }
+<a name="l00724"></a>00724
+<a name="l00725"></a>00725 <span class="preprocessor">#if TBB_DEPRECATED </span>
+<a name="l00727"></a><a class="code" href="a00250.html#1693d1da41b1a8235871be9c6633be35">00727</a> <span class="preprocessor"> void compact() {shrink_to_fit();}</span>
+<a name="l00728"></a>00728 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* TBB_DEPRECATED */</span>
+<a name="l00729"></a>00729
+<a name="l00731"></a>00731 <span class="keywordtype">void</span> shrink_to_fit();
+<a name="l00732"></a>00732
+<a name="l00734"></a><a class="code" href="a00250.html#2c248a017f0576df3e7cd99627836fd6">00734</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="l00735"></a>00735
+<a name="l00736"></a>00736 <span class="comment">//------------------------------------------------------------------------</span>
+<a name="l00737"></a>00737 <span class="comment">// STL support</span>
+<a name="l00738"></a>00738 <span class="comment">//------------------------------------------------------------------------</span>
+<a name="l00739"></a>00739
+<a name="l00741"></a><a class="code" href="a00250.html#730b23a251ecb6d37f692fb22f38e029">00741</a> iterator begin() {<span class="keywordflow">return</span> iterator(*<span class="keyword">this</span>,0);}
+<a name="l00743"></a><a class="code" href="a00250.html#c0b51160e5a764982ec97a455f94f2c6">00743</a> iterator end() {<span class="keywordflow">return</span> iterator(*<span class="keyword">this</span>,size());}
+<a name="l00745"></a><a class="code" href="a00250.html#78a06182276ff758788d4c0623ae0d71">00745</a> const_iterator begin()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_iterator(*<span class="keyword">this</span>,0);}
+<a name="l00747"></a><a class="code" href="a00250.html#1e6aa764ce5a1cbd24526f68bc0a2f6b">00747</a> const_iterator end()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_iterator(*<span class="keyword">this</span>,size());}
+<a name="l00749"></a><a class="code" href="a00250.html#f88fcf1c920693c39bd9709db33c199f">00749</a> const_iterator cbegin()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_iterator(*<span class="keyword">this</span>,0);}
+<a name="l00751"></a><a class="code" href="a00250.html#0c15a5d0f1cf75d687dabba07da1d46b">00751</a> const_iterator cend()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_iterator(*<span class="keyword">this</span>,size());}
+<a name="l00753"></a><a class="code" href="a00250.html#5e220926d09236d98f04fe0721e5f9a1">00753</a> reverse_iterator rbegin() {<span class="keywordflow">return</span> reverse_iterator(end());}
+<a name="l00755"></a><a class="code" href="a00250.html#290119a4eb43cd6a9e98fa17016ba3c2">00755</a> reverse_iterator rend() {<span class="keywordflow">return</span> reverse_iterator(begin());}
+<a name="l00757"></a><a class="code" href="a00250.html#9f9c103e18d5f212703805354074ad44">00757</a> const_reverse_iterator rbegin()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_reverse_iterator(end());}
+<a name="l00759"></a><a class="code" href="a00250.html#d438b9b32ea3a8ffb703015b6dce055b">00759</a> const_reverse_iterator rend()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_reverse_iterator(begin());}
+<a name="l00761"></a><a class="code" href="a00250.html#db78a1d28c9c966050e8a2926d834a33">00761</a> const_reverse_iterator crbegin()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_reverse_iterator(end());}
+<a name="l00763"></a><a class="code" href="a00250.html#fff9cece89438587997ebedf93c5e962">00763</a> const_reverse_iterator crend()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_reverse_iterator(begin());}
+<a name="l00765"></a><a class="code" href="a00250.html#15181759c0bfa2ddce5d10c7550e0002">00765</a> reference front() {
+<a name="l00766"></a>00766 __TBB_ASSERT( size()>0, NULL);
+<a name="l00767"></a>00767 <span class="keywordflow">return</span> static_cast<T*>(my_segment[0].array)[0];
+<a name="l00768"></a>00768 }
+<a name="l00770"></a><a class="code" href="a00250.html#502615a858eb9fa0390ee59169065e90">00770</a> const_reference front()<span class="keyword"> const </span>{
+<a name="l00771"></a>00771 __TBB_ASSERT( size()>0, NULL);
+<a name="l00772"></a>00772 <span class="keywordflow">return</span> static_cast<const T*>(my_segment[0].array)[0];
+<a name="l00773"></a>00773 }
+<a name="l00775"></a><a class="code" href="a00250.html#41ce48d6015a1a2812d41cf620ec3476">00775</a> reference back() {
+<a name="l00776"></a>00776 __TBB_ASSERT( size()>0, NULL);
+<a name="l00777"></a>00777 <span class="keywordflow">return</span> internal_subscript( size()-1 );
+<a name="l00778"></a>00778 }
+<a name="l00780"></a><a class="code" href="a00250.html#bd518e204107d07fd08d0ec5bdfd383d">00780</a> const_reference back()<span class="keyword"> const </span>{
+<a name="l00781"></a>00781 __TBB_ASSERT( size()>0, NULL);
+<a name="l00782"></a>00782 <span class="keywordflow">return</span> internal_subscript( size()-1 );
+<a name="l00783"></a>00783 }
+<a name="l00785"></a><a class="code" href="a00250.html#2fdba8e90de6a4d2300222236d46758e">00785</a> allocator_type get_allocator()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> this->my_allocator; }
+<a name="l00786"></a>00786
+<a name="l00788"></a><a class="code" href="a00250.html#423e5aa15e0e3309ad86d026fd85f6f6">00788</a> <span class="keywordtype">void</span> assign(size_type n, const_reference t) {
+<a name="l00789"></a>00789 clear();
+<a name="l00790"></a>00790 internal_resize( n, <span class="keyword">sizeof</span>(T), max_size(), static_cast<const void*>(&t), &destroy_array, &initialize_array_by );
+<a name="l00791"></a>00791 }
+<a name="l00792"></a>00792
+<a name="l00794"></a>00794 <span class="keyword">template</span><<span class="keyword">class</span> I>
+<a name="l00795"></a><a class="code" href="a00250.html#93a06b3112cb804f42f40efb5e7387b4">00795</a> <span class="keywordtype">void</span> assign(I first, I last) {
+<a name="l00796"></a>00796 clear(); internal_assign_range( first, last, <span class="keyword">static_cast</span><is_integer_tag<std::numeric_limits<I>::is_integer> *>(0) );
+<a name="l00797"></a>00797 }
+<a name="l00798"></a>00798
+<a name="l00800"></a><a class="code" href="a00250.html#96c9c4bd968ed3edb8dd276854d2dae0">00800</a> <span class="keywordtype">void</span> swap(<a class="code" href="a00250.html">concurrent_vector</a> &vector) {
+<a name="l00801"></a>00801 <span class="keywordflow">if</span>( <span class="keyword">this</span> != &vector ) {
+<a name="l00802"></a>00802 concurrent_vector_base_v3::internal_swap(static_cast<concurrent_vector_base_v3&>(vector));
+<a name="l00803"></a>00803 std::swap(this->my_allocator, vector.my_allocator);
+<a name="l00804"></a>00804 }
+<a name="l00805"></a>00805 }
+<a name="l00806"></a>00806
+<a name="l00808"></a>00808
+<a name="l00809"></a><a class="code" href="a00250.html#26f937a359a66b6aae904c3cd9a3c444">00809</a> <span class="keywordtype">void</span> clear() {
+<a name="l00810"></a>00810 internal_clear(&destroy_array);
+<a name="l00811"></a>00811 }
+<a name="l00812"></a>00812
+<a name="l00814"></a><a class="code" href="a00250.html#da2444b28bb840d38f60d0030333a5fc">00814</a> ~<a class="code" href="a00250.html">concurrent_vector</a>() {
+<a name="l00815"></a>00815 segment_t *table = my_segment;
+<a name="l00816"></a>00816 internal_free_segments( reinterpret_cast<void**>(table), internal_clear(&destroy_array), my_first_block );
+<a name="l00817"></a>00817 <span class="comment">// base class destructor call should be then</span>
+<a name="l00818"></a>00818 }
+<a name="l00819"></a>00819
+<a name="l00820"></a>00820 <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="l00821"></a>00821 <span class="keyword">private</span>:
+<a name="l00823"></a>00823 <span class="keyword">static</span> <span class="keywordtype">void</span> *internal_allocator(internal::concurrent_vector_base_v3 &vb, size_t k) {
+<a name="l00824"></a>00824 <span class="keywordflow">return</span> static_cast<concurrent_vector<T, A>&>(vb).my_allocator.allocate(k);
+<a name="l00825"></a>00825 }
+<a name="l00827"></a>00827 <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="l00828"></a>00828
+<a name="l00830"></a>00830 T& internal_subscript( size_type index ) <span class="keyword">const</span>;
+<a name="l00831"></a>00831
+<a name="l00833"></a>00833 T& internal_subscript_with_exceptions( size_type index ) <span class="keyword">const</span>;
+<a name="l00834"></a>00834
+<a name="l00836"></a>00836 <span class="keywordtype">void</span> internal_assign_n(size_type n, const_pointer p) {
+<a name="l00837"></a>00837 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="l00838"></a>00838 }
+<a name="l00839"></a>00839
+<a name="l00841"></a>00841 <span class="keyword">template</span><<span class="keywordtype">bool</span> B> <span class="keyword">class </span>is_integer_tag;
+<a name="l00842"></a>00842
+<a name="l00844"></a>00844 <span class="keyword">template</span><<span class="keyword">class</span> I>
+<a name="l00845"></a>00845 <span class="keywordtype">void</span> internal_assign_range(I first, I last, is_integer_tag<true> *) {
+<a name="l00846"></a>00846 internal_assign_n(static_cast<size_type>(first), &static_cast<T&>(last));
+<a name="l00847"></a>00847 }
+<a name="l00849"></a>00849 <span class="keyword">template</span><<span class="keyword">class</span> I>
+<a name="l00850"></a>00850 <span class="keywordtype">void</span> internal_assign_range(I first, I last, is_integer_tag<false> *) {
+<a name="l00851"></a>00851 internal_assign_iterators(first, last);
+<a name="l00852"></a>00852 }
+<a name="l00854"></a>00854 <span class="keyword">template</span><<span class="keyword">class</span> I>
+<a name="l00855"></a>00855 <span class="keywordtype">void</span> internal_assign_iterators(I first, I last);
+<a name="l00856"></a>00856
+<a name="l00858"></a>00858 <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="l00859"></a>00859
+<a name="l00861"></a>00861 <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="l00862"></a>00862
+<a name="l00864"></a>00864 <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="l00865"></a>00865
+<a name="l00867"></a>00867 <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="l00868"></a>00868
+<a name="l00870"></a>00870 <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="l00871"></a>00871
+<a name="l00873"></a>00873 <span class="keyword">class </span>internal_loop_guide : internal::no_copy {
+<a name="l00874"></a>00874 <span class="keyword">public</span>:
+<a name="l00875"></a>00875 <span class="keyword">const</span> pointer array;
+<a name="l00876"></a>00876 <span class="keyword">const</span> size_type n;
+<a name="l00877"></a>00877 size_type i;
+<a name="l00878"></a>00878 internal_loop_guide(size_type ntrials, <span class="keywordtype">void</span> *ptr)
+<a name="l00879"></a>00879 : array(static_cast<pointer>(ptr)), n(ntrials), i(0) {}
+<a name="l00880"></a>00880 <span class="keywordtype">void</span> init() { <span class="keywordflow">for</span>(; i < n; ++i) <span class="keyword">new</span>( &array[i] ) T(); }
+<a name="l00881"></a>00881 <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="l00882"></a>00882 <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="l00883"></a>00883 <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="l00884"></a>00884 <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="l00885"></a>00885 ~internal_loop_guide() {
+<a name="l00886"></a>00886 <span class="keywordflow">if</span>(i < n) <span class="comment">// if exception raised, do zerroing on the rest of items</span>
+<a name="l00887"></a>00887 std::memset(array+i, 0, (n-i)*<span class="keyword">sizeof</span>(value_type));
+<a name="l00888"></a>00888 }
+<a name="l00889"></a>00889 };
+<a name="l00890"></a>00890 };
+<a name="l00891"></a>00891
+<a name="l00892"></a>00892 <span class="preprocessor">#if defined(_MSC_VER) && !defined(__INTEL_COMPILER) </span>
+<a name="l00893"></a>00893 <span class="preprocessor"></span><span class="preprocessor">#pragma warning (push)</span>
+<a name="l00894"></a>00894 <span class="preprocessor"></span><span class="preprocessor">#pragma warning (disable: 4701) // potentially uninitialized local variable "old"</span>
+<a name="l00895"></a>00895 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00896"></a>00896 <span class="preprocessor"></span><span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
+<a name="l00897"></a><a class="code" href="a00250.html#03c6f4cf66532bf4cc907ee738a9a186">00897</a> <span class="keywordtype">void</span> <a class="code" href="a00250.html">concurrent_vector<T, A>::shrink_to_fit</a>() {
+<a name="l00898"></a>00898 internal_segments_table old;
+<a name="l00899"></a>00899 __TBB_TRY {
+<a name="l00900"></a>00900 <span class="keywordflow">if</span>( internal_compact( <span class="keyword">sizeof</span>(T), &old, &destroy_array, ©_array ) )
+<a name="l00901"></a>00901 internal_free_segments( old.table, pointers_per_long_table, old.first_block ); <span class="comment">// free joined and unnecessary segments</span>
+<a name="l00902"></a>00902 } __TBB_CATCH(...) {
+<a name="l00903"></a>00903 <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="l00904"></a>00904 internal_free_segments( old.table, 1, old.first_block );
+<a name="l00905"></a>00905 __TBB_RETHROW();
+<a name="l00906"></a>00906 }
+<a name="l00907"></a>00907 }
+<a name="l00908"></a>00908 <span class="preprocessor">#if defined(_MSC_VER) && !defined(__INTEL_COMPILER) </span>
+<a name="l00909"></a>00909 <span class="preprocessor"></span><span class="preprocessor">#pragma warning (pop)</span>
+<a name="l00910"></a>00910 <span class="preprocessor"></span><span class="preprocessor">#endif // warning 4701 is back </span>
+<a name="l00911"></a>00911 <span class="preprocessor"></span>
+<a name="l00912"></a>00912 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
+<a name="l00913"></a>00913 <span class="keywordtype">void</span> <a class="code" href="a00250.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="l00914"></a>00914 <span class="comment">// Free the arrays</span>
+<a name="l00915"></a>00915 <span class="keywordflow">while</span>( k > first_block ) {
+<a name="l00916"></a>00916 --k;
+<a name="l00917"></a>00917 T* array = static_cast<T*>(table[k]);
+<a name="l00918"></a>00918 table[k] = NULL;
+<a name="l00919"></a>00919 <span class="keywordflow">if</span>( array > internal::vector_allocation_error_flag ) <span class="comment">// check for correct segment pointer</span>
+<a name="l00920"></a>00920 this->my_allocator.deallocate( array, segment_size(k) );
+<a name="l00921"></a>00921 }
+<a name="l00922"></a>00922 T* array = static_cast<T*>(table[0]);
+<a name="l00923"></a>00923 <span class="keywordflow">if</span>( array > internal::vector_allocation_error_flag ) {
+<a name="l00924"></a>00924 __TBB_ASSERT( first_block > 0, NULL );
+<a name="l00925"></a>00925 <span class="keywordflow">while</span>(k > 0) table[--k] = NULL;
+<a name="l00926"></a>00926 this->my_allocator.deallocate( array, segment_size(first_block) );
+<a name="l00927"></a>00927 }
+<a name="l00928"></a>00928 }
+<a name="l00929"></a>00929
+<a name="l00930"></a>00930 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
+<a name="l00931"></a>00931 T& concurrent_vector<T, A>::internal_subscript( size_type index )<span class="keyword"> const </span>{
+<a name="l00932"></a>00932 __TBB_ASSERT( index < my_early_size, <span class="stringliteral">"index out of bounds"</span> );
+<a name="l00933"></a>00933 size_type j = index;
+<a name="l00934"></a>00934 segment_index_t k = segment_base_index_of( j );
+<a name="l00935"></a>00935 __TBB_ASSERT( (segment_t*)my_segment != my_storage || k < pointers_per_short_table, <span class="stringliteral">"index is being allocated"</span> );
+<a name="l00936"></a>00936 <span class="comment">// no need in __TBB_load_with_acquire since thread works in own space or gets </span>
+<a name="l00937"></a>00937 T* array = static_cast<T*>( tbb::internal::itt_hide_load_word(my_segment[k].array));
+<a name="l00938"></a>00938 __TBB_ASSERT( array != internal::vector_allocation_error_flag, <span class="stringliteral">"the instance is broken by bad allocation. Use at() instead"</span> );
+<a name="l00939"></a>00939 __TBB_ASSERT( array, <span class="stringliteral">"index is being allocated"</span> );
+<a name="l00940"></a>00940 <span class="keywordflow">return</span> array[j];
+<a name="l00941"></a>00941 }
+<a name="l00942"></a>00942
+<a name="l00943"></a>00943 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
+<a name="l00944"></a>00944 T& concurrent_vector<T, A>::internal_subscript_with_exceptions( size_type index )<span class="keyword"> const </span>{
+<a name="l00945"></a>00945 <span class="keywordflow">if</span>( index >= my_early_size )
+<a name="l00946"></a>00946 internal::throw_exception(internal::eid_out_of_range); <span class="comment">// throw std::out_of_range</span>
+<a name="l00947"></a>00947 size_type j = index;
+<a name="l00948"></a>00948 segment_index_t k = segment_base_index_of( j );
+<a name="l00949"></a>00949 <span class="keywordflow">if</span>( (segment_t*)my_segment == my_storage && k >= pointers_per_short_table )
+<a name="l00950"></a>00950 internal::throw_exception(internal::eid_segment_range_error); <span class="comment">// throw std::range_error</span>
+<a name="l00951"></a>00951 <span class="keywordtype">void</span> *array = my_segment[k].array; <span class="comment">// no need in __TBB_load_with_acquire</span>
+<a name="l00952"></a>00952 <span class="keywordflow">if</span>( array <= internal::vector_allocation_error_flag ) <span class="comment">// check for correct segment pointer</span>
+<a name="l00953"></a>00953 internal::throw_exception(internal::eid_index_range_error); <span class="comment">// throw std::range_error</span>
+<a name="l00954"></a>00954 <span class="keywordflow">return</span> static_cast<T*>(array)[j];
+<a name="l00955"></a>00955 }
+<a name="l00956"></a>00956
+<a name="l00957"></a>00957 <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="l00958"></a>00958 <span class="keywordtype">void</span> concurrent_vector<T, A>::internal_assign_iterators(I first, I last) {
+<a name="l00959"></a>00959 __TBB_ASSERT(my_early_size == 0, NULL);
+<a name="l00960"></a>00960 size_type n = std::distance(first, last);
+<a name="l00961"></a>00961 <span class="keywordflow">if</span>( !n ) <span class="keywordflow">return</span>;
+<a name="l00962"></a>00962 internal_reserve(n, <span class="keyword">sizeof</span>(T), <a class="code" href="a00250.html#2c248a017f0576df3e7cd99627836fd6">max_size</a>());
+<a name="l00963"></a>00963 my_early_size = n;
+<a name="l00964"></a>00964 segment_index_t k = 0;
+<a name="l00965"></a>00965 size_type sz = segment_size( my_first_block );
+<a name="l00966"></a>00966 <span class="keywordflow">while</span>( sz < n ) {
+<a name="l00967"></a>00967 internal_loop_guide loop(sz, my_segment[k].array);
+<a name="l00968"></a>00968 loop.iterate(first);
+<a name="l00969"></a>00969 n -= sz;
+<a name="l00970"></a>00970 <span class="keywordflow">if</span>( !k ) k = my_first_block;
+<a name="l00971"></a>00971 <span class="keywordflow">else</span> { ++k; sz <<= 1; }
+<a name="l00972"></a>00972 }
+<a name="l00973"></a>00973 internal_loop_guide loop(n, my_segment[k].array);
+<a name="l00974"></a>00974 loop.iterate(first);
+<a name="l00975"></a>00975 }
+<a name="l00976"></a>00976
+<a name="l00977"></a>00977 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
+<a name="l00978"></a>00978 <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="l00979"></a>00979 internal_loop_guide loop(n, begin); loop.init();
+<a name="l00980"></a>00980 }
+<a name="l00981"></a>00981
+<a name="l00982"></a>00982 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
+<a name="l00983"></a>00983 <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="l00984"></a>00984 internal_loop_guide loop(n, begin); loop.init(src);
+<a name="l00985"></a>00985 }
+<a name="l00986"></a>00986
+<a name="l00987"></a>00987 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
+<a name="l00988"></a>00988 <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="l00989"></a>00989 internal_loop_guide loop(n, dst); loop.copy(src);
+<a name="l00990"></a>00990 }
+<a name="l00991"></a>00991
+<a name="l00992"></a>00992 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
+<a name="l00993"></a>00993 <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="l00994"></a>00994 internal_loop_guide loop(n, dst); loop.assign(src);
+<a name="l00995"></a>00995 }
+<a name="l00996"></a>00996
+<a name="l00997"></a>00997 <span class="preprocessor">#if defined(_MSC_VER) && !defined(__INTEL_COMPILER) </span>
+<a name="l00998"></a>00998 <span class="preprocessor"></span> <span class="comment">// Workaround for overzealous compiler warning</span>
+<a name="l00999"></a>00999 <span class="preprocessor"> #pragma warning (push)</span>
+<a name="l01000"></a>01000 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (disable: 4189)</span>
+<a name="l01001"></a>01001 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l01002"></a>01002 <span class="preprocessor"></span><span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
+<a name="l01003"></a>01003 <span class="keywordtype">void</span> concurrent_vector<T, A>::destroy_array( <span class="keywordtype">void</span>* begin, size_type n ) {
+<a name="l01004"></a>01004 T* array = static_cast<T*>(begin);
+<a name="l01005"></a>01005 <span class="keywordflow">for</span>( size_type j=n; j>0; --j )
+<a name="l01006"></a>01006 array[j-1].~T(); <span class="comment">// destructors are supposed to not throw any exceptions</span>
+<a name="l01007"></a>01007 }
+<a name="l01008"></a>01008 <span class="preprocessor">#if defined(_MSC_VER) && !defined(__INTEL_COMPILER) </span>
+<a name="l01009"></a>01009 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (pop)</span>
+<a name="l01010"></a>01010 <span class="preprocessor"></span><span class="preprocessor">#endif // warning 4189 is back </span>
+<a name="l01011"></a>01011 <span class="preprocessor"></span>
+<a name="l01012"></a>01012 <span class="comment">// concurrent_vector's template functions</span>
+<a name="l01013"></a>01013 <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="l01014"></a>01014 <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="l01015"></a>01015 <span class="comment">// Simply: return a.size() == b.size() && std::equal(a.begin(), a.end(), b.begin());</span>
+<a name="l01016"></a>01016 <span class="keywordflow">if</span>(a.size() != b.size()) <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l01017"></a>01017 <span class="keyword">typename</span> concurrent_vector<T, A1>::const_iterator i(a.begin());
+<a name="l01018"></a>01018 <span class="keyword">typename</span> concurrent_vector<T, A2>::const_iterator j(b.begin());
+<a name="l01019"></a>01019 <span class="keywordflow">for</span>(; i != a.end(); ++i, ++j)
+<a name="l01020"></a>01020 <span class="keywordflow">if</span>( !(*i == *j) ) <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l01021"></a>01021 <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l01022"></a>01022 }
+<a name="l01023"></a>01023
+<a name="l01024"></a>01024 <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="l01025"></a>01025 <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="l01026"></a>01026 { <span class="keywordflow">return</span> !(a == b); }
+<a name="l01027"></a>01027
+<a name="l01028"></a>01028 <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="l01029"></a>01029 <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="l01030"></a>01030 { <span class="keywordflow">return</span> (std::lexicographical_compare(a.begin(), a.end(), b.begin(), b.end())); }
+<a name="l01031"></a>01031
+<a name="l01032"></a>01032 <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="l01033"></a>01033 <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="l01034"></a>01034 { <span class="keywordflow">return</span> b < a; }
+<a name="l01035"></a>01035
+<a name="l01036"></a>01036 <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="l01037"></a>01037 <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="l01038"></a>01038 { <span class="keywordflow">return</span> !(b < a); }
+<a name="l01039"></a>01039
+<a name="l01040"></a>01040 <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="l01041"></a>01041 <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="l01042"></a>01042 { <span class="keywordflow">return</span> !(a < b); }
+<a name="l01043"></a>01043
+<a name="l01044"></a>01044 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
+<a name="l01045"></a>01045 <span class="keyword">inline</span> <span class="keywordtype">void</span> swap(concurrent_vector<T, A> &a, concurrent_vector<T, A> &b)
+<a name="l01046"></a>01046 { a.swap( b ); }
+<a name="l01047"></a>01047
+<a name="l01048"></a>01048 } <span class="comment">// namespace tbb</span>
+<a name="l01049"></a>01049
+<a name="l01050"></a>01050 <span class="preprocessor">#if defined(_MSC_VER) && !defined(__INTEL_COMPILER) && defined(_Wp64)</span>
+<a name="l01051"></a>01051 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (pop)</span>
+<a name="l01052"></a>01052 <span class="preprocessor"></span><span class="preprocessor">#endif // warning 4267 is back</span>
+<a name="l01053"></a>01053 <span class="preprocessor"></span>
+<a name="l01054"></a>01054 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_concurrent_vector_H */</span>
+</pre></div><hr>
+<p></p>
+Copyright © 2005-2011 Intel Corporation. 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/a00452.html
similarity index 100%
rename from doc/html/a00451.html
rename to doc/html/a00452.html
diff --git a/doc/html/a00454.html b/doc/html/a00454.html
deleted file mode 100644
index ae76a92..0000000
--- a/doc/html/a00454.html
+++ /dev/null
@@ -1,967 +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-2011 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 "cache_aligned_allocator.h"</span>
-<a name="l00027"></a>00027 <span class="preprocessor">#include "aligned_space.h"</span>
-<a name="l00028"></a>00028 <span class="preprocessor">#include <string.h></span> <span class="comment">// for memcpy</span>
-<a name="l00029"></a>00029
-<a name="l00030"></a>00030 <span class="preprocessor">#if _WIN32||_WIN64</span>
-<a name="l00031"></a>00031 <span class="preprocessor"></span><span class="preprocessor">#include "machine/windows_api.h"</span>
-<a name="l00032"></a>00032 <span class="preprocessor">#else</span>
-<a name="l00033"></a>00033 <span class="preprocessor"></span><span class="preprocessor">#include <pthread.h></span>
-<a name="l00034"></a>00034 <span class="preprocessor">#endif</span>
-<a name="l00035"></a>00035 <span class="preprocessor"></span>
-<a name="l00036"></a>00036 <span class="keyword">namespace </span>tbb {
-<a name="l00037"></a>00037
-<a name="l00039"></a><a class="code" href="a00362.html#a8622ae61b7e7737dac26542e181178e">00039</a> <span class="keyword">enum</span> <a class="code" href="a00362.html#a8622ae61b7e7737dac26542e181178e">ets_key_usage_type</a> { ets_key_per_instance, ets_no_key };
-<a name="l00040"></a>00040
-<a name="l00041"></a>00041 <span class="keyword">namespace </span>interface6 {
-<a name="l00042"></a>00042
-<a name="l00044"></a>00044 <span class="keyword">namespace </span>internal {
-<a name="l00045"></a>00045
-<a name="l00046"></a>00046 <span class="keyword">template</span><ets_key_usage_type ETS_key_type>
-<a name="l00047"></a>00047 <span class="keyword">class </span>ets_base: tbb::internal::no_copy {
-<a name="l00048"></a>00048 <span class="keyword">protected</span>:
-<a name="l00049"></a>00049 <span class="preprocessor">#if _WIN32||_WIN64</span>
-<a name="l00050"></a>00050 <span class="preprocessor"></span> <span class="keyword">typedef</span> DWORD key_type;
-<a name="l00051"></a>00051 <span class="preprocessor">#else</span>
-<a name="l00052"></a>00052 <span class="preprocessor"></span> <span class="keyword">typedef</span> pthread_t key_type;
-<a name="l00053"></a>00053 <span class="preprocessor">#endif</span>
-<a name="l00054"></a>00054 <span class="preprocessor"></span><span class="preprocessor">#if __TBB_GCC_3_3_PROTECTED_BROKEN</span>
-<a name="l00055"></a>00055 <span class="preprocessor"></span> <span class="keyword">public</span>:
-<a name="l00056"></a>00056 <span class="preprocessor">#endif</span>
-<a name="l00057"></a>00057 <span class="preprocessor"></span> <span class="keyword">struct </span>slot;
-<a name="l00058"></a>00058
-<a name="l00059"></a>00059 <span class="keyword">struct </span>array {
-<a name="l00060"></a>00060 array* next;
-<a name="l00061"></a>00061 size_t lg_size;
-<a name="l00062"></a>00062 slot& at( size_t k ) {
-<a name="l00063"></a>00063 <span class="keywordflow">return</span> ((slot*)(<span class="keywordtype">void</span>*)(<span class="keyword">this</span>+1))[k];
-<a name="l00064"></a>00064 }
-<a name="l00065"></a>00065 size_t size()<span class="keyword"> const </span>{<span class="keywordflow">return</span> (size_t)1<<lg_size;}
-<a name="l00066"></a>00066 size_t mask()<span class="keyword"> const </span>{<span class="keywordflow">return</span> size()-1;}
-<a name="l00067"></a>00067 size_t start( size_t h )<span class="keyword"> const </span>{
-<a name="l00068"></a>00068 <span class="keywordflow">return</span> h>>(8*<span class="keyword">sizeof</span>(size_t)-lg_size);
-<a name="l00069"></a>00069 }
-<a name="l00070"></a>00070 };
-<a name="l00071"></a>00071 <span class="keyword">struct </span>slot {
-<a name="l00072"></a>00072 key_type key;
-<a name="l00073"></a>00073 <span class="keywordtype">void</span>* ptr;
-<a name="l00074"></a>00074 <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{<span class="keywordflow">return</span> !key;}
-<a name="l00075"></a>00075 <span class="keywordtype">bool</span> match( key_type k )<span class="keyword"> const </span>{<span class="keywordflow">return</span> key==k;}
-<a name="l00076"></a>00076 <span class="keywordtype">bool</span> claim( key_type k ) {
-<a name="l00077"></a>00077 __TBB_ASSERT(<span class="keyword">sizeof</span>(<a class="code" href="a00216.html">tbb::atomic<key_type></a>)==<span class="keyword">sizeof</span>(key_type), NULL);
-<a name="l00078"></a>00078 <span class="keywordflow">return</span> tbb::internal::punned_cast<tbb::atomic<key_type>*>(&key)->compare_and_swap(k,0)==0;
-<a name="l00079"></a>00079 }
-<a name="l00080"></a>00080 };
-<a name="l00081"></a>00081 <span class="preprocessor">#if __TBB_GCC_3_3_PROTECTED_BROKEN</span>
-<a name="l00082"></a>00082 <span class="preprocessor"></span> <span class="keyword">protected</span>:
-<a name="l00083"></a>00083 <span class="preprocessor">#endif</span>
-<a name="l00084"></a>00084 <span class="preprocessor"></span>
-<a name="l00085"></a>00085 <span class="keyword">static</span> key_type key_of_current_thread() {
-<a name="l00086"></a>00086 tbb::tbb_thread::id <span class="keywordtype">id</span> = tbb::this_tbb_thread::get_id();
-<a name="l00087"></a>00087 key_type k;
-<a name="l00088"></a>00088 memcpy( &k, &<span class="keywordtype">id</span>, <span class="keyword">sizeof</span>(k) );
-<a name="l00089"></a>00089 <span class="keywordflow">return</span> k;
-<a name="l00090"></a>00090 }
-<a name="l00091"></a>00091
-<a name="l00093"></a>00093
-<a name="l00095"></a>00095 atomic<array*> my_root;
-<a name="l00096"></a>00096 atomic<size_t> my_count;
-<a name="l00097"></a>00097 <span class="keyword">virtual</span> <span class="keywordtype">void</span>* create_local() = 0;
-<a name="l00098"></a>00098 <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="l00099"></a>00099 <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="l00100"></a>00100 array* allocate( size_t lg_size ) {
-<a name="l00101"></a>00101 size_t n = 1<<lg_size;
-<a name="l00102"></a>00102 array* a = static_cast<array*>(create_array( <span class="keyword">sizeof</span>(array)+n*<span class="keyword">sizeof</span>(slot) ));
-<a name="l00103"></a>00103 a->lg_size = lg_size;
-<a name="l00104"></a>00104 std::memset( a+1, 0, n*<span class="keyword">sizeof</span>(slot) );
-<a name="l00105"></a>00105 <span class="keywordflow">return</span> a;
-<a name="l00106"></a>00106 }
-<a name="l00107"></a>00107 <span class="keywordtype">void</span> free(array* a) {
-<a name="l00108"></a>00108 size_t n = 1<<(a->lg_size);
-<a name="l00109"></a>00109 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="l00110"></a>00110 }
-<a name="l00111"></a>00111 <span class="keyword">static</span> size_t hash( key_type k ) {
-<a name="l00112"></a>00112 <span class="comment">// Multiplicative hashing. Client should use *upper* bits.</span>
-<a name="l00113"></a>00113 <span class="comment">// casts required for Mac gcc4.* compiler</span>
-<a name="l00114"></a>00114 <span class="preprocessor">#if __TBB_WORDSIZE == 4</span>
-<a name="l00115"></a>00115 <span class="preprocessor"></span> <span class="keywordflow">return</span> uintptr_t(k)*0x9E3779B9;
-<a name="l00116"></a>00116 <span class="preprocessor">#else</span>
-<a name="l00117"></a>00117 <span class="preprocessor"></span> <span class="keywordflow">return</span> uintptr_t(k)*0x9E3779B97F4A7C15;
-<a name="l00118"></a>00118 <span class="preprocessor">#endif </span>
-<a name="l00119"></a>00119 <span class="preprocessor"></span> }
-<a name="l00120"></a>00120
-<a name="l00121"></a>00121 ets_base() {my_root=NULL; my_count=0;}
-<a name="l00122"></a>00122 <span class="keyword">virtual</span> ~ets_base(); <span class="comment">// g++ complains if this is not virtual...</span>
-<a name="l00123"></a>00123 <span class="keywordtype">void</span>* table_lookup( <span class="keywordtype">bool</span>& exists );
-<a name="l00124"></a>00124 <span class="keywordtype">void</span> table_clear();
-<a name="l00125"></a>00125 slot& table_find( key_type k ) {
-<a name="l00126"></a>00126 size_t h = hash(k);
-<a name="l00127"></a>00127 array* r = my_root;
-<a name="l00128"></a>00128 size_t mask = r->mask();
-<a name="l00129"></a>00129 <span class="keywordflow">for</span>(size_t i = r->start(h);;i=(i+1)&mask) {
-<a name="l00130"></a>00130 slot& s = r->at(i);
-<a name="l00131"></a>00131 <span class="keywordflow">if</span>( s.empty() || s.match(k) )
-<a name="l00132"></a>00132 <span class="keywordflow">return</span> s;
-<a name="l00133"></a>00133 }
-<a name="l00134"></a>00134 }
-<a name="l00135"></a>00135 <span class="keywordtype">void</span> table_reserve_for_copy( <span class="keyword">const</span> ets_base& other ) {
-<a name="l00136"></a>00136 __TBB_ASSERT(!my_root,NULL);
-<a name="l00137"></a>00137 __TBB_ASSERT(!my_count,NULL);
-<a name="l00138"></a>00138 <span class="keywordflow">if</span>( other.my_root ) {
-<a name="l00139"></a>00139 array* a = allocate(other.my_root->lg_size);
-<a name="l00140"></a>00140 a->next = NULL;
-<a name="l00141"></a>00141 my_root = a;
-<a name="l00142"></a>00142 my_count = other.my_count;
-<a name="l00143"></a>00143 }
-<a name="l00144"></a>00144 }
-<a name="l00145"></a>00145 };
-<a name="l00146"></a>00146
-<a name="l00147"></a>00147 <span class="keyword">template</span><ets_key_usage_type ETS_key_type>
-<a name="l00148"></a>00148 ets_base<ETS_key_type>::~ets_base() {
-<a name="l00149"></a>00149 __TBB_ASSERT(!my_root, NULL);
-<a name="l00150"></a>00150 }
-<a name="l00151"></a>00151
-<a name="l00152"></a>00152 <span class="keyword">template</span><ets_key_usage_type ETS_key_type>
-<a name="l00153"></a>00153 <span class="keywordtype">void</span> ets_base<ETS_key_type>::table_clear() {
-<a name="l00154"></a>00154 <span class="keywordflow">while</span>( array* r = my_root ) {
-<a name="l00155"></a>00155 my_root = r->next;
-<a name="l00156"></a>00156 free(r);
-<a name="l00157"></a>00157 }
-<a name="l00158"></a>00158 my_count = 0;
-<a name="l00159"></a>00159 }
-<a name="l00160"></a>00160
-<a name="l00161"></a>00161 <span class="keyword">template</span><ets_key_usage_type ETS_key_type>
-<a name="l00162"></a>00162 <span class="keywordtype">void</span>* ets_base<ETS_key_type>::table_lookup( <span class="keywordtype">bool</span>& exists ) {
-<a name="l00163"></a>00163 <span class="keyword">const</span> key_type k = key_of_current_thread();
-<a name="l00164"></a>00164
-<a name="l00165"></a>00165 __TBB_ASSERT(k!=0,NULL);
-<a name="l00166"></a>00166 <span class="keywordtype">void</span>* found;
-<a name="l00167"></a>00167 size_t h = hash(k);
-<a name="l00168"></a>00168 <span class="keywordflow">for</span>( array* r=my_root; r; r=r->next ) {
-<a name="l00169"></a>00169 size_t mask=r->mask();
-<a name="l00170"></a>00170 <span class="keywordflow">for</span>(size_t i = r->start(h); ;i=(i+1)&mask) {
-<a name="l00171"></a>00171 slot& s = r->at(i);
-<a name="l00172"></a>00172 <span class="keywordflow">if</span>( s.empty() ) <span class="keywordflow">break</span>;
-<a name="l00173"></a>00173 <span class="keywordflow">if</span>( s.match(k) ) {
-<a name="l00174"></a>00174 <span class="keywordflow">if</span>( r==my_root ) {
-<a name="l00175"></a>00175 <span class="comment">// Success at top level</span>
-<a name="l00176"></a>00176 exists = <span class="keyword">true</span>;
-<a name="l00177"></a>00177 <span class="keywordflow">return</span> s.ptr;
-<a name="l00178"></a>00178 } <span class="keywordflow">else</span> {
-<a name="l00179"></a>00179 <span class="comment">// Success at some other level. Need to insert at top level.</span>
-<a name="l00180"></a>00180 exists = <span class="keyword">true</span>;
-<a name="l00181"></a>00181 found = s.ptr;
-<a name="l00182"></a>00182 <span class="keywordflow">goto</span> insert;
-<a name="l00183"></a>00183 }
-<a name="l00184"></a>00184 }
-<a name="l00185"></a>00185 }
-<a name="l00186"></a>00186 }
-<a name="l00187"></a>00187 <span class="comment">// Key does not yet exist</span>
-<a name="l00188"></a>00188 exists = <span class="keyword">false</span>;
-<a name="l00189"></a>00189 found = create_local();
-<a name="l00190"></a>00190 {
-<a name="l00191"></a>00191 size_t c = ++my_count;
-<a name="l00192"></a>00192 array* r = my_root;
-<a name="l00193"></a>00193 <span class="keywordflow">if</span>( !r || c>r->size()/2 ) {
-<a name="l00194"></a>00194 size_t s = r ? r->lg_size : 2;
-<a name="l00195"></a>00195 <span class="keywordflow">while</span>( c>size_t(1)<<(s-1) ) ++s;
-<a name="l00196"></a>00196 array* a = allocate(s);
-<a name="l00197"></a>00197 <span class="keywordflow">for</span>(;;) {
-<a name="l00198"></a>00198 a->next = my_root;
-<a name="l00199"></a>00199 array* new_r = my_root.compare_and_swap(a,r);
-<a name="l00200"></a>00200 <span class="keywordflow">if</span>( new_r==r ) <span class="keywordflow">break</span>;
-<a name="l00201"></a>00201 <span class="keywordflow">if</span>( new_r->lg_size>=s ) {
-<a name="l00202"></a>00202 <span class="comment">// Another thread inserted an equal or bigger array, so our array is superfluous.</span>
-<a name="l00203"></a>00203 free(a);
-<a name="l00204"></a>00204 <span class="keywordflow">break</span>;
-<a name="l00205"></a>00205 }
-<a name="l00206"></a>00206 r = new_r;
-<a name="l00207"></a>00207 }
-<a name="l00208"></a>00208 }
-<a name="l00209"></a>00209 }
-<a name="l00210"></a>00210 insert:
-<a name="l00211"></a>00211 <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="l00212"></a>00212 array* ir = my_root;
-<a name="l00213"></a>00213 size_t mask = ir->mask();
-<a name="l00214"></a>00214 <span class="keywordflow">for</span>(size_t i = ir->start(h);;i=(i+1)&mask) {
-<a name="l00215"></a>00215 slot& s = ir->at(i);
-<a name="l00216"></a>00216 <span class="keywordflow">if</span>( s.empty() ) {
-<a name="l00217"></a>00217 <span class="keywordflow">if</span>( s.claim(k) ) {
-<a name="l00218"></a>00218 s.ptr = found;
-<a name="l00219"></a>00219 <span class="keywordflow">return</span> found;
-<a name="l00220"></a>00220 }
-<a name="l00221"></a>00221 }
-<a name="l00222"></a>00222 }
-<a name="l00223"></a>00223 }
-<a name="l00224"></a>00224
-<a name="l00226"></a>00226 <span class="keyword">template</span> <>
-<a name="l00227"></a>00227 <span class="keyword">class </span>ets_base<ets_key_per_instance>: <span class="keyword">protected</span> ets_base<ets_no_key> {
-<a name="l00228"></a>00228 <span class="keyword">typedef</span> ets_base<ets_no_key> super;
-<a name="l00229"></a>00229 <span class="preprocessor">#if _WIN32||_WIN64</span>
-<a name="l00230"></a>00230 <span class="preprocessor"></span> <span class="keyword">typedef</span> DWORD tls_key_t;
-<a name="l00231"></a>00231 <span class="keywordtype">void</span> create_key() { my_key = TlsAlloc(); }
-<a name="l00232"></a>00232 <span class="keywordtype">void</span> destroy_key() { TlsFree(my_key); }
-<a name="l00233"></a>00233 <span class="keywordtype">void</span> set_tls(<span class="keywordtype">void</span> * value) { TlsSetValue(my_key, (LPVOID)value); }
-<a name="l00234"></a>00234 <span class="keywordtype">void</span>* get_tls() { <span class="keywordflow">return</span> (<span class="keywordtype">void</span> *)TlsGetValue(my_key); }
-<a name="l00235"></a>00235 <span class="preprocessor">#else</span>
-<a name="l00236"></a>00236 <span class="preprocessor"></span> <span class="keyword">typedef</span> pthread_key_t tls_key_t;
-<a name="l00237"></a>00237 <span class="keywordtype">void</span> create_key() { pthread_key_create(&my_key, NULL); }
-<a name="l00238"></a>00238 <span class="keywordtype">void</span> destroy_key() { pthread_key_delete(my_key); }
-<a name="l00239"></a>00239 <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="l00240"></a>00240 <span class="keywordtype">void</span>* get_tls()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> pthread_getspecific(my_key); }
-<a name="l00241"></a>00241 <span class="preprocessor">#endif</span>
-<a name="l00242"></a>00242 <span class="preprocessor"></span> tls_key_t my_key;
-<a name="l00243"></a>00243 <span class="keyword">virtual</span> <span class="keywordtype">void</span>* create_local() = 0;
-<a name="l00244"></a>00244 <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="l00245"></a>00245 <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="l00246"></a>00246 <span class="keyword">public</span>:
-<a name="l00247"></a>00247 ets_base() {create_key();}
-<a name="l00248"></a>00248 ~ets_base() {destroy_key();}
-<a name="l00249"></a>00249 <span class="keywordtype">void</span>* table_lookup( <span class="keywordtype">bool</span>& exists ) {
-<a name="l00250"></a>00250 <span class="keywordtype">void</span>* found = get_tls();
-<a name="l00251"></a>00251 <span class="keywordflow">if</span>( found ) {
-<a name="l00252"></a>00252 exists=<span class="keyword">true</span>;
-<a name="l00253"></a>00253 } <span class="keywordflow">else</span> {
-<a name="l00254"></a>00254 found = super::table_lookup(exists);
-<a name="l00255"></a>00255 set_tls(found);
-<a name="l00256"></a>00256 }
-<a name="l00257"></a>00257 <span class="keywordflow">return</span> found;
-<a name="l00258"></a>00258 }
-<a name="l00259"></a>00259 <span class="keywordtype">void</span> table_clear() {
-<a name="l00260"></a>00260 destroy_key();
-<a name="l00261"></a>00261 create_key();
-<a name="l00262"></a>00262 super::table_clear();
-<a name="l00263"></a>00263 }
-<a name="l00264"></a>00264 };
-<a name="l00265"></a>00265
-<a name="l00267"></a>00267 <span class="keyword">template</span>< <span class="keyword">typename</span> Container, <span class="keyword">typename</span> Value >
-<a name="l00268"></a>00268 <span class="keyword">class </span>enumerable_thread_specific_iterator
-<a name="l00269"></a>00269 #if defined(_WIN64) && defined(_MSC_VER)
-<a name="l00270"></a>00270 <span class="comment">// Ensure that Microsoft's internal template function _Val_type works correctly.</span>
-<a name="l00271"></a>00271 : public std::iterator<std::random_access_iterator_tag,Value>
-<a name="l00272"></a>00272 #endif <span class="comment">/* defined(_WIN64) && defined(_MSC_VER) */</span>
-<a name="l00273"></a>00273 {
-<a name="l00275"></a>00275
-<a name="l00276"></a>00276 Container *my_container;
-<a name="l00277"></a>00277 <span class="keyword">typename</span> Container::size_type my_index;
-<a name="l00278"></a>00278 <span class="keyword">mutable</span> Value *my_value;
-<a name="l00279"></a>00279
-<a name="l00280"></a>00280 <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> T>
-<a name="l00281"></a>00281 <span class="keyword">friend</span> enumerable_thread_specific_iterator<C,T> operator+( ptrdiff_t offset,
-<a name="l00282"></a>00282 <span class="keyword">const</span> enumerable_thread_specific_iterator<C,T>& v );
-<a name="l00283"></a>00283
-<a name="l00284"></a>00284 <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="l00285"></a>00285 <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="l00286"></a>00286 <span class="keyword">const</span> enumerable_thread_specific_iterator<C,U>& j );
-<a name="l00287"></a>00287
-<a name="l00288"></a>00288 <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="l00289"></a>00289 <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator<( const enumerable_thread_specific_iterator<C,T>& i,
-<a name="l00290"></a>00290 <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> T, <span class="keyword">typename</span> U>
-<a name="l00293"></a>00293 <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="l00294"></a>00294
-<a name="l00295"></a>00295 <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> U>
-<a name="l00296"></a>00296 <span class="keyword">friend</span> <span class="keyword">class </span>enumerable_thread_specific_iterator;
-<a name="l00297"></a>00297
-<a name="l00298"></a>00298 <span class="keyword">public</span>:
-<a name="l00299"></a>00299
-<a name="l00300"></a>00300 enumerable_thread_specific_iterator( <span class="keyword">const</span> Container &container, <span class="keyword">typename</span> Container::size_type index ) :
-<a name="l00301"></a>00301 my_container(&const_cast<Container &>(container)), my_index(index), my_value(NULL) {}
-<a name="l00302"></a>00302
-<a name="l00304"></a>00304 enumerable_thread_specific_iterator() : my_container(NULL), my_index(0), my_value(NULL) {}
-<a name="l00305"></a>00305
-<a name="l00306"></a>00306 <span class="keyword">template</span><<span class="keyword">typename</span> U>
-<a name="l00307"></a>00307 enumerable_thread_specific_iterator( <span class="keyword">const</span> enumerable_thread_specific_iterator<Container, U>& other ) :
-<a name="l00308"></a>00308 my_container( other.my_container ), my_index( other.my_index), my_value( const_cast<Value *>(other.my_value) ) {}
-<a name="l00309"></a>00309
-<a name="l00310"></a>00310 enumerable_thread_specific_iterator operator+( ptrdiff_t offset )<span class="keyword"> const </span>{
-<a name="l00311"></a>00311 <span class="keywordflow">return</span> enumerable_thread_specific_iterator(*my_container, my_index + offset);
-<a name="l00312"></a>00312 }
-<a name="l00313"></a>00313
-<a name="l00314"></a>00314 enumerable_thread_specific_iterator &operator+=( ptrdiff_t offset ) {
-<a name="l00315"></a>00315 my_index += offset;
-<a name="l00316"></a>00316 my_value = NULL;
-<a name="l00317"></a>00317 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00318"></a>00318 }
-<a name="l00319"></a>00319
-<a name="l00320"></a>00320 enumerable_thread_specific_iterator operator-( ptrdiff_t offset )<span class="keyword"> const </span>{
-<a name="l00321"></a>00321 <span class="keywordflow">return</span> enumerable_thread_specific_iterator( *my_container, my_index-offset );
-<a name="l00322"></a>00322 }
-<a name="l00323"></a>00323
-<a name="l00324"></a>00324 enumerable_thread_specific_iterator &operator-=( ptrdiff_t offset ) {
-<a name="l00325"></a>00325 my_index -= offset;
-<a name="l00326"></a>00326 my_value = NULL;
-<a name="l00327"></a>00327 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00328"></a>00328 }
-<a name="l00329"></a>00329
-<a name="l00330"></a>00330 Value& operator*()<span class="keyword"> const </span>{
-<a name="l00331"></a>00331 Value* value = my_value;
-<a name="l00332"></a>00332 <span class="keywordflow">if</span>( !value ) {
-<a name="l00333"></a>00333 value = my_value = reinterpret_cast<Value *>(&(*my_container)[my_index].value);
-<a name="l00334"></a>00334 }
-<a name="l00335"></a>00335 __TBB_ASSERT( value==reinterpret_cast<Value *>(&(*my_container)[my_index].value), <span class="stringliteral">"corrupt cache"</span> );
-<a name="l00336"></a>00336 <span class="keywordflow">return</span> *value;
-<a name="l00337"></a>00337 }
-<a name="l00338"></a>00338
-<a name="l00339"></a>00339 Value& operator[]( ptrdiff_t k )<span class="keyword"> const </span>{
-<a name="l00340"></a>00340 <span class="keywordflow">return</span> (*my_container)[my_index + k].value;
-<a name="l00341"></a>00341 }
-<a name="l00342"></a>00342
-<a name="l00343"></a>00343 Value* operator->()<span class="keyword"> const </span>{<span class="keywordflow">return</span> &operator*();}
-<a name="l00344"></a>00344
-<a name="l00345"></a>00345 enumerable_thread_specific_iterator& operator++() {
-<a name="l00346"></a>00346 ++my_index;
-<a name="l00347"></a>00347 my_value = NULL;
-<a name="l00348"></a>00348 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00349"></a>00349 }
-<a name="l00350"></a>00350
-<a name="l00351"></a>00351 enumerable_thread_specific_iterator& operator--() {
-<a name="l00352"></a>00352 --my_index;
-<a name="l00353"></a>00353 my_value = NULL;
-<a name="l00354"></a>00354 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00355"></a>00355 }
-<a name="l00356"></a>00356
-<a name="l00358"></a>00358 enumerable_thread_specific_iterator operator++(<span class="keywordtype">int</span>) {
-<a name="l00359"></a>00359 enumerable_thread_specific_iterator result = *<span class="keyword">this</span>;
-<a name="l00360"></a>00360 ++my_index;
-<a name="l00361"></a>00361 my_value = NULL;
-<a name="l00362"></a>00362 <span class="keywordflow">return</span> result;
-<a name="l00363"></a>00363 }
-<a name="l00364"></a>00364
-<a name="l00366"></a>00366 enumerable_thread_specific_iterator operator--(<span class="keywordtype">int</span>) {
-<a name="l00367"></a>00367 enumerable_thread_specific_iterator result = *<span class="keyword">this</span>;
-<a name="l00368"></a>00368 --my_index;
-<a name="l00369"></a>00369 my_value = NULL;
-<a name="l00370"></a>00370 <span class="keywordflow">return</span> result;
-<a name="l00371"></a>00371 }
-<a name="l00372"></a>00372
-<a name="l00373"></a>00373 <span class="comment">// STL support</span>
-<a name="l00374"></a>00374 <span class="keyword">typedef</span> ptrdiff_t difference_type;
-<a name="l00375"></a>00375 <span class="keyword">typedef</span> Value value_type;
-<a name="l00376"></a>00376 <span class="keyword">typedef</span> Value* pointer;
-<a name="l00377"></a>00377 <span class="keyword">typedef</span> Value& reference;
-<a name="l00378"></a>00378 <span class="keyword">typedef</span> std::random_access_iterator_tag iterator_category;
-<a name="l00379"></a>00379 };
-<a name="l00380"></a>00380
-<a name="l00381"></a>00381 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> T>
-<a name="l00382"></a>00382 enumerable_thread_specific_iterator<Container,T> operator+( ptrdiff_t offset,
-<a name="l00383"></a>00383 <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,T>& v ) {
-<a name="l00384"></a>00384 <span class="keywordflow">return</span> enumerable_thread_specific_iterator<Container,T>( v.my_container, v.my_index + offset );
-<a name="l00385"></a>00385 }
-<a name="l00386"></a>00386
-<a name="l00387"></a>00387 <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="l00388"></a>00388 <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,T>& i,
-<a name="l00389"></a>00389 <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,U>& j ) {
-<a name="l00390"></a>00390 <span class="keywordflow">return</span> i.my_index==j.my_index && i.my_container == j.my_container;
-<a name="l00391"></a>00391 }
-<a name="l00392"></a>00392
-<a name="l00393"></a>00393 <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="l00394"></a>00394 <span class="keywordtype">bool</span> operator!=( <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,T>& i,
-<a name="l00395"></a>00395 <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,U>& j ) {
-<a name="l00396"></a>00396 <span class="keywordflow">return</span> !(i==j);
-<a name="l00397"></a>00397 }
-<a name="l00398"></a>00398
-<a name="l00399"></a>00399 <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="l00400"></a>00400 <span class="keywordtype">bool</span> operator<( const enumerable_thread_specific_iterator<Container,T>& i,
-<a name="l00401"></a>00401 <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,U>& j ) {
-<a name="l00402"></a>00402 <span class="keywordflow">return</span> i.my_index<j.my_index;
-<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> T, <span class="keyword">typename</span> U>
-<a name="l00406"></a>00406 <span class="keywordtype">bool</span> operator>( <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,T>& i,
-<a name="l00407"></a>00407 <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,U>& j ) {
-<a name="l00408"></a>00408 <span class="keywordflow">return</span> j<i;
-<a name="l00409"></a>00409 }
-<a name="l00410"></a>00410
-<a name="l00411"></a>00411 <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="l00412"></a>00412 <span class="keywordtype">bool</span> operator>=( <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,T>& i,
-<a name="l00413"></a>00413 <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,U>& j ) {
-<a name="l00414"></a>00414 <span class="keywordflow">return</span> !(i<j);
-<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<=( const enumerable_thread_specific_iterator<Container,T>& i,
-<a name="l00419"></a>00419 <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,U>& j ) {
-<a name="l00420"></a>00420 <span class="keywordflow">return</span> !(j<i);
-<a name="l00421"></a>00421 }
-<a name="l00422"></a>00422
-<a name="l00423"></a>00423 <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="l00424"></a>00424 ptrdiff_t operator-( <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,T>& i,
-<a name="l00425"></a>00425 <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,U>& j ) {
-<a name="l00426"></a>00426 <span class="keywordflow">return</span> i.my_index-j.my_index;
-<a name="l00427"></a>00427 }
-<a name="l00428"></a>00428
-<a name="l00429"></a>00429 <span class="keyword">template</span><<span class="keyword">typename</span> SegmentedContainer, <span class="keyword">typename</span> Value >
-<a name="l00430"></a>00430 <span class="keyword">class </span>segmented_iterator
-<a name="l00431"></a>00431 #if defined(_WIN64) && defined(_MSC_VER)
-<a name="l00432"></a>00432 : public std::iterator<std::input_iterator_tag, Value>
-<a name="l00433"></a>00433 #endif
-<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> T, <span class="keyword">typename</span> U>
-<a name="l00439"></a>00439 <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="l00440"></a>00440
-<a name="l00441"></a>00441 <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> U>
-<a name="l00442"></a>00442 <span class="keyword">friend</span> <span class="keyword">class </span>segmented_iterator;
-<a name="l00443"></a>00443
-<a name="l00444"></a>00444 <span class="keyword">public</span>:
-<a name="l00445"></a>00445
-<a name="l00446"></a>00446 segmented_iterator() {my_segcont = NULL;}
-<a name="l00447"></a>00447
-<a name="l00448"></a>00448 segmented_iterator( <span class="keyword">const</span> SegmentedContainer& _segmented_container ) :
-<a name="l00449"></a>00449 my_segcont(const_cast<SegmentedContainer*>(&_segmented_container)),
-<a name="l00450"></a>00450 outer_iter(my_segcont->end()) { }
-<a name="l00451"></a>00451
-<a name="l00452"></a>00452 ~segmented_iterator() {}
-<a name="l00453"></a>00453
-<a name="l00454"></a>00454 <span class="keyword">typedef</span> <span class="keyword">typename</span> SegmentedContainer::iterator outer_iterator;
-<a name="l00455"></a>00455 <span class="keyword">typedef</span> <span class="keyword">typename</span> SegmentedContainer::value_type InnerContainer;
-<a name="l00456"></a>00456 <span class="keyword">typedef</span> <span class="keyword">typename</span> InnerContainer::iterator inner_iterator;
-<a name="l00457"></a>00457
-<a name="l00458"></a>00458 <span class="comment">// STL support</span>
-<a name="l00459"></a>00459 <span class="keyword">typedef</span> ptrdiff_t difference_type;
-<a name="l00460"></a>00460 <span class="keyword">typedef</span> Value value_type;
-<a name="l00461"></a>00461 <span class="keyword">typedef</span> <span class="keyword">typename</span> SegmentedContainer::size_type size_type;
-<a name="l00462"></a>00462 <span class="keyword">typedef</span> Value* pointer;
-<a name="l00463"></a>00463 <span class="keyword">typedef</span> Value& reference;
-<a name="l00464"></a>00464 <span class="keyword">typedef</span> std::input_iterator_tag iterator_category;
-<a name="l00465"></a>00465
-<a name="l00466"></a>00466 <span class="comment">// Copy Constructor</span>
-<a name="l00467"></a>00467 <span class="keyword">template</span><<span class="keyword">typename</span> U>
-<a name="l00468"></a>00468 segmented_iterator(<span class="keyword">const</span> segmented_iterator<SegmentedContainer, U>& other) :
-<a name="l00469"></a>00469 my_segcont(other.my_segcont),
-<a name="l00470"></a>00470 outer_iter(other.outer_iter),
-<a name="l00471"></a>00471 <span class="comment">// can we assign a default-constructed iterator to inner if we're at the end?</span>
-<a name="l00472"></a>00472 inner_iter(other.inner_iter)
-<a name="l00473"></a>00473 {}
-<a name="l00474"></a>00474
-<a name="l00475"></a>00475 <span class="comment">// assignment</span>
-<a name="l00476"></a>00476 <span class="keyword">template</span><<span class="keyword">typename</span> U>
-<a name="l00477"></a>00477 segmented_iterator& operator=( <span class="keyword">const</span> segmented_iterator<SegmentedContainer, U>& other) {
-<a name="l00478"></a>00478 <span class="keywordflow">if</span>(<span class="keyword">this</span> != &other) {
-<a name="l00479"></a>00479 my_segcont = other.my_segcont;
-<a name="l00480"></a>00480 outer_iter = other.outer_iter;
-<a name="l00481"></a>00481 <span class="keywordflow">if</span>(outer_iter != my_segcont->end()) inner_iter = other.inner_iter;
-<a name="l00482"></a>00482 }
-<a name="l00483"></a>00483 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00484"></a>00484 }
-<a name="l00485"></a>00485
-<a name="l00486"></a>00486 <span class="comment">// allow assignment of outer iterator to segmented iterator. Once it is</span>
-<a name="l00487"></a>00487 <span class="comment">// assigned, move forward until a non-empty inner container is found or</span>
-<a name="l00488"></a>00488 <span class="comment">// the end of the outer container is reached.</span>
-<a name="l00489"></a>00489 segmented_iterator& operator=(<span class="keyword">const</span> outer_iterator& new_outer_iter) {
-<a name="l00490"></a>00490 __TBB_ASSERT(my_segcont != NULL, NULL);
-<a name="l00491"></a>00491 <span class="comment">// check that this iterator points to something inside the segmented container</span>
-<a name="l00492"></a>00492 <span class="keywordflow">for</span>(outer_iter = new_outer_iter ;outer_iter!=my_segcont->end(); ++outer_iter) {
-<a name="l00493"></a>00493 <span class="keywordflow">if</span>( !outer_iter->empty() ) {
-<a name="l00494"></a>00494 inner_iter = outer_iter->begin();
-<a name="l00495"></a>00495 <span class="keywordflow">break</span>;
-<a name="l00496"></a>00496 }
-<a name="l00497"></a>00497 }
-<a name="l00498"></a>00498 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00499"></a>00499 }
-<a name="l00500"></a>00500
-<a name="l00501"></a>00501 <span class="comment">// pre-increment</span>
-<a name="l00502"></a>00502 segmented_iterator& operator++() {
-<a name="l00503"></a>00503 advance_me();
-<a name="l00504"></a>00504 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00505"></a>00505 }
-<a name="l00506"></a>00506
-<a name="l00507"></a>00507 <span class="comment">// post-increment</span>
-<a name="l00508"></a>00508 segmented_iterator operator++(<span class="keywordtype">int</span>) {
-<a name="l00509"></a>00509 segmented_iterator tmp = *<span class="keyword">this</span>;
-<a name="l00510"></a>00510 operator++();
-<a name="l00511"></a>00511 <span class="keywordflow">return</span> tmp;
-<a name="l00512"></a>00512 }
-<a name="l00513"></a>00513
-<a name="l00514"></a>00514 <span class="keywordtype">bool</span> operator==(<span class="keyword">const</span> outer_iterator& other_outer)<span class="keyword"> const </span>{
-<a name="l00515"></a>00515 __TBB_ASSERT(my_segcont != NULL, NULL);
-<a name="l00516"></a>00516 <span class="keywordflow">return</span> (outer_iter == other_outer &&
-<a name="l00517"></a>00517 (outer_iter == my_segcont->end() || inner_iter == outer_iter->begin()));
-<a name="l00518"></a>00518 }
-<a name="l00519"></a>00519
-<a name="l00520"></a>00520 <span class="keywordtype">bool</span> operator!=(<span class="keyword">const</span> outer_iterator& other_outer)<span class="keyword"> const </span>{
-<a name="l00521"></a>00521 <span class="keywordflow">return</span> !operator==(other_outer);
-<a name="l00522"></a>00522
-<a name="l00523"></a>00523 }
-<a name="l00524"></a>00524
-<a name="l00525"></a>00525 <span class="comment">// (i)* RHS</span>
-<a name="l00526"></a>00526 reference operator*()<span class="keyword"> const </span>{
-<a name="l00527"></a>00527 __TBB_ASSERT(my_segcont != NULL, NULL);
-<a name="l00528"></a>00528 __TBB_ASSERT(outer_iter != my_segcont->end(), <span class="stringliteral">"Dereferencing a pointer at end of container"</span>);
-<a name="l00529"></a>00529 __TBB_ASSERT(inner_iter != outer_iter->end(), NULL); <span class="comment">// should never happen</span>
-<a name="l00530"></a>00530 <span class="keywordflow">return</span> *inner_iter;
-<a name="l00531"></a>00531 }
-<a name="l00532"></a>00532
-<a name="l00533"></a>00533 <span class="comment">// i-></span>
-<a name="l00534"></a>00534 pointer operator->()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> &operator*();}
-<a name="l00535"></a>00535
-<a name="l00536"></a>00536 <span class="keyword">private</span>:
-<a name="l00537"></a>00537 SegmentedContainer* my_segcont;
-<a name="l00538"></a>00538 outer_iterator outer_iter;
-<a name="l00539"></a>00539 inner_iterator inner_iter;
-<a name="l00540"></a>00540
-<a name="l00541"></a>00541 <span class="keywordtype">void</span> advance_me() {
-<a name="l00542"></a>00542 __TBB_ASSERT(my_segcont != NULL, NULL);
-<a name="l00543"></a>00543 __TBB_ASSERT(outer_iter != my_segcont->end(), NULL); <span class="comment">// not true if there are no inner containers</span>
-<a name="l00544"></a>00544 __TBB_ASSERT(inner_iter != outer_iter->end(), NULL); <span class="comment">// not true if the inner containers are all empty.</span>
-<a name="l00545"></a>00545 ++inner_iter;
-<a name="l00546"></a>00546 <span class="keywordflow">while</span>(inner_iter == outer_iter->end() && ++outer_iter != my_segcont->end()) {
-<a name="l00547"></a>00547 inner_iter = outer_iter->begin();
-<a name="l00548"></a>00548 }
-<a name="l00549"></a>00549 }
-<a name="l00550"></a>00550 }; <span class="comment">// segmented_iterator</span>
-<a name="l00551"></a>00551
-<a name="l00552"></a>00552 <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="l00553"></a>00553 <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> segmented_iterator<SegmentedContainer,T>& i,
-<a name="l00554"></a>00554 <span class="keyword">const</span> segmented_iterator<SegmentedContainer,U>& j ) {
-<a name="l00555"></a>00555 <span class="keywordflow">if</span>(i.my_segcont != j.my_segcont) <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l00556"></a>00556 <span class="keywordflow">if</span>(i.my_segcont == NULL) <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l00557"></a>00557 <span class="keywordflow">if</span>(i.outer_iter != j.outer_iter) <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l00558"></a>00558 <span class="keywordflow">if</span>(i.outer_iter == i.my_segcont->end()) <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l00559"></a>00559 <span class="keywordflow">return</span> i.inner_iter == j.inner_iter;
-<a name="l00560"></a>00560 }
-<a name="l00561"></a>00561
-<a name="l00562"></a>00562 <span class="comment">// !=</span>
-<a name="l00563"></a>00563 <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="l00564"></a>00564 <span class="keywordtype">bool</span> operator!=( <span class="keyword">const</span> segmented_iterator<SegmentedContainer,T>& i,
-<a name="l00565"></a>00565 <span class="keyword">const</span> segmented_iterator<SegmentedContainer,U>& j ) {
-<a name="l00566"></a>00566 <span class="keywordflow">return</span> !(i==j);
-<a name="l00567"></a>00567 }
-<a name="l00568"></a>00568
-<a name="l00569"></a>00569 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00570"></a>00570 <span class="keyword">struct </span>destruct_only: tbb::internal::no_copy {
-<a name="l00571"></a>00571 <a class="code" href="a00215.html">tbb::aligned_space<T,1></a> value;
-<a name="l00572"></a>00572 ~destruct_only() {value.begin()[0].~T();}
-<a name="l00573"></a>00573 };
-<a name="l00574"></a>00574
-<a name="l00575"></a>00575 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00576"></a>00576 <span class="keyword">struct </span>construct_by_default: tbb::internal::no_assign {
-<a name="l00577"></a>00577 <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="l00578"></a>00578 construct_by_default( <span class="keywordtype">int</span> ) {}
-<a name="l00579"></a>00579 };
-<a name="l00580"></a>00580
-<a name="l00581"></a>00581 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00582"></a>00582 <span class="keyword">struct </span>construct_by_exemplar: tbb::internal::no_assign {
-<a name="l00583"></a>00583 <span class="keyword">const</span> T exemplar;
-<a name="l00584"></a>00584 <span class="keywordtype">void</span> construct(<span class="keywordtype">void</span>*where) {<span class="keyword">new</span>(where) T(exemplar);}
-<a name="l00585"></a>00585 construct_by_exemplar( <span class="keyword">const</span> T& t ) : exemplar(t) {}
-<a name="l00586"></a>00586 };
-<a name="l00587"></a>00587
-<a name="l00588"></a>00588 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> Finit>
-<a name="l00589"></a>00589 <span class="keyword">struct </span>construct_by_finit: tbb::internal::no_assign {
-<a name="l00590"></a>00590 Finit f;
-<a name="l00591"></a>00591 <span class="keywordtype">void</span> construct(<span class="keywordtype">void</span>* where) {<span class="keyword">new</span>(where) T(f());}
-<a name="l00592"></a>00592 construct_by_finit( <span class="keyword">const</span> Finit& f_ ) : f(f_) {}
-<a name="l00593"></a>00593 };
-<a name="l00594"></a>00594
-<a name="l00595"></a>00595 <span class="comment">// storage for initialization function pointer</span>
-<a name="l00596"></a>00596 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00597"></a>00597 <span class="keyword">class </span>callback_base {
-<a name="l00598"></a>00598 <span class="keyword">public</span>:
-<a name="l00599"></a>00599 <span class="comment">// Clone *this</span>
-<a name="l00600"></a>00600 <span class="keyword">virtual</span> callback_base* clone() = 0;
-<a name="l00601"></a>00601 <span class="comment">// Destruct and free *this</span>
-<a name="l00602"></a>00602 <span class="keyword">virtual</span> <span class="keywordtype">void</span> destroy() = 0;
-<a name="l00603"></a>00603 <span class="comment">// Need virtual destructor to satisfy GCC compiler warning</span>
-<a name="l00604"></a>00604 <span class="keyword">virtual</span> ~callback_base() { }
-<a name="l00605"></a>00605 <span class="comment">// Construct T at where</span>
-<a name="l00606"></a>00606 <span class="keyword">virtual</span> <span class="keywordtype">void</span> construct(<span class="keywordtype">void</span>* where) = 0;
-<a name="l00607"></a>00607 };
-<a name="l00608"></a>00608
-<a name="l00609"></a>00609 <span class="keyword">template</span> <<span class="keyword">typename</span> T, <span class="keyword">typename</span> Constructor>
-<a name="l00610"></a>00610 <span class="keyword">class </span>callback_leaf: <span class="keyword">public</span> callback_base<T>, Constructor {
-<a name="l00611"></a>00611 <span class="keyword">template</span><<span class="keyword">typename</span> X> callback_leaf( <span class="keyword">const</span> X& x ) : Constructor(x) {}
-<a name="l00612"></a>00612
-<a name="l00613"></a>00613 <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00296.html">tbb::tbb_allocator<callback_leaf></a> my_allocator_type;
-<a name="l00614"></a>00614
-<a name="l00615"></a>00615 <span class="comment">/*override*/</span> callback_base<T>* clone() {
-<a name="l00616"></a>00616 <span class="keywordtype">void</span>* where = my_allocator_type().allocate(1);
-<a name="l00617"></a>00617 <span class="keywordflow">return</span> <span class="keyword">new</span>(where) callback_leaf(*<span class="keyword">this</span>);
-<a name="l00618"></a>00618 }
-<a name="l00619"></a>00619
-<a name="l00620"></a>00620 <span class="comment">/*override*/</span> <span class="keywordtype">void</span> destroy() {
-<a name="l00621"></a>00621 my_allocator_type().destroy(<span class="keyword">this</span>);
-<a name="l00622"></a>00622 my_allocator_type().deallocate(<span class="keyword">this</span>,1);
-<a name="l00623"></a>00623 }
-<a name="l00624"></a>00624
-<a name="l00625"></a>00625 <span class="comment">/*override*/</span> <span class="keywordtype">void</span> construct(<span class="keywordtype">void</span>* where) {
-<a name="l00626"></a>00626 Constructor::construct(where);
-<a name="l00627"></a>00627 }
-<a name="l00628"></a>00628 <span class="keyword">public</span>:
-<a name="l00629"></a>00629 <span class="keyword">template</span><<span class="keyword">typename</span> X>
-<a name="l00630"></a>00630 <span class="keyword">static</span> callback_base<T>* make( <span class="keyword">const</span> X& x ) {
-<a name="l00631"></a>00631 <span class="keywordtype">void</span>* where = my_allocator_type().allocate(1);
-<a name="l00632"></a>00632 <span class="keywordflow">return</span> <span class="keyword">new</span>(where) callback_leaf(x);
-<a name="l00633"></a>00633 }
-<a name="l00634"></a>00634 };
-<a name="l00635"></a>00635
-<a name="l00637"></a>00637
-<a name="l00642"></a>00642 <span class="keyword">template</span><<span class="keyword">typename</span> U, size_t ModularSize>
-<a name="l00643"></a>00643 <span class="keyword">struct </span>ets_element {
-<a name="l00644"></a>00644 <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="l00645"></a>00645 <span class="keywordtype">void</span> unconstruct() {
-<a name="l00646"></a>00646 tbb::internal::punned_cast<U*>(&value)->~U();
-<a name="l00647"></a>00647 }
-<a name="l00648"></a>00648 };
-<a name="l00649"></a>00649
-<a name="l00650"></a>00650 } <span class="comment">// namespace internal</span>
-<a name="l00652"></a>00652 <span class="comment"></span>
-<a name="l00654"></a>00654
-<a name="l00673"></a>00673 <span class="keyword">template</span> <<span class="keyword">typename</span> T,
-<a name="l00674"></a>00674 <span class="keyword">typename</span> Allocator=cache_aligned_allocator<T>,
-<a name="l00675"></a><a class="code" href="a00243.html">00675</a> <a class="code" href="a00362.html#a8622ae61b7e7737dac26542e181178e">ets_key_usage_type</a> ETS_key_type=ets_no_key >
-<a name="l00676"></a>00676 <span class="keyword">class </span><a class="code" href="a00243.html">enumerable_thread_specific</a>: internal::ets_base<ETS_key_type> {
-<a name="l00677"></a>00677
-<a name="l00678"></a>00678 <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="a00243.html">enumerable_thread_specific</a>;
-<a name="l00679"></a>00679
-<a name="l00680"></a>00680 <span class="keyword">typedef</span> internal::ets_element<T,sizeof(T)%tbb::internal::NFS_MaxLineSize> padded_element;
-<a name="l00681"></a>00681
-<a name="l00683"></a>00683 <span class="keyword">template</span><<span class="keyword">typename</span> I>
-<a name="l00684"></a>00684 <span class="keyword">class </span>generic_range_type: <span class="keyword">public</span> <a class="code" href="a00221.html">blocked_range</a><I> {
-<a name="l00685"></a>00685 <span class="keyword">public</span>:
-<a name="l00686"></a>00686 <span class="keyword">typedef</span> T value_type;
-<a name="l00687"></a>00687 <span class="keyword">typedef</span> T& reference;
-<a name="l00688"></a>00688 <span class="keyword">typedef</span> <span class="keyword">const</span> T& const_reference;
-<a name="l00689"></a>00689 <span class="keyword">typedef</span> I iterator;
-<a name="l00690"></a>00690 <span class="keyword">typedef</span> ptrdiff_t difference_type;
-<a name="l00691"></a>00691 generic_range_type( I begin_, I end_, size_t grainsize_ = 1) : <a class="code" href="a00221.html">blocked_range<I></a>(begin_,end_,grainsize_) {}
-<a name="l00692"></a>00692 template<typename U>
-<a name="l00693"></a>00693 generic_range_type( <span class="keyword">const</span> generic_range_type<U>& r) : <a class="code" href="a00221.html">blocked_range<I></a>(r.begin(),r.end(),r.grainsize()) {}
-<a name="l00694"></a>00694 generic_range_type( generic_range_type& r, <a class="code" href="a00290.html">split</a> ) : <a class="code" href="a00221.html">blocked_range<I></a>(r,<a class="code" href="a00290.html">split</a>()) {}
-<a name="l00695"></a>00695 };
-<a name="l00696"></a>00696
-<a name="l00697"></a>00697 <span class="keyword">typedef</span> <span class="keyword">typename</span> Allocator::template rebind< padded_element >::other padded_allocator_type;
-<a name="l00698"></a>00698 <span class="keyword">typedef</span> <a class="code" href="a00238.html">tbb::concurrent_vector< padded_element, padded_allocator_type ></a> <a class="code" href="a00238.html">internal_collection_type</a>;
-<a name="l00699"></a>00699
-<a name="l00700"></a>00700 internal::callback_base<T> *my_construct_callback;
-<a name="l00701"></a>00701
-<a name="l00702"></a>00702 internal_collection_type my_locals;
-<a name="l00703"></a>00703
-<a name="l00704"></a>00704 <span class="comment">/*override*/</span> <span class="keywordtype">void</span>* create_local() {
-<a name="l00705"></a>00705 <span class="preprocessor">#if TBB_DEPRECATED</span>
-<a name="l00706"></a>00706 <span class="preprocessor"></span> <span class="keywordtype">void</span>* lref = &my_locals[my_locals.<a class="code" href="a00238.html#e94e038f915c0268fdf2d3d7f87d81b8">push_back</a>(padded_element())];
-<a name="l00707"></a>00707 <span class="preprocessor">#else</span>
-<a name="l00708"></a>00708 <span class="preprocessor"></span> <span class="keywordtype">void</span>* lref = &*my_locals.<a class="code" href="a00238.html#e94e038f915c0268fdf2d3d7f87d81b8">push_back</a>(padded_element());
-<a name="l00709"></a>00709 <span class="preprocessor">#endif</span>
-<a name="l00710"></a>00710 <span class="preprocessor"></span> my_construct_callback->construct(lref);
-<a name="l00711"></a>00711 <span class="keywordflow">return</span> lref;
-<a name="l00712"></a>00712 }
-<a name="l00713"></a>00713
-<a name="l00714"></a>00714 <span class="keywordtype">void</span> unconstruct_locals() {
-<a name="l00715"></a>00715 <span class="keywordflow">for</span>(<span class="keyword">typename</span> internal_collection_type::iterator cvi = my_locals.<a class="code" href="a00238.html#730b23a251ecb6d37f692fb22f38e029">begin</a>(); cvi != my_locals.<a class="code" href="a00238.html#c0b51160e5a764982ec97a455f94f2c6">end</a>(); ++cvi) {
-<a name="l00716"></a>00716 cvi->unconstruct();
-<a name="l00717"></a>00717 }
-<a name="l00718"></a>00718 }
-<a name="l00719"></a>00719
-<a name="l00720"></a>00720 <span class="keyword">typedef</span> <span class="keyword">typename</span> Allocator::template rebind< uintptr_t >::other array_allocator_type;
-<a name="l00721"></a>00721
-<a name="l00722"></a>00722 <span class="comment">// _size is in bytes</span>
-<a name="l00723"></a>00723 <span class="comment">/*override*/</span> <span class="keywordtype">void</span>* create_array(size_t _size) {
-<a name="l00724"></a>00724 size_t nelements = (_size + <span class="keyword">sizeof</span>(uintptr_t) -1) / <span class="keyword">sizeof</span>(uintptr_t);
-<a name="l00725"></a>00725 <span class="keywordflow">return</span> array_allocator_type().allocate(nelements);
-<a name="l00726"></a>00726 }
-<a name="l00727"></a>00727
-<a name="l00728"></a>00728 <span class="comment">/*override*/</span> <span class="keywordtype">void</span> free_array( <span class="keywordtype">void</span>* _ptr, size_t _size) {
-<a name="l00729"></a>00729 size_t nelements = (_size + <span class="keyword">sizeof</span>(uintptr_t) -1) / <span class="keyword">sizeof</span>(uintptr_t);
-<a name="l00730"></a>00730 array_allocator_type().deallocate( reinterpret_cast<uintptr_t *>(_ptr),nelements);
-<a name="l00731"></a>00731 }
-<a name="l00732"></a>00732
-<a name="l00733"></a>00733 <span class="keyword">public</span>:
-<a name="l00734"></a>00734
-<a name="l00736"></a>00736 <span class="keyword">typedef</span> Allocator allocator_type;
-<a name="l00737"></a>00737 <span class="keyword">typedef</span> T value_type;
-<a name="l00738"></a>00738 <span class="keyword">typedef</span> T& reference;
-<a name="l00739"></a>00739 <span class="keyword">typedef</span> <span class="keyword">const</span> T& const_reference;
-<a name="l00740"></a>00740 <span class="keyword">typedef</span> T* pointer;
-<a name="l00741"></a>00741 <span class="keyword">typedef</span> <span class="keyword">const</span> T* const_pointer;
-<a name="l00742"></a>00742 <span class="keyword">typedef</span> <span class="keyword">typename</span> internal_collection_type::size_type size_type;
-<a name="l00743"></a>00743 <span class="keyword">typedef</span> <span class="keyword">typename</span> internal_collection_type::difference_type difference_type;
-<a name="l00744"></a>00744
-<a name="l00745"></a>00745 <span class="comment">// Iterator types</span>
-<a name="l00746"></a>00746 <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::enumerable_thread_specific_iterator< internal_collection_type, value_type > iterator;
-<a name="l00747"></a>00747 <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="l00748"></a>00748
-<a name="l00749"></a>00749 <span class="comment">// Parallel range types</span>
-<a name="l00750"></a>00750 <span class="keyword">typedef</span> generic_range_type< iterator > range_type;
-<a name="l00751"></a>00751 <span class="keyword">typedef</span> generic_range_type< const_iterator > const_range_type;
-<a name="l00752"></a>00752
-<a name="l00754"></a>00754 <a class="code" href="a00243.html">enumerable_thread_specific</a>() :
-<a name="l00755"></a>00755 my_construct_callback( internal::callback_leaf<T,internal::construct_by_default<T> >::make(<span class="comment">/*dummy argument*/</span>0) )
-<a name="l00756"></a>00756 {}
-<a name="l00757"></a>00757
-<a name="l00759"></a><a class="code" href="a00243.html#8d4b456ff9d7b289c73254eccc11db45">00759</a> <span class="keyword">template</span> <<span class="keyword">typename</span> Finit>
-<a name="l00760"></a>00760 <a class="code" href="a00243.html">enumerable_thread_specific</a>( Finit finit ) :
-<a name="l00761"></a>00761 my_construct_callback( internal::callback_leaf<T,internal::construct_by_finit<T,Finit> >::make( finit ) )
-<a name="l00762"></a>00762 {}
-<a name="l00763"></a>00763
-<a name="l00765"></a>00765 <a class="code" href="a00243.html">enumerable_thread_specific</a>(<span class="keyword">const</span> T& exemplar) :
-<a name="l00766"></a>00766 my_construct_callback( internal::callback_leaf<T,internal::construct_by_exemplar<T> >::make( exemplar ) )
-<a name="l00767"></a>00767 {}
-<a name="l00768"></a>00768
-<a name="l00770"></a>00770 ~<a class="code" href="a00243.html">enumerable_thread_specific</a>() {
-<a name="l00771"></a>00771 my_construct_callback->destroy();
-<a name="l00772"></a>00772 this->clear(); <span class="comment">// deallocation before the derived class is finished destructing</span>
-<a name="l00773"></a>00773 <span class="comment">// So free(array *) is still accessible</span>
-<a name="l00774"></a>00774 }
-<a name="l00775"></a>00775
-<a name="l00777"></a>00777 reference local() {
-<a name="l00778"></a>00778 <span class="keywordtype">bool</span> exists;
-<a name="l00779"></a>00779 <span class="keywordflow">return</span> local(exists);
-<a name="l00780"></a>00780 }
-<a name="l00781"></a>00781
-<a name="l00783"></a>00783 reference local(<span class="keywordtype">bool</span>& exists) {
-<a name="l00784"></a>00784 <span class="keywordtype">void</span>* ptr = this->table_lookup(exists);
-<a name="l00785"></a>00785 <span class="keywordflow">return</span> *(T*)ptr;
-<a name="l00786"></a>00786 }
-<a name="l00787"></a>00787
-<a name="l00789"></a>00789 size_type size()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> my_locals.<a class="code" href="a00238.html#715fe313c4a9c22731cc404dd80c9ec9">size</a>(); }
-<a name="l00790"></a>00790
-<a name="l00792"></a>00792 <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> my_locals.<a class="code" href="a00238.html#c6426cb93cf20d3af40f3c90f1f0481a">empty</a>(); }
-<a name="l00793"></a>00793
-<a name="l00795"></a>00795 iterator begin() { <span class="keywordflow">return</span> iterator( my_locals, 0 ); }
-<a name="l00797"></a>00797 iterator end() { <span class="keywordflow">return</span> iterator(my_locals, my_locals.<a class="code" href="a00238.html#715fe313c4a9c22731cc404dd80c9ec9">size</a>() ); }
-<a name="l00798"></a>00798
-<a name="l00800"></a>00800 const_iterator begin()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> const_iterator(my_locals, 0); }
-<a name="l00801"></a>00801
-<a name="l00803"></a>00803 const_iterator end()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> const_iterator(my_locals, my_locals.<a class="code" href="a00238.html#715fe313c4a9c22731cc404dd80c9ec9">size</a>()); }
-<a name="l00804"></a>00804
-<a name="l00806"></a>00806 range_type range( size_t grainsize=1 ) { <span class="keywordflow">return</span> range_type( begin(), end(), grainsize ); }
-<a name="l00807"></a>00807
-<a name="l00809"></a>00809 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="l00810"></a>00810
-<a name="l00812"></a>00812 <span class="keywordtype">void</span> clear() {
-<a name="l00813"></a>00813 unconstruct_locals();
-<a name="l00814"></a>00814 my_locals.<a class="code" href="a00238.html#26f937a359a66b6aae904c3cd9a3c444">clear</a>();
-<a name="l00815"></a>00815 this->table_clear();
-<a name="l00816"></a>00816 <span class="comment">// callback is not destroyed</span>
-<a name="l00817"></a>00817 <span class="comment">// exemplar is not destroyed</span>
-<a name="l00818"></a>00818 }
-<a name="l00819"></a>00819
-<a name="l00820"></a>00820 <span class="keyword">private</span>:
-<a name="l00821"></a>00821
-<a name="l00822"></a>00822 <span class="keyword">template</span><<span class="keyword">typename</span> U, <span class="keyword">typename</span> A2, ets_key_usage_type C2>
-<a name="l00823"></a>00823 <span class="keywordtype">void</span> internal_copy( <span class="keyword">const</span> enumerable_thread_specific<U, A2, C2>& other);
-<a name="l00824"></a>00824
-<a name="l00825"></a>00825 <span class="keyword">public</span>:
-<a name="l00826"></a>00826
-<a name="l00827"></a>00827 <span class="keyword">template</span><<span class="keyword">typename</span> U, <span class="keyword">typename</span> Alloc, ets_key_usage_type Cachetype>
-<a name="l00828"></a>00828 enumerable_thread_specific( <span class="keyword">const</span> enumerable_thread_specific<U, Alloc, Cachetype>& other ) : internal::ets_base<ETS_key_type> ()
-<a name="l00829"></a>00829 {
-<a name="l00830"></a>00830 internal_copy(other);
-<a name="l00831"></a>00831 }
-<a name="l00832"></a>00832
-<a name="l00833"></a>00833 enumerable_thread_specific( <span class="keyword">const</span> enumerable_thread_specific& other ) : internal::ets_base<ETS_key_type> ()
-<a name="l00834"></a>00834 {
-<a name="l00835"></a>00835 internal_copy(other);
-<a name="l00836"></a>00836 }
-<a name="l00837"></a>00837
-<a name="l00838"></a>00838 <span class="keyword">private</span>:
-<a name="l00839"></a>00839
-<a name="l00840"></a>00840 <span class="keyword">template</span><<span class="keyword">typename</span> U, <span class="keyword">typename</span> A2, ets_key_usage_type C2>
-<a name="l00841"></a>00841 enumerable_thread_specific &
-<a name="l00842"></a>00842 internal_assign(<span class="keyword">const</span> enumerable_thread_specific<U, A2, C2>& other) {
-<a name="l00843"></a>00843 <span class="keywordflow">if</span>(static_cast<void *>( <span class="keyword">this</span> ) != static_cast<const void *>( &other )) {
-<a name="l00844"></a>00844 this->clear();
-<a name="l00845"></a>00845 my_construct_callback->destroy();
-<a name="l00846"></a>00846 my_construct_callback = 0;
-<a name="l00847"></a>00847 internal_copy( other );
-<a name="l00848"></a>00848 }
-<a name="l00849"></a>00849 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00850"></a>00850 }
-<a name="l00851"></a>00851
-<a name="l00852"></a>00852 <span class="keyword">public</span>:
-<a name="l00853"></a>00853
-<a name="l00854"></a>00854 <span class="comment">// assignment</span>
-<a name="l00855"></a>00855 enumerable_thread_specific& operator=(<span class="keyword">const</span> enumerable_thread_specific& other) {
-<a name="l00856"></a>00856 <span class="keywordflow">return</span> internal_assign(other);
-<a name="l00857"></a>00857 }
-<a name="l00858"></a>00858
-<a name="l00859"></a>00859 <span class="keyword">template</span><<span class="keyword">typename</span> U, <span class="keyword">typename</span> Alloc, ets_key_usage_type Cachetype>
-<a name="l00860"></a>00860 enumerable_thread_specific& operator=(<span class="keyword">const</span> enumerable_thread_specific<U, Alloc, Cachetype>& other)
-<a name="l00861"></a>00861 {
-<a name="l00862"></a>00862 <span class="keywordflow">return</span> internal_assign(other);
-<a name="l00863"></a>00863 }
-<a name="l00864"></a>00864
-<a name="l00865"></a>00865 <span class="comment">// combine_func_t has signature T(T,T) or T(const T&, const T&)</span>
-<a name="l00866"></a>00866 <span class="keyword">template</span> <<span class="keyword">typename</span> combine_func_t>
-<a name="l00867"></a>00867 T combine(combine_func_t f_combine) {
-<a name="l00868"></a>00868 <span class="keywordflow">if</span>(begin() == end()) {
-<a name="l00869"></a>00869 internal::destruct_only<T> location;
-<a name="l00870"></a>00870 my_construct_callback->construct(location.value.begin());
-<a name="l00871"></a>00871 <span class="keywordflow">return</span> *location.value.begin();
-<a name="l00872"></a>00872 }
-<a name="l00873"></a>00873 const_iterator ci = begin();
-<a name="l00874"></a>00874 T my_result = *ci;
-<a name="l00875"></a>00875 <span class="keywordflow">while</span>(++ci != end())
-<a name="l00876"></a>00876 my_result = f_combine( my_result, *ci );
-<a name="l00877"></a>00877 <span class="keywordflow">return</span> my_result;
-<a name="l00878"></a>00878 }
-<a name="l00879"></a>00879
-<a name="l00880"></a>00880 <span class="comment">// combine_func_t has signature void(T) or void(const T&)</span>
-<a name="l00881"></a>00881 <span class="keyword">template</span> <<span class="keyword">typename</span> combine_func_t>
-<a name="l00882"></a>00882 <span class="keywordtype">void</span> combine_each(combine_func_t f_combine) {
-<a name="l00883"></a>00883 <span class="keywordflow">for</span>(const_iterator ci = begin(); ci != end(); ++ci) {
-<a name="l00884"></a>00884 f_combine( *ci );
-<a name="l00885"></a>00885 }
-<a name="l00886"></a>00886 }
-<a name="l00887"></a>00887
-<a name="l00888"></a>00888 }; <span class="comment">// enumerable_thread_specific</span>
-<a name="l00889"></a>00889
-<a name="l00890"></a>00890 <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="l00891"></a>00891 <span class="keyword">template</span><<span class="keyword">typename</span> U, <span class="keyword">typename</span> A2, ets_key_usage_type C2>
-<a name="l00892"></a>00892 <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="l00893"></a>00893 <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="l00894"></a>00894 my_construct_callback = other.my_construct_callback->clone();
-<a name="l00895"></a>00895
-<a name="l00896"></a>00896 <span class="keyword">typedef</span> internal::ets_base<ets_no_key> base;
-<a name="l00897"></a>00897 __TBB_ASSERT(my_locals.<a class="code" href="a00238.html#715fe313c4a9c22731cc404dd80c9ec9">size</a>()==0,NULL);
-<a name="l00898"></a>00898 this->table_reserve_for_copy( other );
-<a name="l00899"></a>00899 <span class="keywordflow">for</span>( base::array* r=other.my_root; r; r=r->next ) {
-<a name="l00900"></a>00900 <span class="keywordflow">for</span>( size_t i=0; i<r-><a class="code" href="a00221.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>(); ++i ) {
-<a name="l00901"></a>00901 base::slot& s1 = r->at(i);
-<a name="l00902"></a>00902 <span class="keywordflow">if</span>( !s1.empty() ) {
-<a name="l00903"></a>00903 base::slot& s2 = this->table_find(s1.key);
-<a name="l00904"></a>00904 <span class="keywordflow">if</span>( s2.empty() ) {
-<a name="l00905"></a>00905 #<span class="keywordflow">if</span> TBB_DEPRECATED
-<a name="l00906"></a>00906 <span class="keywordtype">void</span>* lref = &my_locals[my_locals.<a class="code" href="a00238.html#e94e038f915c0268fdf2d3d7f87d81b8">push_back</a>(padded_element())];
-<a name="l00907"></a>00907 <span class="preprocessor">#else</span>
-<a name="l00908"></a>00908 <span class="preprocessor"></span> <span class="keywordtype">void</span>* lref = &*my_locals.<a class="code" href="a00238.html#e94e038f915c0268fdf2d3d7f87d81b8">push_back</a>(padded_element());
-<a name="l00909"></a>00909 <span class="preprocessor">#endif</span>
-<a name="l00910"></a>00910 <span class="preprocessor"></span> s2.ptr = <span class="keyword">new</span>(lref) T(*(U*)s1.ptr);
-<a name="l00911"></a>00911 s2.key = s1.key;
-<a name="l00912"></a>00912 } <span class="keywordflow">else</span> {
-<a name="l00913"></a>00913 <span class="comment">// Skip the duplicate</span>
-<a name="l00914"></a>00914 }
-<a name="l00915"></a>00915 }
-<a name="l00916"></a>00916 }
-<a name="l00917"></a>00917 }
-<a name="l00918"></a>00918 }
-<a name="l00919"></a>00919
-<a name="l00920"></a>00920 <span class="keyword">template</span>< <span class="keyword">typename</span> Container >
-<a name="l00921"></a>00921 <span class="keyword">class </span>flattened2d {
-<a name="l00922"></a>00922
-<a name="l00923"></a>00923 <span class="comment">// This intermediate typedef is to address issues with VC7.1 compilers</span>
-<a name="l00924"></a>00924 <span class="keyword">typedef</span> <span class="keyword">typename</span> Container::value_type conval_type;
-<a name="l00925"></a>00925
-<a name="l00926"></a>00926 <span class="keyword">public</span>:
-<a name="l00927"></a>00927
-<a name="l00929"></a>00929 <span class="keyword">typedef</span> <span class="keyword">typename</span> conval_type::size_type size_type;
-<a name="l00930"></a>00930 <span class="keyword">typedef</span> <span class="keyword">typename</span> conval_type::difference_type difference_type;
-<a name="l00931"></a>00931 <span class="keyword">typedef</span> <span class="keyword">typename</span> conval_type::allocator_type allocator_type;
-<a name="l00932"></a>00932 <span class="keyword">typedef</span> <span class="keyword">typename</span> conval_type::value_type value_type;
-<a name="l00933"></a>00933 <span class="keyword">typedef</span> <span class="keyword">typename</span> conval_type::reference reference;
-<a name="l00934"></a>00934 <span class="keyword">typedef</span> <span class="keyword">typename</span> conval_type::const_reference const_reference;
-<a name="l00935"></a>00935 <span class="keyword">typedef</span> <span class="keyword">typename</span> conval_type::pointer pointer;
-<a name="l00936"></a>00936 <span class="keyword">typedef</span> <span class="keyword">typename</span> conval_type::const_pointer const_pointer;
-<a name="l00937"></a>00937
-<a name="l00938"></a>00938 <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::segmented_iterator<Container, value_type> iterator;
-<a name="l00939"></a>00939 <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::segmented_iterator<Container, const value_type> const_iterator;
-<a name="l00940"></a>00940
-<a name="l00941"></a>00941 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="l00942"></a>00942 my_container(const_cast<Container*>(&c)), my_begin(b), my_end(e) { }
-<a name="l00943"></a>00943
-<a name="l00944"></a>00944 flattened2d( <span class="keyword">const</span> Container &c ) :
-<a name="l00945"></a>00945 my_container(const_cast<Container*>(&c)), my_begin(c.begin()), my_end(c.end()) { }
-<a name="l00946"></a>00946
-<a name="l00947"></a>00947 iterator begin() { <span class="keywordflow">return</span> iterator(*my_container) = my_begin; }
-<a name="l00948"></a>00948 iterator end() { <span class="keywordflow">return</span> iterator(*my_container) = my_end; }
-<a name="l00949"></a>00949 const_iterator begin()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> const_iterator(*my_container) = my_begin; }
-<a name="l00950"></a>00950 const_iterator end()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> const_iterator(*my_container) = my_end; }
-<a name="l00951"></a>00951
-<a name="l00952"></a>00952 size_type size()<span class="keyword"> const </span>{
-<a name="l00953"></a>00953 size_type tot_size = 0;
-<a name="l00954"></a>00954 <span class="keywordflow">for</span>(<span class="keyword">typename</span> Container::const_iterator i = my_begin; i != my_end; ++i) {
-<a name="l00955"></a>00955 tot_size += i->size();
-<a name="l00956"></a>00956 }
-<a name="l00957"></a>00957 <span class="keywordflow">return</span> tot_size;
-<a name="l00958"></a>00958 }
-<a name="l00959"></a>00959
-<a name="l00960"></a>00960 <span class="keyword">private</span>:
-<a name="l00961"></a>00961
-<a name="l00962"></a>00962 Container *my_container;
-<a name="l00963"></a>00963 <span class="keyword">typename</span> Container::const_iterator my_begin;
-<a name="l00964"></a>00964 <span class="keyword">typename</span> Container::const_iterator my_end;
-<a name="l00965"></a>00965
-<a name="l00966"></a>00966 };
-<a name="l00967"></a>00967
-<a name="l00968"></a>00968 <span class="keyword">template</span> <<span class="keyword">typename</span> Container>
-<a name="l00969"></a>00969 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="l00970"></a>00970 <span class="keywordflow">return</span> flattened2d<Container>(c, b, e);
-<a name="l00971"></a>00971 }
-<a name="l00972"></a>00972
-<a name="l00973"></a>00973 <span class="keyword">template</span> <<span class="keyword">typename</span> Container>
-<a name="l00974"></a>00974 flattened2d<Container> flatten2d(<span class="keyword">const</span> Container &c) {
-<a name="l00975"></a>00975 <span class="keywordflow">return</span> flattened2d<Container>(c);
-<a name="l00976"></a>00976 }
-<a name="l00977"></a>00977
-<a name="l00978"></a>00978 } <span class="comment">// interface6</span>
-<a name="l00979"></a>00979
-<a name="l00980"></a>00980 <span class="keyword">namespace </span>internal {
-<a name="l00981"></a>00981 <span class="keyword">using</span> interface6::internal::segmented_iterator;
-<a name="l00982"></a>00982 }
-<a name="l00983"></a>00983
-<a name="l00984"></a>00984 <span class="keyword">using</span> interface6::enumerable_thread_specific;
-<a name="l00985"></a>00985 <span class="keyword">using</span> interface6::flattened2d;
-<a name="l00986"></a>00986 <span class="keyword">using</span> interface6::flatten2d;
-<a name="l00987"></a>00987
-<a name="l00988"></a>00988 } <span class="comment">// namespace tbb</span>
-<a name="l00989"></a>00989
-<a name="l00990"></a>00990 <span class="preprocessor">#endif</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2011 Intel Corporation. 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
new file mode 100644
index 0000000..c82dc24
--- /dev/null
+++ b/doc/html/a00455.html
@@ -0,0 +1,968 @@
+<!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-2011 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="a00383.html#a8622ae61b7e7737dac26542e181178e">00040</a> <span class="keyword">enum</span> <a class="code" href="a00383.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_GCC_3_3_PROTECTED_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="a00228.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_GCC_3_3_PROTECTED_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="preprocessor">#if __TBB_WORDSIZE == 4</span>
+<a name="l00116"></a>00116 <span class="preprocessor"></span> <span class="keywordflow">return</span> uintptr_t(k)*0x9E3779B9;
+<a name="l00117"></a>00117 <span class="preprocessor">#else</span>
+<a name="l00118"></a>00118 <span class="preprocessor"></span> <span class="keywordflow">return</span> uintptr_t(k)*0x9E3779B97F4A7C15;
+<a name="l00119"></a>00119 <span class="preprocessor">#endif </span>
+<a name="l00120"></a>00120 <span class="preprocessor"></span> }
+<a name="l00121"></a>00121
+<a name="l00122"></a>00122 ets_base() {my_root=NULL; my_count=0;}
+<a name="l00123"></a>00123 <span class="keyword">virtual</span> ~ets_base(); <span class="comment">// g++ complains if this is not virtual...</span>
+<a name="l00124"></a>00124 <span class="keywordtype">void</span>* table_lookup( <span class="keywordtype">bool</span>& exists );
+<a name="l00125"></a>00125 <span class="keywordtype">void</span> table_clear();
+<a name="l00126"></a>00126 slot& table_find( key_type k ) {
+<a name="l00127"></a>00127 size_t h = hash(k);
+<a name="l00128"></a>00128 array* r = my_root;
+<a name="l00129"></a>00129 size_t mask = r->mask();
+<a name="l00130"></a>00130 <span class="keywordflow">for</span>(size_t i = r->start(h);;i=(i+1)&mask) {
+<a name="l00131"></a>00131 slot& s = r->at(i);
+<a name="l00132"></a>00132 <span class="keywordflow">if</span>( s.empty() || s.match(k) )
+<a name="l00133"></a>00133 <span class="keywordflow">return</span> s;
+<a name="l00134"></a>00134 }
+<a name="l00135"></a>00135 }
+<a name="l00136"></a>00136 <span class="keywordtype">void</span> table_reserve_for_copy( <span class="keyword">const</span> ets_base& other ) {
+<a name="l00137"></a>00137 __TBB_ASSERT(!my_root,NULL);
+<a name="l00138"></a>00138 __TBB_ASSERT(!my_count,NULL);
+<a name="l00139"></a>00139 <span class="keywordflow">if</span>( other.my_root ) {
+<a name="l00140"></a>00140 array* a = allocate(other.my_root->lg_size);
+<a name="l00141"></a>00141 a->next = NULL;
+<a name="l00142"></a>00142 my_root = a;
+<a name="l00143"></a>00143 my_count = other.my_count;
+<a name="l00144"></a>00144 }
+<a name="l00145"></a>00145 }
+<a name="l00146"></a>00146 };
+<a name="l00147"></a>00147
+<a name="l00148"></a>00148 <span class="keyword">template</span><ets_key_usage_type ETS_key_type>
+<a name="l00149"></a>00149 ets_base<ETS_key_type>::~ets_base() {
+<a name="l00150"></a>00150 __TBB_ASSERT(!my_root, NULL);
+<a name="l00151"></a>00151 }
+<a name="l00152"></a>00152
+<a name="l00153"></a>00153 <span class="keyword">template</span><ets_key_usage_type ETS_key_type>
+<a name="l00154"></a>00154 <span class="keywordtype">void</span> ets_base<ETS_key_type>::table_clear() {
+<a name="l00155"></a>00155 <span class="keywordflow">while</span>( array* r = my_root ) {
+<a name="l00156"></a>00156 my_root = r->next;
+<a name="l00157"></a>00157 free(r);
+<a name="l00158"></a>00158 }
+<a name="l00159"></a>00159 my_count = 0;
+<a name="l00160"></a>00160 }
+<a name="l00161"></a>00161
+<a name="l00162"></a>00162 <span class="keyword">template</span><ets_key_usage_type ETS_key_type>
+<a name="l00163"></a>00163 <span class="keywordtype">void</span>* ets_base<ETS_key_type>::table_lookup( <span class="keywordtype">bool</span>& exists ) {
+<a name="l00164"></a>00164 <span class="keyword">const</span> key_type k = key_of_current_thread();
+<a name="l00165"></a>00165
+<a name="l00166"></a>00166 __TBB_ASSERT(k!=0,NULL);
+<a name="l00167"></a>00167 <span class="keywordtype">void</span>* found;
+<a name="l00168"></a>00168 size_t h = hash(k);
+<a name="l00169"></a>00169 <span class="keywordflow">for</span>( array* r=my_root; r; r=r->next ) {
+<a name="l00170"></a>00170 size_t mask=r->mask();
+<a name="l00171"></a>00171 <span class="keywordflow">for</span>(size_t i = r->start(h); ;i=(i+1)&mask) {
+<a name="l00172"></a>00172 slot& s = r->at(i);
+<a name="l00173"></a>00173 <span class="keywordflow">if</span>( s.empty() ) <span class="keywordflow">break</span>;
+<a name="l00174"></a>00174 <span class="keywordflow">if</span>( s.match(k) ) {
+<a name="l00175"></a>00175 <span class="keywordflow">if</span>( r==my_root ) {
+<a name="l00176"></a>00176 <span class="comment">// Success at top level</span>
+<a name="l00177"></a>00177 exists = <span class="keyword">true</span>;
+<a name="l00178"></a>00178 <span class="keywordflow">return</span> s.ptr;
+<a name="l00179"></a>00179 } <span class="keywordflow">else</span> {
+<a name="l00180"></a>00180 <span class="comment">// Success at some other level. Need to insert at top level.</span>
+<a name="l00181"></a>00181 exists = <span class="keyword">true</span>;
+<a name="l00182"></a>00182 found = s.ptr;
+<a name="l00183"></a>00183 <span class="keywordflow">goto</span> insert;
+<a name="l00184"></a>00184 }
+<a name="l00185"></a>00185 }
+<a name="l00186"></a>00186 }
+<a name="l00187"></a>00187 }
+<a name="l00188"></a>00188 <span class="comment">// Key does not yet exist</span>
+<a name="l00189"></a>00189 exists = <span class="keyword">false</span>;
+<a name="l00190"></a>00190 found = create_local();
+<a name="l00191"></a>00191 {
+<a name="l00192"></a>00192 size_t c = ++my_count;
+<a name="l00193"></a>00193 array* r = my_root;
+<a name="l00194"></a>00194 <span class="keywordflow">if</span>( !r || c>r->size()/2 ) {
+<a name="l00195"></a>00195 size_t s = r ? r->lg_size : 2;
+<a name="l00196"></a>00196 <span class="keywordflow">while</span>( c>size_t(1)<<(s-1) ) ++s;
+<a name="l00197"></a>00197 array* a = allocate(s);
+<a name="l00198"></a>00198 <span class="keywordflow">for</span>(;;) {
+<a name="l00199"></a>00199 a->next = my_root;
+<a name="l00200"></a>00200 array* new_r = my_root.compare_and_swap(a,r);
+<a name="l00201"></a>00201 <span class="keywordflow">if</span>( new_r==r ) <span class="keywordflow">break</span>;
+<a name="l00202"></a>00202 <span class="keywordflow">if</span>( new_r->lg_size>=s ) {
+<a name="l00203"></a>00203 <span class="comment">// Another thread inserted an equal or bigger array, so our array is superfluous.</span>
+<a name="l00204"></a>00204 free(a);
+<a name="l00205"></a>00205 <span class="keywordflow">break</span>;
+<a name="l00206"></a>00206 }
+<a name="l00207"></a>00207 r = new_r;
+<a name="l00208"></a>00208 }
+<a name="l00209"></a>00209 }
+<a name="l00210"></a>00210 }
+<a name="l00211"></a>00211 insert:
+<a name="l00212"></a>00212 <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="l00213"></a>00213 array* ir = my_root;
+<a name="l00214"></a>00214 size_t mask = ir->mask();
+<a name="l00215"></a>00215 <span class="keywordflow">for</span>(size_t i = ir->start(h);;i=(i+1)&mask) {
+<a name="l00216"></a>00216 slot& s = ir->at(i);
+<a name="l00217"></a>00217 <span class="keywordflow">if</span>( s.empty() ) {
+<a name="l00218"></a>00218 <span class="keywordflow">if</span>( s.claim(k) ) {
+<a name="l00219"></a>00219 s.ptr = found;
+<a name="l00220"></a>00220 <span class="keywordflow">return</span> found;
+<a name="l00221"></a>00221 }
+<a name="l00222"></a>00222 }
+<a name="l00223"></a>00223 }
+<a name="l00224"></a>00224 }
+<a name="l00225"></a>00225
+<a name="l00227"></a>00227 <span class="keyword">template</span> <>
+<a name="l00228"></a>00228 <span class="keyword">class </span>ets_base<ets_key_per_instance>: <span class="keyword">protected</span> ets_base<ets_no_key> {
+<a name="l00229"></a>00229 <span class="keyword">typedef</span> ets_base<ets_no_key> super;
+<a name="l00230"></a>00230 <span class="preprocessor">#if _WIN32||_WIN64</span>
+<a name="l00231"></a>00231 <span class="preprocessor"></span> <span class="keyword">typedef</span> DWORD tls_key_t;
+<a name="l00232"></a>00232 <span class="keywordtype">void</span> create_key() { my_key = TlsAlloc(); }
+<a name="l00233"></a>00233 <span class="keywordtype">void</span> destroy_key() { TlsFree(my_key); }
+<a name="l00234"></a>00234 <span class="keywordtype">void</span> set_tls(<span class="keywordtype">void</span> * value) { TlsSetValue(my_key, (LPVOID)value); }
+<a name="l00235"></a>00235 <span class="keywordtype">void</span>* get_tls() { <span class="keywordflow">return</span> (<span class="keywordtype">void</span> *)TlsGetValue(my_key); }
+<a name="l00236"></a>00236 <span class="preprocessor">#else</span>
+<a name="l00237"></a>00237 <span class="preprocessor"></span> <span class="keyword">typedef</span> pthread_key_t tls_key_t;
+<a name="l00238"></a>00238 <span class="keywordtype">void</span> create_key() { pthread_key_create(&my_key, NULL); }
+<a name="l00239"></a>00239 <span class="keywordtype">void</span> destroy_key() { pthread_key_delete(my_key); }
+<a name="l00240"></a>00240 <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="l00241"></a>00241 <span class="keywordtype">void</span>* get_tls()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> pthread_getspecific(my_key); }
+<a name="l00242"></a>00242 <span class="preprocessor">#endif</span>
+<a name="l00243"></a>00243 <span class="preprocessor"></span> tls_key_t my_key;
+<a name="l00244"></a>00244 <span class="keyword">virtual</span> <span class="keywordtype">void</span>* create_local() = 0;
+<a name="l00245"></a>00245 <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="l00246"></a>00246 <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="l00247"></a>00247 <span class="keyword">public</span>:
+<a name="l00248"></a>00248 ets_base() {create_key();}
+<a name="l00249"></a>00249 ~ets_base() {destroy_key();}
+<a name="l00250"></a>00250 <span class="keywordtype">void</span>* table_lookup( <span class="keywordtype">bool</span>& exists ) {
+<a name="l00251"></a>00251 <span class="keywordtype">void</span>* found = get_tls();
+<a name="l00252"></a>00252 <span class="keywordflow">if</span>( found ) {
+<a name="l00253"></a>00253 exists=<span class="keyword">true</span>;
+<a name="l00254"></a>00254 } <span class="keywordflow">else</span> {
+<a name="l00255"></a>00255 found = super::table_lookup(exists);
+<a name="l00256"></a>00256 set_tls(found);
+<a name="l00257"></a>00257 }
+<a name="l00258"></a>00258 <span class="keywordflow">return</span> found;
+<a name="l00259"></a>00259 }
+<a name="l00260"></a>00260 <span class="keywordtype">void</span> table_clear() {
+<a name="l00261"></a>00261 destroy_key();
+<a name="l00262"></a>00262 create_key();
+<a name="l00263"></a>00263 super::table_clear();
+<a name="l00264"></a>00264 }
+<a name="l00265"></a>00265 };
+<a name="l00266"></a>00266
+<a name="l00268"></a>00268 <span class="keyword">template</span>< <span class="keyword">typename</span> Container, <span class="keyword">typename</span> Value >
+<a name="l00269"></a>00269 <span class="keyword">class </span>enumerable_thread_specific_iterator
+<a name="l00270"></a>00270 #if defined(_WIN64) && defined(_MSC_VER)
+<a name="l00271"></a>00271 <span class="comment">// Ensure that Microsoft's internal template function _Val_type works correctly.</span>
+<a name="l00272"></a>00272 : public std::iterator<std::random_access_iterator_tag,Value>
+<a name="l00273"></a>00273 #endif <span class="comment">/* defined(_WIN64) && defined(_MSC_VER) */</span>
+<a name="l00274"></a>00274 {
+<a name="l00276"></a>00276
+<a name="l00277"></a>00277 Container *my_container;
+<a name="l00278"></a>00278 <span class="keyword">typename</span> Container::size_type my_index;
+<a name="l00279"></a>00279 <span class="keyword">mutable</span> Value *my_value;
+<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>
+<a name="l00282"></a>00282 <span class="keyword">friend</span> enumerable_thread_specific_iterator<C,T> operator+( ptrdiff_t offset,
+<a name="l00283"></a>00283 <span class="keyword">const</span> enumerable_thread_specific_iterator<C,T>& v );
+<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==( <span class="keyword">const</span> 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> <span class="keywordtype">bool</span> operator<( const enumerable_thread_specific_iterator<C,T>& i,
+<a name="l00291"></a>00291 <span class="keyword">const</span> enumerable_thread_specific_iterator<C,U>& j );
+<a name="l00292"></a>00292
+<a name="l00293"></a>00293 <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="l00294"></a>00294 <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="l00295"></a>00295
+<a name="l00296"></a>00296 <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> U>
+<a name="l00297"></a>00297 <span class="keyword">friend</span> <span class="keyword">class </span>enumerable_thread_specific_iterator;
+<a name="l00298"></a>00298
+<a name="l00299"></a>00299 <span class="keyword">public</span>:
+<a name="l00300"></a>00300
+<a name="l00301"></a>00301 enumerable_thread_specific_iterator( <span class="keyword">const</span> Container &container, <span class="keyword">typename</span> Container::size_type index ) :
+<a name="l00302"></a>00302 my_container(&const_cast<Container &>(container)), my_index(index), my_value(NULL) {}
+<a name="l00303"></a>00303
+<a name="l00305"></a>00305 enumerable_thread_specific_iterator() : my_container(NULL), my_index(0), my_value(NULL) {}
+<a name="l00306"></a>00306
+<a name="l00307"></a>00307 <span class="keyword">template</span><<span class="keyword">typename</span> U>
+<a name="l00308"></a>00308 enumerable_thread_specific_iterator( <span class="keyword">const</span> enumerable_thread_specific_iterator<Container, U>& other ) :
+<a name="l00309"></a>00309 my_container( other.my_container ), my_index( other.my_index), my_value( const_cast<Value *>(other.my_value) ) {}
+<a name="l00310"></a>00310
+<a name="l00311"></a>00311 enumerable_thread_specific_iterator operator+( ptrdiff_t offset )<span class="keyword"> const </span>{
+<a name="l00312"></a>00312 <span class="keywordflow">return</span> enumerable_thread_specific_iterator(*my_container, my_index + offset);
+<a name="l00313"></a>00313 }
+<a name="l00314"></a>00314
+<a name="l00315"></a>00315 enumerable_thread_specific_iterator &operator+=( ptrdiff_t offset ) {
+<a name="l00316"></a>00316 my_index += offset;
+<a name="l00317"></a>00317 my_value = NULL;
+<a name="l00318"></a>00318 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
+<a name="l00319"></a>00319 }
+<a name="l00320"></a>00320
+<a name="l00321"></a>00321 enumerable_thread_specific_iterator operator-( ptrdiff_t offset )<span class="keyword"> const </span>{
+<a name="l00322"></a>00322 <span class="keywordflow">return</span> enumerable_thread_specific_iterator( *my_container, my_index-offset );
+<a name="l00323"></a>00323 }
+<a name="l00324"></a>00324
+<a name="l00325"></a>00325 enumerable_thread_specific_iterator &operator-=( ptrdiff_t offset ) {
+<a name="l00326"></a>00326 my_index -= offset;
+<a name="l00327"></a>00327 my_value = NULL;
+<a name="l00328"></a>00328 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
+<a name="l00329"></a>00329 }
+<a name="l00330"></a>00330
+<a name="l00331"></a>00331 Value& operator*()<span class="keyword"> const </span>{
+<a name="l00332"></a>00332 Value* value = my_value;
+<a name="l00333"></a>00333 <span class="keywordflow">if</span>( !value ) {
+<a name="l00334"></a>00334 value = my_value = reinterpret_cast<Value *>(&(*my_container)[my_index].value);
+<a name="l00335"></a>00335 }
+<a name="l00336"></a>00336 __TBB_ASSERT( value==reinterpret_cast<Value *>(&(*my_container)[my_index].value), <span class="stringliteral">"corrupt cache"</span> );
+<a name="l00337"></a>00337 <span class="keywordflow">return</span> *value;
+<a name="l00338"></a>00338 }
+<a name="l00339"></a>00339
+<a name="l00340"></a>00340 Value& operator[]( ptrdiff_t k )<span class="keyword"> const </span>{
+<a name="l00341"></a>00341 <span class="keywordflow">return</span> (*my_container)[my_index + k].value;
+<a name="l00342"></a>00342 }
+<a name="l00343"></a>00343
+<a name="l00344"></a>00344 Value* operator->()<span class="keyword"> const </span>{<span class="keywordflow">return</span> &operator*();}
+<a name="l00345"></a>00345
+<a name="l00346"></a>00346 enumerable_thread_specific_iterator& operator++() {
+<a name="l00347"></a>00347 ++my_index;
+<a name="l00348"></a>00348 my_value = NULL;
+<a name="l00349"></a>00349 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
+<a name="l00350"></a>00350 }
+<a name="l00351"></a>00351
+<a name="l00352"></a>00352 enumerable_thread_specific_iterator& operator--() {
+<a name="l00353"></a>00353 --my_index;
+<a name="l00354"></a>00354 my_value = NULL;
+<a name="l00355"></a>00355 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
+<a name="l00356"></a>00356 }
+<a name="l00357"></a>00357
+<a name="l00359"></a>00359 enumerable_thread_specific_iterator operator++(<span class="keywordtype">int</span>) {
+<a name="l00360"></a>00360 enumerable_thread_specific_iterator result = *<span class="keyword">this</span>;
+<a name="l00361"></a>00361 ++my_index;
+<a name="l00362"></a>00362 my_value = NULL;
+<a name="l00363"></a>00363 <span class="keywordflow">return</span> result;
+<a name="l00364"></a>00364 }
+<a name="l00365"></a>00365
+<a name="l00367"></a>00367 enumerable_thread_specific_iterator operator--(<span class="keywordtype">int</span>) {
+<a name="l00368"></a>00368 enumerable_thread_specific_iterator result = *<span class="keyword">this</span>;
+<a name="l00369"></a>00369 --my_index;
+<a name="l00370"></a>00370 my_value = NULL;
+<a name="l00371"></a>00371 <span class="keywordflow">return</span> result;
+<a name="l00372"></a>00372 }
+<a name="l00373"></a>00373
+<a name="l00374"></a>00374 <span class="comment">// STL support</span>
+<a name="l00375"></a>00375 <span class="keyword">typedef</span> ptrdiff_t difference_type;
+<a name="l00376"></a>00376 <span class="keyword">typedef</span> Value value_type;
+<a name="l00377"></a>00377 <span class="keyword">typedef</span> Value* pointer;
+<a name="l00378"></a>00378 <span class="keyword">typedef</span> Value& reference;
+<a name="l00379"></a>00379 <span class="keyword">typedef</span> std::random_access_iterator_tag iterator_category;
+<a name="l00380"></a>00380 };
+<a name="l00381"></a>00381
+<a name="l00382"></a>00382 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> T>
+<a name="l00383"></a>00383 enumerable_thread_specific_iterator<Container,T> operator+( ptrdiff_t offset,
+<a name="l00384"></a>00384 <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,T>& v ) {
+<a name="l00385"></a>00385 <span class="keywordflow">return</span> enumerable_thread_specific_iterator<Container,T>( v.my_container, v.my_index + offset );
+<a name="l00386"></a>00386 }
+<a name="l00387"></a>00387
+<a name="l00388"></a>00388 <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="l00389"></a>00389 <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,T>& i,
+<a name="l00390"></a>00390 <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,U>& j ) {
+<a name="l00391"></a>00391 <span class="keywordflow">return</span> i.my_index==j.my_index && i.my_container == j.my_container;
+<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> T, <span class="keyword">typename</span> U>
+<a name="l00395"></a>00395 <span class="keywordtype">bool</span> operator!=( <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,T>& i,
+<a name="l00396"></a>00396 <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,U>& j ) {
+<a name="l00397"></a>00397 <span class="keywordflow">return</span> !(i==j);
+<a name="l00398"></a>00398 }
+<a name="l00399"></a>00399
+<a name="l00400"></a>00400 <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="l00401"></a>00401 <span class="keywordtype">bool</span> operator<( const enumerable_thread_specific_iterator<Container,T>& i,
+<a name="l00402"></a>00402 <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,U>& j ) {
+<a name="l00403"></a>00403 <span class="keywordflow">return</span> i.my_index<j.my_index;
+<a name="l00404"></a>00404 }
+<a name="l00405"></a>00405
+<a name="l00406"></a>00406 <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="l00407"></a>00407 <span class="keywordtype">bool</span> operator>( <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,T>& i,
+<a name="l00408"></a>00408 <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,U>& j ) {
+<a name="l00409"></a>00409 <span class="keywordflow">return</span> j<i;
+<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> enumerable_thread_specific_iterator<Container,T>& i,
+<a name="l00414"></a>00414 <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,U>& j ) {
+<a name="l00415"></a>00415 <span class="keywordflow">return</span> !(i<j);
+<a name="l00416"></a>00416 }
+<a name="l00417"></a>00417
+<a name="l00418"></a>00418 <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="l00419"></a>00419 <span class="keywordtype">bool</span> operator<=( const enumerable_thread_specific_iterator<Container,T>& i,
+<a name="l00420"></a>00420 <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,U>& j ) {
+<a name="l00421"></a>00421 <span class="keywordflow">return</span> !(j<i);
+<a name="l00422"></a>00422 }
+<a name="l00423"></a>00423
+<a name="l00424"></a>00424 <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="l00425"></a>00425 ptrdiff_t operator-( <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,T>& i,
+<a name="l00426"></a>00426 <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,U>& j ) {
+<a name="l00427"></a>00427 <span class="keywordflow">return</span> i.my_index-j.my_index;
+<a name="l00428"></a>00428 }
+<a name="l00429"></a>00429
+<a name="l00430"></a>00430 <span class="keyword">template</span><<span class="keyword">typename</span> SegmentedContainer, <span class="keyword">typename</span> Value >
+<a name="l00431"></a>00431 <span class="keyword">class </span>segmented_iterator
+<a name="l00432"></a>00432 #if defined(_WIN64) && defined(_MSC_VER)
+<a name="l00433"></a>00433 : public std::iterator<std::input_iterator_tag, Value>
+<a name="l00434"></a>00434 #endif
+<a name="l00435"></a>00435 {
+<a name="l00436"></a>00436 <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="l00437"></a>00437 <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="l00438"></a>00438
+<a name="l00439"></a>00439 <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="l00440"></a>00440 <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="l00441"></a>00441
+<a name="l00442"></a>00442 <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> U>
+<a name="l00443"></a>00443 <span class="keyword">friend</span> <span class="keyword">class </span>segmented_iterator;
+<a name="l00444"></a>00444
+<a name="l00445"></a>00445 <span class="keyword">public</span>:
+<a name="l00446"></a>00446
+<a name="l00447"></a>00447 segmented_iterator() {my_segcont = NULL;}
+<a name="l00448"></a>00448
+<a name="l00449"></a>00449 segmented_iterator( <span class="keyword">const</span> SegmentedContainer& _segmented_container ) :
+<a name="l00450"></a>00450 my_segcont(const_cast<SegmentedContainer*>(&_segmented_container)),
+<a name="l00451"></a>00451 outer_iter(my_segcont->end()) { }
+<a name="l00452"></a>00452
+<a name="l00453"></a>00453 ~segmented_iterator() {}
+<a name="l00454"></a>00454
+<a name="l00455"></a>00455 <span class="keyword">typedef</span> <span class="keyword">typename</span> SegmentedContainer::iterator outer_iterator;
+<a name="l00456"></a>00456 <span class="keyword">typedef</span> <span class="keyword">typename</span> SegmentedContainer::value_type InnerContainer;
+<a name="l00457"></a>00457 <span class="keyword">typedef</span> <span class="keyword">typename</span> InnerContainer::iterator inner_iterator;
+<a name="l00458"></a>00458
+<a name="l00459"></a>00459 <span class="comment">// STL support</span>
+<a name="l00460"></a>00460 <span class="keyword">typedef</span> ptrdiff_t difference_type;
+<a name="l00461"></a>00461 <span class="keyword">typedef</span> Value value_type;
+<a name="l00462"></a>00462 <span class="keyword">typedef</span> <span class="keyword">typename</span> SegmentedContainer::size_type size_type;
+<a name="l00463"></a>00463 <span class="keyword">typedef</span> Value* pointer;
+<a name="l00464"></a>00464 <span class="keyword">typedef</span> Value& reference;
+<a name="l00465"></a>00465 <span class="keyword">typedef</span> std::input_iterator_tag iterator_category;
+<a name="l00466"></a>00466
+<a name="l00467"></a>00467 <span class="comment">// Copy Constructor</span>
+<a name="l00468"></a>00468 <span class="keyword">template</span><<span class="keyword">typename</span> U>
+<a name="l00469"></a>00469 segmented_iterator(<span class="keyword">const</span> segmented_iterator<SegmentedContainer, U>& other) :
+<a name="l00470"></a>00470 my_segcont(other.my_segcont),
+<a name="l00471"></a>00471 outer_iter(other.outer_iter),
+<a name="l00472"></a>00472 <span class="comment">// can we assign a default-constructed iterator to inner if we're at the end?</span>
+<a name="l00473"></a>00473 inner_iter(other.inner_iter)
+<a name="l00474"></a>00474 {}
+<a name="l00475"></a>00475
+<a name="l00476"></a>00476 <span class="comment">// assignment</span>
+<a name="l00477"></a>00477 <span class="keyword">template</span><<span class="keyword">typename</span> U>
+<a name="l00478"></a>00478 segmented_iterator& operator=( <span class="keyword">const</span> segmented_iterator<SegmentedContainer, U>& other) {
+<a name="l00479"></a>00479 <span class="keywordflow">if</span>(<span class="keyword">this</span> != &other) {
+<a name="l00480"></a>00480 my_segcont = other.my_segcont;
+<a name="l00481"></a>00481 outer_iter = other.outer_iter;
+<a name="l00482"></a>00482 <span class="keywordflow">if</span>(outer_iter != my_segcont->end()) inner_iter = other.inner_iter;
+<a name="l00483"></a>00483 }
+<a name="l00484"></a>00484 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
+<a name="l00485"></a>00485 }
+<a name="l00486"></a>00486
+<a name="l00487"></a>00487 <span class="comment">// allow assignment of outer iterator to segmented iterator. Once it is</span>
+<a name="l00488"></a>00488 <span class="comment">// assigned, move forward until a non-empty inner container is found or</span>
+<a name="l00489"></a>00489 <span class="comment">// the end of the outer container is reached.</span>
+<a name="l00490"></a>00490 segmented_iterator& operator=(<span class="keyword">const</span> outer_iterator& new_outer_iter) {
+<a name="l00491"></a>00491 __TBB_ASSERT(my_segcont != NULL, NULL);
+<a name="l00492"></a>00492 <span class="comment">// check that this iterator points to something inside the segmented container</span>
+<a name="l00493"></a>00493 <span class="keywordflow">for</span>(outer_iter = new_outer_iter ;outer_iter!=my_segcont->end(); ++outer_iter) {
+<a name="l00494"></a>00494 <span class="keywordflow">if</span>( !outer_iter->empty() ) {
+<a name="l00495"></a>00495 inner_iter = outer_iter->begin();
+<a name="l00496"></a>00496 <span class="keywordflow">break</span>;
+<a name="l00497"></a>00497 }
+<a name="l00498"></a>00498 }
+<a name="l00499"></a>00499 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
+<a name="l00500"></a>00500 }
+<a name="l00501"></a>00501
+<a name="l00502"></a>00502 <span class="comment">// pre-increment</span>
+<a name="l00503"></a>00503 segmented_iterator& operator++() {
+<a name="l00504"></a>00504 advance_me();
+<a name="l00505"></a>00505 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
+<a name="l00506"></a>00506 }
+<a name="l00507"></a>00507
+<a name="l00508"></a>00508 <span class="comment">// post-increment</span>
+<a name="l00509"></a>00509 segmented_iterator operator++(<span class="keywordtype">int</span>) {
+<a name="l00510"></a>00510 segmented_iterator tmp = *<span class="keyword">this</span>;
+<a name="l00511"></a>00511 operator++();
+<a name="l00512"></a>00512 <span class="keywordflow">return</span> tmp;
+<a name="l00513"></a>00513 }
+<a name="l00514"></a>00514
+<a name="l00515"></a>00515 <span class="keywordtype">bool</span> operator==(<span class="keyword">const</span> outer_iterator& other_outer)<span class="keyword"> const </span>{
+<a name="l00516"></a>00516 __TBB_ASSERT(my_segcont != NULL, NULL);
+<a name="l00517"></a>00517 <span class="keywordflow">return</span> (outer_iter == other_outer &&
+<a name="l00518"></a>00518 (outer_iter == my_segcont->end() || inner_iter == outer_iter->begin()));
+<a name="l00519"></a>00519 }
+<a name="l00520"></a>00520
+<a name="l00521"></a>00521 <span class="keywordtype">bool</span> operator!=(<span class="keyword">const</span> outer_iterator& other_outer)<span class="keyword"> const </span>{
+<a name="l00522"></a>00522 <span class="keywordflow">return</span> !operator==(other_outer);
+<a name="l00523"></a>00523
+<a name="l00524"></a>00524 }
+<a name="l00525"></a>00525
+<a name="l00526"></a>00526 <span class="comment">// (i)* RHS</span>
+<a name="l00527"></a>00527 reference operator*()<span class="keyword"> const </span>{
+<a name="l00528"></a>00528 __TBB_ASSERT(my_segcont != NULL, NULL);
+<a name="l00529"></a>00529 __TBB_ASSERT(outer_iter != my_segcont->end(), <span class="stringliteral">"Dereferencing a pointer at end of container"</span>);
+<a name="l00530"></a>00530 __TBB_ASSERT(inner_iter != outer_iter->end(), NULL); <span class="comment">// should never happen</span>
+<a name="l00531"></a>00531 <span class="keywordflow">return</span> *inner_iter;
+<a name="l00532"></a>00532 }
+<a name="l00533"></a>00533
+<a name="l00534"></a>00534 <span class="comment">// i-></span>
+<a name="l00535"></a>00535 pointer operator->()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> &operator*();}
+<a name="l00536"></a>00536
+<a name="l00537"></a>00537 <span class="keyword">private</span>:
+<a name="l00538"></a>00538 SegmentedContainer* my_segcont;
+<a name="l00539"></a>00539 outer_iterator outer_iter;
+<a name="l00540"></a>00540 inner_iterator inner_iter;
+<a name="l00541"></a>00541
+<a name="l00542"></a>00542 <span class="keywordtype">void</span> advance_me() {
+<a name="l00543"></a>00543 __TBB_ASSERT(my_segcont != NULL, NULL);
+<a name="l00544"></a>00544 __TBB_ASSERT(outer_iter != my_segcont->end(), NULL); <span class="comment">// not true if there are no inner containers</span>
+<a name="l00545"></a>00545 __TBB_ASSERT(inner_iter != outer_iter->end(), NULL); <span class="comment">// not true if the inner containers are all empty.</span>
+<a name="l00546"></a>00546 ++inner_iter;
+<a name="l00547"></a>00547 <span class="keywordflow">while</span>(inner_iter == outer_iter->end() && ++outer_iter != my_segcont->end()) {
+<a name="l00548"></a>00548 inner_iter = outer_iter->begin();
+<a name="l00549"></a>00549 }
+<a name="l00550"></a>00550 }
+<a name="l00551"></a>00551 }; <span class="comment">// segmented_iterator</span>
+<a name="l00552"></a>00552
+<a name="l00553"></a>00553 <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="l00554"></a>00554 <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> segmented_iterator<SegmentedContainer,T>& i,
+<a name="l00555"></a>00555 <span class="keyword">const</span> segmented_iterator<SegmentedContainer,U>& j ) {
+<a name="l00556"></a>00556 <span class="keywordflow">if</span>(i.my_segcont != j.my_segcont) <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00557"></a>00557 <span class="keywordflow">if</span>(i.my_segcont == NULL) <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00558"></a>00558 <span class="keywordflow">if</span>(i.outer_iter != j.outer_iter) <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00559"></a>00559 <span class="keywordflow">if</span>(i.outer_iter == i.my_segcont->end()) <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00560"></a>00560 <span class="keywordflow">return</span> i.inner_iter == j.inner_iter;
+<a name="l00561"></a>00561 }
+<a name="l00562"></a>00562
+<a name="l00563"></a>00563 <span class="comment">// !=</span>
+<a name="l00564"></a>00564 <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="l00565"></a>00565 <span class="keywordtype">bool</span> operator!=( <span class="keyword">const</span> segmented_iterator<SegmentedContainer,T>& i,
+<a name="l00566"></a>00566 <span class="keyword">const</span> segmented_iterator<SegmentedContainer,U>& j ) {
+<a name="l00567"></a>00567 <span class="keywordflow">return</span> !(i==j);
+<a name="l00568"></a>00568 }
+<a name="l00569"></a>00569
+<a name="l00570"></a>00570 <span class="keyword">template</span><<span class="keyword">typename</span> T>
+<a name="l00571"></a>00571 <span class="keyword">struct </span>destruct_only: tbb::internal::no_copy {
+<a name="l00572"></a>00572 <a class="code" href="a00227.html">tbb::aligned_space<T,1></a> value;
+<a name="l00573"></a>00573 ~destruct_only() {value.begin()[0].~T();}
+<a name="l00574"></a>00574 };
+<a name="l00575"></a>00575
+<a name="l00576"></a>00576 <span class="keyword">template</span><<span class="keyword">typename</span> T>
+<a name="l00577"></a>00577 <span class="keyword">struct </span>construct_by_default: tbb::internal::no_assign {
+<a name="l00578"></a>00578 <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="l00579"></a>00579 construct_by_default( <span class="keywordtype">int</span> ) {}
+<a name="l00580"></a>00580 };
+<a name="l00581"></a>00581
+<a name="l00582"></a>00582 <span class="keyword">template</span><<span class="keyword">typename</span> T>
+<a name="l00583"></a>00583 <span class="keyword">struct </span>construct_by_exemplar: tbb::internal::no_assign {
+<a name="l00584"></a>00584 <span class="keyword">const</span> T exemplar;
+<a name="l00585"></a>00585 <span class="keywordtype">void</span> construct(<span class="keywordtype">void</span>*where) {<span class="keyword">new</span>(where) T(exemplar);}
+<a name="l00586"></a>00586 construct_by_exemplar( <span class="keyword">const</span> T& t ) : exemplar(t) {}
+<a name="l00587"></a>00587 };
+<a name="l00588"></a>00588
+<a name="l00589"></a>00589 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> Finit>
+<a name="l00590"></a>00590 <span class="keyword">struct </span>construct_by_finit: tbb::internal::no_assign {
+<a name="l00591"></a>00591 Finit f;
+<a name="l00592"></a>00592 <span class="keywordtype">void</span> construct(<span class="keywordtype">void</span>* where) {<span class="keyword">new</span>(where) T(f());}
+<a name="l00593"></a>00593 construct_by_finit( <span class="keyword">const</span> Finit& f_ ) : f(f_) {}
+<a name="l00594"></a>00594 };
+<a name="l00595"></a>00595
+<a name="l00596"></a>00596 <span class="comment">// storage for initialization function pointer</span>
+<a name="l00597"></a>00597 <span class="keyword">template</span><<span class="keyword">typename</span> T>
+<a name="l00598"></a>00598 <span class="keyword">class </span>callback_base {
+<a name="l00599"></a>00599 <span class="keyword">public</span>:
+<a name="l00600"></a>00600 <span class="comment">// Clone *this</span>
+<a name="l00601"></a>00601 <span class="keyword">virtual</span> callback_base* clone() = 0;
+<a name="l00602"></a>00602 <span class="comment">// Destruct and free *this</span>
+<a name="l00603"></a>00603 <span class="keyword">virtual</span> <span class="keywordtype">void</span> destroy() = 0;
+<a name="l00604"></a>00604 <span class="comment">// Need virtual destructor to satisfy GCC compiler warning</span>
+<a name="l00605"></a>00605 <span class="keyword">virtual</span> ~callback_base() { }
+<a name="l00606"></a>00606 <span class="comment">// Construct T at where</span>
+<a name="l00607"></a>00607 <span class="keyword">virtual</span> <span class="keywordtype">void</span> construct(<span class="keywordtype">void</span>* where) = 0;
+<a name="l00608"></a>00608 };
+<a name="l00609"></a>00609
+<a name="l00610"></a>00610 <span class="keyword">template</span> <<span class="keyword">typename</span> T, <span class="keyword">typename</span> Constructor>
+<a name="l00611"></a>00611 <span class="keyword">class </span>callback_leaf: <span class="keyword">public</span> callback_base<T>, Constructor {
+<a name="l00612"></a>00612 <span class="keyword">template</span><<span class="keyword">typename</span> X> callback_leaf( <span class="keyword">const</span> X& x ) : Constructor(x) {}
+<a name="l00613"></a>00613
+<a name="l00614"></a>00614 <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00317.html">tbb::tbb_allocator<callback_leaf></a> my_allocator_type;
+<a name="l00615"></a>00615
+<a name="l00616"></a>00616 <span class="comment">/*override*/</span> callback_base<T>* clone() {
+<a name="l00617"></a>00617 <span class="keywordtype">void</span>* where = my_allocator_type().allocate(1);
+<a name="l00618"></a>00618 <span class="keywordflow">return</span> <span class="keyword">new</span>(where) callback_leaf(*<span class="keyword">this</span>);
+<a name="l00619"></a>00619 }
+<a name="l00620"></a>00620
+<a name="l00621"></a>00621 <span class="comment">/*override*/</span> <span class="keywordtype">void</span> destroy() {
+<a name="l00622"></a>00622 my_allocator_type().destroy(<span class="keyword">this</span>);
+<a name="l00623"></a>00623 my_allocator_type().deallocate(<span class="keyword">this</span>,1);
+<a name="l00624"></a>00624 }
+<a name="l00625"></a>00625
+<a name="l00626"></a>00626 <span class="comment">/*override*/</span> <span class="keywordtype">void</span> construct(<span class="keywordtype">void</span>* where) {
+<a name="l00627"></a>00627 Constructor::construct(where);
+<a name="l00628"></a>00628 }
+<a name="l00629"></a>00629 <span class="keyword">public</span>:
+<a name="l00630"></a>00630 <span class="keyword">template</span><<span class="keyword">typename</span> X>
+<a name="l00631"></a>00631 <span class="keyword">static</span> callback_base<T>* make( <span class="keyword">const</span> X& x ) {
+<a name="l00632"></a>00632 <span class="keywordtype">void</span>* where = my_allocator_type().allocate(1);
+<a name="l00633"></a>00633 <span class="keywordflow">return</span> <span class="keyword">new</span>(where) callback_leaf(x);
+<a name="l00634"></a>00634 }
+<a name="l00635"></a>00635 };
+<a name="l00636"></a>00636
+<a name="l00638"></a>00638
+<a name="l00643"></a>00643 <span class="keyword">template</span><<span class="keyword">typename</span> U, size_t ModularSize>
+<a name="l00644"></a>00644 <span class="keyword">struct </span>ets_element {
+<a name="l00645"></a>00645 <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="l00646"></a>00646 <span class="keywordtype">void</span> unconstruct() {
+<a name="l00647"></a>00647 tbb::internal::punned_cast<U*>(&value)->~U();
+<a name="l00648"></a>00648 }
+<a name="l00649"></a>00649 };
+<a name="l00650"></a>00650
+<a name="l00651"></a>00651 } <span class="comment">// namespace internal</span>
+<a name="l00653"></a>00653 <span class="comment"></span>
+<a name="l00655"></a>00655
+<a name="l00674"></a>00674 <span class="keyword">template</span> <<span class="keyword">typename</span> T,
+<a name="l00675"></a>00675 <span class="keyword">typename</span> Allocator=cache_aligned_allocator<T>,
+<a name="l00676"></a><a class="code" href="a00255.html">00676</a> <a class="code" href="a00383.html#a8622ae61b7e7737dac26542e181178e">ets_key_usage_type</a> ETS_key_type=ets_no_key >
+<a name="l00677"></a>00677 <span class="keyword">class </span><a class="code" href="a00255.html">enumerable_thread_specific</a>: internal::ets_base<ETS_key_type> {
+<a name="l00678"></a>00678
+<a name="l00679"></a>00679 <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="a00255.html">enumerable_thread_specific</a>;
+<a name="l00680"></a>00680
+<a name="l00681"></a>00681 <span class="keyword">typedef</span> internal::ets_element<T,sizeof(T)%tbb::internal::NFS_MaxLineSize> padded_element;
+<a name="l00682"></a>00682
+<a name="l00684"></a>00684 <span class="keyword">template</span><<span class="keyword">typename</span> I>
+<a name="l00685"></a>00685 <span class="keyword">class </span>generic_range_type: <span class="keyword">public</span> <a class="code" href="a00233.html">blocked_range</a><I> {
+<a name="l00686"></a>00686 <span class="keyword">public</span>:
+<a name="l00687"></a>00687 <span class="keyword">typedef</span> T value_type;
+<a name="l00688"></a>00688 <span class="keyword">typedef</span> T& reference;
+<a name="l00689"></a>00689 <span class="keyword">typedef</span> <span class="keyword">const</span> T& const_reference;
+<a name="l00690"></a>00690 <span class="keyword">typedef</span> I iterator;
+<a name="l00691"></a>00691 <span class="keyword">typedef</span> ptrdiff_t difference_type;
+<a name="l00692"></a>00692 generic_range_type( I begin_, I end_, size_t grainsize_ = 1) : <a class="code" href="a00233.html">blocked_range<I></a>(begin_,end_,grainsize_) {}
+<a name="l00693"></a>00693 template<typename U>
+<a name="l00694"></a>00694 generic_range_type( <span class="keyword">const</span> generic_range_type<U>& r) : <a class="code" href="a00233.html">blocked_range<I></a>(r.begin(),r.end(),r.grainsize()) {}
+<a name="l00695"></a>00695 generic_range_type( generic_range_type& r, <a class="code" href="a00309.html">split</a> ) : <a class="code" href="a00233.html">blocked_range<I></a>(r,<a class="code" href="a00309.html">split</a>()) {}
+<a name="l00696"></a>00696 };
+<a name="l00697"></a>00697
+<a name="l00698"></a>00698 <span class="keyword">typedef</span> <span class="keyword">typename</span> Allocator::template rebind< padded_element >::other padded_allocator_type;
+<a name="l00699"></a>00699 <span class="keyword">typedef</span> <a class="code" href="a00250.html">tbb::concurrent_vector< padded_element, padded_allocator_type ></a> <a class="code" href="a00250.html">internal_collection_type</a>;
+<a name="l00700"></a>00700
+<a name="l00701"></a>00701 internal::callback_base<T> *my_construct_callback;
+<a name="l00702"></a>00702
+<a name="l00703"></a>00703 internal_collection_type my_locals;
+<a name="l00704"></a>00704
+<a name="l00705"></a>00705 <span class="comment">/*override*/</span> <span class="keywordtype">void</span>* create_local() {
+<a name="l00706"></a>00706 <span class="preprocessor">#if TBB_DEPRECATED</span>
+<a name="l00707"></a>00707 <span class="preprocessor"></span> <span class="keywordtype">void</span>* lref = &my_locals[my_locals.<a class="code" href="a00250.html#e94e038f915c0268fdf2d3d7f87d81b8">push_back</a>(padded_element())];
+<a name="l00708"></a>00708 <span class="preprocessor">#else</span>
+<a name="l00709"></a>00709 <span class="preprocessor"></span> <span class="keywordtype">void</span>* lref = &*my_locals.<a class="code" href="a00250.html#e94e038f915c0268fdf2d3d7f87d81b8">push_back</a>(padded_element());
+<a name="l00710"></a>00710 <span class="preprocessor">#endif</span>
+<a name="l00711"></a>00711 <span class="preprocessor"></span> my_construct_callback->construct(lref);
+<a name="l00712"></a>00712 <span class="keywordflow">return</span> lref;
+<a name="l00713"></a>00713 }
+<a name="l00714"></a>00714
+<a name="l00715"></a>00715 <span class="keywordtype">void</span> unconstruct_locals() {
+<a name="l00716"></a>00716 <span class="keywordflow">for</span>(<span class="keyword">typename</span> internal_collection_type::iterator cvi = my_locals.<a class="code" href="a00250.html#730b23a251ecb6d37f692fb22f38e029">begin</a>(); cvi != my_locals.<a class="code" href="a00250.html#c0b51160e5a764982ec97a455f94f2c6">end</a>(); ++cvi) {
+<a name="l00717"></a>00717 cvi->unconstruct();
+<a name="l00718"></a>00718 }
+<a name="l00719"></a>00719 }
+<a name="l00720"></a>00720
+<a name="l00721"></a>00721 <span class="keyword">typedef</span> <span class="keyword">typename</span> Allocator::template rebind< uintptr_t >::other array_allocator_type;
+<a name="l00722"></a>00722
+<a name="l00723"></a>00723 <span class="comment">// _size is in bytes</span>
+<a name="l00724"></a>00724 <span class="comment">/*override*/</span> <span class="keywordtype">void</span>* create_array(size_t _size) {
+<a name="l00725"></a>00725 size_t nelements = (_size + <span class="keyword">sizeof</span>(uintptr_t) -1) / <span class="keyword">sizeof</span>(uintptr_t);
+<a name="l00726"></a>00726 <span class="keywordflow">return</span> array_allocator_type().allocate(nelements);
+<a name="l00727"></a>00727 }
+<a name="l00728"></a>00728
+<a name="l00729"></a>00729 <span class="comment">/*override*/</span> <span class="keywordtype">void</span> free_array( <span class="keywordtype">void</span>* _ptr, size_t _size) {
+<a name="l00730"></a>00730 size_t nelements = (_size + <span class="keyword">sizeof</span>(uintptr_t) -1) / <span class="keyword">sizeof</span>(uintptr_t);
+<a name="l00731"></a>00731 array_allocator_type().deallocate( reinterpret_cast<uintptr_t *>(_ptr),nelements);
+<a name="l00732"></a>00732 }
+<a name="l00733"></a>00733
+<a name="l00734"></a>00734 <span class="keyword">public</span>:
+<a name="l00735"></a>00735
+<a name="l00737"></a>00737 <span class="keyword">typedef</span> Allocator allocator_type;
+<a name="l00738"></a>00738 <span class="keyword">typedef</span> T value_type;
+<a name="l00739"></a>00739 <span class="keyword">typedef</span> T& reference;
+<a name="l00740"></a>00740 <span class="keyword">typedef</span> <span class="keyword">const</span> T& const_reference;
+<a name="l00741"></a>00741 <span class="keyword">typedef</span> T* pointer;
+<a name="l00742"></a>00742 <span class="keyword">typedef</span> <span class="keyword">const</span> T* const_pointer;
+<a name="l00743"></a>00743 <span class="keyword">typedef</span> <span class="keyword">typename</span> internal_collection_type::size_type size_type;
+<a name="l00744"></a>00744 <span class="keyword">typedef</span> <span class="keyword">typename</span> internal_collection_type::difference_type difference_type;
+<a name="l00745"></a>00745
+<a name="l00746"></a>00746 <span class="comment">// Iterator types</span>
+<a name="l00747"></a>00747 <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::enumerable_thread_specific_iterator< internal_collection_type, value_type > iterator;
+<a name="l00748"></a>00748 <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="l00749"></a>00749
+<a name="l00750"></a>00750 <span class="comment">// Parallel range types</span>
+<a name="l00751"></a>00751 <span class="keyword">typedef</span> generic_range_type< iterator > range_type;
+<a name="l00752"></a>00752 <span class="keyword">typedef</span> generic_range_type< const_iterator > const_range_type;
+<a name="l00753"></a>00753
+<a name="l00755"></a>00755 <a class="code" href="a00255.html">enumerable_thread_specific</a>() :
+<a name="l00756"></a>00756 my_construct_callback( internal::callback_leaf<T,internal::construct_by_default<T> >::make(<span class="comment">/*dummy argument*/</span>0) )
+<a name="l00757"></a>00757 {}
+<a name="l00758"></a>00758
+<a name="l00760"></a><a class="code" href="a00255.html#8d4b456ff9d7b289c73254eccc11db45">00760</a> <span class="keyword">template</span> <<span class="keyword">typename</span> Finit>
+<a name="l00761"></a>00761 <a class="code" href="a00255.html">enumerable_thread_specific</a>( Finit finit ) :
+<a name="l00762"></a>00762 my_construct_callback( internal::callback_leaf<T,internal::construct_by_finit<T,Finit> >::make( finit ) )
+<a name="l00763"></a>00763 {}
+<a name="l00764"></a>00764
+<a name="l00766"></a>00766 <a class="code" href="a00255.html">enumerable_thread_specific</a>(<span class="keyword">const</span> T& exemplar) :
+<a name="l00767"></a>00767 my_construct_callback( internal::callback_leaf<T,internal::construct_by_exemplar<T> >::make( exemplar ) )
+<a name="l00768"></a>00768 {}
+<a name="l00769"></a>00769
+<a name="l00771"></a>00771 ~<a class="code" href="a00255.html">enumerable_thread_specific</a>() {
+<a name="l00772"></a>00772 my_construct_callback->destroy();
+<a name="l00773"></a>00773 this->clear(); <span class="comment">// deallocation before the derived class is finished destructing</span>
+<a name="l00774"></a>00774 <span class="comment">// So free(array *) is still accessible</span>
+<a name="l00775"></a>00775 }
+<a name="l00776"></a>00776
+<a name="l00778"></a>00778 reference local() {
+<a name="l00779"></a>00779 <span class="keywordtype">bool</span> exists;
+<a name="l00780"></a>00780 <span class="keywordflow">return</span> local(exists);
+<a name="l00781"></a>00781 }
+<a name="l00782"></a>00782
+<a name="l00784"></a>00784 reference local(<span class="keywordtype">bool</span>& exists) {
+<a name="l00785"></a>00785 <span class="keywordtype">void</span>* ptr = this->table_lookup(exists);
+<a name="l00786"></a>00786 <span class="keywordflow">return</span> *(T*)ptr;
+<a name="l00787"></a>00787 }
+<a name="l00788"></a>00788
+<a name="l00790"></a>00790 size_type size()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> my_locals.<a class="code" href="a00250.html#715fe313c4a9c22731cc404dd80c9ec9">size</a>(); }
+<a name="l00791"></a>00791
+<a name="l00793"></a>00793 <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> my_locals.<a class="code" href="a00250.html#c6426cb93cf20d3af40f3c90f1f0481a">empty</a>(); }
+<a name="l00794"></a>00794
+<a name="l00796"></a>00796 iterator begin() { <span class="keywordflow">return</span> iterator( my_locals, 0 ); }
+<a name="l00798"></a>00798 iterator end() { <span class="keywordflow">return</span> iterator(my_locals, my_locals.<a class="code" href="a00250.html#715fe313c4a9c22731cc404dd80c9ec9">size</a>() ); }
+<a name="l00799"></a>00799
+<a name="l00801"></a>00801 const_iterator begin()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> const_iterator(my_locals, 0); }
+<a name="l00802"></a>00802
+<a name="l00804"></a>00804 const_iterator end()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> const_iterator(my_locals, my_locals.<a class="code" href="a00250.html#715fe313c4a9c22731cc404dd80c9ec9">size</a>()); }
+<a name="l00805"></a>00805
+<a name="l00807"></a>00807 range_type range( size_t grainsize=1 ) { <span class="keywordflow">return</span> range_type( begin(), end(), grainsize ); }
+<a name="l00808"></a>00808
+<a name="l00810"></a>00810 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="l00811"></a>00811
+<a name="l00813"></a>00813 <span class="keywordtype">void</span> clear() {
+<a name="l00814"></a>00814 unconstruct_locals();
+<a name="l00815"></a>00815 my_locals.<a class="code" href="a00250.html#26f937a359a66b6aae904c3cd9a3c444">clear</a>();
+<a name="l00816"></a>00816 this->table_clear();
+<a name="l00817"></a>00817 <span class="comment">// callback is not destroyed</span>
+<a name="l00818"></a>00818 <span class="comment">// exemplar is not destroyed</span>
+<a name="l00819"></a>00819 }
+<a name="l00820"></a>00820
+<a name="l00821"></a>00821 <span class="keyword">private</span>:
+<a name="l00822"></a>00822
+<a name="l00823"></a>00823 <span class="keyword">template</span><<span class="keyword">typename</span> U, <span class="keyword">typename</span> A2, ets_key_usage_type C2>
+<a name="l00824"></a>00824 <span class="keywordtype">void</span> internal_copy( <span class="keyword">const</span> enumerable_thread_specific<U, A2, C2>& other);
+<a name="l00825"></a>00825
+<a name="l00826"></a>00826 <span class="keyword">public</span>:
+<a name="l00827"></a>00827
+<a name="l00828"></a>00828 <span class="keyword">template</span><<span class="keyword">typename</span> U, <span class="keyword">typename</span> Alloc, ets_key_usage_type Cachetype>
+<a name="l00829"></a>00829 enumerable_thread_specific( <span class="keyword">const</span> enumerable_thread_specific<U, Alloc, Cachetype>& other ) : internal::ets_base<ETS_key_type> ()
+<a name="l00830"></a>00830 {
+<a name="l00831"></a>00831 internal_copy(other);
+<a name="l00832"></a>00832 }
+<a name="l00833"></a>00833
+<a name="l00834"></a>00834 enumerable_thread_specific( <span class="keyword">const</span> enumerable_thread_specific& other ) : internal::ets_base<ETS_key_type> ()
+<a name="l00835"></a>00835 {
+<a name="l00836"></a>00836 internal_copy(other);
+<a name="l00837"></a>00837 }
+<a name="l00838"></a>00838
+<a name="l00839"></a>00839 <span class="keyword">private</span>:
+<a name="l00840"></a>00840
+<a name="l00841"></a>00841 <span class="keyword">template</span><<span class="keyword">typename</span> U, <span class="keyword">typename</span> A2, ets_key_usage_type C2>
+<a name="l00842"></a>00842 enumerable_thread_specific &
+<a name="l00843"></a>00843 internal_assign(<span class="keyword">const</span> enumerable_thread_specific<U, A2, C2>& other) {
+<a name="l00844"></a>00844 <span class="keywordflow">if</span>(static_cast<void *>( <span class="keyword">this</span> ) != static_cast<const void *>( &other )) {
+<a name="l00845"></a>00845 this->clear();
+<a name="l00846"></a>00846 my_construct_callback->destroy();
+<a name="l00847"></a>00847 my_construct_callback = 0;
+<a name="l00848"></a>00848 internal_copy( other );
+<a name="l00849"></a>00849 }
+<a name="l00850"></a>00850 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
+<a name="l00851"></a>00851 }
+<a name="l00852"></a>00852
+<a name="l00853"></a>00853 <span class="keyword">public</span>:
+<a name="l00854"></a>00854
+<a name="l00855"></a>00855 <span class="comment">// assignment</span>
+<a name="l00856"></a>00856 enumerable_thread_specific& operator=(<span class="keyword">const</span> enumerable_thread_specific& other) {
+<a name="l00857"></a>00857 <span class="keywordflow">return</span> internal_assign(other);
+<a name="l00858"></a>00858 }
+<a name="l00859"></a>00859
+<a name="l00860"></a>00860 <span class="keyword">template</span><<span class="keyword">typename</span> U, <span class="keyword">typename</span> Alloc, ets_key_usage_type Cachetype>
+<a name="l00861"></a>00861 enumerable_thread_specific& operator=(<span class="keyword">const</span> enumerable_thread_specific<U, Alloc, Cachetype>& other)
+<a name="l00862"></a>00862 {
+<a name="l00863"></a>00863 <span class="keywordflow">return</span> internal_assign(other);
+<a name="l00864"></a>00864 }
+<a name="l00865"></a>00865
+<a name="l00866"></a>00866 <span class="comment">// combine_func_t has signature T(T,T) or T(const T&, const T&)</span>
+<a name="l00867"></a>00867 <span class="keyword">template</span> <<span class="keyword">typename</span> combine_func_t>
+<a name="l00868"></a>00868 T combine(combine_func_t f_combine) {
+<a name="l00869"></a>00869 <span class="keywordflow">if</span>(begin() == end()) {
+<a name="l00870"></a>00870 internal::destruct_only<T> location;
+<a name="l00871"></a>00871 my_construct_callback->construct(location.value.begin());
+<a name="l00872"></a>00872 <span class="keywordflow">return</span> *location.value.begin();
+<a name="l00873"></a>00873 }
+<a name="l00874"></a>00874 const_iterator ci = begin();
+<a name="l00875"></a>00875 T my_result = *ci;
+<a name="l00876"></a>00876 <span class="keywordflow">while</span>(++ci != end())
+<a name="l00877"></a>00877 my_result = f_combine( my_result, *ci );
+<a name="l00878"></a>00878 <span class="keywordflow">return</span> my_result;
+<a name="l00879"></a>00879 }
+<a name="l00880"></a>00880
+<a name="l00881"></a>00881 <span class="comment">// combine_func_t has signature void(T) or void(const T&)</span>
+<a name="l00882"></a>00882 <span class="keyword">template</span> <<span class="keyword">typename</span> combine_func_t>
+<a name="l00883"></a>00883 <span class="keywordtype">void</span> combine_each(combine_func_t f_combine) {
+<a name="l00884"></a>00884 <span class="keywordflow">for</span>(const_iterator ci = begin(); ci != end(); ++ci) {
+<a name="l00885"></a>00885 f_combine( *ci );
+<a name="l00886"></a>00886 }
+<a name="l00887"></a>00887 }
+<a name="l00888"></a>00888
+<a name="l00889"></a>00889 }; <span class="comment">// enumerable_thread_specific</span>
+<a name="l00890"></a>00890
+<a name="l00891"></a>00891 <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="l00892"></a>00892 <span class="keyword">template</span><<span class="keyword">typename</span> U, <span class="keyword">typename</span> A2, ets_key_usage_type C2>
+<a name="l00893"></a>00893 <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="l00894"></a>00894 <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="l00895"></a>00895 my_construct_callback = other.my_construct_callback->clone();
+<a name="l00896"></a>00896
+<a name="l00897"></a>00897 <span class="keyword">typedef</span> internal::ets_base<ets_no_key> base;
+<a name="l00898"></a>00898 __TBB_ASSERT(my_locals.<a class="code" href="a00250.html#715fe313c4a9c22731cc404dd80c9ec9">size</a>()==0,NULL);
+<a name="l00899"></a>00899 this->table_reserve_for_copy( other );
+<a name="l00900"></a>00900 <span class="keywordflow">for</span>( base::array* r=other.my_root; r; r=r->next ) {
+<a name="l00901"></a>00901 <span class="keywordflow">for</span>( size_t i=0; i<r-><a class="code" href="a00233.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>(); ++i ) {
+<a name="l00902"></a>00902 base::slot& s1 = r->at(i);
+<a name="l00903"></a>00903 <span class="keywordflow">if</span>( !s1.empty() ) {
+<a name="l00904"></a>00904 base::slot& s2 = this->table_find(s1.key);
+<a name="l00905"></a>00905 <span class="keywordflow">if</span>( s2.empty() ) {
+<a name="l00906"></a>00906 #<span class="keywordflow">if</span> TBB_DEPRECATED
+<a name="l00907"></a>00907 <span class="keywordtype">void</span>* lref = &my_locals[my_locals.<a class="code" href="a00250.html#e94e038f915c0268fdf2d3d7f87d81b8">push_back</a>(padded_element())];
+<a name="l00908"></a>00908 <span class="preprocessor">#else</span>
+<a name="l00909"></a>00909 <span class="preprocessor"></span> <span class="keywordtype">void</span>* lref = &*my_locals.<a class="code" href="a00250.html#e94e038f915c0268fdf2d3d7f87d81b8">push_back</a>(padded_element());
+<a name="l00910"></a>00910 <span class="preprocessor">#endif</span>
+<a name="l00911"></a>00911 <span class="preprocessor"></span> s2.ptr = <span class="keyword">new</span>(lref) T(*(U*)s1.ptr);
+<a name="l00912"></a>00912 s2.key = s1.key;
+<a name="l00913"></a>00913 } <span class="keywordflow">else</span> {
+<a name="l00914"></a>00914 <span class="comment">// Skip the duplicate</span>
+<a name="l00915"></a>00915 }
+<a name="l00916"></a>00916 }
+<a name="l00917"></a>00917 }
+<a name="l00918"></a>00918 }
+<a name="l00919"></a>00919 }
+<a name="l00920"></a>00920
+<a name="l00921"></a>00921 <span class="keyword">template</span>< <span class="keyword">typename</span> Container >
+<a name="l00922"></a>00922 <span class="keyword">class </span>flattened2d {
+<a name="l00923"></a>00923
+<a name="l00924"></a>00924 <span class="comment">// This intermediate typedef is to address issues with VC7.1 compilers</span>
+<a name="l00925"></a>00925 <span class="keyword">typedef</span> <span class="keyword">typename</span> Container::value_type conval_type;
+<a name="l00926"></a>00926
+<a name="l00927"></a>00927 <span class="keyword">public</span>:
+<a name="l00928"></a>00928
+<a name="l00930"></a>00930 <span class="keyword">typedef</span> <span class="keyword">typename</span> conval_type::size_type size_type;
+<a name="l00931"></a>00931 <span class="keyword">typedef</span> <span class="keyword">typename</span> conval_type::difference_type difference_type;
+<a name="l00932"></a>00932 <span class="keyword">typedef</span> <span class="keyword">typename</span> conval_type::allocator_type allocator_type;
+<a name="l00933"></a>00933 <span class="keyword">typedef</span> <span class="keyword">typename</span> conval_type::value_type value_type;
+<a name="l00934"></a>00934 <span class="keyword">typedef</span> <span class="keyword">typename</span> conval_type::reference reference;
+<a name="l00935"></a>00935 <span class="keyword">typedef</span> <span class="keyword">typename</span> conval_type::const_reference const_reference;
+<a name="l00936"></a>00936 <span class="keyword">typedef</span> <span class="keyword">typename</span> conval_type::pointer pointer;
+<a name="l00937"></a>00937 <span class="keyword">typedef</span> <span class="keyword">typename</span> conval_type::const_pointer const_pointer;
+<a name="l00938"></a>00938
+<a name="l00939"></a>00939 <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::segmented_iterator<Container, value_type> iterator;
+<a name="l00940"></a>00940 <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::segmented_iterator<Container, const value_type> const_iterator;
+<a name="l00941"></a>00941
+<a name="l00942"></a>00942 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="l00943"></a>00943 my_container(const_cast<Container*>(&c)), my_begin(b), my_end(e) { }
+<a name="l00944"></a>00944
+<a name="l00945"></a>00945 flattened2d( <span class="keyword">const</span> Container &c ) :
+<a name="l00946"></a>00946 my_container(const_cast<Container*>(&c)), my_begin(c.begin()), my_end(c.end()) { }
+<a name="l00947"></a>00947
+<a name="l00948"></a>00948 iterator begin() { <span class="keywordflow">return</span> iterator(*my_container) = my_begin; }
+<a name="l00949"></a>00949 iterator end() { <span class="keywordflow">return</span> iterator(*my_container) = my_end; }
+<a name="l00950"></a>00950 const_iterator begin()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> const_iterator(*my_container) = my_begin; }
+<a name="l00951"></a>00951 const_iterator end()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> const_iterator(*my_container) = my_end; }
+<a name="l00952"></a>00952
+<a name="l00953"></a>00953 size_type size()<span class="keyword"> const </span>{
+<a name="l00954"></a>00954 size_type tot_size = 0;
+<a name="l00955"></a>00955 <span class="keywordflow">for</span>(<span class="keyword">typename</span> Container::const_iterator i = my_begin; i != my_end; ++i) {
+<a name="l00956"></a>00956 tot_size += i->size();
+<a name="l00957"></a>00957 }
+<a name="l00958"></a>00958 <span class="keywordflow">return</span> tot_size;
+<a name="l00959"></a>00959 }
+<a name="l00960"></a>00960
+<a name="l00961"></a>00961 <span class="keyword">private</span>:
+<a name="l00962"></a>00962
+<a name="l00963"></a>00963 Container *my_container;
+<a name="l00964"></a>00964 <span class="keyword">typename</span> Container::const_iterator my_begin;
+<a name="l00965"></a>00965 <span class="keyword">typename</span> Container::const_iterator my_end;
+<a name="l00966"></a>00966
+<a name="l00967"></a>00967 };
+<a name="l00968"></a>00968
+<a name="l00969"></a>00969 <span class="keyword">template</span> <<span class="keyword">typename</span> Container>
+<a name="l00970"></a>00970 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="l00971"></a>00971 <span class="keywordflow">return</span> flattened2d<Container>(c, b, e);
+<a name="l00972"></a>00972 }
+<a name="l00973"></a>00973
+<a name="l00974"></a>00974 <span class="keyword">template</span> <<span class="keyword">typename</span> Container>
+<a name="l00975"></a>00975 flattened2d<Container> flatten2d(<span class="keyword">const</span> Container &c) {
+<a name="l00976"></a>00976 <span class="keywordflow">return</span> flattened2d<Container>(c);
+<a name="l00977"></a>00977 }
+<a name="l00978"></a>00978
+<a name="l00979"></a>00979 } <span class="comment">// interface6</span>
+<a name="l00980"></a>00980
+<a name="l00981"></a>00981 <span class="keyword">namespace </span>internal {
+<a name="l00982"></a>00982 <span class="keyword">using</span> interface6::internal::segmented_iterator;
+<a name="l00983"></a>00983 }
+<a name="l00984"></a>00984
+<a name="l00985"></a>00985 <span class="keyword">using</span> interface6::enumerable_thread_specific;
+<a name="l00986"></a>00986 <span class="keyword">using</span> interface6::flattened2d;
+<a name="l00987"></a>00987 <span class="keyword">using</span> interface6::flatten2d;
+<a name="l00988"></a>00988
+<a name="l00989"></a>00989 } <span class="comment">// namespace tbb</span>
+<a name="l00990"></a>00990
+<a name="l00991"></a>00991 <span class="preprocessor">#endif</span>
+</pre></div><hr>
+<p></p>
+Copyright © 2005-2011 Intel Corporation. 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 4cd8731..0000000
--- a/doc/html/a00466.html
+++ /dev/null
@@ -1,2522 +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>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>graph.h</h1><a href="a00326.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-2011 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_graph_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_graph_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#if !TBB_PREVIEW_GRAPH</span>
-<a name="l00025"></a>00025 <span class="preprocessor"></span><span class="preprocessor">#error Set TBB_PREVIEW_GRAPH to include graph.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_stddef.h"</span>
-<a name="l00029"></a>00029 <span class="preprocessor">#include "atomic.h"</span>
-<a name="l00030"></a>00030 <span class="preprocessor">#include "spin_mutex.h"</span>
-<a name="l00031"></a>00031 <span class="preprocessor">#include "null_mutex.h"</span>
-<a name="l00032"></a>00032 <span class="preprocessor">#include "spin_rw_mutex.h"</span>
-<a name="l00033"></a>00033 <span class="preprocessor">#include "null_rw_mutex.h"</span>
-<a name="l00034"></a>00034 <span class="preprocessor">#include "task.h"</span>
-<a name="l00035"></a>00035 <span class="preprocessor">#include "concurrent_vector.h"</span>
-<a name="l00036"></a>00036 <span class="preprocessor">#include "_aggregator_internal.h"</span>
-<a name="l00037"></a>00037
-<a name="l00038"></a>00038 <span class="comment">// use the VC10 or gcc version of tuple if it is available.</span>
-<a name="l00039"></a>00039 <span class="preprocessor">#if TBB_IMPLEMENT_CPP0X && (!defined(_MSC_VER) || _MSC_VER < 1600)</span>
-<a name="l00040"></a>00040 <span class="preprocessor"></span><span class="preprocessor">#define TBB_PREVIEW_TUPLE 1</span>
-<a name="l00041"></a>00041 <span class="preprocessor"></span><span class="preprocessor">#include "compat/tuple"</span>
-<a name="l00042"></a>00042 <span class="preprocessor">#else</span>
-<a name="l00043"></a>00043 <span class="preprocessor"></span><span class="preprocessor">#include <tuple></span>
-<a name="l00044"></a>00044 <span class="preprocessor">#endif</span>
-<a name="l00045"></a>00045 <span class="preprocessor"></span>
-<a name="l00046"></a>00046 <span class="preprocessor">#include<list></span>
-<a name="l00047"></a>00047 <span class="preprocessor">#include<queue></span>
-<a name="l00048"></a>00048
-<a name="l00049"></a>00049
-<a name="l00060"></a>00060 <span class="keyword">namespace </span>tbb {
-<a name="l00061"></a>00061
-<a name="l00063"></a><a class="code" href="a00251.html">00063</a> <span class="keyword">class </span><a class="code" href="a00251.html">graph_node</a> {
-<a name="l00064"></a>00064 <span class="keyword">public</span>:
-<a name="l00065"></a>00065 <span class="keyword">virtual</span> ~<a class="code" href="a00251.html">graph_node</a>() {}
-<a name="l00066"></a>00066 };
-<a name="l00067"></a>00067
-<a name="l00069"></a><a class="code" href="a00239.html">00069</a> <span class="keyword">class </span><a class="code" href="a00239.html">continue_msg</a> {};
-<a name="l00070"></a>00070
-<a name="l00071"></a>00071 <span class="keyword">template</span>< <span class="keyword">typename</span> T > <span class="keyword">class </span><a class="code" href="a00282.html">sender</a>;
-<a name="l00072"></a>00072 <span class="keyword">template</span>< <span class="keyword">typename</span> T > <span class="keyword">class </span><a class="code" href="a00277.html">receiver</a>;
-<a name="l00073"></a>00073 <span class="keyword">class </span><a class="code" href="a00241.html">continue_receiver</a>;
-<a name="l00074"></a>00074
-<a name="l00076"></a>00076 <span class="keyword">template</span>< <span class="keyword">typename</span> T >
-<a name="l00077"></a><a class="code" href="a00282.html">00077</a> <span class="keyword">class </span><a class="code" href="a00282.html">sender</a> {
-<a name="l00078"></a>00078 <span class="keyword">public</span>:
-<a name="l00080"></a><a class="code" href="a00282.html#d3aa21714dfc464e65a471816e38ea89">00080</a> <span class="keyword">typedef</span> T <a class="code" href="a00282.html#d3aa21714dfc464e65a471816e38ea89">output_type</a>;
-<a name="l00081"></a>00081
-<a name="l00083"></a><a class="code" href="a00282.html#c0746cda7dfd266f01acaf6cd5d4b77d">00083</a> <span class="keyword">typedef</span> <a class="code" href="a00277.html">receiver<T></a> <a class="code" href="a00277.html">successor_type</a>;
-<a name="l00084"></a>00084
-<a name="l00085"></a>00085 <span class="keyword">virtual</span> ~<a class="code" href="a00282.html">sender</a>() {}
-<a name="l00086"></a>00086
-<a name="l00088"></a>00088 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="a00282.html#be48ac70174cf8e08e2b0279cd6343d3">register_successor</a>( <a class="code" href="a00282.html#c0746cda7dfd266f01acaf6cd5d4b77d">successor_type</a> &r ) = 0;
-<a name="l00089"></a>00089
-<a name="l00091"></a>00091 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="a00282.html#3f345427e812e8741370308ff88f30bf">remove_successor</a>( <a class="code" href="a00282.html#c0746cda7dfd266f01acaf6cd5d4b77d">successor_type</a> &r ) = 0;
-<a name="l00092"></a>00092
-<a name="l00094"></a><a class="code" href="a00282.html#bf8c9235810354f3353a899c982645de">00094</a> <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="a00282.html#bf8c9235810354f3353a899c982645de">try_get</a>( T & ) { <span class="keywordflow">return</span> <span class="keyword">false</span>; }
-<a name="l00095"></a>00095
-<a name="l00097"></a><a class="code" href="a00282.html#3506c7275aeeb2fc3ba5d5f10ee0adac">00097</a> <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="a00282.html#3506c7275aeeb2fc3ba5d5f10ee0adac">try_reserve</a>( T & ) { <span class="keywordflow">return</span> <span class="keyword">false</span>; }
-<a name="l00098"></a>00098
-<a name="l00100"></a><a class="code" href="a00282.html#28c41df1c0c7ed485b4a691ec8f30098">00100</a> <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="a00282.html#28c41df1c0c7ed485b4a691ec8f30098">try_release</a>( ) { <span class="keywordflow">return</span> <span class="keyword">false</span>; }
-<a name="l00101"></a>00101
-<a name="l00103"></a><a class="code" href="a00282.html#add46946c4c7330422733432e4032fac">00103</a> <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="a00282.html#add46946c4c7330422733432e4032fac">try_consume</a>( ) { <span class="keywordflow">return</span> <span class="keyword">false</span>; }
-<a name="l00104"></a>00104
-<a name="l00105"></a>00105 };
-<a name="l00106"></a>00106
-<a name="l00107"></a>00107
-<a name="l00109"></a>00109 <span class="keyword">template</span>< <span class="keyword">typename</span> T >
-<a name="l00110"></a><a class="code" href="a00277.html">00110</a> <span class="keyword">class </span><a class="code" href="a00277.html">receiver</a> {
-<a name="l00111"></a>00111 <span class="keyword">public</span>:
-<a name="l00112"></a>00112
-<a name="l00114"></a><a class="code" href="a00277.html#9cfd5ef0d67d5bbfb5f9a76d75e62765">00114</a> <span class="keyword">typedef</span> T <a class="code" href="a00239.html">input_type</a>;
-<a name="l00115"></a>00115
-<a name="l00117"></a><a class="code" href="a00277.html#c802c845b51c6d129153b684d33f7310">00117</a> <span class="keyword">typedef</span> <a class="code" href="a00282.html">sender<T></a> <a class="code" href="a00282.html">predecessor_type</a>;
-<a name="l00118"></a>00118
-<a name="l00120"></a><a class="code" href="a00277.html#18f74b83abae0ee1e4ce07942797ef27">00120</a> <span class="keyword">virtual</span> <a class="code" href="a00277.html#18f74b83abae0ee1e4ce07942797ef27">~receiver</a>() {}
-<a name="l00121"></a>00121
-<a name="l00123"></a>00123 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="a00277.html#6e5422b03b4570138f227b3d5d0073b8">try_put</a>( T t ) = 0;
-<a name="l00124"></a>00124
-<a name="l00126"></a><a class="code" href="a00277.html#14ae737c8fca4c8bf8e1a736dfbac444">00126</a> <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="a00277.html#14ae737c8fca4c8bf8e1a736dfbac444">register_predecessor</a>( <a class="code" href="a00282.html">predecessor_type</a> & ) { <span class="keywordflow">return</span> <span class="keyword">false</span>; }
-<a name="l00127"></a>00127
-<a name="l00129"></a><a class="code" href="a00277.html#d2f23b40b328dc254a7c2a0a30f408e4">00129</a> <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="a00277.html#d2f23b40b328dc254a7c2a0a30f408e4">remove_predecessor</a>( <a class="code" href="a00282.html">predecessor_type</a> & ) { <span class="keywordflow">return</span> <span class="keyword">false</span>; }
-<a name="l00130"></a>00130
-<a name="l00131"></a>00131 };
-<a name="l00132"></a>00132
-<a name="l00134"></a>00134
-<a name="l00135"></a><a class="code" href="a00241.html">00135</a> <span class="keyword">class </span><a class="code" href="a00241.html">continue_receiver</a> : <span class="keyword">public</span> <a class="code" href="a00277.html">receiver</a>< continue_msg > {
-<a name="l00136"></a>00136 <span class="keyword">public</span>:
-<a name="l00137"></a>00137
-<a name="l00139"></a><a class="code" href="a00241.html#21acef0b97b53d92f637619012837b30">00139</a> <span class="keyword">typedef</span> <a class="code" href="a00239.html">continue_msg</a> <a class="code" href="a00239.html">input_type</a>;
-<a name="l00140"></a>00140
-<a name="l00142"></a><a class="code" href="a00241.html#52fa92968dd48560d59798ca7ba6a3a2">00142</a> <span class="keyword">typedef</span> <a class="code" href="a00282.html">sender< continue_msg ></a> <a class="code" href="a00282.html">predecessor_type</a>;
-<a name="l00143"></a>00143
-<a name="l00145"></a><a class="code" href="a00241.html#799d383813261426d881b10247caadba">00145</a> <a class="code" href="a00241.html#799d383813261426d881b10247caadba">continue_receiver</a>( <span class="keywordtype">int</span> number_of_predecessors = 0 ) {
-<a name="l00146"></a>00146 my_predecessor_count = number_of_predecessors;
-<a name="l00147"></a>00147 my_current_count = 0;
-<a name="l00148"></a>00148 }
-<a name="l00149"></a>00149
-<a name="l00151"></a><a class="code" href="a00241.html#9a38edb7e1e3c9be4e3848145c51a617">00151</a> <span class="keyword">virtual</span> <a class="code" href="a00241.html#9a38edb7e1e3c9be4e3848145c51a617">~continue_receiver</a>() { }
-<a name="l00152"></a>00152
-<a name="l00154"></a><a class="code" href="a00241.html#b9fa9290cbb871f8780f9d69e1ec3b4e">00154</a> <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00241.html#b9fa9290cbb871f8780f9d69e1ec3b4e">register_predecessor</a>( <a class="code" href="a00282.html">predecessor_type</a> & ) {
-<a name="l00155"></a>00155 <a class="code" href="a00287.html">spin_mutex::scoped_lock</a> l(my_mutex);
-<a name="l00156"></a>00156 ++my_predecessor_count;
-<a name="l00157"></a>00157 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l00158"></a>00158 }
-<a name="l00159"></a>00159
-<a name="l00161"></a>00161
-<a name="l00164"></a><a class="code" href="a00241.html#02411d8d13b380062548aff133752cc5">00164</a> <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00241.html#02411d8d13b380062548aff133752cc5">remove_predecessor</a>( <a class="code" href="a00282.html">predecessor_type</a> & ) {
-<a name="l00165"></a>00165 <a class="code" href="a00287.html">spin_mutex::scoped_lock</a> l(my_mutex);
-<a name="l00166"></a>00166 --my_predecessor_count;
-<a name="l00167"></a>00167 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l00168"></a>00168 }
-<a name="l00169"></a>00169
-<a name="l00171"></a>00171
-<a name="l00173"></a><a class="code" href="a00241.html#a7f8b9cc6286eb2cd8d429d6279da64d">00173</a> <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00241.html#a7f8b9cc6286eb2cd8d429d6279da64d">try_put</a>( <a class="code" href="a00239.html">input_type</a> ) {
-<a name="l00174"></a>00174 {
-<a name="l00175"></a>00175 <a class="code" href="a00287.html">spin_mutex::scoped_lock</a> l(my_mutex);
-<a name="l00176"></a>00176 <span class="keywordflow">if</span> ( ++my_current_count < my_predecessor_count )
-<a name="l00177"></a>00177 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l00178"></a>00178 <span class="keywordflow">else</span>
-<a name="l00179"></a>00179 my_current_count = 0;
-<a name="l00180"></a>00180 }
-<a name="l00181"></a>00181 <a class="code" href="a00241.html#e6bf1d21e670b78ea00c71fccbe17c78">execute</a>();
-<a name="l00182"></a>00182 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l00183"></a>00183 }
-<a name="l00184"></a>00184
-<a name="l00185"></a>00185 <span class="keyword">protected</span>:
-<a name="l00186"></a>00186
-<a name="l00187"></a>00187 <a class="code" href="a00286.html">spin_mutex</a> my_mutex;
-<a name="l00188"></a>00188 <span class="keywordtype">int</span> my_predecessor_count;
-<a name="l00189"></a>00189 <span class="keywordtype">int</span> my_current_count;
-<a name="l00190"></a>00190
-<a name="l00192"></a>00192
-<a name="l00194"></a>00194 <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="a00241.html#e6bf1d21e670b78ea00c71fccbe17c78">execute</a>() = 0;
-<a name="l00195"></a>00195
-<a name="l00196"></a>00196 };
-<a name="l00197"></a>00197
-<a name="l00199"></a>00199 <span class="keyword">namespace </span>internal {
-<a name="l00200"></a>00200
-<a name="l00202"></a>00202 <span class="keyword">enum</span> node_state { node_state_idle=0, node_state_nonidle=1, node_state_inactive=2 };
-<a name="l00203"></a>00203
-<a name="l00204"></a>00204
-<a name="l00206"></a>00206 <span class="keyword">template</span>< <span class="keyword">typename</span> Output >
-<a name="l00207"></a>00207 <span class="keyword">class </span>source_body : no_assign {
-<a name="l00208"></a>00208 <span class="keyword">public</span>:
-<a name="l00209"></a>00209 <span class="keyword">virtual</span> ~source_body() {}
-<a name="l00210"></a>00210 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> operator()(Output &output) = 0;
-<a name="l00211"></a>00211 };
-<a name="l00212"></a>00212
-<a name="l00214"></a>00214 <span class="keyword">template</span>< <span class="keyword">typename</span> Output, <span class="keyword">typename</span> Body>
-<a name="l00215"></a>00215 <span class="keyword">class </span>source_body_leaf : <span class="keyword">public</span> source_body<Output> {
-<a name="l00216"></a>00216 <span class="keyword">public</span>:
-<a name="l00217"></a>00217 source_body_leaf( Body _body ) : body(_body) { }
-<a name="l00218"></a>00218 <span class="comment">/*override */</span> <span class="keywordtype">bool</span> operator()(Output &output) { <span class="keywordflow">return</span> body( output ); }
-<a name="l00219"></a>00219 <span class="keyword">private</span>:
-<a name="l00220"></a>00220 Body body;
-<a name="l00221"></a>00221 };
-<a name="l00222"></a>00222
-<a name="l00224"></a>00224 <span class="keyword">template</span>< <span class="keyword">typename</span> Input, <span class="keyword">typename</span> Output >
-<a name="l00225"></a>00225 <span class="keyword">class </span>function_body : no_assign {
-<a name="l00226"></a>00226 <span class="keyword">public</span>:
-<a name="l00227"></a>00227 <span class="keyword">virtual</span> ~function_body() {}
-<a name="l00228"></a>00228 <span class="keyword">virtual</span> Output operator()(Input input) = 0;
-<a name="l00229"></a>00229 };
-<a name="l00230"></a>00230
-<a name="l00232"></a>00232 <span class="keyword">template</span> <<span class="keyword">typename</span> Input, <span class="keyword">typename</span> Output, <span class="keyword">typename</span> B>
-<a name="l00233"></a>00233 <span class="keyword">class </span>function_body_leaf : <span class="keyword">public</span> function_body< Input, Output > {
-<a name="l00234"></a>00234 <span class="keyword">public</span>:
-<a name="l00235"></a>00235 function_body_leaf( B _body ) : body(_body) { }
-<a name="l00236"></a>00236 Output operator()(Input i) { <span class="keywordflow">return</span> body(i); }
-<a name="l00237"></a>00237
-<a name="l00238"></a>00238 <span class="keyword">private</span>:
-<a name="l00239"></a>00239 B body;
-<a name="l00240"></a>00240 };
-<a name="l00241"></a>00241
-<a name="l00243"></a>00243 <span class="keyword">template</span> <<span class="keyword">typename</span> B>
-<a name="l00244"></a>00244 <span class="keyword">class </span>function_body_leaf< continue_msg, continue_msg, B> : <span class="keyword">public</span> function_body< continue_msg, continue_msg > {
-<a name="l00245"></a>00245 <span class="keyword">public</span>:
-<a name="l00246"></a>00246 function_body_leaf( B _body ) : body(_body) { }
-<a name="l00247"></a>00247 continue_msg operator()( continue_msg i ) {
-<a name="l00248"></a>00248 body(i);
-<a name="l00249"></a>00249 <span class="keywordflow">return</span> i;
-<a name="l00250"></a>00250 }
-<a name="l00251"></a>00251
-<a name="l00252"></a>00252 <span class="keyword">private</span>:
-<a name="l00253"></a>00253 B body;
-<a name="l00254"></a>00254 };
-<a name="l00255"></a>00255
-<a name="l00257"></a>00257 <span class="keyword">template</span> <<span class="keyword">typename</span> Input, <span class="keyword">typename</span> B>
-<a name="l00258"></a>00258 <span class="keyword">class </span>function_body_leaf< Input, continue_msg, B> : <span class="keyword">public</span> function_body< Input, continue_msg > {
-<a name="l00259"></a>00259 <span class="keyword">public</span>:
-<a name="l00260"></a>00260 function_body_leaf( B _body ) : body(_body) { }
-<a name="l00261"></a>00261 continue_msg operator()(Input i) {
-<a name="l00262"></a>00262 body(i);
-<a name="l00263"></a>00263 <span class="keywordflow">return</span> continue_msg();
-<a name="l00264"></a>00264 }
-<a name="l00265"></a>00265
-<a name="l00266"></a>00266 <span class="keyword">private</span>:
-<a name="l00267"></a>00267 B body;
-<a name="l00268"></a>00268 };
-<a name="l00269"></a>00269
-<a name="l00271"></a>00271 <span class="keyword">template</span> <<span class="keyword">typename</span> Output, <span class="keyword">typename</span> B>
-<a name="l00272"></a>00272 <span class="keyword">class </span>function_body_leaf< continue_msg, Output, B > : <span class="keyword">public</span> function_body< continue_msg, Output > {
-<a name="l00273"></a>00273 <span class="keyword">public</span>:
-<a name="l00274"></a>00274 function_body_leaf( B _body ) : body(_body) { }
-<a name="l00275"></a>00275 Output operator()(continue_msg i) {
-<a name="l00276"></a>00276 <span class="keywordflow">return</span> body(i);
-<a name="l00277"></a>00277 }
-<a name="l00278"></a>00278
-<a name="l00279"></a>00279 <span class="keyword">private</span>:
-<a name="l00280"></a>00280 B body;
-<a name="l00281"></a>00281 };
-<a name="l00282"></a>00282
-<a name="l00284"></a>00284 <span class="keyword">template</span>< <span class="keyword">typename</span> NodeType >
-<a name="l00285"></a>00285 <span class="keyword">class </span>forward_task : <span class="keyword">public</span> task {
-<a name="l00286"></a>00286
-<a name="l00287"></a>00287 NodeType &my_node;
-<a name="l00288"></a>00288
-<a name="l00289"></a>00289 <span class="keyword">public</span>:
-<a name="l00290"></a>00290
-<a name="l00291"></a>00291 forward_task( NodeType &n ) : my_node(n) {}
-<a name="l00292"></a>00292
-<a name="l00293"></a>00293 task *execute() {
-<a name="l00294"></a>00294 my_node.forward();
-<a name="l00295"></a>00295 <span class="keywordflow">return</span> NULL;
-<a name="l00296"></a>00296 }
-<a name="l00297"></a>00297 };
-<a name="l00298"></a>00298
-<a name="l00300"></a>00300 <span class="keyword">template</span>< <span class="keyword">typename</span> NodeType, <span class="keyword">typename</span> Input >
-<a name="l00301"></a>00301 <span class="keyword">class </span>apply_body_task : <span class="keyword">public</span> task {
-<a name="l00302"></a>00302
-<a name="l00303"></a>00303 NodeType &my_node;
-<a name="l00304"></a>00304 Input my_input;
-<a name="l00305"></a>00305
-<a name="l00306"></a>00306 <span class="keyword">public</span>:
-<a name="l00307"></a>00307
-<a name="l00308"></a>00308 apply_body_task( NodeType &n, Input i ) : my_node(n), my_input(i) {}
-<a name="l00309"></a>00309
-<a name="l00310"></a>00310 task *execute() {
-<a name="l00311"></a>00311 my_node.apply_body( my_input );
-<a name="l00312"></a>00312 <span class="keywordflow">return</span> NULL;
-<a name="l00313"></a>00313 }
-<a name="l00314"></a>00314 };
-<a name="l00315"></a>00315
-<a name="l00317"></a>00317 <span class="keyword">template</span>< <span class="keyword">typename</span> NodeType >
-<a name="l00318"></a>00318 <span class="keyword">class </span>source_task : <span class="keyword">public</span> task {
-<a name="l00319"></a>00319
-<a name="l00320"></a>00320 NodeType &my_node;
-<a name="l00321"></a>00321
-<a name="l00322"></a>00322 <span class="keyword">public</span>:
-<a name="l00323"></a>00323
-<a name="l00324"></a>00324 source_task( NodeType &n ) : my_node(n) {}
-<a name="l00325"></a>00325
-<a name="l00326"></a>00326 task *execute() {
-<a name="l00327"></a>00327 my_node.apply_body( );
-<a name="l00328"></a>00328 <span class="keywordflow">return</span> NULL;
-<a name="l00329"></a>00329 }
-<a name="l00330"></a>00330 };
-<a name="l00331"></a>00331
-<a name="l00333"></a>00333 <span class="keyword">template</span>< <span class="keyword">typename</span> Input, <span class="keyword">typename</span> Output >
-<a name="l00334"></a>00334 <span class="keyword">struct </span>empty_body {
-<a name="l00335"></a>00335 Output operator()( Input & )<span class="keyword"> const </span>{ <span class="keywordflow">return</span> Output(); }
-<a name="l00336"></a>00336 };
-<a name="l00337"></a>00337
-<a name="l00339"></a>00339 <span class="keyword">template</span>< <span class="keyword">typename</span> T, <span class="keyword">typename</span> M=spin_mutex >
-<a name="l00340"></a>00340 <span class="keyword">class </span>node_cache {
-<a name="l00341"></a>00341 <span class="keyword">public</span>:
-<a name="l00342"></a>00342
-<a name="l00343"></a>00343 <span class="keyword">typedef</span> size_t size_type;
-<a name="l00344"></a>00344
-<a name="l00345"></a>00345 <span class="keywordtype">bool</span> empty() {
-<a name="l00346"></a>00346 <span class="keyword">typename</span> my_mutex_type::scoped_lock lock( my_mutex );
-<a name="l00347"></a>00347 <span class="keywordflow">return</span> internal_empty();
-<a name="l00348"></a>00348 }
-<a name="l00349"></a>00349
-<a name="l00350"></a>00350 <span class="keywordtype">void</span> add( T &n ) {
-<a name="l00351"></a>00351 <span class="keyword">typename</span> my_mutex_type::scoped_lock lock( my_mutex );
-<a name="l00352"></a>00352 internal_push(n);
-<a name="l00353"></a>00353 }
-<a name="l00354"></a>00354
-<a name="l00355"></a>00355 <span class="keywordtype">void</span> remove( T &n ) {
-<a name="l00356"></a>00356 <span class="keyword">typename</span> my_mutex_type::scoped_lock lock( my_mutex );
-<a name="l00357"></a>00357 <span class="keywordflow">for</span> ( size_t i = internal_size(); i != 0; --i ) {
-<a name="l00358"></a>00358 T &s = internal_pop();
-<a name="l00359"></a>00359 <span class="keywordflow">if</span> ( &s != &n ) {
-<a name="l00360"></a>00360 internal_push(s);
-<a name="l00361"></a>00361 }
-<a name="l00362"></a>00362 }
-<a name="l00363"></a>00363 }
-<a name="l00364"></a>00364
-<a name="l00365"></a>00365 <span class="keyword">protected</span>:
-<a name="l00366"></a>00366
-<a name="l00367"></a>00367 <span class="keyword">typedef</span> M my_mutex_type;
-<a name="l00368"></a>00368 my_mutex_type my_mutex;
-<a name="l00369"></a>00369 std::queue< T * > my_q;
-<a name="l00370"></a>00370
-<a name="l00371"></a>00371 <span class="comment">// Assumes lock is held</span>
-<a name="l00372"></a>00372 <span class="keyword">inline</span> <span class="keywordtype">bool</span> internal_empty( ) {
-<a name="l00373"></a>00373 <span class="keywordflow">return</span> my_q.empty();
-<a name="l00374"></a>00374 }
-<a name="l00375"></a>00375
-<a name="l00376"></a>00376 <span class="comment">// Assumes lock is held</span>
-<a name="l00377"></a>00377 <span class="keyword">inline</span> size_type internal_size( ) {
-<a name="l00378"></a>00378 <span class="keywordflow">return</span> my_q.size();
-<a name="l00379"></a>00379 }
-<a name="l00380"></a>00380
-<a name="l00381"></a>00381 <span class="comment">// Assumes lock is held</span>
-<a name="l00382"></a>00382 <span class="keyword">inline</span> <span class="keywordtype">void</span> internal_push( T &n ) {
-<a name="l00383"></a>00383 my_q.push(&n);
-<a name="l00384"></a>00384 }
-<a name="l00385"></a>00385
-<a name="l00386"></a>00386 <span class="comment">// Assumes lock is held</span>
-<a name="l00387"></a>00387 <span class="keyword">inline</span> T &internal_pop() {
-<a name="l00388"></a>00388 T *v = my_q.front();
-<a name="l00389"></a>00389 my_q.pop();
-<a name="l00390"></a>00390 <span class="keywordflow">return</span> *v;
-<a name="l00391"></a>00391 }
-<a name="l00392"></a>00392
-<a name="l00393"></a>00393 };
-<a name="l00394"></a>00394
-<a name="l00396"></a>00396 <span class="keyword">template</span>< <span class="keyword">typename</span> T, <span class="keyword">typename</span> M=spin_mutex >
-<a name="l00397"></a>00397 <span class="keyword">class </span>predecessor_cache : <span class="keyword">public</span> node_cache< sender<T>, M > {
-<a name="l00398"></a>00398 <span class="keyword">public</span>:
-<a name="l00399"></a>00399 <span class="keyword">typedef</span> M my_mutex_type;
-<a name="l00400"></a>00400 <span class="keyword">typedef</span> T output_type;
-<a name="l00401"></a>00401 <span class="keyword">typedef</span> sender<output_type> predecessor_type;
-<a name="l00402"></a>00402 <span class="keyword">typedef</span> receiver<output_type> successor_type;
-<a name="l00403"></a>00403
-<a name="l00404"></a>00404 predecessor_cache( ) : my_owner( NULL ) { }
-<a name="l00405"></a>00405
-<a name="l00406"></a>00406 <span class="keywordtype">void</span> set_owner( successor_type *owner ) { my_owner = owner; }
-<a name="l00407"></a>00407
-<a name="l00408"></a>00408 <span class="keywordtype">bool</span> get_item( output_type &v ) {
-<a name="l00409"></a>00409
-<a name="l00410"></a>00410 <span class="keywordtype">bool</span> msg = <span class="keyword">false</span>;
-<a name="l00411"></a>00411
-<a name="l00412"></a>00412 <span class="keywordflow">do</span> {
-<a name="l00413"></a>00413 predecessor_type *src;
-<a name="l00414"></a>00414 {
-<a name="l00415"></a>00415 <span class="keyword">typename</span> my_mutex_type::scoped_lock lock(this->my_mutex);
-<a name="l00416"></a>00416 <span class="keywordflow">if</span> ( this->internal_empty() ) {
-<a name="l00417"></a>00417 <span class="keywordflow">break</span>;
-<a name="l00418"></a>00418 }
-<a name="l00419"></a>00419 src = &this->internal_pop();
-<a name="l00420"></a>00420 }
-<a name="l00421"></a>00421
-<a name="l00422"></a>00422 <span class="comment">// Try to get from this sender</span>
-<a name="l00423"></a>00423 msg = src->try_get( v );
-<a name="l00424"></a>00424
-<a name="l00425"></a>00425 <span class="keywordflow">if</span> (msg == <span class="keyword">false</span>) {
-<a name="l00426"></a>00426 <span class="comment">// Relinquish ownership of the edge</span>
-<a name="l00427"></a>00427 <span class="keywordflow">if</span> ( my_owner)
-<a name="l00428"></a>00428 src->register_successor( *my_owner );
-<a name="l00429"></a>00429 } <span class="keywordflow">else</span> {
-<a name="l00430"></a>00430 <span class="comment">// Retain ownership of the edge</span>
-<a name="l00431"></a>00431 this->add(*src);
-<a name="l00432"></a>00432 }
-<a name="l00433"></a>00433 } <span class="keywordflow">while</span> ( msg == <span class="keyword">false</span> );
-<a name="l00434"></a>00434 <span class="keywordflow">return</span> msg;
-<a name="l00435"></a>00435 }
-<a name="l00436"></a>00436
-<a name="l00437"></a>00437 <span class="keyword">protected</span>:
-<a name="l00438"></a>00438 successor_type *my_owner;
-<a name="l00439"></a>00439 };
-<a name="l00440"></a>00440
-<a name="l00442"></a>00442 <span class="keyword">template</span>< <span class="keyword">typename</span> T, <span class="keyword">typename</span> M=spin_mutex >
-<a name="l00443"></a>00443 <span class="keyword">class </span>reservable_predecessor_cache : <span class="keyword">public</span> predecessor_cache< T, M > {
-<a name="l00444"></a>00444 <span class="keyword">public</span>:
-<a name="l00445"></a>00445 <span class="keyword">typedef</span> M my_mutex_type;
-<a name="l00446"></a>00446 <span class="keyword">typedef</span> T output_type;
-<a name="l00447"></a>00447 <span class="keyword">typedef</span> sender<T> predecessor_type;
-<a name="l00448"></a>00448 <span class="keyword">typedef</span> receiver<T> successor_type;
-<a name="l00449"></a>00449
-<a name="l00450"></a>00450 reservable_predecessor_cache( ) : reserved_src(NULL) { }
-<a name="l00451"></a>00451
-<a name="l00452"></a>00452 <span class="keywordtype">bool</span>
-<a name="l00453"></a>00453 try_reserve( output_type &v ) {
-<a name="l00454"></a>00454 <span class="keywordtype">bool</span> msg = <span class="keyword">false</span>;
-<a name="l00455"></a>00455
-<a name="l00456"></a>00456 <span class="keywordflow">do</span> {
-<a name="l00457"></a>00457 {
-<a name="l00458"></a>00458 <span class="keyword">typename</span> my_mutex_type::scoped_lock lock(this->my_mutex);
-<a name="l00459"></a>00459 <span class="keywordflow">if</span> ( reserved_src || this->internal_empty() )
-<a name="l00460"></a>00460 <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l00461"></a>00461
-<a name="l00462"></a>00462 reserved_src = &this->internal_pop();
-<a name="l00463"></a>00463 }
-<a name="l00464"></a>00464
-<a name="l00465"></a>00465 <span class="comment">// Try to get from this sender</span>
-<a name="l00466"></a>00466 msg = reserved_src->try_reserve( v );
-<a name="l00467"></a>00467
-<a name="l00468"></a>00468 <span class="keywordflow">if</span> (msg == <span class="keyword">false</span>) {
-<a name="l00469"></a>00469 <span class="keyword">typename</span> my_mutex_type::scoped_lock lock(this->my_mutex);
-<a name="l00470"></a>00470 <span class="comment">// Relinquish ownership of the edge</span>
-<a name="l00471"></a>00471 reserved_src->register_successor( *this->my_owner );
-<a name="l00472"></a>00472 reserved_src = NULL;
-<a name="l00473"></a>00473 } <span class="keywordflow">else</span> {
-<a name="l00474"></a>00474 <span class="comment">// Retain ownership of the edge</span>
-<a name="l00475"></a>00475 this->add( *reserved_src );
-<a name="l00476"></a>00476 }
-<a name="l00477"></a>00477 } <span class="keywordflow">while</span> ( msg == <span class="keyword">false</span> );
-<a name="l00478"></a>00478
-<a name="l00479"></a>00479 <span class="keywordflow">return</span> msg;
-<a name="l00480"></a>00480 }
-<a name="l00481"></a>00481
-<a name="l00482"></a>00482 <span class="keywordtype">bool</span>
-<a name="l00483"></a>00483 try_release( ) {
-<a name="l00484"></a>00484 reserved_src->try_release( );
-<a name="l00485"></a>00485 reserved_src = NULL;
-<a name="l00486"></a>00486 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l00487"></a>00487 }
-<a name="l00488"></a>00488
-<a name="l00489"></a>00489 <span class="keywordtype">bool</span>
-<a name="l00490"></a>00490 try_consume( ) {
-<a name="l00491"></a>00491 reserved_src->try_consume( );
-<a name="l00492"></a>00492 reserved_src = NULL;
-<a name="l00493"></a>00493 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l00494"></a>00494 }
-<a name="l00495"></a>00495
-<a name="l00496"></a>00496 <span class="keyword">private</span>:
-<a name="l00497"></a>00497 predecessor_type *reserved_src;
-<a name="l00498"></a>00498 };
-<a name="l00499"></a>00499
-<a name="l00500"></a>00500
-<a name="l00502"></a>00502 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> M=spin_rw_mutex >
-<a name="l00503"></a>00503 <span class="keyword">class </span>successor_cache : no_copy {
-<a name="l00504"></a>00504 <span class="keyword">protected</span>:
-<a name="l00505"></a>00505
-<a name="l00506"></a>00506 <span class="keyword">typedef</span> M my_mutex_type;
-<a name="l00507"></a>00507 my_mutex_type my_mutex;
-<a name="l00508"></a>00508
-<a name="l00509"></a>00509 <span class="keyword">typedef</span> std::list< receiver<T> * > my_successors_type;
-<a name="l00510"></a>00510 my_successors_type my_successors;
-<a name="l00511"></a>00511
-<a name="l00512"></a>00512 sender<T> *my_owner;
-<a name="l00513"></a>00513
-<a name="l00514"></a>00514 <span class="keyword">public</span>:
-<a name="l00515"></a>00515
-<a name="l00516"></a>00516 successor_cache( ) : my_owner(NULL) {}
-<a name="l00517"></a>00517
-<a name="l00518"></a>00518 <span class="keywordtype">void</span> set_owner( sender<T> *owner ) { my_owner = owner; }
-<a name="l00519"></a>00519
-<a name="l00520"></a>00520 <span class="keyword">virtual</span> ~successor_cache() {}
-<a name="l00521"></a>00521
-<a name="l00522"></a>00522 <span class="keywordtype">void</span> register_successor( receiver<T> &r ) {
-<a name="l00523"></a>00523 <span class="keyword">typename</span> my_mutex_type::scoped_lock l(my_mutex, <span class="keyword">true</span>);
-<a name="l00524"></a>00524 my_successors.push_back( &r );
-<a name="l00525"></a>00525 }
-<a name="l00526"></a>00526
-<a name="l00527"></a>00527 <span class="keywordtype">void</span> remove_successor( receiver<T> &r ) {
-<a name="l00528"></a>00528 <span class="keyword">typename</span> my_mutex_type::scoped_lock l(my_mutex, <span class="keyword">true</span>);
-<a name="l00529"></a>00529 <span class="keywordflow">for</span> ( <span class="keyword">typename</span> my_successors_type::iterator i = my_successors.begin();
-<a name="l00530"></a>00530 i != my_successors.end(); ++i ) {
-<a name="l00531"></a>00531 <span class="keywordflow">if</span> ( *i == & r ) {
-<a name="l00532"></a>00532 my_successors.erase(i);
-<a name="l00533"></a>00533 <span class="keywordflow">break</span>;
-<a name="l00534"></a>00534 }
-<a name="l00535"></a>00535 }
-<a name="l00536"></a>00536 }
-<a name="l00537"></a>00537
-<a name="l00538"></a>00538 <span class="keywordtype">bool</span> empty() {
-<a name="l00539"></a>00539 <span class="keyword">typename</span> my_mutex_type::scoped_lock l(my_mutex, <span class="keyword">false</span>);
-<a name="l00540"></a>00540 <span class="keywordflow">return</span> my_successors.empty();
-<a name="l00541"></a>00541 }
-<a name="l00542"></a>00542
-<a name="l00543"></a>00543 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> try_put( T t ) = 0;
-<a name="l00544"></a>00544 };
-<a name="l00545"></a>00545
-<a name="l00547"></a>00547 <span class="keyword">template</span><>
-<a name="l00548"></a>00548 <span class="keyword">class </span>successor_cache< continue_msg > : no_copy {
-<a name="l00549"></a>00549 <span class="keyword">protected</span>:
-<a name="l00550"></a>00550
-<a name="l00551"></a>00551 <span class="keyword">typedef</span> spin_rw_mutex my_mutex_type;
-<a name="l00552"></a>00552 my_mutex_type my_mutex;
-<a name="l00553"></a>00553
-<a name="l00554"></a>00554 <span class="keyword">typedef</span> std::list< receiver<continue_msg> * > my_successors_type;
-<a name="l00555"></a>00555 my_successors_type my_successors;
-<a name="l00556"></a>00556
-<a name="l00557"></a>00557 sender<continue_msg> *my_owner;
-<a name="l00558"></a>00558
-<a name="l00559"></a>00559 <span class="keyword">public</span>:
-<a name="l00560"></a>00560
-<a name="l00561"></a>00561 successor_cache( ) : my_owner(NULL) {}
-<a name="l00562"></a>00562
-<a name="l00563"></a>00563 <span class="keywordtype">void</span> set_owner( sender<continue_msg> *owner ) { my_owner = owner; }
-<a name="l00564"></a>00564
-<a name="l00565"></a>00565 <span class="keyword">virtual</span> ~successor_cache() {}
-<a name="l00566"></a>00566
-<a name="l00567"></a>00567 <span class="keywordtype">void</span> register_successor( receiver<continue_msg> &r ) {
-<a name="l00568"></a>00568 my_mutex_type::scoped_lock l(my_mutex, <span class="keyword">true</span>);
-<a name="l00569"></a>00569 my_successors.push_back( &r );
-<a name="l00570"></a>00570 <span class="keywordflow">if</span> ( my_owner )
-<a name="l00571"></a>00571 r.register_predecessor( *my_owner );
-<a name="l00572"></a>00572 }
-<a name="l00573"></a>00573
-<a name="l00574"></a>00574 <span class="keywordtype">void</span> remove_successor( receiver<continue_msg> &r ) {
-<a name="l00575"></a>00575 my_mutex_type::scoped_lock l(my_mutex, <span class="keyword">true</span>);
-<a name="l00576"></a>00576 <span class="keywordflow">for</span> ( my_successors_type::iterator i = my_successors.begin();
-<a name="l00577"></a>00577 i != my_successors.end(); ++i ) {
-<a name="l00578"></a>00578 <span class="keywordflow">if</span> ( *i == & r ) {
-<a name="l00579"></a>00579 <span class="keywordflow">if</span> ( my_owner )
-<a name="l00580"></a>00580 r.remove_predecessor( *my_owner );
-<a name="l00581"></a>00581 my_successors.erase(i);
-<a name="l00582"></a>00582 <span class="keywordflow">break</span>;
-<a name="l00583"></a>00583 }
-<a name="l00584"></a>00584 }
-<a name="l00585"></a>00585 }
-<a name="l00586"></a>00586
-<a name="l00587"></a>00587 <span class="keywordtype">bool</span> empty() {
-<a name="l00588"></a>00588 my_mutex_type::scoped_lock l(my_mutex, <span class="keyword">false</span>);
-<a name="l00589"></a>00589 <span class="keywordflow">return</span> my_successors.empty();
-<a name="l00590"></a>00590 }
-<a name="l00591"></a>00591
-<a name="l00592"></a>00592 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> try_put( continue_msg t ) = 0;
-<a name="l00593"></a>00593
-<a name="l00594"></a>00594 };
-<a name="l00595"></a>00595
-<a name="l00597"></a>00597 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> M=spin_rw_mutex>
-<a name="l00598"></a>00598 <span class="keyword">class </span>broadcast_cache : <span class="keyword">public</span> successor_cache<T, M> {
-<a name="l00599"></a>00599 <span class="keyword">typedef</span> M my_mutex_type;
-<a name="l00600"></a>00600 <span class="keyword">typedef</span> std::list< receiver<T> * > my_successors_type;
-<a name="l00601"></a>00601
-<a name="l00602"></a>00602 <span class="keyword">public</span>:
-<a name="l00603"></a>00603
-<a name="l00604"></a>00604 broadcast_cache( ) {}
-<a name="l00605"></a>00605
-<a name="l00606"></a>00606 <span class="keywordtype">bool</span> try_put( T t ) {
-<a name="l00607"></a>00607 <span class="keywordtype">bool</span> msg = <span class="keyword">false</span>;
-<a name="l00608"></a>00608 <span class="keywordtype">bool</span> upgraded = <span class="keyword">false</span>;
-<a name="l00609"></a>00609 <span class="keyword">typename</span> my_mutex_type::scoped_lock l(this->my_mutex, <span class="keyword">false</span>);
-<a name="l00610"></a>00610 <span class="keyword">typename</span> my_successors_type::iterator i = this->my_successors.begin();
-<a name="l00611"></a>00611 <span class="keywordflow">while</span> ( i != this->my_successors.end() ) {
-<a name="l00612"></a>00612 <span class="keywordflow">if</span> ( (*i)->try_put( t ) == true ) {
-<a name="l00613"></a>00613 ++i;
-<a name="l00614"></a>00614 msg = <span class="keyword">true</span>;
-<a name="l00615"></a>00615 } <span class="keywordflow">else</span> {
-<a name="l00616"></a>00616 <span class="keywordflow">if</span> ( (*i)->register_predecessor(*this->my_owner) ) {
-<a name="l00617"></a>00617 <span class="keywordflow">if</span> (!upgraded) {
-<a name="l00618"></a>00618 l.upgrade_to_writer();
-<a name="l00619"></a>00619 upgraded = <span class="keyword">true</span>;
-<a name="l00620"></a>00620 }
-<a name="l00621"></a>00621 i = this->my_successors.erase(i);
-<a name="l00622"></a>00622 }
-<a name="l00623"></a>00623 <span class="keywordflow">else</span> {
-<a name="l00624"></a>00624 ++i;
-<a name="l00625"></a>00625 }
-<a name="l00626"></a>00626 }
-<a name="l00627"></a>00627 }
-<a name="l00628"></a>00628 <span class="keywordflow">return</span> msg;
-<a name="l00629"></a>00629 }
-<a name="l00630"></a>00630 };
-<a name="l00631"></a>00631
-<a name="l00633"></a>00633 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> M=spin_rw_mutex >
-<a name="l00634"></a>00634 <span class="keyword">class </span>round_robin_cache : <span class="keyword">public</span> successor_cache<T, M> {
-<a name="l00635"></a>00635 <span class="keyword">typedef</span> size_t size_type;
-<a name="l00636"></a>00636 <span class="keyword">typedef</span> M my_mutex_type;
-<a name="l00637"></a>00637 <span class="keyword">typedef</span> std::list< receiver<T> * > my_successors_type;
-<a name="l00638"></a>00638
-<a name="l00639"></a>00639 <span class="keyword">public</span>:
-<a name="l00640"></a>00640
-<a name="l00641"></a>00641 round_robin_cache( ) {}
-<a name="l00642"></a>00642
-<a name="l00643"></a>00643 size_type size() {
-<a name="l00644"></a>00644 <span class="keyword">typename</span> my_mutex_type::scoped_lock l(this->my_mutex, <span class="keyword">false</span>);
-<a name="l00645"></a>00645 <span class="keywordflow">return</span> this->my_successors.size();
-<a name="l00646"></a>00646 }
-<a name="l00647"></a>00647
-<a name="l00648"></a>00648 <span class="keywordtype">bool</span> try_put( T t ) {
-<a name="l00649"></a>00649 <span class="keywordtype">bool</span> upgraded = <span class="keyword">false</span>;
-<a name="l00650"></a>00650 <span class="keyword">typename</span> my_mutex_type::scoped_lock l(this->my_mutex, <span class="keyword">false</span>);
-<a name="l00651"></a>00651 <span class="keyword">typename</span> my_successors_type::iterator i = this->my_successors.begin();
-<a name="l00652"></a>00652 <span class="keywordflow">while</span> ( i != this->my_successors.end() ) {
-<a name="l00653"></a>00653 <span class="keywordflow">if</span> ( (*i)->try_put( t ) ) {
-<a name="l00654"></a>00654 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l00655"></a>00655 } <span class="keywordflow">else</span> {
-<a name="l00656"></a>00656 <span class="keywordflow">if</span> ( (*i)->register_predecessor(*this->my_owner) ) {
-<a name="l00657"></a>00657 <span class="keywordflow">if</span> (!upgraded) {
-<a name="l00658"></a>00658 l.upgrade_to_writer();
-<a name="l00659"></a>00659 upgraded = <span class="keyword">true</span>;
-<a name="l00660"></a>00660 }
-<a name="l00661"></a>00661 i = this->my_successors.erase(i);
-<a name="l00662"></a>00662 }
-<a name="l00663"></a>00663 <span class="keywordflow">else</span> {
-<a name="l00664"></a>00664 ++i;
-<a name="l00665"></a>00665 }
-<a name="l00666"></a>00666 }
-<a name="l00667"></a>00667 }
-<a name="l00668"></a>00668 <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l00669"></a>00669 }
-<a name="l00670"></a>00670 };
-<a name="l00671"></a>00671
-<a name="l00672"></a>00672 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00673"></a>00673 <span class="keyword">class </span>decrementer : <span class="keyword">public</span> continue_receiver, internal::no_copy {
-<a name="l00674"></a>00674
-<a name="l00675"></a>00675 T *my_node;
-<a name="l00676"></a>00676
-<a name="l00677"></a>00677 <span class="keywordtype">void</span> execute() {
-<a name="l00678"></a>00678 my_node->decrement_counter();
-<a name="l00679"></a>00679 }
-<a name="l00680"></a>00680
-<a name="l00681"></a>00681 <span class="keyword">public</span>:
-<a name="l00682"></a>00682
-<a name="l00683"></a>00683 <span class="keyword">typedef</span> continue_msg input_type;
-<a name="l00684"></a>00684 <span class="keyword">typedef</span> continue_msg output_type;
-<a name="l00685"></a>00685 decrementer( <span class="keywordtype">int</span> number_of_predecessors = 0 ) : continue_receiver( number_of_predecessors ) { }
-<a name="l00686"></a>00686 <span class="keywordtype">void</span> set_owner( T *node ) { my_node = node; }
-<a name="l00687"></a>00687 };
-<a name="l00688"></a>00688
-<a name="l00689"></a>00689 }
-<a name="l00691"></a>00691
-<a name="l00692"></a>00692
-<a name="l00694"></a>00694
-<a name="l00695"></a><a class="code" href="a00250.html">00695</a> <span class="keyword">class </span><a class="code" href="a00250.html">graph</a> : internal::no_copy {
-<a name="l00696"></a>00696
-<a name="l00697"></a>00697 <span class="keyword">template</span>< <span class="keyword">typename</span> Body >
-<a name="l00698"></a>00698 <span class="keyword">class </span>run_task : <span class="keyword">public</span> <a class="code" href="a00291.html">task</a> {
-<a name="l00699"></a>00699 <span class="keyword">public</span>:
-<a name="l00700"></a>00700 run_task( Body& body ) : my_body(body) {}
-<a name="l00701"></a>00701 <a class="code" href="a00291.html">task</a> *execute() {
-<a name="l00702"></a>00702 my_body();
-<a name="l00703"></a>00703 <span class="keywordflow">return</span> NULL;
-<a name="l00704"></a>00704 }
-<a name="l00705"></a>00705 <span class="keyword">private</span>:
-<a name="l00706"></a>00706 Body my_body;
-<a name="l00707"></a>00707 };
-<a name="l00708"></a>00708
-<a name="l00709"></a>00709 <span class="keyword">template</span>< <span class="keyword">typename</span> Receiver, <span class="keyword">typename</span> Body >
-<a name="l00710"></a>00710 <span class="keyword">class </span>run_and_put_task : <span class="keyword">public</span> <a class="code" href="a00291.html">task</a> {
-<a name="l00711"></a>00711 <span class="keyword">public</span>:
-<a name="l00712"></a>00712 run_and_put_task( Receiver &r, Body& body ) : my_receiver(r), my_body(body) {}
-<a name="l00713"></a>00713 <a class="code" href="a00291.html">task</a> *execute() {
-<a name="l00714"></a>00714 my_receiver.try_put( my_body() );
-<a name="l00715"></a>00715 <span class="keywordflow">return</span> NULL;
-<a name="l00716"></a>00716 }
-<a name="l00717"></a>00717 <span class="keyword">private</span>:
-<a name="l00718"></a>00718 Receiver &my_receiver;
-<a name="l00719"></a>00719 Body my_body;
-<a name="l00720"></a>00720 };
-<a name="l00721"></a>00721
-<a name="l00722"></a>00722 <span class="keyword">public</span>:
-<a name="l00723"></a>00723
-<a name="l00725"></a><a class="code" href="a00250.html#633b9b55e3248b785efd13264261f0e5">00725</a> <span class="keyword">enum</span> <a class="code" href="a00250.html#633b9b55e3248b785efd13264261f0e5">concurrency</a> { unlimited = 0, serial = 1 };
-<a name="l00726"></a>00726
-<a name="l00728"></a><a class="code" href="a00250.html#1ba8311506558a2419101722f5d49ba9">00728</a> <a class="code" href="a00250.html#1ba8311506558a2419101722f5d49ba9">graph</a>() : my_root_task( new ( <a class="code" href="a00291.html">task</a>::allocate_root( ) ) <a class="code" href="a00242.html">empty_task</a> ) {
-<a name="l00729"></a>00729 my_root_task-><a class="code" href="a00291.html#06a4206a57e8e12a439b14d6d41cfd92">set_ref_count</a>(1);
-<a name="l00730"></a>00730 }
-<a name="l00731"></a>00731
-<a name="l00733"></a>00733
-<a name="l00735"></a><a class="code" href="a00250.html#55332084e7884a26ff288b8fe960030d">00735</a> <a class="code" href="a00250.html#55332084e7884a26ff288b8fe960030d">~graph</a>() {
-<a name="l00736"></a>00736 <a class="code" href="a00250.html#bafd6349fdc6563ffa02746866e30bec">wait_for_all</a>();
-<a name="l00737"></a>00737 my_root_task-><a class="code" href="a00291.html#06a4206a57e8e12a439b14d6d41cfd92">set_ref_count</a>(0);
-<a name="l00738"></a>00738 <a class="code" href="a00291.html#dfaacf92685e5f86393bf657b2853bf8">task::destroy</a>( *my_root_task );
-<a name="l00739"></a>00739 }
-<a name="l00740"></a>00740
-<a name="l00741"></a>00741
-<a name="l00743"></a>00743
-<a name="l00745"></a><a class="code" href="a00250.html#1e5c5ae6538ec714cee107d1004705b9">00745</a> <span class="keywordtype">void</span> <a class="code" href="a00250.html#1e5c5ae6538ec714cee107d1004705b9">increment_wait_count</a>() {
-<a name="l00746"></a>00746 <span class="keywordflow">if</span> (my_root_task)
-<a name="l00747"></a>00747 my_root_task-><a class="code" href="a00291.html#f5fb43c7ad0de5a4b95703cebc39e345">increment_ref_count</a>();
-<a name="l00748"></a>00748 }
-<a name="l00749"></a>00749
-<a name="l00751"></a>00751
-<a name="l00753"></a><a class="code" href="a00250.html#ff3b6a3ef2ae1e661dcdb398c227b43c">00753</a> <span class="keywordtype">void</span> <a class="code" href="a00250.html#ff3b6a3ef2ae1e661dcdb398c227b43c">decrement_wait_count</a>() {
-<a name="l00754"></a>00754 <span class="keywordflow">if</span> (my_root_task)
-<a name="l00755"></a>00755 my_root_task-><a class="code" href="a00291.html#ef4680f5c148020c5e7e43ddef44cd5d">decrement_ref_count</a>();
-<a name="l00756"></a>00756 }
-<a name="l00757"></a>00757
-<a name="l00759"></a>00759
-<a name="l00761"></a>00761 <span class="keyword">template</span>< <span class="keyword">typename</span> Receiver, <span class="keyword">typename</span> Body >
-<a name="l00762"></a><a class="code" href="a00250.html#4c5e8dc5a45e641d534d6206838cfa7f">00762</a> <span class="keywordtype">void</span> <a class="code" href="a00250.html#4c5e8dc5a45e641d534d6206838cfa7f">run</a>( Receiver &r, Body body ) {
-<a name="l00763"></a>00763 <a class="code" href="a00291.html#8365d063c0cc9d7bd616bca47256b93c">task::enqueue</a>( * <span class="keyword">new</span> ( task::allocate_additional_child_of( *my_root_task ) )
-<a name="l00764"></a>00764 run_and_put_task< Receiver, Body >( r, body ) );
-<a name="l00765"></a>00765 }
-<a name="l00766"></a>00766
-<a name="l00768"></a>00768
-<a name="l00770"></a>00770 <span class="keyword">template</span>< <span class="keyword">typename</span> Body >
-<a name="l00771"></a><a class="code" href="a00250.html#71213dd18099298dc74731e293c8286a">00771</a> <span class="keywordtype">void</span> <a class="code" href="a00250.html#4c5e8dc5a45e641d534d6206838cfa7f">run</a>( Body body ) {
-<a name="l00772"></a>00772 <a class="code" href="a00291.html#8365d063c0cc9d7bd616bca47256b93c">task::enqueue</a>( * <span class="keyword">new</span> ( task::allocate_additional_child_of( *my_root_task ) )
-<a name="l00773"></a>00773 run_task< Body >( body ) );
-<a name="l00774"></a>00774 }
-<a name="l00775"></a>00775
-<a name="l00777"></a>00777
-<a name="l00778"></a><a class="code" href="a00250.html#bafd6349fdc6563ffa02746866e30bec">00778</a> <span class="keywordtype">void</span> <a class="code" href="a00250.html#bafd6349fdc6563ffa02746866e30bec">wait_for_all</a>() {
-<a name="l00779"></a>00779 <span class="keywordflow">if</span> (my_root_task)
-<a name="l00780"></a>00780 my_root_task-><a class="code" href="a00291.html#53d2615ad9c38859b4c8080936600283">wait_for_all</a>();
-<a name="l00781"></a>00781 my_root_task-><a class="code" href="a00291.html#06a4206a57e8e12a439b14d6d41cfd92">set_ref_count</a>(1);
-<a name="l00782"></a>00782 }
-<a name="l00783"></a>00783
-<a name="l00785"></a><a class="code" href="a00250.html#34d61d8b6560e5b2eb42e0112701db0f">00785</a> <a class="code" href="a00291.html">task</a> * <a class="code" href="a00250.html#34d61d8b6560e5b2eb42e0112701db0f">root_task</a>() {
-<a name="l00786"></a>00786 <span class="keywordflow">return</span> my_root_task;
-<a name="l00787"></a>00787 }
-<a name="l00788"></a>00788
-<a name="l00789"></a>00789 <span class="keyword">private</span>:
-<a name="l00790"></a>00790
-<a name="l00791"></a>00791 <a class="code" href="a00291.html">task</a> *my_root_task;
-<a name="l00792"></a>00792
-<a name="l00793"></a>00793 };
-<a name="l00794"></a>00794
-<a name="l00795"></a>00795
-<a name="l00797"></a>00797 <span class="keyword">namespace </span>internal {
-<a name="l00798"></a>00798
-<a name="l00800"></a>00800 <span class="keyword">template</span>< <span class="keyword">typename</span> Input, <span class="keyword">typename</span> Output >
-<a name="l00801"></a>00801 <span class="keyword">class </span>function_input : <span class="keyword">public</span> receiver<Input>, no_assign {
-<a name="l00802"></a>00802 <span class="keyword">typedef</span> sender<Input> predecessor_type;
-<a name="l00803"></a>00803 <span class="keyword">enum</span> op_stat {WAIT=0, SUCCEEDED, FAILED};
-<a name="l00804"></a>00804 <span class="keyword">enum</span> op_type {reg_pred, rem_pred, app_body, tryput, try_fwd};
-<a name="l00805"></a>00805
-<a name="l00806"></a>00806 <span class="keyword">public</span>:
-<a name="l00808"></a>00808 <span class="keyword">typedef</span> Input input_type;
-<a name="l00810"></a>00810 <span class="keyword">typedef</span> Output output_type;
-<a name="l00811"></a>00811
-<a name="l00813"></a>00813 <span class="keyword">template</span>< <span class="keyword">typename</span> Body >
-<a name="l00814"></a>00814 function_input( graph &g, size_t max_concurrency, Body& body )
-<a name="l00815"></a>00815 : my_root_task(g.root_task()), my_max_concurrency(max_concurrency), my_concurrency(internal::node_state_idle),
-<a name="l00816"></a>00816 my_body( new internal::function_body_leaf< input_type, output_type, Body>(body) ),
-<a name="l00817"></a>00817 forwarder_busy(false) {
-<a name="l00818"></a>00818 my_predecessors.set_owner(<span class="keyword">this</span>);
-<a name="l00819"></a>00819 my_aggregator.initialize_handler(my_functor_t(<span class="keyword">this</span>));
-<a name="l00820"></a>00820 }
-<a name="l00821"></a>00821
-<a name="l00823"></a>00823 <span class="keyword">virtual</span> ~function_input() { <span class="keyword">delete</span> my_body; }
-<a name="l00824"></a>00824
-<a name="l00826"></a>00826 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> try_put( input_type t ) {
-<a name="l00827"></a>00827 <span class="keywordflow">if</span> ( my_max_concurrency == 0 ) {
-<a name="l00828"></a>00828 spawn_body_task( t );
-<a name="l00829"></a>00829 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l00830"></a>00830 } <span class="keywordflow">else</span> {
-<a name="l00831"></a>00831 my_operation op_data(t, tryput);
-<a name="l00832"></a>00832 my_aggregator.execute(&op_data);
-<a name="l00833"></a>00833 <span class="keywordflow">return</span> op_data.status == SUCCEEDED;
-<a name="l00834"></a>00834 }
-<a name="l00835"></a>00835 }
-<a name="l00836"></a>00836
-<a name="l00838"></a>00838 <span class="comment">/* override */</span> <span class="keywordtype">bool</span> register_predecessor( predecessor_type &src ) {
-<a name="l00839"></a>00839 my_operation op_data(reg_pred);
-<a name="l00840"></a>00840 op_data.r = &src;
-<a name="l00841"></a>00841 my_aggregator.execute(&op_data);
-<a name="l00842"></a>00842 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l00843"></a>00843 }
-<a name="l00844"></a>00844
-<a name="l00846"></a>00846 <span class="comment">/* override */</span> <span class="keywordtype">bool</span> remove_predecessor( predecessor_type &src ) {
-<a name="l00847"></a>00847 my_operation op_data(rem_pred);
-<a name="l00848"></a>00848 op_data.r = &src;
-<a name="l00849"></a>00849 my_aggregator.execute(&op_data);
-<a name="l00850"></a>00850 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l00851"></a>00851 }
-<a name="l00852"></a>00852
-<a name="l00853"></a>00853 <span class="keyword">protected</span>:
-<a name="l00854"></a>00854 task *my_root_task;
-<a name="l00855"></a>00855 <span class="keyword">const</span> size_t my_max_concurrency;
-<a name="l00856"></a>00856 size_t my_concurrency;
-<a name="l00857"></a>00857 function_body<input_type, output_type> *my_body;
-<a name="l00858"></a>00858 predecessor_cache<input_type, null_mutex > my_predecessors;
-<a name="l00859"></a>00859
-<a name="l00860"></a>00860 <span class="keyword">virtual</span> broadcast_cache<output_type > &successors() = 0;
-<a name="l00861"></a>00861
-<a name="l00862"></a>00862 <span class="keyword">private</span>:
-<a name="l00863"></a>00863 <span class="keyword">friend</span> <span class="keyword">class </span>apply_body_task< function_input< input_type, output_type >, input_type >;
-<a name="l00864"></a>00864 <span class="keyword">friend</span> <span class="keyword">class </span>forward_task< function_input< input_type, output_type > >;
-<a name="l00865"></a>00865
-<a name="l00866"></a>00866 <span class="keyword">class </span>my_operation : <span class="keyword">public</span> aggregated_operation< my_operation > {
-<a name="l00867"></a>00867 <span class="keyword">public</span>:
-<a name="l00868"></a>00868 <span class="keywordtype">char</span> type;
-<a name="l00869"></a>00869 <span class="keyword">union </span>{
-<a name="l00870"></a>00870 input_type *elem;
-<a name="l00871"></a>00871 predecessor_type *r;
-<a name="l00872"></a>00872 };
-<a name="l00873"></a>00873 my_operation(<span class="keyword">const</span> input_type& e, op_type t) :
-<a name="l00874"></a>00874 type(char(t)), elem(const_cast<input_type*>(&e)) {}
-<a name="l00875"></a>00875 my_operation(op_type t) : type(char(t)), r(NULL) {}
-<a name="l00876"></a>00876 };
-<a name="l00877"></a>00877
-<a name="l00878"></a>00878 <span class="keyword">class </span>my_functor_t {
-<a name="l00879"></a>00879 function_input<input_type, output_type> *fi;
-<a name="l00880"></a>00880 <span class="keyword">public</span>:
-<a name="l00881"></a>00881 my_functor_t() {}
-<a name="l00882"></a>00882 my_functor_t(function_input<input_type, output_type> *fi_) : fi(fi_) {}
-<a name="l00883"></a>00883 <span class="keywordtype">void</span> operator()(my_operation* op_list) {
-<a name="l00884"></a>00884 fi->handle_operations(op_list);
-<a name="l00885"></a>00885 }
-<a name="l00886"></a>00886 };
-<a name="l00887"></a>00887
-<a name="l00888"></a>00888 <span class="keywordtype">bool</span> forwarder_busy;
-<a name="l00889"></a>00889 aggregator< my_functor_t, my_operation > my_aggregator;
-<a name="l00890"></a>00890
-<a name="l00891"></a>00891 <span class="keywordtype">void</span> handle_operations(my_operation *op_list) {
-<a name="l00892"></a>00892 my_operation *tmp;
-<a name="l00893"></a>00893 <span class="keywordflow">while</span> (op_list) {
-<a name="l00894"></a>00894 tmp = op_list;
-<a name="l00895"></a>00895 op_list = op_list->next;
-<a name="l00896"></a>00896 <span class="keywordflow">switch</span> (tmp->type) {
-<a name="l00897"></a>00897 <span class="keywordflow">case</span> reg_pred:
-<a name="l00898"></a>00898 my_predecessors.add(*(tmp->r));
-<a name="l00899"></a>00899 __TBB_store_with_release(tmp->status, SUCCEEDED);
-<a name="l00900"></a>00900 <span class="keywordflow">if</span> (!forwarder_busy) {
-<a name="l00901"></a>00901 forwarder_busy = <span class="keyword">true</span>;
-<a name="l00902"></a>00902 spawn_forward_task();
-<a name="l00903"></a>00903 }
-<a name="l00904"></a>00904 <span class="keywordflow">break</span>;
-<a name="l00905"></a>00905 <span class="keywordflow">case</span> rem_pred:
-<a name="l00906"></a>00906 my_predecessors.remove(*(tmp->r));
-<a name="l00907"></a>00907 __TBB_store_with_release(tmp->status, SUCCEEDED);
-<a name="l00908"></a>00908 <span class="keywordflow">break</span>;
-<a name="l00909"></a>00909 <span class="keywordflow">case</span> app_body:
-<a name="l00910"></a>00910 __TBB_ASSERT(my_max_concurrency != 0, NULL);
-<a name="l00911"></a>00911 --my_concurrency;
-<a name="l00912"></a>00912 __TBB_store_with_release(tmp->status, SUCCEEDED);
-<a name="l00913"></a>00913 <span class="keywordflow">if</span> (my_concurrency<my_max_concurrency) {
-<a name="l00914"></a>00914 input_type i;
-<a name="l00915"></a>00915 <span class="keywordflow">if</span> (my_predecessors.get_item(i)) {
-<a name="l00916"></a>00916 ++my_concurrency;
-<a name="l00917"></a>00917 spawn_body_task(i);
-<a name="l00918"></a>00918 }
-<a name="l00919"></a>00919 }
-<a name="l00920"></a>00920 <span class="keywordflow">break</span>;
-<a name="l00921"></a>00921 <span class="keywordflow">case</span> tryput: internal_try_put(tmp); <span class="keywordflow">break</span>;
-<a name="l00922"></a>00922 <span class="keywordflow">case</span> try_fwd: internal_forward(tmp); <span class="keywordflow">break</span>;
-<a name="l00923"></a>00923 }
-<a name="l00924"></a>00924 }
-<a name="l00925"></a>00925 }
-<a name="l00926"></a>00926
-<a name="l00927"></a>00927
-<a name="l00929"></a>00929 <span class="keywordtype">void</span> internal_try_put(my_operation *op) {
-<a name="l00930"></a>00930 __TBB_ASSERT(my_max_concurrency != 0, NULL);
-<a name="l00931"></a>00931 <span class="keywordflow">if</span> (my_concurrency < my_max_concurrency) {
-<a name="l00932"></a>00932 ++my_concurrency;
-<a name="l00933"></a>00933 spawn_body_task(*(op->elem));
-<a name="l00934"></a>00934 __TBB_store_with_release(op->status, SUCCEEDED);
-<a name="l00935"></a>00935 } <span class="keywordflow">else</span> {
-<a name="l00936"></a>00936 __TBB_store_with_release(op->status, FAILED);
-<a name="l00937"></a>00937 }
-<a name="l00938"></a>00938 }
-<a name="l00939"></a>00939
-<a name="l00941"></a>00941 <span class="keywordtype">void</span> internal_forward(my_operation *op) {
-<a name="l00942"></a>00942 <span class="keywordflow">if</span> (my_concurrency<my_max_concurrency || !my_max_concurrency) {
-<a name="l00943"></a>00943 input_type i;
-<a name="l00944"></a>00944 <span class="keywordflow">if</span> (my_predecessors.get_item(i)) {
-<a name="l00945"></a>00945 ++my_concurrency;
-<a name="l00946"></a>00946 __TBB_store_with_release(op->status, SUCCEEDED);
-<a name="l00947"></a>00947 spawn_body_task(i);
-<a name="l00948"></a>00948 <span class="keywordflow">return</span>;
-<a name="l00949"></a>00949 }
-<a name="l00950"></a>00950 }
-<a name="l00951"></a>00951 __TBB_store_with_release(op->status, FAILED);
-<a name="l00952"></a>00952 forwarder_busy = <span class="keyword">false</span>;
-<a name="l00953"></a>00953 }
-<a name="l00954"></a>00954
-<a name="l00956"></a>00956 <span class="keywordtype">void</span> apply_body( input_type &i ) {
-<a name="l00957"></a>00957 successors().try_put( (*my_body)(i) );
-<a name="l00958"></a>00958 <span class="keywordflow">if</span> ( my_max_concurrency != 0 ) {
-<a name="l00959"></a>00959 my_operation op_data(app_body);
-<a name="l00960"></a>00960 my_aggregator.execute(&op_data);
-<a name="l00961"></a>00961 }
-<a name="l00962"></a>00962 }
-<a name="l00963"></a>00963
-<a name="l00965"></a>00965 <span class="keyword">inline</span> <span class="keywordtype">void</span> spawn_body_task( input_type &input ) {
-<a name="l00966"></a>00966 <a class="code" href="a00291.html#8365d063c0cc9d7bd616bca47256b93c">task::enqueue</a>(*<span class="keyword">new</span>(task::allocate_additional_child_of(*my_root_task)) apply_body_task<function_input<input_type, output_type>, input_type >(*<span class="keyword">this</span>, input));
-<a name="l00967"></a>00967 }
-<a name="l00968"></a>00968
-<a name="l00970"></a>00970 <span class="keywordtype">void</span> forward() {
-<a name="l00971"></a>00971 my_operation op_data(try_fwd);
-<a name="l00972"></a>00972 <span class="keywordflow">do</span> {
-<a name="l00973"></a>00973 op_data.status = WAIT;
-<a name="l00974"></a>00974 my_aggregator.execute(&op_data);
-<a name="l00975"></a>00975 } <span class="keywordflow">while</span> (op_data.status == SUCCEEDED);
-<a name="l00976"></a>00976 }
-<a name="l00977"></a>00977
-<a name="l00979"></a>00979 <span class="keyword">inline</span> <span class="keywordtype">void</span> spawn_forward_task() {
-<a name="l00980"></a>00980 <a class="code" href="a00291.html#8365d063c0cc9d7bd616bca47256b93c">task::enqueue</a>(*<span class="keyword">new</span>(task::allocate_additional_child_of(*my_root_task)) forward_task<function_input<input_type, output_type> >(*<span class="keyword">this</span>));
-<a name="l00981"></a>00981 }
-<a name="l00982"></a>00982 };
-<a name="l00983"></a>00983
-<a name="l00985"></a>00985 <span class="keyword">template</span>< <span class="keyword">typename</span> Output >
-<a name="l00986"></a>00986 <span class="keyword">class </span>continue_input : <span class="keyword">public</span> continue_receiver {
-<a name="l00987"></a>00987 <span class="keyword">public</span>:
-<a name="l00988"></a>00988
-<a name="l00990"></a>00990 <span class="keyword">typedef</span> continue_msg input_type;
-<a name="l00991"></a>00991
-<a name="l00993"></a>00993 <span class="keyword">typedef</span> Output output_type;
-<a name="l00994"></a>00994
-<a name="l00995"></a>00995 <span class="keyword">template</span>< <span class="keyword">typename</span> Body >
-<a name="l00996"></a>00996 continue_input( graph &g, Body& body )
-<a name="l00997"></a>00997 : my_root_task(g.root_task()),
-<a name="l00998"></a>00998 my_body( new internal::function_body_leaf< input_type, output_type, Body>(body) ) { }
-<a name="l00999"></a>00999
-<a name="l01000"></a>01000 <span class="keyword">template</span>< <span class="keyword">typename</span> Body >
-<a name="l01001"></a>01001 continue_input( graph &g, <span class="keywordtype">int</span> number_of_predecessors, Body& body )
-<a name="l01002"></a>01002 : continue_receiver( number_of_predecessors ), my_root_task(g.root_task()),
-<a name="l01003"></a>01003 my_body( new internal::function_body_leaf< input_type, output_type, Body>(body) ) { }
-<a name="l01004"></a>01004
-<a name="l01005"></a>01005 <span class="keyword">protected</span>:
-<a name="l01006"></a>01006
-<a name="l01007"></a>01007 task *my_root_task;
-<a name="l01008"></a>01008 function_body<input_type, output_type> *my_body;
-<a name="l01009"></a>01009
-<a name="l01010"></a>01010 <span class="keyword">virtual</span> broadcast_cache<output_type > &successors() = 0;
-<a name="l01011"></a>01011
-<a name="l01012"></a>01012 <span class="keyword">friend</span> <span class="keyword">class </span>apply_body_task< continue_input< Output >, continue_msg >;
-<a name="l01013"></a>01013
-<a name="l01015"></a>01015 <span class="comment">/* override */</span> <span class="keywordtype">void</span> apply_body( input_type ) {
-<a name="l01016"></a>01016 successors().try_put( (*my_body)( continue_msg() ) );
-<a name="l01017"></a>01017 }
-<a name="l01018"></a>01018
-<a name="l01020"></a>01020 <span class="comment">/* override */</span> <span class="keywordtype">void</span> execute( ) {
-<a name="l01021"></a>01021 <a class="code" href="a00291.html#8365d063c0cc9d7bd616bca47256b93c">task::enqueue</a>( * <span class="keyword">new</span> ( task::allocate_additional_child_of( *my_root_task ) )
-<a name="l01022"></a>01022 apply_body_task< continue_input< Output >, continue_msg >( *<span class="keyword">this</span>, continue_msg() ) );
-<a name="l01023"></a>01023 }
-<a name="l01024"></a>01024 };
-<a name="l01025"></a>01025
-<a name="l01027"></a>01027 <span class="keyword">template</span>< <span class="keyword">typename</span> Output >
-<a name="l01028"></a>01028 <span class="keyword">class </span>function_output : <span class="keyword">public</span> sender<Output> {
-<a name="l01029"></a>01029 <span class="keyword">public</span>:
-<a name="l01030"></a>01030
-<a name="l01031"></a>01031 <span class="keyword">typedef</span> Output output_type;
-<a name="l01032"></a>01032
-<a name="l01033"></a>01033 function_output() { }
-<a name="l01034"></a>01034
-<a name="l01036"></a>01036 <span class="comment">/* override */</span> <span class="keywordtype">bool</span> register_successor( receiver<output_type> &r ) {
-<a name="l01037"></a>01037 successors().register_successor( r );
-<a name="l01038"></a>01038 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l01039"></a>01039 }
-<a name="l01040"></a>01040
-<a name="l01042"></a>01042 <span class="comment">/* override */</span> <span class="keywordtype">bool</span> remove_successor( receiver<output_type> &r ) {
-<a name="l01043"></a>01043 successors().remove_successor( r );
-<a name="l01044"></a>01044 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l01045"></a>01045 }
-<a name="l01046"></a>01046
-<a name="l01047"></a>01047 <span class="keyword">protected</span>:
-<a name="l01048"></a>01048
-<a name="l01049"></a>01049 <span class="keyword">virtual</span> broadcast_cache<output_type > &successors() = 0;
-<a name="l01050"></a>01050
-<a name="l01051"></a>01051 };
-<a name="l01052"></a>01052
-<a name="l01053"></a>01053 }
-<a name="l01055"></a>01055
-<a name="l01057"></a>01057 <span class="keyword">template</span> < <span class="keyword">typename</span> Output >
-<a name="l01058"></a><a class="code" href="a00285.html">01058</a> <span class="keyword">class </span><a class="code" href="a00285.html">source_node</a> : <span class="keyword">public</span> <a class="code" href="a00251.html">graph_node</a>, <span class="keyword">public</span> <a class="code" href="a00282.html">sender</a>< Output > {
-<a name="l01059"></a>01059 <span class="keyword">public</span>:
-<a name="l01060"></a>01060
-<a name="l01062"></a><a class="code" href="a00285.html#c5a2c6ab64bcd798724976d7d75ba92f">01062</a> <span class="keyword">typedef</span> Output <a class="code" href="a00285.html#c5a2c6ab64bcd798724976d7d75ba92f">output_type</a>;
-<a name="l01063"></a>01063
-<a name="l01065"></a><a class="code" href="a00285.html#217d72bbc6e7a4b35ef014dd9a15efca">01065</a> <span class="keyword">typedef</span> <a class="code" href="a00277.html">receiver< Output ></a> <a class="code" href="a00277.html">successor_type</a>;
-<a name="l01066"></a>01066
-<a name="l01068"></a>01068 <span class="keyword">template</span>< <span class="keyword">typename</span> Body >
-<a name="l01069"></a><a class="code" href="a00285.html#0513272133a06db6742873671af98f21">01069</a> <a class="code" href="a00285.html#0513272133a06db6742873671af98f21">source_node</a>( <a class="code" href="a00250.html">graph</a> &g, Body body, <span class="keywordtype">bool</span> is_active = <span class="keyword">true</span> )
-<a name="l01070"></a>01070 : my_root_task(g.root_task()), my_state( is_active ? internal::node_state_idle : internal::node_state_inactive ),
-<a name="l01071"></a>01071 my_body( new internal::source_body_leaf< <a class="code" href="a00285.html#c5a2c6ab64bcd798724976d7d75ba92f">output_type</a>, Body>(body) ),
-<a name="l01072"></a>01072 my_reserved(false), my_has_cached_item(false) {
-<a name="l01073"></a>01073 my_successors.set_owner(<span class="keyword">this</span>);
-<a name="l01074"></a>01074 }
-<a name="l01075"></a>01075
-<a name="l01077"></a><a class="code" href="a00285.html#90c94a8a52cc3d19cf393ce289e80733">01077</a> <a class="code" href="a00285.html#90c94a8a52cc3d19cf393ce289e80733">~source_node</a>() { <span class="keyword">delete</span> my_body; }
-<a name="l01078"></a>01078
-<a name="l01080"></a><a class="code" href="a00285.html#ce601874ec5cbb0996f6dcb8e43badb8">01080</a> <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00285.html#ce601874ec5cbb0996f6dcb8e43badb8">register_successor</a>( <a class="code" href="a00277.html">receiver<output_type></a> &r ) {
-<a name="l01081"></a>01081 <a class="code" href="a00287.html">spin_mutex::scoped_lock</a> lock(my_mutex);
-<a name="l01082"></a>01082 my_successors.register_successor(r);
-<a name="l01083"></a>01083 <span class="keywordflow">if</span> ( my_state != internal::node_state_inactive )
-<a name="l01084"></a>01084 spawn_put();
-<a name="l01085"></a>01085 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l01086"></a>01086 }
-<a name="l01087"></a>01087
-<a name="l01089"></a><a class="code" href="a00285.html#de069bfc6fae7ed4e82b2a1fbb58b721">01089</a> <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00285.html#de069bfc6fae7ed4e82b2a1fbb58b721">remove_successor</a>( <a class="code" href="a00277.html">receiver<output_type></a> &r ) {
-<a name="l01090"></a>01090 <a class="code" href="a00287.html">spin_mutex::scoped_lock</a> lock(my_mutex);
-<a name="l01091"></a>01091 my_successors.remove_successor(r);
-<a name="l01092"></a>01092 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l01093"></a>01093 }
-<a name="l01094"></a>01094
-<a name="l01096"></a><a class="code" href="a00285.html#0434d2933ad082d3c43a4ec774150511">01096</a> <span class="comment">/*override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00285.html#0434d2933ad082d3c43a4ec774150511">try_get</a>( <a class="code" href="a00285.html#c5a2c6ab64bcd798724976d7d75ba92f">output_type</a> &v ) {
-<a name="l01097"></a>01097 <a class="code" href="a00287.html">spin_mutex::scoped_lock</a> lock(my_mutex);
-<a name="l01098"></a>01098 <span class="keywordflow">if</span> ( my_reserved )
-<a name="l01099"></a>01099 <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l01100"></a>01100
-<a name="l01101"></a>01101 <span class="keywordflow">if</span> ( my_has_cached_item ) {
-<a name="l01102"></a>01102 v = my_cached_item;
-<a name="l01103"></a>01103 my_has_cached_item = <span class="keyword">false</span>;
-<a name="l01104"></a>01104 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( (*my_body)(v) == <span class="keyword">false</span> ) {
-<a name="l01105"></a>01105 <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l01106"></a>01106 }
-<a name="l01107"></a>01107 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l01108"></a>01108 }
-<a name="l01109"></a>01109
-<a name="l01111"></a><a class="code" href="a00285.html#ecac0bb52cff61912dcd186647ccd1bf">01111</a> <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00285.html#ecac0bb52cff61912dcd186647ccd1bf">try_reserve</a>( <a class="code" href="a00285.html#c5a2c6ab64bcd798724976d7d75ba92f">output_type</a> &v ) {
-<a name="l01112"></a>01112 <a class="code" href="a00287.html">spin_mutex::scoped_lock</a> lock(my_mutex);
-<a name="l01113"></a>01113 <span class="keywordflow">if</span> ( my_reserved ) {
-<a name="l01114"></a>01114 <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l01115"></a>01115 }
-<a name="l01116"></a>01116
-<a name="l01117"></a>01117 <span class="keywordflow">if</span> ( !my_has_cached_item && (*my_body)(my_cached_item) )
-<a name="l01118"></a>01118 my_has_cached_item = <span class="keyword">true</span>;
-<a name="l01119"></a>01119
-<a name="l01120"></a>01120 <span class="keywordflow">if</span> ( my_has_cached_item ) {
-<a name="l01121"></a>01121 v = my_cached_item;
-<a name="l01122"></a>01122 my_reserved = <span class="keyword">true</span>;
-<a name="l01123"></a>01123 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l01124"></a>01124 } <span class="keywordflow">else</span> {
-<a name="l01125"></a>01125 <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l01126"></a>01126 }
-<a name="l01127"></a>01127 }
-<a name="l01128"></a>01128
-<a name="l01130"></a>01130
-<a name="l01131"></a><a class="code" href="a00285.html#3dd7e998aa3e7258b3b5731307df23a0">01131</a> <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00285.html#3dd7e998aa3e7258b3b5731307df23a0">try_release</a>( ) {
-<a name="l01132"></a>01132 <a class="code" href="a00287.html">spin_mutex::scoped_lock</a> lock(my_mutex);
-<a name="l01133"></a>01133 __TBB_ASSERT( my_reserved && my_has_cached_item, <span class="stringliteral">"releasing non-existent reservation"</span> );
-<a name="l01134"></a>01134 my_reserved = <span class="keyword">false</span>;
-<a name="l01135"></a>01135 spawn_put();
-<a name="l01136"></a>01136 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l01137"></a>01137 }
-<a name="l01138"></a>01138
-<a name="l01140"></a><a class="code" href="a00285.html#809f51859ca4dd04204591d76c8572eb">01140</a> <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00285.html#809f51859ca4dd04204591d76c8572eb">try_consume</a>( ) {
-<a name="l01141"></a>01141 <a class="code" href="a00287.html">spin_mutex::scoped_lock</a> lock(my_mutex);
-<a name="l01142"></a>01142 __TBB_ASSERT( my_reserved && my_has_cached_item, <span class="stringliteral">"consuming non-existent reservation"</span> );
-<a name="l01143"></a>01143 my_reserved = <span class="keyword">false</span>;
-<a name="l01144"></a>01144 my_has_cached_item = <span class="keyword">false</span>;
-<a name="l01145"></a>01145 <span class="keywordflow">if</span> ( !my_successors.empty() ) {
-<a name="l01146"></a>01146 spawn_put();
-<a name="l01147"></a>01147 }
-<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><a class="code" href="a00285.html#d71ed386c53032463f3435f79a15b6ff">01152</a> <span class="keywordtype">void</span> <a class="code" href="a00285.html#d71ed386c53032463f3435f79a15b6ff">activate</a>() {
-<a name="l01153"></a>01153 <a class="code" href="a00287.html">spin_mutex::scoped_lock</a> lock(my_mutex);
-<a name="l01154"></a>01154 my_state = internal::node_state_idle;
-<a name="l01155"></a>01155 <span class="keywordflow">if</span> ( !my_successors.empty() )
-<a name="l01156"></a>01156 spawn_put();
-<a name="l01157"></a>01157 }
-<a name="l01158"></a>01158
-<a name="l01159"></a>01159 <span class="keyword">private</span>:
-<a name="l01160"></a>01160
-<a name="l01161"></a>01161 <a class="code" href="a00291.html">task</a> *my_root_task;
-<a name="l01162"></a>01162 <a class="code" href="a00286.html">spin_mutex</a> my_mutex;
-<a name="l01163"></a>01163 internal::node_state my_state;
-<a name="l01164"></a>01164 internal::source_body<output_type> *my_body;
-<a name="l01165"></a>01165 internal::broadcast_cache< output_type > my_successors;
-<a name="l01166"></a>01166 <span class="keywordtype">bool</span> my_reserved;
-<a name="l01167"></a>01167 <span class="keywordtype">bool</span> my_has_cached_item;
-<a name="l01168"></a>01168 <a class="code" href="a00285.html#c5a2c6ab64bcd798724976d7d75ba92f">output_type</a> my_cached_item;
-<a name="l01169"></a>01169
-<a name="l01170"></a>01170 <span class="keyword">friend</span> <span class="keyword">class </span>internal::source_task< source_node< output_type > >;
-<a name="l01171"></a>01171
-<a name="l01173"></a>01173 <span class="comment">/* override */</span> <span class="keywordtype">void</span> apply_body( ) {
-<a name="l01174"></a>01174 output_type v;
-<a name="l01175"></a>01175 <span class="keywordflow">if</span> ( <a class="code" href="a00285.html#ecac0bb52cff61912dcd186647ccd1bf">try_reserve</a>(v) == <span class="keyword">false</span> )
-<a name="l01176"></a>01176 <span class="keywordflow">return</span>;
-<a name="l01177"></a>01177
-<a name="l01178"></a>01178 <span class="keywordflow">if</span> ( my_successors.try_put( v ) )
-<a name="l01179"></a>01179 <a class="code" href="a00285.html#809f51859ca4dd04204591d76c8572eb">try_consume</a>();
-<a name="l01180"></a>01180 <span class="keywordflow">else</span>
-<a name="l01181"></a>01181 <a class="code" href="a00285.html#3dd7e998aa3e7258b3b5731307df23a0">try_release</a>();
-<a name="l01182"></a>01182 }
-<a name="l01183"></a>01183
-<a name="l01185"></a>01185 <span class="comment">/* override */</span> <span class="keywordtype">void</span> spawn_put( ) {
-<a name="l01186"></a>01186 <a class="code" href="a00291.html#8365d063c0cc9d7bd616bca47256b93c">task::enqueue</a>( * <span class="keyword">new</span> ( task::allocate_additional_child_of( *my_root_task ) )
-<a name="l01187"></a>01187 internal::source_task< source_node< output_type > >( *<span class="keyword">this</span> ) );
-<a name="l01188"></a>01188 }
-<a name="l01189"></a>01189
-<a name="l01190"></a>01190 };
-<a name="l01191"></a>01191
-<a name="l01193"></a>01193 <span class="keyword">template</span> <<span class="keyword">typename</span> Input, <span class="keyword">typename</span> Output = continue_msg >
-<a name="l01194"></a><a class="code" href="a00249.html">01194</a> <span class="keyword">class </span><a class="code" href="a00249.html">function_node</a> : <span class="keyword">public</span> <a class="code" href="a00251.html">graph_node</a>, <span class="keyword">public</span> internal::function_input<Input,Output>, <span class="keyword">public</span> internal::function_output<Output> {
-<a name="l01195"></a>01195 <span class="keyword">public</span>:
-<a name="l01196"></a>01196
-<a name="l01197"></a>01197 <span class="keyword">typedef</span> Input input_type;
-<a name="l01198"></a>01198 <span class="keyword">typedef</span> Output output_type;
-<a name="l01199"></a>01199 <span class="keyword">typedef</span> <a class="code" href="a00282.html">sender< input_type ></a> <a class="code" href="a00282.html">predecessor_type</a>;
-<a name="l01200"></a>01200 <span class="keyword">typedef</span> <a class="code" href="a00277.html">receiver< output_type ></a> <a class="code" href="a00277.html">successor_type</a>;
-<a name="l01201"></a>01201
-<a name="l01203"></a>01203 <span class="keyword">template</span>< <span class="keyword">typename</span> Body >
-<a name="l01204"></a><a class="code" href="a00249.html#7bde12e8ee43d4cafbdd5b1fc2031e2b">01204</a> <a class="code" href="a00249.html#7bde12e8ee43d4cafbdd5b1fc2031e2b">function_node</a>( <a class="code" href="a00250.html">graph</a> &g, size_t concurrency, Body body )
-<a name="l01205"></a>01205 : internal::function_input<input_type,output_type>( g, concurrency, body ) {
-<a name="l01206"></a>01206 my_successors.set_owner(<span class="keyword">this</span>);
-<a name="l01207"></a>01207 }
-<a name="l01208"></a>01208
-<a name="l01209"></a>01209 <span class="keyword">protected</span>:
-<a name="l01210"></a>01210
-<a name="l01211"></a>01211 internal::broadcast_cache<output_type> my_successors;
-<a name="l01212"></a>01212 <span class="comment">/* override */</span> internal::broadcast_cache<output_type> &successors () { <span class="keywordflow">return</span> my_successors; }
-<a name="l01213"></a>01213
-<a name="l01214"></a>01214 };
-<a name="l01215"></a>01215
-<a name="l01217"></a>01217 <span class="keyword">template</span> <<span class="keyword">typename</span> Output>
-<a name="l01218"></a><a class="code" href="a00244.html">01218</a> <span class="keyword">class </span><a class="code" href="a00244.html">executable_node</a> : <span class="keyword">public</span> <a class="code" href="a00251.html">graph_node</a>, <span class="keyword">public</span> internal::continue_input<Output>, <span class="keyword">public</span> internal::function_output<Output> {
-<a name="l01219"></a>01219 <span class="keyword">public</span>:
-<a name="l01220"></a>01220
-<a name="l01221"></a>01221 <span class="keyword">typedef</span> continue_msg input_type;
-<a name="l01222"></a>01222 <span class="keyword">typedef</span> Output output_type;
-<a name="l01223"></a>01223 <span class="keyword">typedef</span> <a class="code" href="a00282.html">sender< input_type ></a> <a class="code" href="a00282.html">predecessor_type</a>;
-<a name="l01224"></a>01224 <span class="keyword">typedef</span> <a class="code" href="a00277.html">receiver< output_type ></a> <a class="code" href="a00277.html">successor_type</a>;
-<a name="l01225"></a>01225
-<a name="l01227"></a>01227 <span class="keyword">template</span> <<span class="keyword">typename</span> Body >
-<a name="l01228"></a><a class="code" href="a00244.html#73d4304b322a25ed0df468e607dd1dac">01228</a> <a class="code" href="a00244.html#73d4304b322a25ed0df468e607dd1dac">executable_node</a>( <a class="code" href="a00250.html">graph</a> &g, Body body )
-<a name="l01229"></a>01229 : internal::continue_input<output_type>( g, body ) {
-<a name="l01230"></a>01230 my_successors.set_owner(<span class="keyword">this</span>);
-<a name="l01231"></a>01231 }
-<a name="l01232"></a>01232
-<a name="l01234"></a>01234 <span class="keyword">template</span> <<span class="keyword">typename</span> Body >
-<a name="l01235"></a><a class="code" href="a00244.html#c13030111d34feeafd9cdb1dd21584f1">01235</a> <a class="code" href="a00244.html#73d4304b322a25ed0df468e607dd1dac">executable_node</a>( <a class="code" href="a00250.html">graph</a> &g, <span class="keywordtype">int</span> number_of_predecessors, Body body )
-<a name="l01236"></a>01236 : internal::continue_input<output_type>( g, number_of_predecessors, body ) {
-<a name="l01237"></a>01237 my_successors.set_owner(<span class="keyword">this</span>);
-<a name="l01238"></a>01238 }
-<a name="l01239"></a>01239
-<a name="l01240"></a>01240 <span class="keyword">protected</span>:
-<a name="l01241"></a>01241
-<a name="l01242"></a>01242 internal::broadcast_cache<output_type> my_successors;
-<a name="l01243"></a>01243 <span class="comment">/* override */</span> internal::broadcast_cache<output_type> &successors () { <span class="keywordflow">return</span> my_successors; }
-<a name="l01244"></a>01244
-<a name="l01245"></a>01245 };
-<a name="l01246"></a>01246
-<a name="l01247"></a>01247
-<a name="l01248"></a>01248
-<a name="l01249"></a>01249 <span class="keyword">template</span>< <span class="keyword">typename</span> T >
-<a name="l01250"></a>01250 <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>, internal::no_copy {
-<a name="l01251"></a>01251 <span class="keyword">public</span>:
-<a name="l01252"></a>01252
-<a name="l01253"></a>01253 <span class="keyword">typedef</span> T input_type;
-<a name="l01254"></a>01254 <span class="keyword">typedef</span> T output_type;
-<a name="l01255"></a>01255 <span class="keyword">typedef</span> sender< input_type > predecessor_type;
-<a name="l01256"></a>01256 <span class="keyword">typedef</span> receiver< output_type > successor_type;
-<a name="l01257"></a>01257
-<a name="l01258"></a>01258 overwrite_node() : my_buffer_is_valid(false) {
-<a name="l01259"></a>01259 my_successors.set_owner( <span class="keyword">this</span> );
-<a name="l01260"></a>01260 }
-<a name="l01261"></a>01261
-<a name="l01262"></a>01262 ~overwrite_node() {}
-<a name="l01263"></a>01263
-<a name="l01264"></a>01264 <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00282.html#be48ac70174cf8e08e2b0279cd6343d3">register_successor</a>( successor_type &s ) {
-<a name="l01265"></a>01265 spin_mutex::scoped_lock l( my_mutex );
-<a name="l01266"></a>01266 <span class="keywordflow">if</span> ( my_buffer_is_valid ) {
-<a name="l01267"></a>01267 <span class="comment">// We have a valid value that must be forwarded immediately.</span>
-<a name="l01268"></a>01268 <span class="keywordflow">if</span> ( s.try_put( my_buffer ) || !s.register_predecessor( *<span class="keyword">this</span> ) ) {
-<a name="l01269"></a>01269 <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="l01270"></a>01270 my_successors.register_successor( s );
-<a name="l01271"></a>01271 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l01272"></a>01272 } <span class="keywordflow">else</span> {
-<a name="l01273"></a>01273 <span class="comment">// We don't add the successor: it rejected our put and we became its predecessor instead</span>
-<a name="l01274"></a>01274 <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l01275"></a>01275 }
-<a name="l01276"></a>01276 } <span class="keywordflow">else</span> {
-<a name="l01277"></a>01277 <span class="comment">// No valid value yet, just add as successor</span>
-<a name="l01278"></a>01278 my_successors.register_successor( s );
-<a name="l01279"></a>01279 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l01280"></a>01280 }
-<a name="l01281"></a>01281 }
-<a name="l01282"></a>01282
-<a name="l01283"></a>01283 <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00282.html#3f345427e812e8741370308ff88f30bf">remove_successor</a>( successor_type &s ) {
-<a name="l01284"></a>01284 spin_mutex::scoped_lock l( my_mutex );
-<a name="l01285"></a>01285 my_successors.remove_successor(s);
-<a name="l01286"></a>01286 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l01287"></a>01287 }
-<a name="l01288"></a>01288
-<a name="l01289"></a>01289 <span class="comment">/* override */</span> <span class="keywordtype">bool</span> try_put( T v ) {
-<a name="l01290"></a>01290 spin_mutex::scoped_lock l( my_mutex );
-<a name="l01291"></a>01291 my_buffer = v;
-<a name="l01292"></a>01292 my_buffer_is_valid = <span class="keyword">true</span>;
-<a name="l01293"></a>01293 my_successors.try_put(v);
-<a name="l01294"></a>01294 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l01295"></a>01295 }
-<a name="l01296"></a>01296
-<a name="l01297"></a>01297 <span class="comment">/* override */</span> <span class="keywordtype">bool</span> try_get( T &v ) {
-<a name="l01298"></a>01298 spin_mutex::scoped_lock l( my_mutex );
-<a name="l01299"></a>01299 <span class="keywordflow">if</span> ( my_buffer_is_valid ) {
-<a name="l01300"></a>01300 v = my_buffer;
-<a name="l01301"></a>01301 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l01302"></a>01302 } <span class="keywordflow">else</span> {
-<a name="l01303"></a>01303 <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l01304"></a>01304 }
-<a name="l01305"></a>01305 }
-<a name="l01306"></a>01306
-<a name="l01307"></a>01307 <span class="keywordtype">bool</span> is_valid() {
-<a name="l01308"></a>01308 spin_mutex::scoped_lock l( my_mutex );
-<a name="l01309"></a>01309 <span class="keywordflow">return</span> my_buffer_is_valid;
-<a name="l01310"></a>01310 }
-<a name="l01311"></a>01311
-<a name="l01312"></a>01312 <span class="keywordtype">void</span> clear() {
-<a name="l01313"></a>01313 spin_mutex::scoped_lock l( my_mutex );
-<a name="l01314"></a>01314 my_buffer_is_valid = <span class="keyword">false</span>;
-<a name="l01315"></a>01315 }
-<a name="l01316"></a>01316
-<a name="l01317"></a>01317 <span class="keyword">protected</span>:
-<a name="l01318"></a>01318
-<a name="l01319"></a>01319 spin_mutex my_mutex;
-<a name="l01320"></a>01320 internal::broadcast_cache< T, null_rw_mutex > my_successors;
-<a name="l01321"></a>01321 T my_buffer;
-<a name="l01322"></a>01322 <span class="keywordtype">bool</span> my_buffer_is_valid;
-<a name="l01323"></a>01323
-<a name="l01324"></a>01324 };
-<a name="l01325"></a>01325
-<a name="l01326"></a>01326 <span class="keyword">template</span>< <span class="keyword">typename</span> T >
-<a name="l01327"></a>01327 <span class="keyword">class </span>write_once_node : <span class="keyword">public</span> overwrite_node<T> {
-<a name="l01328"></a>01328 <span class="keyword">public</span>:
-<a name="l01329"></a>01329
-<a name="l01330"></a>01330 <span class="keyword">typedef</span> T input_type;
-<a name="l01331"></a>01331 <span class="keyword">typedef</span> T output_type;
-<a name="l01332"></a>01332 <span class="keyword">typedef</span> sender< input_type > predecessor_type;
-<a name="l01333"></a>01333 <span class="keyword">typedef</span> receiver< output_type > successor_type;
-<a name="l01334"></a>01334
-<a name="l01335"></a>01335 <span class="comment">/* override */</span> <span class="keywordtype">bool</span> try_put( T v ) {
-<a name="l01336"></a>01336 spin_mutex::scoped_lock l( this->my_mutex );
-<a name="l01337"></a>01337 <span class="keywordflow">if</span> ( this->my_buffer_is_valid ) {
-<a name="l01338"></a>01338 <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l01339"></a>01339 } <span class="keywordflow">else</span> {
-<a name="l01340"></a>01340 this->my_buffer = v;
-<a name="l01341"></a>01341 this->my_buffer_is_valid = <span class="keyword">true</span>;
-<a name="l01342"></a>01342 this->my_successors.try_put(v);
-<a name="l01343"></a>01343 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l01344"></a>01344 }
-<a name="l01345"></a>01345 }
-<a name="l01346"></a>01346 };
-<a name="l01347"></a>01347
-<a name="l01349"></a>01349
-<a name="l01350"></a><a class="code" href="a00240.html">01350</a> <span class="keyword">class </span><a class="code" href="a00240.html">continue_node</a> : <span class="keyword">public</span> <a class="code" href="a00244.html">executable_node</a>< continue_msg > {
-<a name="l01351"></a>01351 <span class="keyword">public</span>:
-<a name="l01352"></a>01352
-<a name="l01353"></a>01353 <span class="keyword">typedef</span> continue_msg input_type;
-<a name="l01354"></a>01354 <span class="keyword">typedef</span> continue_msg output_type;
-<a name="l01355"></a>01355 <span class="keyword">typedef</span> <a class="code" href="a00282.html">sender< input_type ></a> <a class="code" href="a00282.html">predecessor_type</a>;
-<a name="l01356"></a>01356 <span class="keyword">typedef</span> <a class="code" href="a00277.html">receiver< output_type ></a> <a class="code" href="a00277.html">successor_type</a>;
-<a name="l01357"></a>01357
-<a name="l01358"></a>01358 <a class="code" href="a00240.html">continue_node</a>( <a class="code" href="a00250.html">graph</a> &g ) : <a class="code" href="a00244.html">executable_node<continue_msg></a>( g, internal::empty_body< continue_msg, continue_msg>() ) {}
-<a name="l01359"></a>01359 };
-<a name="l01360"></a>01360
-<a name="l01362"></a>01362 <span class="keyword">template</span> <<span class="keyword">typename</span> T>
-<a name="l01363"></a><a class="code" href="a00224.html">01363</a> <span class="keyword">class </span><a class="code" href="a00224.html">broadcast_node</a> : <span class="keyword">public</span> <a class="code" href="a00251.html">graph_node</a>, <span class="keyword">public</span> <a class="code" href="a00277.html">receiver</a><T>, <span class="keyword">public</span> <a class="code" href="a00282.html">sender</a><T>, internal::no_copy {
-<a name="l01364"></a>01364
-<a name="l01365"></a>01365 internal::broadcast_cache<T> my_successors;
-<a name="l01366"></a>01366
-<a name="l01367"></a>01367 <span class="keyword">public</span>:
-<a name="l01368"></a>01368
-<a name="l01369"></a><a class="code" href="a00224.html#59ea89dbeab816742e6dc6af467e6c3f">01369</a> <span class="keyword">typedef</span> T <a class="code" href="a00224.html#59ea89dbeab816742e6dc6af467e6c3f">input_type</a>;
-<a name="l01370"></a><a class="code" href="a00224.html#b844ca1ee578a54bc11ff28467b12e7d">01370</a> <span class="keyword">typedef</span> T output_type;
-<a name="l01371"></a><a class="code" href="a00224.html#4dd13b81f6361fc244abe7cbcacd048c">01371</a> <span class="keyword">typedef</span> <a class="code" href="a00282.html">sender< input_type ></a> <a class="code" href="a00282.html">predecessor_type</a>;
-<a name="l01372"></a><a class="code" href="a00224.html#453928c367d813cb481f1b9aa1e1742a">01372</a> <span class="keyword">typedef</span> <a class="code" href="a00277.html">receiver< output_type ></a> <a class="code" href="a00277.html">successor_type</a>;
-<a name="l01373"></a>01373
-<a name="l01374"></a>01374 <a class="code" href="a00224.html">broadcast_node</a>( ) {
-<a name="l01375"></a>01375 my_successors.set_owner( <span class="keyword">this</span> );
-<a name="l01376"></a>01376 }
-<a name="l01377"></a>01377
-<a name="l01379"></a><a class="code" href="a00224.html#3f4149fa6b984b2138cb5ed40a2ddc6c">01379</a> <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="a00224.html#3f4149fa6b984b2138cb5ed40a2ddc6c">register_successor</a>( <a class="code" href="a00277.html">receiver<T></a> &r ) {
-<a name="l01380"></a>01380 my_successors.register_successor( r );
-<a name="l01381"></a>01381 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l01382"></a>01382 }
-<a name="l01383"></a>01383
-<a name="l01385"></a><a class="code" href="a00224.html#eefb3210bb9727765ea7385ba163c2a6">01385</a> <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="a00224.html#eefb3210bb9727765ea7385ba163c2a6">remove_successor</a>( <a class="code" href="a00277.html">receiver<T></a> &r ) {
-<a name="l01386"></a>01386 my_successors.remove_successor( r );
-<a name="l01387"></a>01387 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l01388"></a>01388 }
-<a name="l01389"></a>01389
-<a name="l01390"></a><a class="code" href="a00224.html#9b211e02554d6b39dc04f7e7f4e00073">01390</a> <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00224.html#9b211e02554d6b39dc04f7e7f4e00073">try_put</a>( T t ) {
-<a name="l01391"></a>01391 my_successors.try_put(t);
-<a name="l01392"></a>01392 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l01393"></a>01393 }
-<a name="l01394"></a>01394
-<a name="l01395"></a>01395 };
-<a name="l01396"></a>01396
-<a name="l01397"></a>01397
-<a name="l01399"></a>01399 <span class="keyword">template</span> <<span class="keyword">typename</span> T>
-<a name="l01400"></a><a class="code" href="a00225.html">01400</a> <span class="keyword">class </span><a class="code" href="a00225.html">buffer_node</a> : <span class="keyword">public</span> <a class="code" href="a00251.html">graph_node</a>, <span class="keyword">public</span> <a class="code" href="a00277.html">receiver</a><T>, <span class="keyword">public</span> <a class="code" href="a00282.html">sender</a><T>, internal::no_copy {
-<a name="l01401"></a>01401 <span class="keyword">public</span>:
-<a name="l01402"></a><a class="code" href="a00225.html#90de308ba6abefb74c537a62ed0f1ca3">01402</a> <span class="keyword">typedef</span> T <a class="code" href="a00225.html#90de308ba6abefb74c537a62ed0f1ca3">input_type</a>;
-<a name="l01403"></a><a class="code" href="a00225.html#28c06a61dbad153f2e989efbf43016c5">01403</a> <span class="keyword">typedef</span> T output_type;
-<a name="l01404"></a><a class="code" href="a00225.html#688cf819089ee2fac2b9de2e050adea7">01404</a> <span class="keyword">typedef</span> <a class="code" href="a00282.html">sender< input_type ></a> <a class="code" href="a00282.html">predecessor_type</a>;
-<a name="l01405"></a><a class="code" href="a00225.html#5e23f4f377ff4e1f53e71fd909a65771">01405</a> <span class="keyword">typedef</span> <a class="code" href="a00277.html">receiver< output_type ></a> <a class="code" href="a00277.html">successor_type</a>;
-<a name="l01406"></a>01406 <span class="keyword">protected</span>:
-<a name="l01407"></a>01407 <span class="keyword">typedef</span> size_t size_type;
-<a name="l01408"></a>01408 <span class="keyword">typedef</span> std::pair< T, bool > item_type;
-<a name="l01409"></a>01409
-<a name="l01410"></a>01410 internal::round_robin_cache< T, null_rw_mutex > my_successors;
-<a name="l01411"></a>01411
-<a name="l01412"></a>01412 <a class="code" href="a00291.html">task</a> *my_parent;
-<a name="l01413"></a>01413 item_type *my_array;
-<a name="l01414"></a>01414 size_type my_array_size;
-<a name="l01415"></a>01415 <span class="keyword">static</span> <span class="keyword">const</span> size_type initial_buffer_size = 4;
-<a name="l01416"></a>01416 size_type my_head;
-<a name="l01417"></a>01417 size_type my_tail;
-<a name="l01418"></a>01418 <a class="code" href="a00286.html">spin_mutex</a> my_mutex;
-<a name="l01419"></a>01419 <span class="keywordtype">bool</span> my_reserved;
-<a name="l01420"></a>01420 size_type my_reserved_id;
-<a name="l01421"></a>01421
-<a name="l01422"></a>01422 <span class="keyword">friend</span> <span class="keyword">class </span>internal::forward_task< buffer_node< T > >;
-<a name="l01423"></a>01423
-<a name="l01424"></a>01424 <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="l01425"></a>01425 <span class="keyword">enum</span> op_stat {WAIT=0, SUCCEEDED, FAILED};
-<a name="l01426"></a>01426
-<a name="l01427"></a>01427 <span class="comment">// implements the aggregator_operation concept</span>
-<a name="l01428"></a>01428 <span class="keyword">class </span>buffer_operation : <span class="keyword">public</span> internal::aggregated_operation< buffer_operation > {
-<a name="l01429"></a>01429 <span class="keyword">public</span>:
-<a name="l01430"></a>01430 <span class="keywordtype">char</span> type;
-<a name="l01431"></a>01431 T *elem;
-<a name="l01432"></a>01432 <a class="code" href="a00225.html#5e23f4f377ff4e1f53e71fd909a65771">successor_type</a> *r;
-<a name="l01433"></a>01433 buffer_operation(<span class="keyword">const</span> T& e, op_type t) :
-<a name="l01434"></a>01434 type(char(t)), elem(const_cast<T*>(&e)), r(NULL) {}
-<a name="l01435"></a>01435 buffer_operation(op_type t) : type(char(t)), r(NULL) {}
-<a name="l01436"></a>01436 };
-<a name="l01437"></a>01437
-<a name="l01438"></a>01438 <span class="keyword">class </span>my_functor_t {
-<a name="l01439"></a>01439 buffer_node<T> *bfr;
-<a name="l01440"></a>01440 <span class="keyword">public</span>:
-<a name="l01441"></a>01441 my_functor_t(buffer_node<T> *bfr_) : bfr(bfr_) {}
-<a name="l01442"></a>01442 my_functor_t() {}
-<a name="l01443"></a>01443 <span class="keywordtype">void</span> operator()(buffer_operation* op_list) {
-<a name="l01444"></a>01444 bfr->handle_operations(op_list);
-<a name="l01445"></a>01445 }
-<a name="l01446"></a>01446 };
-<a name="l01447"></a>01447
-<a name="l01448"></a>01448 <span class="keywordtype">bool</span> forwarder_busy;
-<a name="l01449"></a>01449 internal::aggregator< my_functor_t, buffer_operation> my_aggregator;
-<a name="l01450"></a>01450
-<a name="l01451"></a>01451 <span class="keyword">virtual</span> <span class="keywordtype">void</span> handle_operations(buffer_operation *op_list) {
-<a name="l01452"></a>01452 buffer_operation *tmp;
-<a name="l01453"></a>01453 <span class="keywordtype">bool</span> try_forwarding=<span class="keyword">false</span>;
-<a name="l01454"></a>01454 <span class="keywordflow">while</span> (op_list) {
-<a name="l01455"></a>01455 tmp = op_list;
-<a name="l01456"></a>01456 op_list = op_list->next;
-<a name="l01457"></a>01457 <span class="keywordflow">switch</span> (tmp->type) {
-<a name="l01458"></a>01458 <span class="keywordflow">case</span> reg_succ: <a class="code" href="a00225.html#017f16c8d6e0fb65d0d3a61aec86b3e2">internal_reg_succ</a>(tmp); try_forwarding = <span class="keyword">true</span>; <span class="keywordflow">break</span>;
-<a name="l01459"></a>01459 <span class="keywordflow">case</span> rem_succ: <a class="code" href="a00225.html#a75f731cf9fc93f7487eb72de3fcf7b1">internal_rem_succ</a>(tmp); <span class="keywordflow">break</span>;
-<a name="l01460"></a>01460 <span class="keywordflow">case</span> req_item: internal_pop(tmp); <span class="keywordflow">break</span>;
-<a name="l01461"></a>01461 <span class="keywordflow">case</span> res_item: internal_reserve(tmp); <span class="keywordflow">break</span>;
-<a name="l01462"></a>01462 <span class="keywordflow">case</span> rel_res: internal_release(tmp); try_forwarding = <span class="keyword">true</span>; <span class="keywordflow">break</span>;
-<a name="l01463"></a>01463 <span class="keywordflow">case</span> con_res: internal_consume(tmp); try_forwarding = <span class="keyword">true</span>; <span class="keywordflow">break</span>;
-<a name="l01464"></a>01464 <span class="keywordflow">case</span> put_item: internal_push(tmp); try_forwarding = <span class="keyword">true</span>; <span class="keywordflow">break</span>;
-<a name="l01465"></a>01465 <span class="keywordflow">case</span> try_fwd: <a class="code" href="a00225.html#a3cb61d8a98bc4bc860b1cb04944b4f8">internal_forward</a>(tmp); <span class="keywordflow">break</span>;
-<a name="l01466"></a>01466 }
-<a name="l01467"></a>01467 }
-<a name="l01468"></a>01468 <span class="keywordflow">if</span> (try_forwarding && !forwarder_busy) {
-<a name="l01469"></a>01469 forwarder_busy = <span class="keyword">true</span>;
-<a name="l01470"></a>01470 <a class="code" href="a00291.html#8365d063c0cc9d7bd616bca47256b93c">task::enqueue</a>(*<span class="keyword">new</span>(task::allocate_additional_child_of(*my_parent)) internal::forward_task< buffer_node<input_type> >(*<span class="keyword">this</span>));
-<a name="l01471"></a>01471 }
-<a name="l01472"></a>01472 }
-<a name="l01473"></a>01473
-<a name="l01475"></a><a class="code" href="a00225.html#3a31b3b55bee417de3af09c7b45b9ad6">01475</a> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="a00225.html#3a31b3b55bee417de3af09c7b45b9ad6">forward</a>() {
-<a name="l01476"></a>01476 buffer_operation op_data(try_fwd);
-<a name="l01477"></a>01477 <span class="keywordflow">do</span> {
-<a name="l01478"></a>01478 op_data.status = WAIT;
-<a name="l01479"></a>01479 my_aggregator.execute(&op_data);
-<a name="l01480"></a>01480 } <span class="keywordflow">while</span> (op_data.status == SUCCEEDED);
-<a name="l01481"></a>01481 }
-<a name="l01482"></a>01482
-<a name="l01484"></a><a class="code" href="a00225.html#017f16c8d6e0fb65d0d3a61aec86b3e2">01484</a> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="a00225.html#017f16c8d6e0fb65d0d3a61aec86b3e2">internal_reg_succ</a>(buffer_operation *op) {
-<a name="l01485"></a>01485 my_successors.register_successor(*(op->r));
-<a name="l01486"></a>01486 __TBB_store_with_release(op->status, SUCCEEDED);
-<a name="l01487"></a>01487 }
-<a name="l01488"></a>01488
-<a name="l01490"></a><a class="code" href="a00225.html#a75f731cf9fc93f7487eb72de3fcf7b1">01490</a> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="a00225.html#a75f731cf9fc93f7487eb72de3fcf7b1">internal_rem_succ</a>(buffer_operation *op) {
-<a name="l01491"></a>01491 my_successors.remove_successor(*(op->r));
-<a name="l01492"></a>01492 __TBB_store_with_release(op->status, SUCCEEDED);
-<a name="l01493"></a>01493 }
-<a name="l01494"></a>01494
-<a name="l01496"></a><a class="code" href="a00225.html#a3cb61d8a98bc4bc860b1cb04944b4f8">01496</a> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="a00225.html#a3cb61d8a98bc4bc860b1cb04944b4f8">internal_forward</a>(buffer_operation *op) {
-<a name="l01497"></a>01497 T i_copy;
-<a name="l01498"></a>01498 <span class="keywordtype">bool</span> success = <span class="keyword">false</span>; <span class="comment">// flagged when a successor accepts</span>
-<a name="l01499"></a>01499 size_type counter = my_successors.size();
-<a name="l01500"></a>01500 <span class="comment">// Try forwarding, giving each successor a chance</span>
-<a name="l01501"></a>01501 <span class="keywordflow">while</span> (counter>0 && my_tail>my_head && my_array[ (my_tail-1) & (my_array_size-1)].second == <span class="keyword">true</span> ) {
-<a name="l01502"></a>01502 i_copy = my_array[ (my_tail-1) & (my_array_size-1)].first;
-<a name="l01503"></a>01503 <span class="keywordtype">bool</span> msg = my_successors.try_put(i_copy);
-<a name="l01504"></a>01504 <span class="keywordflow">if</span> ( msg == <span class="keyword">true</span> ) {
-<a name="l01505"></a>01505 my_array[ (my_tail-1) & (my_array_size-1)].second = <span class="keyword">false</span>;
-<a name="l01506"></a>01506 --my_tail;
-<a name="l01507"></a>01507 success = <span class="keyword">true</span>; <span class="comment">// found an accepting successor</span>
-<a name="l01508"></a>01508 }
-<a name="l01509"></a>01509 --counter;
-<a name="l01510"></a>01510 }
-<a name="l01511"></a>01511 <span class="keywordflow">if</span> (success && !counter)
-<a name="l01512"></a>01512 __TBB_store_with_release(op->status, SUCCEEDED);
-<a name="l01513"></a>01513 <span class="keywordflow">else</span> {
-<a name="l01514"></a>01514 __TBB_store_with_release(op->status, FAILED);
-<a name="l01515"></a>01515 forwarder_busy = <span class="keyword">false</span>;
-<a name="l01516"></a>01516 }
-<a name="l01517"></a>01517 }
-<a name="l01518"></a>01518
-<a name="l01519"></a>01519 <span class="keyword">virtual</span> <span class="keywordtype">void</span> internal_push(buffer_operation *op) {
-<a name="l01520"></a>01520 <span class="keywordflow">while</span>( my_tail-my_head >= my_array_size ) {
-<a name="l01521"></a>01521 <a class="code" href="a00225.html#3ec9d33aa9f1e9292d5952e3eb477ca1">grow_my_array</a>( my_tail - my_head + 1 );
-<a name="l01522"></a>01522 }
-<a name="l01523"></a>01523 my_array[my_tail&(my_array_size-1)] = std::make_pair( *(op->elem), <span class="keyword">true</span> );
-<a name="l01524"></a>01524 ++my_tail;
-<a name="l01525"></a>01525 __TBB_store_with_release(op->status, SUCCEEDED);
-<a name="l01526"></a>01526 }
-<a name="l01527"></a>01527 <span class="keyword">virtual</span> <span class="keywordtype">void</span> internal_pop(buffer_operation *op) {
-<a name="l01528"></a>01528 <span class="keywordflow">if</span> ( my_array[(my_tail-1) & (my_array_size-1)].second == <span class="keyword">false</span> ) {
-<a name="l01529"></a>01529 __TBB_store_with_release(op->status, FAILED);
-<a name="l01530"></a>01530 }
-<a name="l01531"></a>01531 <span class="keywordflow">else</span> {
-<a name="l01532"></a>01532 *(op->elem) = my_array[(my_tail-1) & (my_array_size-1)].first;
-<a name="l01533"></a>01533 my_array[(my_tail-1) & (my_array_size-1)].second = <span class="keyword">false</span>;
-<a name="l01534"></a>01534 --my_tail;
-<a name="l01535"></a>01535 __TBB_store_with_release(op->status, SUCCEEDED);
-<a name="l01536"></a>01536 }
-<a name="l01537"></a>01537 }
-<a name="l01538"></a>01538 <span class="keyword">virtual</span> <span class="keywordtype">void</span> internal_reserve(buffer_operation *op) {
-<a name="l01539"></a>01539 <span class="keywordflow">if</span> (my_reserved == <span class="keyword">true</span> || my_array[ my_head & (my_array_size-1)].second == <span class="keyword">false</span> ) {
-<a name="l01540"></a>01540 __TBB_store_with_release(op->status, FAILED);
-<a name="l01541"></a>01541 }
-<a name="l01542"></a>01542 <span class="keywordflow">else</span> {
-<a name="l01543"></a>01543 my_reserved = <span class="keyword">true</span>;
-<a name="l01544"></a>01544 *(op->elem) = my_array[ my_head & (my_array_size-1)].first;
-<a name="l01545"></a>01545 my_array[ my_head & (my_array_size-1)].second = <span class="keyword">false</span>;
-<a name="l01546"></a>01546 __TBB_store_with_release(op->status, SUCCEEDED);
-<a name="l01547"></a>01547 }
-<a name="l01548"></a>01548 }
-<a name="l01549"></a>01549 <span class="keyword">virtual</span> <span class="keywordtype">void</span> internal_consume(buffer_operation *op) {
-<a name="l01550"></a>01550 my_reserved = <span class="keyword">false</span>;
-<a name="l01551"></a>01551 ++my_head;
-<a name="l01552"></a>01552 __TBB_store_with_release(op->status, SUCCEEDED);
-<a name="l01553"></a>01553 }
-<a name="l01554"></a>01554
-<a name="l01555"></a>01555 <span class="keyword">virtual</span> <span class="keywordtype">void</span> internal_release(buffer_operation *op) {
-<a name="l01556"></a>01556 my_array[my_head&(my_array_size-1)].second = <span class="keyword">true</span>;
-<a name="l01557"></a>01557 my_reserved = <span class="keyword">false</span>;
-<a name="l01558"></a>01558 __TBB_store_with_release(op->status, SUCCEEDED);
-<a name="l01559"></a>01559 }
-<a name="l01560"></a>01560
-<a name="l01562"></a><a class="code" href="a00225.html#3ec9d33aa9f1e9292d5952e3eb477ca1">01562</a> <span class="keywordtype">void</span> <a class="code" href="a00225.html#3ec9d33aa9f1e9292d5952e3eb477ca1">grow_my_array</a>( size_t minimum_size ) {
-<a name="l01563"></a>01563 size_type old_size = my_array_size;
-<a name="l01564"></a>01564 size_type new_size = old_size ? 2*old_size : initial_buffer_size;
-<a name="l01565"></a>01565 <span class="keywordflow">while</span>( new_size<minimum_size )
-<a name="l01566"></a>01566 new_size*=2;
-<a name="l01567"></a>01567
-<a name="l01568"></a>01568 item_type* new_array = <a class="code" href="a00226.html">cache_aligned_allocator<item_type></a>().allocate(new_size);
-<a name="l01569"></a>01569 item_type* old_array = my_array;
-<a name="l01570"></a>01570
-<a name="l01571"></a>01571 <span class="keywordflow">for</span>( size_type i=0; i<new_size; ++i )
-<a name="l01572"></a>01572 new_array[i].second = <span class="keyword">false</span>;
-<a name="l01573"></a>01573
-<a name="l01574"></a>01574 size_t t=my_head;
-<a name="l01575"></a>01575 <span class="keywordflow">for</span>( size_type i=0; i<old_size; ++i, ++t )
-<a name="l01576"></a>01576 new_array[t&(new_size-1)] = old_array[t&(old_size-1)];
-<a name="l01577"></a>01577 my_array = new_array;
-<a name="l01578"></a>01578 my_array_size = new_size;
-<a name="l01579"></a>01579 <span class="keywordflow">if</span>( old_array )
-<a name="l01580"></a>01580 <a class="code" href="a00226.html">cache_aligned_allocator<item_type></a>().deallocate(old_array,old_size);
-<a name="l01581"></a>01581 }
-<a name="l01582"></a>01582
-<a name="l01583"></a>01583 <span class="keyword">public</span>:
-<a name="l01585"></a><a class="code" href="a00225.html#7360978fa427d054bc6cde05c80e5e9f">01585</a> <a class="code" href="a00225.html#7360978fa427d054bc6cde05c80e5e9f">buffer_node</a>( <a class="code" href="a00250.html">graph</a> &g ) :
-<a name="l01586"></a>01586 my_parent( g.root_task() ), my_array(NULL), my_array_size(0),
-<a name="l01587"></a>01587 my_head(0), my_tail(0), my_reserved(false), forwarder_busy(false) {
-<a name="l01588"></a>01588 my_successors.set_owner(<span class="keyword">this</span>);
-<a name="l01589"></a>01589 my_aggregator.initialize_handler(my_functor_t(<span class="keyword">this</span>));
-<a name="l01590"></a>01590 <a class="code" href="a00225.html#3ec9d33aa9f1e9292d5952e3eb477ca1">grow_my_array</a>(initial_buffer_size);
-<a name="l01591"></a>01591 }
-<a name="l01592"></a>01592
-<a name="l01593"></a>01593 <span class="keyword">virtual</span> ~buffer_node() {}
-<a name="l01594"></a>01594
-<a name="l01595"></a>01595 <span class="comment">//</span>
-<a name="l01596"></a>01596 <span class="comment">// message sender implementation</span>
-<a name="l01597"></a>01597 <span class="comment">//</span>
-<a name="l01598"></a>01598
-<a name="l01600"></a>01600
-<a name="l01601"></a><a class="code" href="a00225.html#cd2ef588b0ee6eb8d23ee169e00c73a9">01601</a> <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00225.html#cd2ef588b0ee6eb8d23ee169e00c73a9">register_successor</a>( <a class="code" href="a00277.html">receiver<output_type></a> &r ) {
-<a name="l01602"></a>01602 buffer_operation op_data(reg_succ);
-<a name="l01603"></a>01603 op_data.r = &r;
-<a name="l01604"></a>01604 my_aggregator.execute(&op_data);
-<a name="l01605"></a>01605 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l01606"></a>01606 }
-<a name="l01607"></a>01607
-<a name="l01609"></a>01609
-<a name="l01611"></a><a class="code" href="a00225.html#415428db02e74a479fb056a8ed72ba53">01611</a> <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00225.html#415428db02e74a479fb056a8ed72ba53">remove_successor</a>( <a class="code" href="a00277.html">receiver<output_type></a> &r ) {
-<a name="l01612"></a>01612 r.<a class="code" href="a00277.html#d2f23b40b328dc254a7c2a0a30f408e4">remove_predecessor</a>(*<span class="keyword">this</span>);
-<a name="l01613"></a>01613 buffer_operation op_data(rem_succ);
-<a name="l01614"></a>01614 op_data.r = &r;
-<a name="l01615"></a>01615 my_aggregator.execute(&op_data);
-<a name="l01616"></a>01616 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l01617"></a>01617 }
-<a name="l01618"></a>01618
-<a name="l01620"></a>01620
-<a name="l01622"></a><a class="code" href="a00225.html#b68bdec127703dbfb2d93d685abbfd67">01622</a> <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00225.html#b68bdec127703dbfb2d93d685abbfd67">try_get</a>( T &v ) {
-<a name="l01623"></a>01623 buffer_operation op_data(req_item);
-<a name="l01624"></a>01624 op_data.elem = &v;
-<a name="l01625"></a>01625 my_aggregator.execute(&op_data);
-<a name="l01626"></a>01626 <span class="keywordflow">return</span> (op_data.status==SUCCEEDED);
-<a name="l01627"></a>01627 }
-<a name="l01628"></a>01628
-<a name="l01630"></a>01630
-<a name="l01632"></a><a class="code" href="a00225.html#11ebad4c72082a1a03ecccd3afab4ae2">01632</a> <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00225.html#11ebad4c72082a1a03ecccd3afab4ae2">try_reserve</a>( T &v ) {
-<a name="l01633"></a>01633 buffer_operation op_data(res_item);
-<a name="l01634"></a>01634 op_data.elem = &v;
-<a name="l01635"></a>01635 my_aggregator.execute(&op_data);
-<a name="l01636"></a>01636 <span class="keywordflow">return</span> (op_data.status==SUCCEEDED);
-<a name="l01637"></a>01637 }
-<a name="l01638"></a>01638
-<a name="l01640"></a>01640
-<a name="l01641"></a><a class="code" href="a00225.html#435e29a66f0719d4822a0a8dc78a0405">01641</a> <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00225.html#435e29a66f0719d4822a0a8dc78a0405">try_release</a>() {
-<a name="l01642"></a>01642 buffer_operation op_data(rel_res);
-<a name="l01643"></a>01643 my_aggregator.execute(&op_data);
-<a name="l01644"></a>01644 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l01645"></a>01645 }
-<a name="l01646"></a>01646
-<a name="l01648"></a>01648
-<a name="l01649"></a><a class="code" href="a00225.html#46b8b257a97e2192a2b11743279e8ffe">01649</a> <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00225.html#46b8b257a97e2192a2b11743279e8ffe">try_consume</a>() {
-<a name="l01650"></a>01650 buffer_operation op_data(con_res);
-<a name="l01651"></a>01651 my_aggregator.execute(&op_data);
-<a name="l01652"></a>01652 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l01653"></a>01653 }
-<a name="l01654"></a>01654
-<a name="l01656"></a>01656
-<a name="l01657"></a><a class="code" href="a00225.html#f74899ffb67687998168ad428f586b64">01657</a> <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00225.html#f74899ffb67687998168ad428f586b64">try_put</a>(T t) {
-<a name="l01658"></a>01658 buffer_operation op_data(t, put_item);
-<a name="l01659"></a>01659 my_aggregator.execute(&op_data);
-<a name="l01660"></a>01660 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l01661"></a>01661 }
-<a name="l01662"></a>01662 };
-<a name="l01663"></a>01663
-<a name="l01664"></a>01664
-<a name="l01666"></a>01666 <span class="keyword">template</span> <<span class="keyword">typename</span> T>
-<a name="l01667"></a><a class="code" href="a00269.html">01667</a> <span class="keyword">class </span><a class="code" href="a00269.html">queue_node</a> : <span class="keyword">public</span> buffer_node<T> {
-<a name="l01668"></a>01668 <span class="keyword">protected</span>:
-<a name="l01669"></a>01669 <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00225.html">buffer_node<T>::size_type</a> size_type;
-<a name="l01670"></a>01670 <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00225.html">buffer_node<T>::buffer_operation</a> queue_operation;
-<a name="l01671"></a>01671
-<a name="l01672"></a>01672 <span class="keyword">enum</span> op_stat {WAIT=0, SUCCEEDED, FAILED};
-<a name="l01673"></a>01673
-<a name="l01675"></a><a class="code" href="a00269.html#fb58bac5ac355e5134c51125e601fa2a">01675</a> <span class="comment">/* override */</span> <span class="keywordtype">void</span> <a class="code" href="a00269.html#fb58bac5ac355e5134c51125e601fa2a">internal_forward</a>(queue_operation *op) {
-<a name="l01676"></a>01676 T i_copy;
-<a name="l01677"></a>01677 <span class="keywordtype">bool</span> success = <span class="keyword">false</span>; <span class="comment">// flagged when a successor accepts</span>
-<a name="l01678"></a>01678 size_type counter = this->my_successors.size();
-<a name="l01679"></a>01679 <span class="keywordflow">if</span> (this->my_reserved || this->my_array[ this->my_head & (this->my_array_size-1)].second == <span class="keyword">false</span>) {
-<a name="l01680"></a>01680 __TBB_store_with_release(op->status, FAILED);
-<a name="l01681"></a>01681 this->forwarder_busy = <span class="keyword">false</span>;
-<a name="l01682"></a>01682 <span class="keywordflow">return</span>;
-<a name="l01683"></a>01683 }
-<a name="l01684"></a>01684 <span class="comment">// Keep trying to send items while there is at least one accepting successor</span>
-<a name="l01685"></a>01685 <span class="keywordflow">while</span> (counter>0 && this->my_array[ this->my_head & (this->my_array_size-1)].second == <span class="keyword">true</span> ) {
-<a name="l01686"></a>01686 i_copy = this->my_array[ this->my_head & (this->my_array_size-1)].first;
-<a name="l01687"></a>01687 <span class="keywordtype">bool</span> msg = this->my_successors.try_put(i_copy);
-<a name="l01688"></a>01688 <span class="keywordflow">if</span> ( msg == <span class="keyword">true</span> ) {
-<a name="l01689"></a>01689 this->my_array[ this->my_head & (this->my_array_size-1)].second = <span class="keyword">false</span>;
-<a name="l01690"></a>01690 ++(this->my_head);
-<a name="l01691"></a>01691 success = <span class="keyword">true</span>; <span class="comment">// found an accepting successor</span>
-<a name="l01692"></a>01692 }
-<a name="l01693"></a>01693 --counter;
-<a name="l01694"></a>01694 }
-<a name="l01695"></a>01695 <span class="keywordflow">if</span> (success && !counter)
-<a name="l01696"></a>01696 __TBB_store_with_release(op->status, SUCCEEDED);
-<a name="l01697"></a>01697 <span class="keywordflow">else</span> {
-<a name="l01698"></a>01698 __TBB_store_with_release(op->status, FAILED);
-<a name="l01699"></a>01699 this->forwarder_busy = <span class="keyword">false</span>;
-<a name="l01700"></a>01700 }
-<a name="l01701"></a>01701 }
-<a name="l01702"></a>01702
-<a name="l01703"></a>01703 <span class="comment">/* override */</span> <span class="keywordtype">void</span> internal_pop(queue_operation *op) {
-<a name="l01704"></a>01704 <span class="keywordflow">if</span> ( this->my_reserved == <span class="keyword">true</span> || this->my_array[ this->my_head & (this->my_array_size-1)].second == <span class="keyword">false</span> ) {
-<a name="l01705"></a>01705 __TBB_store_with_release(op->status, FAILED);
-<a name="l01706"></a>01706 }
-<a name="l01707"></a>01707 <span class="keywordflow">else</span> {
-<a name="l01708"></a>01708 *(op->elem) = this->my_array[ this->my_head & (this->my_array_size-1)].first;
-<a name="l01709"></a>01709 this->my_array[ this->my_head & (this->my_array_size-1)].second = <span class="keyword">false</span>;
-<a name="l01710"></a>01710 ++(this->my_head);
-<a name="l01711"></a>01711 __TBB_store_with_release(op->status, SUCCEEDED);
-<a name="l01712"></a>01712 }
-<a name="l01713"></a>01713 }
-<a name="l01714"></a>01714 <span class="comment">/* override */</span> <span class="keywordtype">void</span> internal_reserve(queue_operation *op) {
-<a name="l01715"></a>01715 <span class="keywordflow">if</span> (this->my_reserved == <span class="keyword">true</span> || this->my_array[ this->my_head & (this->my_array_size-1)].second == <span class="keyword">false</span> ) {
-<a name="l01716"></a>01716 __TBB_store_with_release(op->status, FAILED);
-<a name="l01717"></a>01717 }
-<a name="l01718"></a>01718 <span class="keywordflow">else</span> {
-<a name="l01719"></a>01719 this->my_reserved = <span class="keyword">true</span>;
-<a name="l01720"></a>01720 *(op->elem) = this->my_array[ this->my_head & (this->my_array_size-1)].first;
-<a name="l01721"></a>01721 __TBB_store_with_release(op->status, SUCCEEDED);
-<a name="l01722"></a>01722 }
-<a name="l01723"></a>01723 }
-<a name="l01724"></a>01724 <span class="comment">/* override */</span> <span class="keywordtype">void</span> internal_consume(queue_operation *op) {
-<a name="l01725"></a>01725 this->my_reserved = <span class="keyword">false</span>;
-<a name="l01726"></a>01726 this->my_array[ this->my_head & (this->my_array_size-1)].second = <span class="keyword">false</span>;
-<a name="l01727"></a>01727 ++(this->my_head);
-<a name="l01728"></a>01728 __TBB_store_with_release(op->status, SUCCEEDED);
-<a name="l01729"></a>01729 }
-<a name="l01730"></a>01730
-<a name="l01731"></a>01731 <span class="keyword">public</span>:
-<a name="l01732"></a>01732
-<a name="l01733"></a><a class="code" href="a00269.html#27016487003a4ff2908748c3cf11c1fe">01733</a> <span class="keyword">typedef</span> T <a class="code" href="a00269.html#27016487003a4ff2908748c3cf11c1fe">input_type</a>;
-<a name="l01734"></a><a class="code" href="a00269.html#d227f122eebe2f9489ba763ff24fd6fb">01734</a> <span class="keyword">typedef</span> T output_type;
-<a name="l01735"></a><a class="code" href="a00269.html#83bc7308a38f1d205377d78ec14931d1">01735</a> <span class="keyword">typedef</span> <a class="code" href="a00282.html">sender< input_type ></a> <a class="code" href="a00282.html">predecessor_type</a>;
-<a name="l01736"></a><a class="code" href="a00269.html#c3b1d76b66b1292f6a1b6dae52c67a0e">01736</a> <span class="keyword">typedef</span> <a class="code" href="a00277.html">receiver< output_type ></a> <a class="code" href="a00277.html">successor_type</a>;
-<a name="l01737"></a>01737
-<a name="l01739"></a><a class="code" href="a00269.html#1564c6bf9573b13d6854b0e8f7ce2b68">01739</a> <a class="code" href="a00269.html#1564c6bf9573b13d6854b0e8f7ce2b68">queue_node</a>( <a class="code" href="a00250.html">graph</a> &g ) : buffer_node<T>(g) {}
-<a name="l01740"></a>01740 };
-<a name="l01741"></a>01741
-<a name="l01743"></a>01743 <span class="keyword">template</span>< <span class="keyword">typename</span> T >
-<a name="l01744"></a><a class="code" href="a00283.html">01744</a> <span class="keyword">class </span><a class="code" href="a00283.html">sequencer_node</a> : <span class="keyword">public</span> <a class="code" href="a00269.html">queue_node</a><T> {
-<a name="l01745"></a>01745 internal::function_body< T, size_t > *my_sequencer;
-<a name="l01746"></a>01746 <span class="keyword">public</span>:
-<a name="l01747"></a>01747
-<a name="l01748"></a><a class="code" href="a00283.html#a73e4a3ae6c430281f08226d448ebfc8">01748</a> <span class="keyword">typedef</span> T <a class="code" href="a00283.html#a73e4a3ae6c430281f08226d448ebfc8">input_type</a>;
-<a name="l01749"></a><a class="code" href="a00283.html#0c613bb01103dfcfbc3f9cbe943f95b0">01749</a> <span class="keyword">typedef</span> T output_type;
-<a name="l01750"></a><a class="code" href="a00283.html#6581686ef0cf8e13c0270687628af5eb">01750</a> <span class="keyword">typedef</span> <a class="code" href="a00282.html">sender< input_type ></a> <a class="code" href="a00282.html">predecessor_type</a>;
-<a name="l01751"></a><a class="code" href="a00283.html#3591313e30d0f485a09106686067411f">01751</a> <span class="keyword">typedef</span> <a class="code" href="a00277.html">receiver< output_type ></a> <a class="code" href="a00277.html">successor_type</a>;
-<a name="l01752"></a>01752
-<a name="l01754"></a>01754 <span class="keyword">template</span>< <span class="keyword">typename</span> Sequencer >
-<a name="l01755"></a><a class="code" href="a00283.html#c3138c1c96b76ae9f13b0abbf7029590">01755</a> <a class="code" href="a00283.html#c3138c1c96b76ae9f13b0abbf7029590">sequencer_node</a>( <a class="code" href="a00250.html">graph</a> &g, <span class="keyword">const</span> Sequencer& s ) : <a class="code" href="a00269.html">queue_node</a><T>(g),
-<a name="l01756"></a>01756 my_sequencer(new internal::function_body_leaf< T, size_t, Sequencer>(s) ) {}
-<a name="l01757"></a>01757
-<a name="l01759"></a><a class="code" href="a00283.html#c87d80feebaf2bae4af22b5f2459b37e">01759</a> <a class="code" href="a00283.html#c87d80feebaf2bae4af22b5f2459b37e">~sequencer_node</a>() { <span class="keyword">delete</span> my_sequencer; }
-<a name="l01760"></a>01760 <span class="keyword">protected</span>:
-<a name="l01761"></a>01761 <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00225.html">buffer_node<T>::size_type</a> size_type;
-<a name="l01762"></a>01762 <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00225.html">buffer_node<T>::buffer_operation</a> sequencer_operation;
-<a name="l01763"></a>01763
-<a name="l01764"></a>01764 <span class="keyword">enum</span> op_stat {WAIT=0, SUCCEEDED, FAILED};
-<a name="l01765"></a>01765
-<a name="l01766"></a>01766 <span class="keyword">private</span>:
-<a name="l01767"></a>01767 <span class="comment">/* override */</span> <span class="keywordtype">void</span> internal_push(sequencer_operation *op) {
-<a name="l01768"></a>01768 size_type tag = (*my_sequencer)(*(op->elem));
-<a name="l01769"></a>01769
-<a name="l01770"></a>01770 this->my_tail = (tag+1 > this->my_tail) ? tag+1 : this->my_tail;
-<a name="l01771"></a>01771 while ( this->my_tail - this->my_head >= this->my_array_size ) {
-<a name="l01772"></a>01772 this-><a class="code" href="a00225.html#3ec9d33aa9f1e9292d5952e3eb477ca1">grow_my_array</a>( this->my_tail - this->my_head + 1);
-<a name="l01773"></a>01773 }
-<a name="l01774"></a>01774 this->my_array[tag&(this->my_array_size-1)] = std::make_pair( *(op->elem), <span class="keyword">true</span> );
-<a name="l01775"></a>01775 __TBB_store_with_release(op->status, SUCCEEDED);
-<a name="l01776"></a>01776 }
-<a name="l01777"></a>01777 };
-<a name="l01778"></a>01778
-<a name="l01780"></a>01780 <span class="keyword">template</span>< <span class="keyword">typename</span> T, <span class="keyword">typename</span> Compare = std::less<T> >
-<a name="l01781"></a><a class="code" href="a00268.html">01781</a> <span class="keyword">class </span><a class="code" href="a00268.html">priority_queue_node</a> : <span class="keyword">public</span> buffer_node<T> {
-<a name="l01782"></a>01782 <span class="keyword">public</span>:
-<a name="l01783"></a><a class="code" href="a00268.html#40fdedd4829aeae3ebd1a5fdaf39b23d">01783</a> <span class="keyword">typedef</span> T <a class="code" href="a00268.html#40fdedd4829aeae3ebd1a5fdaf39b23d">input_type</a>;
-<a name="l01784"></a><a class="code" href="a00268.html#3b3fa4479416e7cb6d4a6a4b175c2b15">01784</a> <span class="keyword">typedef</span> T output_type;
-<a name="l01785"></a><a class="code" href="a00268.html#98900a87758cac05500fcbc74113cebf">01785</a> <span class="keyword">typedef</span> <a class="code" href="a00282.html">sender< input_type ></a> <a class="code" href="a00282.html">predecessor_type</a>;
-<a name="l01786"></a><a class="code" href="a00268.html#e01014f2e5ceea292c68f6fe47391c57">01786</a> <span class="keyword">typedef</span> <a class="code" href="a00277.html">receiver< output_type ></a> <a class="code" href="a00277.html">successor_type</a>;
-<a name="l01787"></a>01787
-<a name="l01789"></a><a class="code" href="a00268.html#1630f68674c4b201346a391b1e8d3f5d">01789</a> <a class="code" href="a00268.html#1630f68674c4b201346a391b1e8d3f5d">priority_queue_node</a>( <a class="code" href="a00250.html">graph</a> &g ) : buffer_node<T>(g), mark(0) {}
-<a name="l01790"></a>01790
-<a name="l01791"></a>01791 <span class="keyword">protected</span>:
-<a name="l01792"></a>01792 <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00225.html">buffer_node<T>::size_type</a> size_type;
-<a name="l01793"></a>01793 <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00225.html">buffer_node<T>::item_type</a> item_type;
-<a name="l01794"></a>01794 <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00225.html">buffer_node<T>::buffer_operation</a> prio_operation;
-<a name="l01795"></a>01795
-<a name="l01796"></a>01796 <span class="keyword">enum</span> op_stat {WAIT=0, SUCCEEDED, FAILED};
-<a name="l01797"></a>01797
-<a name="l01798"></a>01798 <span class="comment">/* override */</span> <span class="keywordtype">void</span> handle_operations(prio_operation *op_list) {
-<a name="l01799"></a>01799 prio_operation *tmp <span class="comment">/*, *pop_list*/</span> ;
-<a name="l01800"></a>01800 <span class="keywordtype">bool</span> try_forwarding=<span class="keyword">false</span>;
-<a name="l01801"></a>01801 <span class="keywordflow">while</span> (op_list) {
-<a name="l01802"></a>01802 tmp = op_list;
-<a name="l01803"></a>01803 op_list = op_list->next;
-<a name="l01804"></a>01804 <span class="keywordflow">switch</span> (tmp->type) {
-<a name="l01805"></a>01805 <span class="keywordflow">case</span> buffer_node<T>::reg_succ: this-><a class="code" href="a00225.html#017f16c8d6e0fb65d0d3a61aec86b3e2">internal_reg_succ</a>(tmp); try_forwarding = <span class="keyword">true</span>; <span class="keywordflow">break</span>;
-<a name="l01806"></a>01806 <span class="keywordflow">case</span> buffer_node<T>::rem_succ: this-><a class="code" href="a00225.html#a75f731cf9fc93f7487eb72de3fcf7b1">internal_rem_succ</a>(tmp); <span class="keywordflow">break</span>;
-<a name="l01807"></a>01807 <span class="keywordflow">case</span> buffer_node<T>::put_item: internal_push(tmp); try_forwarding = <span class="keyword">true</span>; <span class="keywordflow">break</span>;
-<a name="l01808"></a>01808 <span class="keywordflow">case</span> buffer_node<T>::try_fwd: <a class="code" href="a00268.html#79161e73f79cc43b2c2b08367504dfda">internal_forward</a>(tmp); <span class="keywordflow">break</span>;
-<a name="l01809"></a>01809 <span class="keywordflow">case</span> buffer_node<T>::rel_res: internal_release(tmp); try_forwarding = <span class="keyword">true</span>; <span class="keywordflow">break</span>;
-<a name="l01810"></a>01810 <span class="keywordflow">case</span> buffer_node<T>::con_res: internal_consume(tmp); try_forwarding = <span class="keyword">true</span>; <span class="keywordflow">break</span>;
-<a name="l01811"></a>01811 <span class="keywordflow">case</span> buffer_node<T>::req_item: internal_pop(tmp); <span class="keywordflow">break</span>;
-<a name="l01812"></a>01812 <span class="keywordflow">case</span> buffer_node<T>::res_item: internal_reserve(tmp); <span class="keywordflow">break</span>;
-<a name="l01813"></a>01813 }
-<a name="l01814"></a>01814 }
-<a name="l01815"></a>01815 <span class="comment">// process pops! for now, no special pop processing</span>
-<a name="l01816"></a>01816 <span class="keywordflow">if</span> (mark<this->my_tail) heapify();
-<a name="l01817"></a>01817 <span class="keywordflow">if</span> (try_forwarding && !this->forwarder_busy) {
-<a name="l01818"></a>01818 this->forwarder_busy = <span class="keyword">true</span>;
-<a name="l01819"></a>01819 <a class="code" href="a00291.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> >(*<span class="keyword">this</span>));
-<a name="l01820"></a>01820 }
-<a name="l01821"></a>01821 }
-<a name="l01822"></a>01822
-<a name="l01824"></a><a class="code" href="a00268.html#79161e73f79cc43b2c2b08367504dfda">01824</a> <span class="comment">/* override */</span> <span class="keywordtype">void</span> <a class="code" href="a00268.html#79161e73f79cc43b2c2b08367504dfda">internal_forward</a>(prio_operation *op) {
-<a name="l01825"></a>01825 T i_copy;
-<a name="l01826"></a>01826 <span class="keywordtype">bool</span> success = <span class="keyword">false</span>; <span class="comment">// flagged when a successor accepts</span>
-<a name="l01827"></a>01827 size_type counter = this->my_successors.size();
-<a name="l01828"></a>01828
-<a name="l01829"></a>01829 <span class="keywordflow">if</span> (this->my_reserved || this->my_tail == 0) {
-<a name="l01830"></a>01830 __TBB_store_with_release(op->status, FAILED);
-<a name="l01831"></a>01831 this->forwarder_busy = <span class="keyword">false</span>;
-<a name="l01832"></a>01832 <span class="keywordflow">return</span>;
-<a name="l01833"></a>01833 }
-<a name="l01834"></a>01834 <span class="comment">// Keep trying to send while there exists an accepting successor</span>
-<a name="l01835"></a>01835 <span class="keywordflow">while</span> (counter>0 && this->my_tail > 0) {
-<a name="l01836"></a>01836 i_copy = this->my_array[0].first;
-<a name="l01837"></a>01837 <span class="keywordtype">bool</span> msg = this->my_successors.try_put(i_copy);
-<a name="l01838"></a>01838 <span class="keywordflow">if</span> ( msg == <span class="keyword">true</span> ) {
-<a name="l01839"></a>01839 <span class="keywordflow">if</span> (mark == this->my_tail) --mark;
-<a name="l01840"></a>01840 --(this->my_tail);
-<a name="l01841"></a>01841 this->my_array[0].first=this->my_array[this->my_tail].first;
-<a name="l01842"></a>01842 <span class="keywordflow">if</span> (this->my_tail > 1) <span class="comment">// don't reheap for heap of size 1</span>
-<a name="l01843"></a>01843 reheap();
-<a name="l01844"></a>01844 success = <span class="keyword">true</span>; <span class="comment">// found an accepting successor</span>
-<a name="l01845"></a>01845 }
-<a name="l01846"></a>01846 --counter;
-<a name="l01847"></a>01847 }
-<a name="l01848"></a>01848 <span class="keywordflow">if</span> (success && !counter)
-<a name="l01849"></a>01849 __TBB_store_with_release(op->status, SUCCEEDED);
-<a name="l01850"></a>01850 <span class="keywordflow">else</span> {
-<a name="l01851"></a>01851 __TBB_store_with_release(op->status, FAILED);
-<a name="l01852"></a>01852 this->forwarder_busy = <span class="keyword">false</span>;
-<a name="l01853"></a>01853 }
-<a name="l01854"></a>01854 }
-<a name="l01855"></a>01855
-<a name="l01856"></a>01856 <span class="comment">/* override */</span> <span class="keywordtype">void</span> internal_push(prio_operation *op) {
-<a name="l01857"></a>01857 <span class="keywordflow">if</span> ( this->my_tail >= this->my_array_size )
-<a name="l01858"></a>01858 this-><a class="code" href="a00225.html#3ec9d33aa9f1e9292d5952e3eb477ca1">grow_my_array</a>( this->my_tail + 1 );
-<a name="l01859"></a>01859 this->my_array[this->my_tail] = std::make_pair( *(op->elem), <span class="keyword">true</span> );
-<a name="l01860"></a>01860 ++(this->my_tail);
-<a name="l01861"></a>01861 __TBB_store_with_release(op->status, SUCCEEDED);
-<a name="l01862"></a>01862 }
-<a name="l01863"></a>01863 <span class="comment">/* override */</span> <span class="keywordtype">void</span> internal_pop(prio_operation *op) {
-<a name="l01864"></a>01864 <span class="keywordflow">if</span> ( this->my_reserved == <span class="keyword">true</span> || this->my_tail == 0 ) {
-<a name="l01865"></a>01865 __TBB_store_with_release(op->status, FAILED);
-<a name="l01866"></a>01866 }
-<a name="l01867"></a>01867 <span class="keywordflow">else</span> {
-<a name="l01868"></a>01868 <span class="keywordflow">if</span> (mark<this->my_tail &&
-<a name="l01869"></a>01869 compare(this->my_array[0].first,
-<a name="l01870"></a>01870 this->my_array[this->my_tail-1].first)) {
-<a name="l01871"></a>01871 <span class="comment">// there are newly pushed elems; last one higher than top</span>
-<a name="l01872"></a>01872 <span class="comment">// copy the data</span>
-<a name="l01873"></a>01873 *(op->elem) = this->my_array[this->my_tail-1].first;
-<a name="l01874"></a>01874 --(this->my_tail);
-<a name="l01875"></a>01875 __TBB_store_with_release(op->status, SUCCEEDED);
-<a name="l01876"></a>01876 }
-<a name="l01877"></a>01877 <span class="keywordflow">else</span> { <span class="comment">// extract and push the last element down heap</span>
-<a name="l01878"></a>01878 *(op->elem) = this->my_array[0].first; <span class="comment">// copy the data</span>
-<a name="l01879"></a>01879 if (mark == this->my_tail) --mark;
-<a name="l01880"></a>01880 --(this->my_tail);
-<a name="l01881"></a>01881 __TBB_store_with_release(op->status, SUCCEEDED);
-<a name="l01882"></a>01882 this->my_array[0].first=this->my_array[this->my_tail].first;
-<a name="l01883"></a>01883 <span class="keywordflow">if</span> (this->my_tail > 1) <span class="comment">// don't reheap for heap of size 1</span>
-<a name="l01884"></a>01884 reheap();
-<a name="l01885"></a>01885 }
-<a name="l01886"></a>01886 }
-<a name="l01887"></a>01887 }
-<a name="l01888"></a>01888 <span class="comment">/* override */</span> <span class="keywordtype">void</span> internal_reserve(prio_operation *op) {
-<a name="l01889"></a>01889 <span class="keywordflow">if</span> (this->my_reserved == <span class="keyword">true</span> || this->my_tail == 0) {
-<a name="l01890"></a>01890 __TBB_store_with_release(op->status, FAILED);
-<a name="l01891"></a>01891 }
-<a name="l01892"></a>01892 <span class="keywordflow">else</span> {
-<a name="l01893"></a>01893 this->my_reserved = <span class="keyword">true</span>;
-<a name="l01894"></a>01894 *(op->elem) = reserved_item = this->my_array[0].first;
-<a name="l01895"></a>01895 if (mark == this->my_tail) --mark;
-<a name="l01896"></a>01896 --(this->my_tail);
-<a name="l01897"></a>01897 __TBB_store_with_release(op->status, SUCCEEDED);
-<a name="l01898"></a>01898 this->my_array[0].first = this->my_array[this->my_tail].first;
-<a name="l01899"></a>01899 <span class="keywordflow">if</span> (this->my_tail > 1) <span class="comment">// don't reheap for heap of size 1</span>
-<a name="l01900"></a>01900 reheap();
-<a name="l01901"></a>01901 }
-<a name="l01902"></a>01902 }
-<a name="l01903"></a>01903 <span class="comment">/* override */</span> <span class="keywordtype">void</span> internal_consume(prio_operation *op) {
-<a name="l01904"></a>01904 this->my_reserved = <span class="keyword">false</span>;
-<a name="l01905"></a>01905 __TBB_store_with_release(op->status, SUCCEEDED);
-<a name="l01906"></a>01906 }
-<a name="l01907"></a>01907 <span class="comment">/* override */</span> <span class="keywordtype">void</span> internal_release(prio_operation *op) {
-<a name="l01908"></a>01908 <span class="keywordflow">if</span> (this->my_tail >= this->my_array_size)
-<a name="l01909"></a>01909 this-><a class="code" href="a00225.html#3ec9d33aa9f1e9292d5952e3eb477ca1">grow_my_array</a>( this->my_tail + 1 );
-<a name="l01910"></a>01910 this->my_array[this->my_tail] = std::make_pair(reserved_item, <span class="keyword">true</span>);
-<a name="l01911"></a>01911 ++(this->my_tail);
-<a name="l01912"></a>01912 this->my_reserved = <span class="keyword">false</span>;
-<a name="l01913"></a>01913 __TBB_store_with_release(op->status, SUCCEEDED);
-<a name="l01914"></a>01914 heapify();
-<a name="l01915"></a>01915 }
-<a name="l01916"></a>01916 <span class="keyword">private</span>:
-<a name="l01917"></a>01917 Compare compare;
-<a name="l01918"></a>01918 size_type mark;
-<a name="l01919"></a>01919 <a class="code" href="a00268.html#40fdedd4829aeae3ebd1a5fdaf39b23d">input_type</a> reserved_item;
-<a name="l01920"></a>01920
-<a name="l01921"></a>01921 <span class="keywordtype">void</span> heapify() {
-<a name="l01922"></a>01922 <span class="keywordflow">if</span> (!mark) mark = 1;
-<a name="l01923"></a>01923 <span class="keywordflow">for</span> (; mark<this->my_tail; ++mark) { <span class="comment">// for each unheaped element</span>
-<a name="l01924"></a>01924 size_type cur_pos = mark;
-<a name="l01925"></a>01925 <a class="code" href="a00268.html#40fdedd4829aeae3ebd1a5fdaf39b23d">input_type</a> to_place = this->my_array[mark].first;
-<a name="l01926"></a>01926 <span class="keywordflow">do</span> { <span class="comment">// push to_place up the heap</span>
-<a name="l01927"></a>01927 size_type parent = (cur_pos-1)>>1;
-<a name="l01928"></a>01928 <span class="keywordflow">if</span> (!compare(this->my_array[parent].first, to_place))
-<a name="l01929"></a>01929 <span class="keywordflow">break</span>;
-<a name="l01930"></a>01930 this->my_array[cur_pos].first = this->my_array[parent].first;
-<a name="l01931"></a>01931 cur_pos = parent;
-<a name="l01932"></a>01932 } <span class="keywordflow">while</span>( cur_pos );
-<a name="l01933"></a>01933 this->my_array[cur_pos].first = to_place;
-<a name="l01934"></a>01934 }
-<a name="l01935"></a>01935 }
-<a name="l01936"></a>01936
-<a name="l01937"></a>01937 <span class="keywordtype">void</span> reheap() {
-<a name="l01938"></a>01938 size_type cur_pos=0, child=1;
-<a name="l01939"></a>01939 <span class="keywordflow">while</span> (child < mark) {
-<a name="l01940"></a>01940 size_type target = child;
-<a name="l01941"></a>01941 <span class="keywordflow">if</span> (child+1<mark &&
-<a name="l01942"></a>01942 compare(this->my_array[child].first,
-<a name="l01943"></a>01943 this->my_array[child+1].first))
-<a name="l01944"></a>01944 ++target;
-<a name="l01945"></a>01945 <span class="comment">// target now has the higher priority child</span>
-<a name="l01946"></a>01946 <span class="keywordflow">if</span> (compare(this->my_array[target].first,
-<a name="l01947"></a>01947 this->my_array[this->my_tail].first))
-<a name="l01948"></a>01948 <span class="keywordflow">break</span>;
-<a name="l01949"></a>01949 this->my_array[cur_pos].first = this->my_array[target].first;
-<a name="l01950"></a>01950 cur_pos = target;
-<a name="l01951"></a>01951 child = (cur_pos<<1)+1;
-<a name="l01952"></a>01952 }
-<a name="l01953"></a>01953 this->my_array[cur_pos].first = this->my_array[this->my_tail].first;
-<a name="l01954"></a>01954 }
-<a name="l01955"></a>01955 };
-<a name="l01956"></a>01956
-<a name="l01958"></a>01958
-<a name="l01961"></a>01961 <span class="keyword">template</span>< <span class="keyword">typename</span> T >
-<a name="l01962"></a><a class="code" href="a00255.html">01962</a> <span class="keyword">class </span><a class="code" href="a00255.html">limiter_node</a> : <span class="keyword">public</span> <a class="code" href="a00251.html">graph_node</a>, <span class="keyword">public</span> <a class="code" href="a00277.html">receiver</a>< T >, <span class="keyword">public</span> <a class="code" href="a00282.html">sender</a>< T >, internal::no_copy {
-<a name="l01963"></a>01963 <span class="keyword">public</span>:
-<a name="l01964"></a>01964
-<a name="l01965"></a><a class="code" href="a00255.html#f654b8974c613e8fd3de5a40e181d5ff">01965</a> <span class="keyword">typedef</span> T <a class="code" href="a00255.html#f654b8974c613e8fd3de5a40e181d5ff">input_type</a>;
-<a name="l01966"></a><a class="code" href="a00255.html#370f88278dec6f584c1d08a375f9b4cd">01966</a> <span class="keyword">typedef</span> T output_type;
-<a name="l01967"></a><a class="code" href="a00255.html#fd88ce7670e7107aef2161b45f156185">01967</a> <span class="keyword">typedef</span> <a class="code" href="a00282.html">sender< input_type ></a> <a class="code" href="a00282.html">predecessor_type</a>;
-<a name="l01968"></a><a class="code" href="a00255.html#754182cc1e5b403201495bc1fd45674b">01968</a> <span class="keyword">typedef</span> <a class="code" href="a00277.html">receiver< output_type ></a> <a class="code" href="a00277.html">successor_type</a>;
-<a name="l01969"></a>01969
-<a name="l01970"></a>01970 <span class="keyword">private</span>:
-<a name="l01971"></a>01971
-<a name="l01972"></a>01972 <a class="code" href="a00291.html">task</a> *my_root_task;
-<a name="l01973"></a>01973 size_t my_threshold;
-<a name="l01974"></a>01974 size_t my_count;
-<a name="l01975"></a>01975 internal::predecessor_cache< T > my_predecessors;
-<a name="l01976"></a>01976 <a class="code" href="a00286.html">spin_mutex</a> my_mutex;
-<a name="l01977"></a>01977 internal::broadcast_cache< T > my_successors;
-<a name="l01978"></a>01978
-<a name="l01979"></a>01979 <span class="keyword">friend</span> <span class="keyword">class </span>internal::forward_task< limiter_node<T> >;
-<a name="l01980"></a>01980
-<a name="l01981"></a>01981 <span class="comment">// Let decrementer call decrement_counter()</span>
-<a name="l01982"></a>01982 <span class="keyword">friend</span> <span class="keyword">class </span>internal::decrementer< limiter_node<T> >;
-<a name="l01983"></a>01983
-<a name="l01984"></a>01984 <span class="keywordtype">void</span> decrement_counter() {
-<a name="l01985"></a>01985 <a class="code" href="a00255.html#f654b8974c613e8fd3de5a40e181d5ff">input_type</a> v;
-<a name="l01986"></a>01986
-<a name="l01987"></a>01987 <span class="comment">// If we can't get / put an item immediately then drop the count</span>
-<a name="l01988"></a>01988 <span class="keywordflow">if</span> ( my_predecessors.get_item( v ) == <span class="keyword">false</span>
-<a name="l01989"></a>01989 || my_successors.try_put(v) == false ) {
-<a name="l01990"></a>01990 <a class="code" href="a00287.html">spin_mutex::scoped_lock</a> lock(my_mutex);
-<a name="l01991"></a>01991 --my_count;
-<a name="l01992"></a>01992 <span class="keywordflow">if</span> ( !my_predecessors.empty() )
-<a name="l01993"></a>01993 <a class="code" href="a00291.html#8365d063c0cc9d7bd616bca47256b93c">task::enqueue</a>( * <span class="keyword">new</span> ( task::allocate_additional_child_of( *my_root_task ) )
-<a name="l01994"></a>01994 internal::forward_task< <a class="code" href="a00255.html">limiter_node<T></a> >( *<span class="keyword">this</span> ) );
-<a name="l01995"></a>01995 }
-<a name="l01996"></a>01996 }
-<a name="l01997"></a>01997
-<a name="l01998"></a>01998 <span class="keywordtype">void</span> forward() {
-<a name="l01999"></a>01999 {
-<a name="l02000"></a>02000 spin_mutex::scoped_lock lock(my_mutex);
-<a name="l02001"></a>02001 <span class="keywordflow">if</span> ( my_count < my_threshold )
-<a name="l02002"></a>02002 ++my_count;
-<a name="l02003"></a>02003 <span class="keywordflow">else</span>
-<a name="l02004"></a>02004 <span class="keywordflow">return</span>;
-<a name="l02005"></a>02005 }
-<a name="l02006"></a>02006 decrement_counter();
-<a name="l02007"></a>02007 }
-<a name="l02008"></a>02008
-<a name="l02009"></a>02009 <span class="keyword">public</span>:
-<a name="l02010"></a>02010
-<a name="l02012"></a><a class="code" href="a00255.html#181fa37d3e3c68ec3819ea46beed79a2">02012</a> internal::decrementer< limiter_node<T> > <a class="code" href="a00255.html#181fa37d3e3c68ec3819ea46beed79a2">decrement</a>;
-<a name="l02013"></a>02013
-<a name="l02015"></a><a class="code" href="a00255.html#f0139fc645a51ce30b7aebb59c38a4ed">02015</a> <a class="code" href="a00255.html#f0139fc645a51ce30b7aebb59c38a4ed">limiter_node</a>( <a class="code" href="a00250.html">graph</a> &g, size_t threshold, <span class="keywordtype">int</span> number_of_decrement_predecessors = 0 ) :
-<a name="l02016"></a>02016 my_root_task(g.root_task()), my_threshold(threshold), my_count(0), <a class="code" href="a00255.html#181fa37d3e3c68ec3819ea46beed79a2">decrement</a>(number_of_decrement_predecessors) {
-<a name="l02017"></a>02017 my_predecessors.set_owner(<span class="keyword">this</span>);
-<a name="l02018"></a>02018 my_successors.set_owner(<span class="keyword">this</span>);
-<a name="l02019"></a>02019 <a class="code" href="a00255.html#181fa37d3e3c68ec3819ea46beed79a2">decrement</a>.set_owner(<span class="keyword">this</span>);
-<a name="l02020"></a>02020 }
-<a name="l02021"></a>02021
-<a name="l02023"></a><a class="code" href="a00255.html#b8b9dbfbfc52750fa0c6bb8849681e86">02023</a> <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00255.html#b8b9dbfbfc52750fa0c6bb8849681e86">register_successor</a>( <a class="code" href="a00277.html">receiver<output_type></a> &r ) {
-<a name="l02024"></a>02024 my_successors.register_successor(r);
-<a name="l02025"></a>02025 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l02026"></a>02026 }
-<a name="l02027"></a>02027
-<a name="l02029"></a>02029
-<a name="l02030"></a><a class="code" href="a00255.html#047d77f583e789e6d3ac6a52aba3168b">02030</a> <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00255.html#047d77f583e789e6d3ac6a52aba3168b">remove_successor</a>( <a class="code" href="a00277.html">receiver<output_type></a> &r ) {
-<a name="l02031"></a>02031 r.<a class="code" href="a00277.html#d2f23b40b328dc254a7c2a0a30f408e4">remove_predecessor</a>(*<span class="keyword">this</span>);
-<a name="l02032"></a>02032 my_successors.remove_successor(r);
-<a name="l02033"></a>02033 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l02034"></a>02034 }
-<a name="l02035"></a>02035
-<a name="l02037"></a><a class="code" href="a00255.html#a38facb46cde854cb7408bf9f3bf8999">02037</a> <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00255.html#a38facb46cde854cb7408bf9f3bf8999">try_put</a>( T t ) {
-<a name="l02038"></a>02038 {
-<a name="l02039"></a>02039 <a class="code" href="a00287.html">spin_mutex::scoped_lock</a> lock(my_mutex);
-<a name="l02040"></a>02040 <span class="keywordflow">if</span> ( my_count >= my_threshold )
-<a name="l02041"></a>02041 <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l02042"></a>02042 <span class="keywordflow">else</span>
-<a name="l02043"></a>02043 ++my_count;
-<a name="l02044"></a>02044 }
-<a name="l02045"></a>02045
-<a name="l02046"></a>02046 <span class="keywordtype">bool</span> msg = my_successors.try_put(t);
-<a name="l02047"></a>02047
-<a name="l02048"></a>02048 <span class="keywordflow">if</span> ( msg != <span class="keyword">true</span> ) {
-<a name="l02049"></a>02049 <a class="code" href="a00287.html">spin_mutex::scoped_lock</a> lock(my_mutex);
-<a name="l02050"></a>02050 --my_count;
-<a name="l02051"></a>02051 <span class="keywordflow">if</span> ( !my_predecessors.empty() )
-<a name="l02052"></a>02052 <a class="code" href="a00291.html#8365d063c0cc9d7bd616bca47256b93c">task::enqueue</a>( * <span class="keyword">new</span> ( task::allocate_additional_child_of( *my_root_task ) )
-<a name="l02053"></a>02053 internal::forward_task< <a class="code" href="a00255.html">limiter_node<T></a> >( *<span class="keyword">this</span> ) );
-<a name="l02054"></a>02054 }
-<a name="l02055"></a>02055
-<a name="l02056"></a>02056 <span class="keywordflow">return</span> msg;
-<a name="l02057"></a>02057 }
-<a name="l02058"></a>02058
-<a name="l02060"></a><a class="code" href="a00255.html#fb9909b87538f5c881c7cb7577436d14">02060</a> <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00255.html#fb9909b87538f5c881c7cb7577436d14">register_predecessor</a>( <a class="code" href="a00282.html">predecessor_type</a> &src ) {
-<a name="l02061"></a>02061 <a class="code" href="a00287.html">spin_mutex::scoped_lock</a> lock(my_mutex);
-<a name="l02062"></a>02062 my_predecessors.add( src );
-<a name="l02063"></a>02063 <span class="keywordflow">if</span> ( my_count < my_threshold && !my_successors.empty() )
-<a name="l02064"></a>02064 <a class="code" href="a00291.html#8365d063c0cc9d7bd616bca47256b93c">task::enqueue</a>( * <span class="keyword">new</span> ( task::allocate_additional_child_of( *my_root_task ) )
-<a name="l02065"></a>02065 internal::forward_task< <a class="code" href="a00255.html">limiter_node<T></a> >( *<span class="keyword">this</span> ) );
-<a name="l02066"></a>02066 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l02067"></a>02067 }
-<a name="l02068"></a>02068
-<a name="l02070"></a><a class="code" href="a00255.html#a05cf39b2825183e9c0393890fbbbb41">02070</a> <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00255.html#a05cf39b2825183e9c0393890fbbbb41">remove_predecessor</a>( <a class="code" href="a00282.html">predecessor_type</a> &src ) {
-<a name="l02071"></a>02071 my_predecessors.remove( src );
-<a name="l02072"></a>02072 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l02073"></a>02073 }
-<a name="l02074"></a>02074
-<a name="l02075"></a>02075 };
-<a name="l02076"></a>02076
-<a name="l02077"></a>02077 <span class="keyword">namespace </span>internal {
-<a name="l02078"></a>02078
-<a name="l02079"></a>02079 <span class="keyword">struct </span>forwarding_base {
-<a name="l02080"></a>02080 <span class="keyword">virtual</span> ~forwarding_base() {}
-<a name="l02081"></a>02081 <span class="keyword">virtual</span> <span class="keywordtype">void</span> decrement_port_count() = 0;
-<a name="l02082"></a>02082 <span class="keyword">virtual</span> <span class="keywordtype">void</span> increment_port_count() = 0;
-<a name="l02083"></a>02083 };
-<a name="l02084"></a>02084
-<a name="l02085"></a>02085 <span class="keyword">template</span>< <span class="keywordtype">int</span> N >
-<a name="l02086"></a>02086 <span class="keyword">struct </span>join_helper {
-<a name="l02087"></a>02087
-<a name="l02088"></a>02088 <span class="keyword">template</span>< <span class="keyword">typename</span> TupleType, <span class="keyword">typename</span> PortType >
-<a name="l02089"></a>02089 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> set_join_node_pointer(TupleType &my_input, PortType *port) {
-<a name="l02090"></a>02090 std::get<N-1>( my_input ).set_join_node_pointer(port);
-<a name="l02091"></a>02091 join_helper<N-1>::set_join_node_pointer( my_input, port );
-<a name="l02092"></a>02092 }
-<a name="l02093"></a>02093 <span class="keyword">template</span>< <span class="keyword">typename</span> TupleType >
-<a name="l02094"></a>02094 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> consume_reservations( TupleType &my_input ) {
-<a name="l02095"></a>02095 std::get<N-1>( my_input ).consume();
-<a name="l02096"></a>02096 join_helper<N-1>::consume_reservations( my_input );
-<a name="l02097"></a>02097 }
-<a name="l02098"></a>02098
-<a name="l02099"></a>02099 <span class="keyword">template</span>< <span class="keyword">typename</span> TupleType >
-<a name="l02100"></a>02100 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> release_my_reservation( TupleType &my_input ) {
-<a name="l02101"></a>02101 std::get<N-1>( my_input ).<a class="code" href="a00362.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">release</a>();
-<a name="l02102"></a>02102 }
-<a name="l02103"></a>02103
-<a name="l02104"></a>02104 <span class="keyword">template</span> <<span class="keyword">typename</span> TupleType>
-<a name="l02105"></a>02105 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> release_reservations( TupleType &my_input) {
-<a name="l02106"></a>02106 join_helper<N-1>::release_reservations(my_input);
-<a name="l02107"></a>02107 release_my_reservation(my_input);
-<a name="l02108"></a>02108 }
-<a name="l02109"></a>02109
-<a name="l02110"></a>02110 <span class="keyword">template</span>< <span class="keyword">typename</span> InputTuple, <span class="keyword">typename</span> OutputTuple >
-<a name="l02111"></a>02111 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> reserve( InputTuple &my_input, OutputTuple &out) {
-<a name="l02112"></a>02112 <span class="keywordflow">if</span> ( !std::get<N-1>( my_input ).reserve( std::get<N-1>( out ) ) ) <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l02113"></a>02113 <span class="keywordflow">if</span> ( !join_helper<N-1>::reserve( my_input, out ) ) {
-<a name="l02114"></a>02114 release_my_reservation( my_input );
-<a name="l02115"></a>02115 <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l02116"></a>02116 }
-<a name="l02117"></a>02117 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l02118"></a>02118 }
-<a name="l02119"></a>02119 };
-<a name="l02120"></a>02120
-<a name="l02121"></a>02121 <span class="keyword">template</span>< >
-<a name="l02122"></a>02122 <span class="keyword">struct </span>join_helper<1> {
-<a name="l02123"></a>02123
-<a name="l02124"></a>02124 <span class="keyword">template</span>< <span class="keyword">typename</span> TupleType, <span class="keyword">typename</span> PortType >
-<a name="l02125"></a>02125 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> set_join_node_pointer(TupleType &my_input, PortType *port) {
-<a name="l02126"></a>02126 std::get<0>( my_input ).set_join_node_pointer(port);
-<a name="l02127"></a>02127 }
-<a name="l02128"></a>02128
-<a name="l02129"></a>02129 <span class="keyword">template</span>< <span class="keyword">typename</span> TupleType >
-<a name="l02130"></a>02130 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> consume_reservations( TupleType &my_input ) {
-<a name="l02131"></a>02131 std::get<0>( my_input ).consume();
-<a name="l02132"></a>02132 }
-<a name="l02133"></a>02133
-<a name="l02134"></a>02134 <span class="keyword">template</span>< <span class="keyword">typename</span> TupleType >
-<a name="l02135"></a>02135 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> release_my_reservation( TupleType &my_input ) {
-<a name="l02136"></a>02136 std::get<0>( my_input ).<a class="code" href="a00362.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">release</a>();
-<a name="l02137"></a>02137 }
-<a name="l02138"></a>02138
-<a name="l02139"></a>02139 <span class="keyword">template</span><<span class="keyword">typename</span> TupleType>
-<a name="l02140"></a>02140 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> release_reservations( TupleType &my_input) {
-<a name="l02141"></a>02141 release_my_reservation(my_input);
-<a name="l02142"></a>02142 }
-<a name="l02143"></a>02143
-<a name="l02144"></a>02144 <span class="keyword">template</span>< <span class="keyword">typename</span> InputTuple, <span class="keyword">typename</span> OutputTuple >
-<a name="l02145"></a>02145 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> reserve( InputTuple &my_input, OutputTuple &out) {
-<a name="l02146"></a>02146 <span class="keywordflow">return</span> std::get<0>( my_input ).reserve( std::get<0>( out ) );
-<a name="l02147"></a>02147 }
-<a name="l02148"></a>02148 };
-<a name="l02149"></a>02149
-<a name="l02150"></a>02150 <span class="keyword">namespace </span>join_policy_namespace {
-<a name="l02151"></a>02151 <span class="keyword">enum</span> join_policy { two_phase
-<a name="l02152"></a>02152 };
-<a name="l02153"></a>02153 }
-<a name="l02154"></a>02154 <span class="keyword">using namespace </span>join_policy_namespace;
-<a name="l02155"></a>02155
-<a name="l02157"></a>02157 <span class="keyword">template</span>< <span class="keyword">typename</span> T >
-<a name="l02158"></a><a class="code" href="a00304.html">02158</a> <span class="keyword">class </span><a class="code" href="a00304.html">two_phase_port</a> : <span class="keyword">public</span> <a class="code" href="a00277.html">receiver</a><T> {
-<a name="l02159"></a>02159 <span class="keyword">public</span>:
-<a name="l02160"></a><a class="code" href="a00304.html#0f464d59e15941d6d625e8c7d634e26b">02160</a> <span class="keyword">typedef</span> T <a class="code" href="a00304.html#0f464d59e15941d6d625e8c7d634e26b">input_type</a>;
-<a name="l02161"></a><a class="code" href="a00304.html#37ee9b5320b631c39bccc0b4745d88d1">02161</a> <span class="keyword">typedef</span> <a class="code" href="a00282.html">sender<T></a> <a class="code" href="a00282.html">predecessor_type</a>;
-<a name="l02162"></a>02162
-<a name="l02164"></a><a class="code" href="a00304.html#60e17ef935031c86c4a288eafab5c066">02164</a> <a class="code" href="a00304.html#60e17ef935031c86c4a288eafab5c066">two_phase_port</a>() : reserved(false) {
-<a name="l02165"></a>02165 my_join = NULL;
-<a name="l02166"></a>02166 my_predecessors.set_owner( <span class="keyword">this</span> );
-<a name="l02167"></a>02167 }
-<a name="l02168"></a>02168
-<a name="l02169"></a>02169 <span class="comment">// copy constructor</span>
-<a name="l02170"></a>02170 <a class="code" href="a00304.html#60e17ef935031c86c4a288eafab5c066">two_phase_port</a>(<span class="keyword">const</span> <a class="code" href="a00304.html">two_phase_port</a>& <span class="comment">/* other */</span>) : <a class="code" href="a00277.html">receiver</a><T>() {
-<a name="l02171"></a>02171 reserved = <span class="keyword">false</span>;
-<a name="l02172"></a>02172 my_join = NULL;
-<a name="l02173"></a>02173 my_predecessors.set_owner( <span class="keyword">this</span> );
-<a name="l02174"></a>02174 }
-<a name="l02175"></a>02175
-<a name="l02176"></a>02176 <span class="keywordtype">void</span> set_join_node_pointer(forwarding_base *join) {
-<a name="l02177"></a>02177 my_join = join;
-<a name="l02178"></a>02178 }
-<a name="l02179"></a>02179
-<a name="l02180"></a><a class="code" href="a00304.html#f316c0d5ff67068ff23b684accbe87f4">02180</a> <span class="keywordtype">bool</span> <a class="code" href="a00304.html#f316c0d5ff67068ff23b684accbe87f4">try_put</a>( T ) {
-<a name="l02181"></a>02181 <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l02182"></a>02182 }
-<a name="l02183"></a>02183
-<a name="l02185"></a><a class="code" href="a00304.html#6dc1f9bf02109c7f6fe4cc58bc31a00c">02185</a> <span class="keywordtype">bool</span> <a class="code" href="a00304.html#6dc1f9bf02109c7f6fe4cc58bc31a00c">register_predecessor</a>( <a class="code" href="a00282.html">sender<T></a> &src ) {
-<a name="l02186"></a>02186 <a class="code" href="a00287.html">spin_mutex::scoped_lock</a> l(my_mutex);
-<a name="l02187"></a>02187 <span class="keywordtype">bool</span> no_predecessors = my_predecessors.empty();
-<a name="l02188"></a>02188 my_predecessors.add(src);
-<a name="l02189"></a>02189 <span class="keywordflow">if</span> ( no_predecessors ) {
-<a name="l02190"></a>02190 my_join->decrement_port_count( );
-<a name="l02191"></a>02191 }
-<a name="l02192"></a>02192 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l02193"></a>02193 }
-<a name="l02194"></a>02194
-<a name="l02196"></a><a class="code" href="a00304.html#a734a55289804ff34ce1c6ac4c5075e4">02196</a> <span class="keywordtype">bool</span> <a class="code" href="a00304.html#a734a55289804ff34ce1c6ac4c5075e4">remove_predecessor</a>( <a class="code" href="a00282.html">sender<T></a> &src ) {
-<a name="l02197"></a>02197 <a class="code" href="a00287.html">spin_mutex::scoped_lock</a> l(my_mutex);
-<a name="l02198"></a>02198 my_predecessors.remove( src );
-<a name="l02199"></a>02199 <span class="keywordflow">if</span>(my_predecessors.empty()) my_join->increment_port_count();
-<a name="l02200"></a>02200 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l02201"></a>02201 }
-<a name="l02202"></a>02202
-<a name="l02204"></a><a class="code" href="a00304.html#1d7399cfc77fca8878d8d16049ce4e7e">02204</a> <span class="keywordtype">bool</span> <a class="code" href="a00304.html#1d7399cfc77fca8878d8d16049ce4e7e">reserve</a>( T &v ) {
-<a name="l02205"></a>02205 <a class="code" href="a00287.html">spin_mutex::scoped_lock</a> l(my_mutex);
-<a name="l02206"></a>02206 <span class="keywordflow">if</span> ( reserved ) {
-<a name="l02207"></a>02207 <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l02208"></a>02208 }
-<a name="l02209"></a>02209 <span class="keywordflow">if</span> ( my_predecessors.try_reserve( v ) ) {
-<a name="l02210"></a>02210 reserved = <span class="keyword">true</span>;
-<a name="l02211"></a>02211 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l02212"></a>02212 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( my_predecessors.empty() ) {
-<a name="l02213"></a>02213 my_join->increment_port_count();
-<a name="l02214"></a>02214 }
-<a name="l02215"></a>02215 <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l02216"></a>02216 }
-<a name="l02217"></a>02217
-<a name="l02219"></a><a class="code" href="a00304.html#091f6efffaadbbeca6cf23483dabd891">02219</a> <span class="keywordtype">void</span> <a class="code" href="a00304.html#091f6efffaadbbeca6cf23483dabd891">release</a>( ) {
-<a name="l02220"></a>02220 <a class="code" href="a00287.html">spin_mutex::scoped_lock</a> l(my_mutex);
-<a name="l02221"></a>02221 reserved = <span class="keyword">false</span>;
-<a name="l02222"></a>02222 my_predecessors.try_release( );
-<a name="l02223"></a>02223 }
-<a name="l02224"></a>02224
-<a name="l02226"></a><a class="code" href="a00304.html#684f6bbc3290270ed43cb34ffd273f71">02226</a> <span class="keywordtype">void</span> <a class="code" href="a00304.html#684f6bbc3290270ed43cb34ffd273f71">consume</a>( ) {
-<a name="l02227"></a>02227 <a class="code" href="a00287.html">spin_mutex::scoped_lock</a> l(my_mutex);
-<a name="l02228"></a>02228 reserved = <span class="keyword">false</span>;
-<a name="l02229"></a>02229 my_predecessors.try_consume( );
-<a name="l02230"></a>02230 }
-<a name="l02231"></a>02231
-<a name="l02232"></a>02232 <span class="keyword">private</span>:
-<a name="l02233"></a>02233 <a class="code" href="a00286.html">spin_mutex</a> my_mutex;
-<a name="l02234"></a>02234 forwarding_base *my_join;
-<a name="l02235"></a>02235 reservable_predecessor_cache< T > my_predecessors;
-<a name="l02236"></a>02236 <span class="keywordtype">bool</span> reserved;
-<a name="l02237"></a>02237 };
-<a name="l02238"></a>02238
-<a name="l02239"></a>02239 <span class="keyword">template</span><join_policy JP, <span class="keyword">typename</span> InputTuple, <span class="keyword">typename</span> OutputTuple>
-<a name="l02240"></a>02240 <span class="keyword">class </span>join_node_base;
-<a name="l02241"></a>02241
-<a name="l02243"></a>02243 <span class="keyword">template</span><join_policy JP, <span class="keyword">typename</span> InputTuple, <span class="keyword">typename</span> OutputTuple>
-<a name="l02244"></a>02244 <span class="keyword">class </span>join_node_FE;
-<a name="l02245"></a>02245
-<a name="l02246"></a>02246 <span class="keyword">template</span><<span class="keyword">typename</span> InputTuple, <span class="keyword">typename</span> OutputTuple>
-<a name="l02247"></a>02247 <span class="keyword">class </span>join_node_FE<two_phase, InputTuple, OutputTuple> : <span class="keyword">public</span> forwarding_base {
-<a name="l02248"></a>02248 <span class="keyword">public</span>:
-<a name="l02249"></a>02249 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">int</span> N = std::tuple_size<OutputTuple>::value;
-<a name="l02250"></a>02250 <span class="keyword">typedef</span> OutputTuple output_type;
-<a name="l02251"></a>02251 <span class="keyword">typedef</span> InputTuple input_type;
-<a name="l02252"></a>02252 <span class="keyword">typedef</span> join_node_base<two_phase, InputTuple, OutputTuple> my_node_type; <span class="comment">// for forwarding</span>
-<a name="l02253"></a>02253
-<a name="l02254"></a>02254 join_node_FE(<a class="code" href="a00250.html">graph</a> &g) : my_root_task(g.root_task()), my_node(NULL) {
-<a name="l02255"></a>02255 ports_with_no_inputs = N;
-<a name="l02256"></a>02256 join_helper<N>::set_join_node_pointer(my_inputs, <span class="keyword">this</span>);
-<a name="l02257"></a>02257 }
-<a name="l02258"></a>02258
-<a name="l02259"></a>02259 <span class="keywordtype">void</span> set_my_node(my_node_type *new_my_node) { my_node = new_my_node; }
-<a name="l02260"></a>02260
-<a name="l02261"></a>02261 <span class="keywordtype">void</span> increment_port_count() {
-<a name="l02262"></a>02262 ++ports_with_no_inputs;
-<a name="l02263"></a>02263 }
-<a name="l02264"></a>02264
-<a name="l02265"></a>02265 <span class="comment">// if all input_ports have predecessors, spawn forward to try and consume tuples</span>
-<a name="l02266"></a>02266 <span class="keywordtype">void</span> decrement_port_count() {
-<a name="l02267"></a>02267 <span class="keywordflow">if</span>(ports_with_no_inputs.fetch_and_decrement() == 1) {
-<a name="l02268"></a>02268 <a class="code" href="a00291.html#8365d063c0cc9d7bd616bca47256b93c">task::enqueue</a>( * <span class="keyword">new</span> ( task::allocate_additional_child_of( *my_root_task ) )
-<a name="l02269"></a>02269 forward_task<my_node_type>(*my_node) );
-<a name="l02270"></a>02270 }
-<a name="l02271"></a>02271 }
-<a name="l02272"></a>02272
-<a name="l02273"></a>02273 input_type &inputs() { <span class="keywordflow">return</span> my_inputs; }
-<a name="l02274"></a>02274 <span class="keyword">protected</span>:
-<a name="l02275"></a>02275 <span class="comment">// all methods on input ports should be called under spin lock from join_node_base.</span>
-<a name="l02276"></a>02276
-<a name="l02277"></a>02277 <span class="keywordtype">bool</span> tuple_build_may_succeed() {
-<a name="l02278"></a>02278 <span class="keywordflow">return</span> !ports_with_no_inputs;
-<a name="l02279"></a>02279 }
-<a name="l02280"></a>02280
-<a name="l02281"></a>02281 <span class="keywordtype">bool</span> try_to_make_tuple(output_type &out) {
-<a name="l02282"></a>02282 <span class="keywordflow">if</span>(ports_with_no_inputs) <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l02283"></a>02283 <span class="keywordflow">return</span> join_helper<N>::reserve(my_inputs, out);
-<a name="l02284"></a>02284 }
-<a name="l02285"></a>02285
-<a name="l02286"></a>02286 <span class="keywordtype">void</span> tuple_accepted() {
-<a name="l02287"></a>02287 join_helper<N>::consume_reservations(my_inputs);
-<a name="l02288"></a>02288 }
-<a name="l02289"></a>02289 <span class="keywordtype">void</span> tuple_rejected() {
-<a name="l02290"></a>02290 join_helper<N>::release_reservations(my_inputs);
-<a name="l02291"></a>02291 }
-<a name="l02292"></a>02292
-<a name="l02293"></a>02293 input_type my_inputs;
-<a name="l02294"></a>02294 task *my_root_task;
-<a name="l02295"></a>02295 my_node_type *my_node;
-<a name="l02296"></a>02296 atomic<size_t> ports_with_no_inputs;
-<a name="l02297"></a>02297 };
-<a name="l02298"></a>02298
-<a name="l02300"></a>02300 <span class="keyword">template</span><join_policy JP, <span class="keyword">typename</span> InputTuple, <span class="keyword">typename</span> OutputTuple>
-<a name="l02301"></a><a class="code" href="a00254.html">02301</a> <span class="keyword">class </span><a class="code" href="a00254.html">join_node_base</a> : <span class="keyword">public</span> <a class="code" href="a00251.html">graph_node</a>, <span class="keyword">public</span> join_node_FE<JP, InputTuple, OutputTuple>,
-<a name="l02302"></a>02302 <span class="keyword">public</span> <a class="code" href="a00282.html">sender</a><OutputTuple>, no_copy {
-<a name="l02303"></a>02303 <span class="keyword">public</span>:
-<a name="l02304"></a><a class="code" href="a00254.html#578893d923f91b7e44a15dea8b0d7082">02304</a> <span class="keyword">typedef</span> OutputTuple output_type;
-<a name="l02305"></a>02305
-<a name="l02306"></a><a class="code" href="a00254.html#1212cbaa293a93c3bf334da1539556bd">02306</a> <span class="keyword">typedef</span> <a class="code" href="a00277.html">receiver<output_type></a> <a class="code" href="a00277.html">successor_type</a>;
-<a name="l02307"></a>02307 <span class="keyword">typedef</span> join_node_FE<JP, InputTuple, OutputTuple> input_ports_type;
-<a name="l02308"></a>02308 <span class="keyword">using</span> input_ports_type::tuple_build_may_succeed;
-<a name="l02309"></a>02309 <span class="keyword">using</span> input_ports_type::try_to_make_tuple;
-<a name="l02310"></a>02310 <span class="keyword">using</span> input_ports_type::tuple_accepted;
-<a name="l02311"></a>02311 <span class="keyword">using</span> input_ports_type::tuple_rejected;
-<a name="l02312"></a>02312
-<a name="l02313"></a>02313 <a class="code" href="a00254.html">join_node_base</a>(<a class="code" href="a00250.html">graph</a> &g) : input_ports_type(g), my_root_task(g.root_task()) {
-<a name="l02314"></a>02314 my_successors.set_owner(<span class="keyword">this</span>);
-<a name="l02315"></a>02315 input_ports_type::set_my_node(<span class="keyword">this</span>);
-<a name="l02316"></a>02316 }
-<a name="l02317"></a>02317
-<a name="l02318"></a>02318 <span class="keywordtype">bool</span> register_successor(<a class="code" href="a00254.html#1212cbaa293a93c3bf334da1539556bd">successor_type</a> &r) {
-<a name="l02319"></a>02319 <a class="code" href="a00287.html">spin_mutex::scoped_lock</a> l(my_mutex);
-<a name="l02320"></a>02320 my_successors.register_successor(r);
-<a name="l02321"></a>02321 <span class="keywordflow">if</span>(tuple_build_may_succeed()) {
-<a name="l02322"></a>02322 <a class="code" href="a00291.html#8365d063c0cc9d7bd616bca47256b93c">task::enqueue</a>( * <span class="keyword">new</span> ( task::allocate_additional_child_of( *my_root_task) )
-<a name="l02323"></a>02323 forward_task<<a class="code" href="a00254.html">join_node_base<JP,InputTuple,OutputTuple></a> >( *<span class="keyword">this</span> ) );
-<a name="l02324"></a>02324 }
-<a name="l02325"></a>02325 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l02326"></a>02326 }
-<a name="l02327"></a>02327
-<a name="l02328"></a>02328 <span class="keyword">template</span><size_t N>
-<a name="l02329"></a>02329 receiver<typename std::tuple_element<N, OutputTuple>::value> & input_port(<span class="keywordtype">void</span>) { <span class="keywordflow">return</span> std::get<N>(input_ports_type::inputs()); }
-<a name="l02330"></a>02330
-<a name="l02331"></a>02331 <span class="keywordtype">bool</span> remove_successor( <a class="code" href="a00254.html#1212cbaa293a93c3bf334da1539556bd">successor_type</a> &r) {
-<a name="l02332"></a>02332 spin_mutex::scoped_lock l(my_mutex);
-<a name="l02333"></a>02333 my_successors.remove_successor(r);
-<a name="l02334"></a>02334 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l02335"></a>02335 }
-<a name="l02336"></a>02336
-<a name="l02337"></a><a class="code" href="a00254.html#50c0e6465ac929a2e94d4e62a13ebeff">02337</a> <span class="keywordtype">bool</span> <a class="code" href="a00254.html#50c0e6465ac929a2e94d4e62a13ebeff">try_get</a>( output_type &v) {
-<a name="l02338"></a>02338 <a class="code" href="a00287.html">spin_mutex::scoped_lock</a> l(my_mutex);
-<a name="l02339"></a>02339 <span class="keywordflow">if</span>(tuple_build_may_succeed()) {
-<a name="l02340"></a>02340 <span class="keywordflow">if</span>(try_to_make_tuple(v)) {
-<a name="l02341"></a>02341 <span class="comment">// successor requested, so acceptance guaranteed</span>
-<a name="l02342"></a>02342 tuple_accepted();
-<a name="l02343"></a>02343 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l02344"></a>02344 }
-<a name="l02345"></a>02345 }
-<a name="l02346"></a>02346 <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l02347"></a>02347 }
-<a name="l02348"></a>02348
-<a name="l02349"></a>02349 <span class="keyword">private</span>:
-<a name="l02350"></a>02350 <a class="code" href="a00291.html">task</a> *my_root_task;
-<a name="l02351"></a>02351 broadcast_cache<output_type, null_rw_mutex> my_successors;
-<a name="l02352"></a>02352 <a class="code" href="a00286.html">spin_mutex</a> my_mutex;
-<a name="l02353"></a>02353
-<a name="l02354"></a>02354 <span class="keyword">friend</span> <span class="keyword">class </span>forward_task< join_node_base<JP, InputTuple, OutputTuple> >;
-<a name="l02355"></a>02355
-<a name="l02356"></a>02356 <span class="keywordtype">void</span> forward() {
-<a name="l02357"></a>02357 <a class="code" href="a00287.html">spin_mutex::scoped_lock</a> l(my_mutex);
-<a name="l02358"></a>02358 output_type out;
-<a name="l02359"></a>02359 <span class="keywordflow">if</span>(!tuple_build_may_succeed()) <span class="keywordflow">return</span>;
-<a name="l02360"></a>02360 <span class="keywordflow">while</span>(try_to_make_tuple(out)) {
-<a name="l02361"></a>02361 <span class="keywordflow">if</span>(my_successors.try_put(out)) {
-<a name="l02362"></a>02362 tuple_accepted();
-<a name="l02363"></a>02363 }
-<a name="l02364"></a>02364 <span class="keywordflow">else</span> {
-<a name="l02365"></a>02365 tuple_rejected();
-<a name="l02366"></a>02366 <span class="keywordflow">return</span>;
-<a name="l02367"></a>02367 }
-<a name="l02368"></a>02368 }
-<a name="l02369"></a>02369 }
-<a name="l02370"></a>02370 };
-<a name="l02371"></a>02371
-<a name="l02373"></a>02373 <span class="comment">// using tuple_element.</span>
-<a name="l02374"></a>02374 <span class="keyword">template</span><<span class="keywordtype">int</span> N, <span class="keyword">typename</span> OutputTuple, join_policy JP>
-<a name="l02375"></a>02375 <span class="keyword">class </span>unfolded_join_node;
-<a name="l02376"></a>02376
-<a name="l02377"></a>02377 <span class="keyword">template</span><<span class="keyword">typename</span> OutputTuple>
-<a name="l02378"></a>02378 <span class="keyword">class </span>unfolded_join_node<2,OutputTuple,two_phase> : <span class="keyword">public</span> internal::join_node_base<two_phase,
-<a name="l02379"></a>02379 std::tuple<
-<a name="l02380"></a>02380 two_phase_port<typename std::tuple_element<0,OutputTuple>::type>,
-<a name="l02381"></a>02381 two_phase_port<typename std::tuple_element<1,OutputTuple>::type> >,
-<a name="l02382"></a>02382 OutputTuple
-<a name="l02383"></a>02383 >
-<a name="l02384"></a>02384 {
-<a name="l02385"></a>02385 <span class="keyword">private</span>:
-<a name="l02386"></a>02386 <span class="keyword">typedef</span> <span class="keyword">typename</span> std::tuple<
-<a name="l02387"></a>02387 two_phase_port<typename std::tuple_element<0,OutputTuple>::type>,
-<a name="l02388"></a>02388 two_phase_port<typename std::tuple_element<1,OutputTuple>::type> > port_tuple_type;
-<a name="l02389"></a>02389 <span class="keyword">public</span>:
-<a name="l02390"></a>02390 <span class="keyword">typedef</span> OutputTuple output_type;
-<a name="l02391"></a>02391 <span class="keyword">private</span>:
-<a name="l02392"></a>02392 <span class="keyword">typedef</span> join_node_base<two_phase, port_tuple_type, output_type > base_type;
-<a name="l02393"></a>02393 <span class="keyword">public</span>:
-<a name="l02394"></a>02394 unfolded_join_node(graph &g) : base_type(g) {}
-<a name="l02395"></a>02395 };
-<a name="l02396"></a>02396
-<a name="l02397"></a>02397 <span class="keyword">template</span><<span class="keyword">typename</span> OutputTuple>
-<a name="l02398"></a>02398 <span class="keyword">class </span>unfolded_join_node<3,OutputTuple,two_phase> : <span class="keyword">public</span> internal::join_node_base<two_phase,
-<a name="l02399"></a>02399 std::tuple<
-<a name="l02400"></a>02400 two_phase_port<typename std::tuple_element<0,OutputTuple>::type>,
-<a name="l02401"></a>02401 two_phase_port<typename std::tuple_element<1,OutputTuple>::type>,
-<a name="l02402"></a>02402 two_phase_port<typename std::tuple_element<2,OutputTuple>::type> >,
-<a name="l02403"></a>02403 OutputTuple
-<a name="l02404"></a>02404 >
-<a name="l02405"></a>02405 {
-<a name="l02406"></a>02406 <span class="keyword">private</span>:
-<a name="l02407"></a>02407 <span class="keyword">typedef</span> <span class="keyword">typename</span> std::tuple<
-<a name="l02408"></a>02408 two_phase_port<typename std::tuple_element<0,OutputTuple>::type>,
-<a name="l02409"></a>02409 two_phase_port<typename std::tuple_element<1,OutputTuple>::type>,
-<a name="l02410"></a>02410 two_phase_port<typename std::tuple_element<2,OutputTuple>::type> > port_tuple_type;
-<a name="l02411"></a>02411 <span class="keyword">public</span>:
-<a name="l02412"></a>02412 <span class="keyword">typedef</span> OutputTuple output_type;
-<a name="l02413"></a>02413 <span class="keyword">private</span>:
-<a name="l02414"></a>02414 <span class="keyword">typedef</span> join_node_base<two_phase, port_tuple_type, output_type > base_type;
-<a name="l02415"></a>02415 <span class="keyword">public</span>:
-<a name="l02416"></a>02416 unfolded_join_node(graph &g) : base_type(g) {}
-<a name="l02417"></a>02417 };
-<a name="l02418"></a>02418
-<a name="l02419"></a>02419 <span class="keyword">template</span><<span class="keyword">typename</span> OutputTuple>
-<a name="l02420"></a>02420 <span class="keyword">class </span>unfolded_join_node<4,OutputTuple,two_phase> : <span class="keyword">public</span> internal::join_node_base<two_phase,
-<a name="l02421"></a>02421 std::tuple<
-<a name="l02422"></a>02422 two_phase_port<typename std::tuple_element<0,OutputTuple>::type>,
-<a name="l02423"></a>02423 two_phase_port<typename std::tuple_element<1,OutputTuple>::type>,
-<a name="l02424"></a>02424 two_phase_port<typename std::tuple_element<2,OutputTuple>::type>,
-<a name="l02425"></a>02425 two_phase_port<typename std::tuple_element<3,OutputTuple>::type> >,
-<a name="l02426"></a>02426 OutputTuple
-<a name="l02427"></a>02427 > {
-<a name="l02428"></a>02428 <span class="keyword">private</span>:
-<a name="l02429"></a>02429 <span class="keyword">typedef</span> <span class="keyword">typename</span> std::tuple<
-<a name="l02430"></a>02430 two_phase_port<typename std::tuple_element<0,OutputTuple>::type>,
-<a name="l02431"></a>02431 two_phase_port<typename std::tuple_element<1,OutputTuple>::type>,
-<a name="l02432"></a>02432 two_phase_port<typename std::tuple_element<2,OutputTuple>::type>,
-<a name="l02433"></a>02433 two_phase_port<typename std::tuple_element<3,OutputTuple>::type> > port_tuple_type;
-<a name="l02434"></a>02434 <span class="keyword">public</span>:
-<a name="l02435"></a>02435 <span class="keyword">typedef</span> OutputTuple output_type;
-<a name="l02436"></a>02436 <span class="keyword">private</span>:
-<a name="l02437"></a>02437 <span class="keyword">typedef</span> join_node_base<two_phase, port_tuple_type, output_type > base_type;
-<a name="l02438"></a>02438 <span class="keyword">public</span>:
-<a name="l02439"></a>02439 unfolded_join_node(graph &g) : base_type(g) {}
-<a name="l02440"></a>02440 };
-<a name="l02441"></a>02441
-<a name="l02442"></a>02442 <span class="keyword">template</span><<span class="keyword">typename</span> OutputTuple>
-<a name="l02443"></a>02443 <span class="keyword">class </span>unfolded_join_node<5,OutputTuple,two_phase> : <span class="keyword">public</span> internal::join_node_base<two_phase,
-<a name="l02444"></a>02444 std::tuple<
-<a name="l02445"></a>02445 two_phase_port<typename std::tuple_element<0,OutputTuple>::type>,
-<a name="l02446"></a>02446 two_phase_port<typename std::tuple_element<1,OutputTuple>::type>,
-<a name="l02447"></a>02447 two_phase_port<typename std::tuple_element<2,OutputTuple>::type>,
-<a name="l02448"></a>02448 two_phase_port<typename std::tuple_element<3,OutputTuple>::type>,
-<a name="l02449"></a>02449 two_phase_port<typename std::tuple_element<4,OutputTuple>::type> >,
-<a name="l02450"></a>02450 OutputTuple
-<a name="l02451"></a>02451 > {
-<a name="l02452"></a>02452 <span class="keyword">private</span>:
-<a name="l02453"></a>02453 <span class="keyword">typedef</span> <span class="keyword">typename</span> std::tuple<
-<a name="l02454"></a>02454 two_phase_port<typename std::tuple_element<0,OutputTuple>::type>,
-<a name="l02455"></a>02455 two_phase_port<typename std::tuple_element<1,OutputTuple>::type>,
-<a name="l02456"></a>02456 two_phase_port<typename std::tuple_element<2,OutputTuple>::type>,
-<a name="l02457"></a>02457 two_phase_port<typename std::tuple_element<3,OutputTuple>::type>,
-<a name="l02458"></a>02458 two_phase_port<typename std::tuple_element<4,OutputTuple>::type> > port_tuple_type;
-<a name="l02459"></a>02459 <span class="keyword">public</span>:
-<a name="l02460"></a>02460 <span class="keyword">typedef</span> OutputTuple output_type;
-<a name="l02461"></a>02461 <span class="keyword">private</span>:
-<a name="l02462"></a>02462 <span class="keyword">typedef</span> join_node_base<two_phase, port_tuple_type, output_type > base_type;
-<a name="l02463"></a>02463 <span class="keyword">public</span>:
-<a name="l02464"></a>02464 unfolded_join_node(graph &g) : base_type(g) {}
-<a name="l02465"></a>02465 };
-<a name="l02466"></a>02466
-<a name="l02467"></a>02467 <span class="keyword">template</span><<span class="keyword">typename</span> OutputTuple>
-<a name="l02468"></a>02468 <span class="keyword">class </span>unfolded_join_node<6,OutputTuple,two_phase> : <span class="keyword">public</span> internal::join_node_base<two_phase,
-<a name="l02469"></a>02469 std::tuple<
-<a name="l02470"></a>02470 two_phase_port<typename std::tuple_element<0,OutputTuple>::type>,
-<a name="l02471"></a>02471 two_phase_port<typename std::tuple_element<1,OutputTuple>::type>,
-<a name="l02472"></a>02472 two_phase_port<typename std::tuple_element<2,OutputTuple>::type>,
-<a name="l02473"></a>02473 two_phase_port<typename std::tuple_element<3,OutputTuple>::type>,
-<a name="l02474"></a>02474 two_phase_port<typename std::tuple_element<4,OutputTuple>::type>,
-<a name="l02475"></a>02475 two_phase_port<typename std::tuple_element<5,OutputTuple>::type> >,
-<a name="l02476"></a>02476 OutputTuple
-<a name="l02477"></a>02477 > {
-<a name="l02478"></a>02478 <span class="keyword">private</span>:
-<a name="l02479"></a>02479 <span class="keyword">typedef</span> <span class="keyword">typename</span> std::tuple<
-<a name="l02480"></a>02480 two_phase_port<typename std::tuple_element<0,OutputTuple>::type>,
-<a name="l02481"></a>02481 two_phase_port<typename std::tuple_element<1,OutputTuple>::type>,
-<a name="l02482"></a>02482 two_phase_port<typename std::tuple_element<2,OutputTuple>::type>,
-<a name="l02483"></a>02483 two_phase_port<typename std::tuple_element<3,OutputTuple>::type>,
-<a name="l02484"></a>02484 two_phase_port<typename std::tuple_element<4,OutputTuple>::type>,
-<a name="l02485"></a>02485 two_phase_port<typename std::tuple_element<5,OutputTuple>::type> > port_tuple_type;
-<a name="l02486"></a>02486 <span class="keyword">public</span>:
-<a name="l02487"></a>02487 <span class="keyword">typedef</span> OutputTuple output_type;
-<a name="l02488"></a>02488 <span class="keyword">private</span>:
-<a name="l02489"></a>02489 <span class="keyword">typedef</span> join_node_base<two_phase, port_tuple_type, output_type > base_type;
-<a name="l02490"></a>02490 <span class="keyword">public</span>:
-<a name="l02491"></a>02491 unfolded_join_node(graph &g) : base_type(g) {}
-<a name="l02492"></a>02492 };
-<a name="l02493"></a>02493
-<a name="l02494"></a>02494 <span class="keyword">template</span><<span class="keyword">typename</span> OutputTuple>
-<a name="l02495"></a>02495 <span class="keyword">class </span>unfolded_join_node<7,OutputTuple,two_phase> : <span class="keyword">public</span> internal::join_node_base<two_phase,
-<a name="l02496"></a>02496 std::tuple<
-<a name="l02497"></a>02497 two_phase_port<typename std::tuple_element<0,OutputTuple>::type>,
-<a name="l02498"></a>02498 two_phase_port<typename std::tuple_element<1,OutputTuple>::type>,
-<a name="l02499"></a>02499 two_phase_port<typename std::tuple_element<2,OutputTuple>::type>,
-<a name="l02500"></a>02500 two_phase_port<typename std::tuple_element<3,OutputTuple>::type>,
-<a name="l02501"></a>02501 two_phase_port<typename std::tuple_element<4,OutputTuple>::type>,
-<a name="l02502"></a>02502 two_phase_port<typename std::tuple_element<5,OutputTuple>::type>,
-<a name="l02503"></a>02503 two_phase_port<typename std::tuple_element<6,OutputTuple>::type> >,
-<a name="l02504"></a>02504 OutputTuple
-<a name="l02505"></a>02505 > {
-<a name="l02506"></a>02506 <span class="keyword">private</span>:
-<a name="l02507"></a>02507 <span class="keyword">typedef</span> <span class="keyword">typename</span> std::tuple<
-<a name="l02508"></a>02508 two_phase_port<typename std::tuple_element<0,OutputTuple>::type>,
-<a name="l02509"></a>02509 two_phase_port<typename std::tuple_element<1,OutputTuple>::type>,
-<a name="l02510"></a>02510 two_phase_port<typename std::tuple_element<2,OutputTuple>::type>,
-<a name="l02511"></a>02511 two_phase_port<typename std::tuple_element<3,OutputTuple>::type>,
-<a name="l02512"></a>02512 two_phase_port<typename std::tuple_element<4,OutputTuple>::type>,
-<a name="l02513"></a>02513 two_phase_port<typename std::tuple_element<5,OutputTuple>::type>,
-<a name="l02514"></a>02514 two_phase_port<typename std::tuple_element<6,OutputTuple>::type> > port_tuple_type;
-<a name="l02515"></a>02515 <span class="keyword">public</span>:
-<a name="l02516"></a>02516 <span class="keyword">typedef</span> OutputTuple output_type;
-<a name="l02517"></a>02517 <span class="keyword">private</span>:
-<a name="l02518"></a>02518 <span class="keyword">typedef</span> join_node_base<two_phase, port_tuple_type, output_type > base_type;
-<a name="l02519"></a>02519 <span class="keyword">public</span>:
-<a name="l02520"></a>02520 unfolded_join_node(graph &g) : base_type(g) {}
-<a name="l02521"></a>02521 };
-<a name="l02522"></a>02522
-<a name="l02523"></a>02523 <span class="keyword">template</span><<span class="keyword">typename</span> OutputTuple>
-<a name="l02524"></a>02524 <span class="keyword">class </span>unfolded_join_node<8,OutputTuple,two_phase> : <span class="keyword">public</span> internal::join_node_base<two_phase,
-<a name="l02525"></a>02525 std::tuple<
-<a name="l02526"></a>02526 two_phase_port<typename std::tuple_element<0,OutputTuple>::type>,
-<a name="l02527"></a>02527 two_phase_port<typename std::tuple_element<1,OutputTuple>::type>,
-<a name="l02528"></a>02528 two_phase_port<typename std::tuple_element<2,OutputTuple>::type>,
-<a name="l02529"></a>02529 two_phase_port<typename std::tuple_element<3,OutputTuple>::type>,
-<a name="l02530"></a>02530 two_phase_port<typename std::tuple_element<4,OutputTuple>::type>,
-<a name="l02531"></a>02531 two_phase_port<typename std::tuple_element<5,OutputTuple>::type>,
-<a name="l02532"></a>02532 two_phase_port<typename std::tuple_element<6,OutputTuple>::type>,
-<a name="l02533"></a>02533 two_phase_port<typename std::tuple_element<7,OutputTuple>::type> >,
-<a name="l02534"></a>02534 OutputTuple
-<a name="l02535"></a>02535 > {
-<a name="l02536"></a>02536 <span class="keyword">private</span>:
-<a name="l02537"></a>02537 <span class="keyword">typedef</span> <span class="keyword">typename</span> std::tuple<
-<a name="l02538"></a>02538 two_phase_port<typename std::tuple_element<0,OutputTuple>::type>,
-<a name="l02539"></a>02539 two_phase_port<typename std::tuple_element<1,OutputTuple>::type>,
-<a name="l02540"></a>02540 two_phase_port<typename std::tuple_element<2,OutputTuple>::type>,
-<a name="l02541"></a>02541 two_phase_port<typename std::tuple_element<3,OutputTuple>::type>,
-<a name="l02542"></a>02542 two_phase_port<typename std::tuple_element<4,OutputTuple>::type>,
-<a name="l02543"></a>02543 two_phase_port<typename std::tuple_element<5,OutputTuple>::type>,
-<a name="l02544"></a>02544 two_phase_port<typename std::tuple_element<6,OutputTuple>::type>,
-<a name="l02545"></a>02545 two_phase_port<typename std::tuple_element<7,OutputTuple>::type> > port_tuple_type;
-<a name="l02546"></a>02546 <span class="keyword">public</span>:
-<a name="l02547"></a>02547 <span class="keyword">typedef</span> OutputTuple output_type;
-<a name="l02548"></a>02548 <span class="keyword">private</span>:
-<a name="l02549"></a>02549 <span class="keyword">typedef</span> join_node_base<two_phase, port_tuple_type, output_type > base_type;
-<a name="l02550"></a>02550 <span class="keyword">public</span>:
-<a name="l02551"></a>02551 unfolded_join_node(graph &g) : base_type(g) {}
-<a name="l02552"></a>02552 };
-<a name="l02553"></a>02553
-<a name="l02554"></a>02554 <span class="keyword">template</span><<span class="keyword">typename</span> OutputTuple>
-<a name="l02555"></a>02555 <span class="keyword">class </span>unfolded_join_node<9,OutputTuple,two_phase> : <span class="keyword">public</span> internal::join_node_base<two_phase,
-<a name="l02556"></a>02556 std::tuple<
-<a name="l02557"></a>02557 two_phase_port<typename std::tuple_element<0,OutputTuple>::type>,
-<a name="l02558"></a>02558 two_phase_port<typename std::tuple_element<1,OutputTuple>::type>,
-<a name="l02559"></a>02559 two_phase_port<typename std::tuple_element<2,OutputTuple>::type>,
-<a name="l02560"></a>02560 two_phase_port<typename std::tuple_element<3,OutputTuple>::type>,
-<a name="l02561"></a>02561 two_phase_port<typename std::tuple_element<4,OutputTuple>::type>,
-<a name="l02562"></a>02562 two_phase_port<typename std::tuple_element<5,OutputTuple>::type>,
-<a name="l02563"></a>02563 two_phase_port<typename std::tuple_element<6,OutputTuple>::type>,
-<a name="l02564"></a>02564 two_phase_port<typename std::tuple_element<7,OutputTuple>::type>,
-<a name="l02565"></a>02565 two_phase_port<typename std::tuple_element<8,OutputTuple>::type> >,
-<a name="l02566"></a>02566 OutputTuple
-<a name="l02567"></a>02567 > {
-<a name="l02568"></a>02568 <span class="keyword">private</span>:
-<a name="l02569"></a>02569 <span class="keyword">typedef</span> <span class="keyword">typename</span> std::tuple<
-<a name="l02570"></a>02570 two_phase_port<typename std::tuple_element<0,OutputTuple>::type>,
-<a name="l02571"></a>02571 two_phase_port<typename std::tuple_element<1,OutputTuple>::type>,
-<a name="l02572"></a>02572 two_phase_port<typename std::tuple_element<2,OutputTuple>::type>,
-<a name="l02573"></a>02573 two_phase_port<typename std::tuple_element<3,OutputTuple>::type>,
-<a name="l02574"></a>02574 two_phase_port<typename std::tuple_element<4,OutputTuple>::type>,
-<a name="l02575"></a>02575 two_phase_port<typename std::tuple_element<5,OutputTuple>::type>,
-<a name="l02576"></a>02576 two_phase_port<typename std::tuple_element<6,OutputTuple>::type>,
-<a name="l02577"></a>02577 two_phase_port<typename std::tuple_element<7,OutputTuple>::type>,
-<a name="l02578"></a>02578 two_phase_port<typename std::tuple_element<8,OutputTuple>::type> > port_tuple_type;
-<a name="l02579"></a>02579 <span class="keyword">public</span>:
-<a name="l02580"></a>02580 <span class="keyword">typedef</span> OutputTuple output_type;
-<a name="l02581"></a>02581 <span class="keyword">private</span>:
-<a name="l02582"></a>02582 <span class="keyword">typedef</span> join_node_base<two_phase, port_tuple_type, output_type > base_type;
-<a name="l02583"></a>02583 <span class="keyword">public</span>:
-<a name="l02584"></a>02584 unfolded_join_node(graph &g) : base_type(g) {}
-<a name="l02585"></a>02585 };
-<a name="l02586"></a>02586
-<a name="l02587"></a>02587 <span class="keyword">template</span><<span class="keyword">typename</span> OutputTuple>
-<a name="l02588"></a>02588 <span class="keyword">class </span>unfolded_join_node<10,OutputTuple,two_phase> : <span class="keyword">public</span> internal::join_node_base<two_phase,
-<a name="l02589"></a>02589 std::tuple<
-<a name="l02590"></a>02590 two_phase_port<typename std::tuple_element<0,OutputTuple>::type>,
-<a name="l02591"></a>02591 two_phase_port<typename std::tuple_element<1,OutputTuple>::type>,
-<a name="l02592"></a>02592 two_phase_port<typename std::tuple_element<2,OutputTuple>::type>,
-<a name="l02593"></a>02593 two_phase_port<typename std::tuple_element<3,OutputTuple>::type>,
-<a name="l02594"></a>02594 two_phase_port<typename std::tuple_element<4,OutputTuple>::type>,
-<a name="l02595"></a>02595 two_phase_port<typename std::tuple_element<5,OutputTuple>::type>,
-<a name="l02596"></a>02596 two_phase_port<typename std::tuple_element<6,OutputTuple>::type>,
-<a name="l02597"></a>02597 two_phase_port<typename std::tuple_element<7,OutputTuple>::type>,
-<a name="l02598"></a>02598 two_phase_port<typename std::tuple_element<8,OutputTuple>::type>,
-<a name="l02599"></a>02599 two_phase_port<typename std::tuple_element<9,OutputTuple>::type> >,
-<a name="l02600"></a>02600 OutputTuple
-<a name="l02601"></a>02601 > {
-<a name="l02602"></a>02602 <span class="keyword">private</span>:
-<a name="l02603"></a>02603 <span class="keyword">typedef</span> <span class="keyword">typename</span> std::tuple<
-<a name="l02604"></a>02604 two_phase_port<typename std::tuple_element<0,OutputTuple>::type>,
-<a name="l02605"></a>02605 two_phase_port<typename std::tuple_element<1,OutputTuple>::type>,
-<a name="l02606"></a>02606 two_phase_port<typename std::tuple_element<2,OutputTuple>::type>,
-<a name="l02607"></a>02607 two_phase_port<typename std::tuple_element<3,OutputTuple>::type>,
-<a name="l02608"></a>02608 two_phase_port<typename std::tuple_element<4,OutputTuple>::type>,
-<a name="l02609"></a>02609 two_phase_port<typename std::tuple_element<5,OutputTuple>::type>,
-<a name="l02610"></a>02610 two_phase_port<typename std::tuple_element<6,OutputTuple>::type>,
-<a name="l02611"></a>02611 two_phase_port<typename std::tuple_element<7,OutputTuple>::type>,
-<a name="l02612"></a>02612 two_phase_port<typename std::tuple_element<8,OutputTuple>::type>,
-<a name="l02613"></a>02613 two_phase_port<typename std::tuple_element<9,OutputTuple>::type> > port_tuple_type;
-<a name="l02614"></a>02614 <span class="keyword">public</span>:
-<a name="l02615"></a>02615 <span class="keyword">typedef</span> OutputTuple output_type;
-<a name="l02616"></a>02616 <span class="keyword">private</span>:
-<a name="l02617"></a>02617 <span class="keyword">typedef</span> join_node_base<two_phase, port_tuple_type, output_type > base_type;
-<a name="l02618"></a>02618 <span class="keyword">public</span>:
-<a name="l02619"></a>02619 unfolded_join_node(graph &g) : base_type(g) {}
-<a name="l02620"></a>02620 };
-<a name="l02621"></a>02621
-<a name="l02622"></a>02622 } <span class="comment">// namespace internal</span>
-<a name="l02623"></a>02623
-<a name="l02624"></a>02624 <span class="keyword">using namespace </span>internal::join_policy_namespace;
-<a name="l02625"></a>02625
-<a name="l02626"></a>02626 <span class="keyword">template</span><<span class="keyword">typename</span> OutputTuple, join_policy JP=two_phase>
-<a name="l02627"></a>02627 <span class="keyword">class </span>join_node: <span class="keyword">public</span> internal::unfolded_join_node<std::tuple_size<OutputTuple>::value, OutputTuple, JP> {
-<a name="l02628"></a>02628 <span class="keyword">private</span>:
-<a name="l02629"></a>02629 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">int</span> N = std::tuple_size<OutputTuple>::value;
-<a name="l02630"></a>02630 <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::unfolded_join_node<N, OutputTuple, JP> unfolded_type;
-<a name="l02631"></a>02631 <span class="keyword">public</span>:
-<a name="l02632"></a>02632 <span class="keyword">typedef</span> OutputTuple output_type;
-<a name="l02633"></a>02633 join_node(graph &g) : unfolded_type(g) { }
-<a name="l02634"></a>02634 };
-<a name="l02635"></a>02635
-<a name="l02636"></a>02636 <span class="comment">//</span>
-<a name="l02637"></a>02637 <span class="comment">// Making edges</span>
-<a name="l02638"></a>02638 <span class="comment">//</span>
-<a name="l02639"></a>02639
-<a name="l02641"></a>02641 <span class="keyword">template</span>< <span class="keyword">typename</span> T >
-<a name="l02642"></a><a class="code" href="a00362.html#0a5a2559e7d28a9bf8f9e5e60d745e86">02642</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="a00362.html#0a5a2559e7d28a9bf8f9e5e60d745e86">make_edge</a>( <a class="code" href="a00282.html">sender<T></a> &p, <a class="code" href="a00277.html">receiver<T></a> &s ) {
-<a name="l02643"></a>02643 p.<a class="code" href="a00282.html#be48ac70174cf8e08e2b0279cd6343d3">register_successor</a>( s );
-<a name="l02644"></a>02644 }
-<a name="l02645"></a>02645
-<a name="l02647"></a>02647 <span class="keyword">template</span>< <span class="keyword">typename</span> T, <span class="keyword">typename</span> SIterator >
-<a name="l02648"></a><a class="code" href="a00362.html#ac6def751039959ab7ab1e52c8535fd3">02648</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="a00362.html#ac6def751039959ab7ab1e52c8535fd3">make_edges</a>( <a class="code" href="a00282.html">sender<T></a> &p, SIterator s_begin, SIterator s_end ) {
-<a name="l02649"></a>02649 <span class="keywordflow">for</span> ( SIterator i = s_begin; i != s_end; ++i ) {
-<a name="l02650"></a>02650 <a class="code" href="a00362.html#0a5a2559e7d28a9bf8f9e5e60d745e86">make_edge</a>( p, **i );
-<a name="l02651"></a>02651 }
-<a name="l02652"></a>02652 }
-<a name="l02653"></a>02653
-<a name="l02655"></a>02655 <span class="keyword">template</span>< <span class="keyword">typename</span> T, <span class="keyword">typename</span> PIterator >
-<a name="l02656"></a><a class="code" href="a00362.html#9368d2f689961f790bf7aa4a8cc1135e">02656</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="a00362.html#ac6def751039959ab7ab1e52c8535fd3">make_edges</a>( PIterator p_begin, PIterator p_end, <a class="code" href="a00277.html">receiver<T></a> &s ) {
-<a name="l02657"></a>02657 <span class="keywordflow">for</span> ( PIterator i = p_begin; i != p_end; ++i ) {
-<a name="l02658"></a>02658 <a class="code" href="a00362.html#0a5a2559e7d28a9bf8f9e5e60d745e86">make_edge</a>( **i, s );
-<a name="l02659"></a>02659 }
-<a name="l02660"></a>02660 }
-<a name="l02661"></a>02661
-<a name="l02662"></a>02662 }
-<a name="l02663"></a>02663
-<a name="l02664"></a>02664 <span class="preprocessor">#endif</span>
-<a name="l02665"></a>02665 <span class="preprocessor"></span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2011 Intel Corporation. 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/a00468.html b/doc/html/a00468.html
new file mode 100644
index 0000000..2bbd57d
--- /dev/null
+++ b/doc/html/a00468.html
@@ -0,0 +1,1479 @@
+<!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="a00343.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-2011 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="a00263.html">00064</a> <span class="keyword">class </span><a class="code" href="a00263.html">graph_node</a> {
+<a name="l00065"></a>00065 <span class="keyword">public</span>:
+<a name="l00066"></a>00066 <span class="keyword">virtual</span> ~<a class="code" href="a00263.html">graph_node</a>() {}
+<a name="l00067"></a>00067 };
+<a name="l00068"></a>00068
+<a name="l00070"></a><a class="code" href="a00251.html">00070</a> <span class="keyword">class </span><a class="code" href="a00251.html">continue_msg</a> {};
+<a name="l00071"></a>00071
+<a name="l00072"></a>00072 <span class="keyword">template</span>< <span class="keyword">typename</span> T > <span class="keyword">class </span><a class="code" href="a00301.html">sender</a>;
+<a name="l00073"></a>00073 <span class="keyword">template</span>< <span class="keyword">typename</span> T > <span class="keyword">class </span><a class="code" href="a00295.html">receiver</a>;
+<a name="l00074"></a>00074 <span class="keyword">class </span><a class="code" href="a00253.html">continue_receiver</a>;
+<a name="l00075"></a>00075
+<a name="l00077"></a>00077 <span class="keyword">template</span>< <span class="keyword">typename</span> T >
+<a name="l00078"></a><a class="code" href="a00301.html">00078</a> <span class="keyword">class </span><a class="code" href="a00301.html">sender</a> {
+<a name="l00079"></a>00079 <span class="keyword">public</span>:
+<a name="l00081"></a><a class="code" href="a00301.html#127af99916cc085cd9dbc09c53299928">00081</a> <span class="keyword">typedef</span> T <a class="code" href="a00301.html#127af99916cc085cd9dbc09c53299928">output_type</a>;
+<a name="l00082"></a>00082
+<a name="l00084"></a><a class="code" href="a00301.html#d690e8a54e358968f0ee4fdf9ee73068">00084</a> <span class="keyword">typedef</span> <a class="code" href="a00295.html">receiver<T></a> <a class="code" href="a00295.html">successor_type</a>;
+<a name="l00085"></a>00085
+<a name="l00086"></a>00086 <span class="keyword">virtual</span> ~<a class="code" href="a00301.html">sender</a>() {}
+<a name="l00087"></a>00087
+<a name="l00089"></a>00089 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="a00301.html#68b8941ad77b9303cf3bcb8cf1f2d28a">register_successor</a>( <a class="code" href="a00301.html#d690e8a54e358968f0ee4fdf9ee73068">successor_type</a> &r ) = 0;
+<a name="l00090"></a>00090
+<a name="l00092"></a>00092 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="a00301.html#82f363bfb1738bb8789e167590b10ef9">remove_successor</a>( <a class="code" href="a00301.html#d690e8a54e358968f0ee4fdf9ee73068">successor_type</a> &r ) = 0;
+<a name="l00093"></a>00093
+<a name="l00095"></a><a class="code" href="a00301.html#922fb56b0aad090b90a98b7d56b76a59">00095</a> <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="a00301.html#922fb56b0aad090b90a98b7d56b76a59">try_get</a>( T & ) { <span class="keywordflow">return</span> <span class="keyword">false</span>; }
+<a name="l00096"></a>00096
+<a name="l00098"></a><a class="code" href="a00301.html#02c05b472271db1b68a48ea2618fa72f">00098</a> <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="a00301.html#02c05b472271db1b68a48ea2618fa72f">try_reserve</a>( T & ) { <span class="keywordflow">return</span> <span class="keyword">false</span>; }
+<a name="l00099"></a>00099
+<a name="l00101"></a><a class="code" href="a00301.html#27036b06d6a91e97007e14f400529199">00101</a> <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="a00301.html#27036b06d6a91e97007e14f400529199">try_release</a>( ) { <span class="keywordflow">return</span> <span class="keyword">false</span>; }
+<a name="l00102"></a>00102
+<a name="l00104"></a><a class="code" href="a00301.html#7b840f50da117a0d6848707c1857ea2e">00104</a> <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="a00301.html#7b840f50da117a0d6848707c1857ea2e">try_consume</a>( ) { <span class="keywordflow">return</span> <span class="keyword">false</span>; }
+<a name="l00105"></a>00105
+<a name="l00106"></a>00106 };
+<a name="l00107"></a>00107
+<a name="l00108"></a>00108
+<a name="l00110"></a>00110 <span class="keyword">template</span>< <span class="keyword">typename</span> T >
+<a name="l00111"></a><a class="code" href="a00295.html">00111</a> <span class="keyword">class </span><a class="code" href="a00295.html">receiver</a> {
+<a name="l00112"></a>00112 <span class="keyword">public</span>:
+<a name="l00113"></a>00113
+<a name="l00115"></a><a class="code" href="a00295.html#0d0524c99313dedea1e04464bbf2f7ef">00115</a> <span class="keyword">typedef</span> T <a class="code" href="a00251.html">input_type</a>;
+<a name="l00116"></a>00116
+<a name="l00118"></a><a class="code" href="a00295.html#7fa8cff811e7c1589b805a4bb4c7a74f">00118</a> <span class="keyword">typedef</span> <a class="code" href="a00301.html">sender<T></a> <a class="code" href="a00301.html">predecessor_type</a>;
+<a name="l00119"></a>00119
+<a name="l00121"></a><a class="code" href="a00295.html#b00699b235435f7b65b663d5063624a1">00121</a> <span class="keyword">virtual</span> <a class="code" href="a00295.html#b00699b235435f7b65b663d5063624a1">~receiver</a>() {}
+<a name="l00122"></a>00122
+<a name="l00124"></a>00124 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="a00295.html#c6d5d0cb8ebe5771be91933609fe31b8">try_put</a>( <span class="keyword">const</span> T& t ) = 0;
+<a name="l00125"></a>00125
+<a name="l00127"></a><a class="code" href="a00295.html#30e3316466efe3a713c23062b6e806f3">00127</a> <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="a00295.html#30e3316466efe3a713c23062b6e806f3">register_predecessor</a>( <a class="code" href="a00301.html">predecessor_type</a> & ) { <span class="keywordflow">return</span> <span class="keyword">false</span>; }
+<a name="l00128"></a>00128
+<a name="l00130"></a><a class="code" href="a00295.html#3bc76547b51d3c9b633e3987d22dce95">00130</a> <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="a00295.html#3bc76547b51d3c9b633e3987d22dce95">remove_predecessor</a>( <a class="code" href="a00301.html">predecessor_type</a> & ) { <span class="keywordflow">return</span> <span class="keyword">false</span>; }
+<a name="l00131"></a>00131
+<a name="l00132"></a>00132 };
+<a name="l00133"></a>00133
+<a name="l00135"></a>00135
+<a name="l00136"></a><a class="code" href="a00253.html">00136</a> <span class="keyword">class </span><a class="code" href="a00253.html">continue_receiver</a> : <span class="keyword">public</span> <a class="code" href="a00295.html">receiver</a>< continue_msg > {
+<a name="l00137"></a>00137 <span class="keyword">public</span>:
+<a name="l00138"></a>00138
+<a name="l00140"></a><a class="code" href="a00253.html#3c43c166af832d9187035985841e0a7f">00140</a> <span class="keyword">typedef</span> <a class="code" href="a00251.html">continue_msg</a> <a class="code" href="a00251.html">input_type</a>;
+<a name="l00141"></a>00141
+<a name="l00143"></a><a class="code" href="a00253.html#f9c58b3e9c46afd2518d0fd8957a5a2f">00143</a> <span class="keyword">typedef</span> <a class="code" href="a00301.html">sender< continue_msg ></a> <a class="code" href="a00301.html">predecessor_type</a>;
+<a name="l00144"></a>00144
+<a name="l00146"></a><a class="code" href="a00253.html#177db82d548a1f8471371331890b91a8">00146</a> <a class="code" href="a00253.html#177db82d548a1f8471371331890b91a8">continue_receiver</a>( <span class="keywordtype">int</span> number_of_predecessors = 0 ) {
+<a name="l00147"></a>00147 my_predecessor_count = my_initial_predecessor_count = number_of_predecessors;
+<a name="l00148"></a>00148 my_current_count = 0;
+<a name="l00149"></a>00149 }
+<a name="l00150"></a>00150
+<a name="l00152"></a><a class="code" href="a00253.html#a0b292ed7fa6556b2a735f6d1e82dc74">00152</a> <a class="code" href="a00253.html#177db82d548a1f8471371331890b91a8">continue_receiver</a>( <span class="keyword">const</span> <a class="code" href="a00253.html">continue_receiver</a>& src ) : <a class="code" href="a00295.html">receiver</a><<a class="code" href="a00251.html">continue_msg</a>>() {
+<a name="l00153"></a>00153 my_predecessor_count = my_initial_predecessor_count = src.<a class="code" href="a00253.html#8a0d4c3084fd13902c2d38f31c1dc232">my_initial_predecessor_count</a>;
+<a name="l00154"></a>00154 my_current_count = 0;
+<a name="l00155"></a>00155 }
+<a name="l00156"></a>00156
+<a name="l00158"></a><a class="code" href="a00253.html#1e14828fa079b9835ff7267df5ee45d7">00158</a> <span class="keyword">virtual</span> <a class="code" href="a00253.html#1e14828fa079b9835ff7267df5ee45d7">~continue_receiver</a>() { }
+<a name="l00159"></a>00159
+<a name="l00161"></a><a class="code" href="a00253.html#2fcfa4990a42417bbeb1f3c8b9ac8a22">00161</a> <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00253.html#2fcfa4990a42417bbeb1f3c8b9ac8a22">register_predecessor</a>( <a class="code" href="a00301.html">predecessor_type</a> & ) {
+<a name="l00162"></a>00162 <a class="code" href="a00306.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="l00171"></a><a class="code" href="a00253.html#cb691b18416d4742265aed84d496ebbd">00171</a> <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00253.html#cb691b18416d4742265aed84d496ebbd">remove_predecessor</a>( <a class="code" href="a00301.html">predecessor_type</a> & ) {
+<a name="l00172"></a>00172 <a class="code" href="a00306.html">spin_mutex::scoped_lock</a> l(my_mutex);
+<a name="l00173"></a>00173 --my_predecessor_count;
+<a name="l00174"></a>00174 <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00175"></a>00175 }
+<a name="l00176"></a>00176
+<a name="l00178"></a>00178
+<a name="l00180"></a><a class="code" href="a00253.html#3969c70fb89c0a982f142ae9eb5facae">00180</a> <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00253.html#3969c70fb89c0a982f142ae9eb5facae">try_put</a>( <span class="keyword">const</span> <a class="code" href="a00251.html">input_type</a> & ) {
+<a name="l00181"></a>00181 {
+<a name="l00182"></a>00182 <a class="code" href="a00306.html">spin_mutex::scoped_lock</a> l(my_mutex);
+<a name="l00183"></a>00183 <span class="keywordflow">if</span> ( ++my_current_count < my_predecessor_count )
+<a name="l00184"></a>00184 <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00185"></a>00185 <span class="keywordflow">else</span>
+<a name="l00186"></a>00186 my_current_count = 0;
+<a name="l00187"></a>00187 }
+<a name="l00188"></a>00188 <a class="code" href="a00253.html#40ca8b7e96c5bc3428b4d1e409725ee5">execute</a>();
+<a name="l00189"></a>00189 <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00190"></a>00190 }
+<a name="l00191"></a>00191
+<a name="l00192"></a>00192 <span class="keyword">protected</span>:
+<a name="l00193"></a>00193
+<a name="l00194"></a>00194 <a class="code" href="a00305.html">spin_mutex</a> my_mutex;
+<a name="l00195"></a>00195 <span class="keywordtype">int</span> my_predecessor_count;
+<a name="l00196"></a>00196 <span class="keywordtype">int</span> my_current_count;
+<a name="l00197"></a>00197 <span class="keywordtype">int</span> my_initial_predecessor_count;
+<a name="l00198"></a>00198
+<a name="l00200"></a>00200
+<a name="l00202"></a>00202 <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="a00253.html#40ca8b7e96c5bc3428b4d1e409725ee5">execute</a>() = 0;
+<a name="l00203"></a>00203
+<a name="l00204"></a>00204 };
+<a name="l00205"></a>00205
+<a name="l00206"></a>00206 <span class="preprocessor">#include "internal/_flow_graph_impl.h"</span>
+<a name="l00207"></a>00207 <span class="keyword">using namespace </span>internal::graph_policy_namespace;
+<a name="l00208"></a>00208
+<a name="l00210"></a>00210
+<a name="l00211"></a><a class="code" href="a00262.html">00211</a> <span class="keyword">class </span><a class="code" href="a00262.html">graph</a> : tbb::internal::no_copy {
+<a name="l00212"></a>00212
+<a name="l00213"></a>00213 <span class="keyword">template</span>< <span class="keyword">typename</span> Body >
+<a name="l00214"></a>00214 <span class="keyword">class </span>run_task : <span class="keyword">public</span> <a class="code" href="a00311.html">task</a> {
+<a name="l00215"></a>00215 <span class="keyword">public</span>:
+<a name="l00216"></a>00216 run_task( Body& body ) : my_body(body) {}
+<a name="l00217"></a>00217 <a class="code" href="a00311.html">task</a> *execute() {
+<a name="l00218"></a>00218 my_body();
+<a name="l00219"></a>00219 <span class="keywordflow">return</span> NULL;
+<a name="l00220"></a>00220 }
+<a name="l00221"></a>00221 <span class="keyword">private</span>:
+<a name="l00222"></a>00222 Body my_body;
+<a name="l00223"></a>00223 };
+<a name="l00224"></a>00224
+<a name="l00225"></a>00225 <span class="keyword">template</span>< <span class="keyword">typename</span> Receiver, <span class="keyword">typename</span> Body >
+<a name="l00226"></a>00226 <span class="keyword">class </span>run_and_put_task : <span class="keyword">public</span> <a class="code" href="a00311.html">task</a> {
+<a name="l00227"></a>00227 <span class="keyword">public</span>:
+<a name="l00228"></a>00228 run_and_put_task( Receiver &r, Body& body ) : my_receiver(r), my_body(body) {}
+<a name="l00229"></a>00229 <a class="code" href="a00311.html">task</a> *execute() {
+<a name="l00230"></a>00230 my_receiver.try_put( my_body() );
+<a name="l00231"></a>00231 <span class="keywordflow">return</span> NULL;
+<a name="l00232"></a>00232 }
+<a name="l00233"></a>00233 <span class="keyword">private</span>:
+<a name="l00234"></a>00234 Receiver &my_receiver;
+<a name="l00235"></a>00235 Body my_body;
+<a name="l00236"></a>00236 };
+<a name="l00237"></a>00237
+<a name="l00238"></a>00238 <span class="keyword">public</span>:
+<a name="l00239"></a>00239
+<a name="l00240"></a>00240
+<a name="l00242"></a><a class="code" href="a00262.html#4ab3d4b5208ece28c4c3ced647e26e12">00242</a> <a class="code" href="a00262.html#4ab3d4b5208ece28c4c3ced647e26e12">graph</a>() : my_root_task( new ( <a class="code" href="a00311.html">task</a>::allocate_root( ) ) <a class="code" href="a00254.html">empty_task</a> ) {
+<a name="l00243"></a>00243 my_root_task-><a class="code" href="a00311.html#06a4206a57e8e12a439b14d6d41cfd92">set_ref_count</a>(1);
+<a name="l00244"></a>00244 }
+<a name="l00245"></a>00245
+<a name="l00247"></a>00247
+<a name="l00249"></a><a class="code" href="a00262.html#8a7d424c0616a1c37a908ead182e2fe5">00249</a> <a class="code" href="a00262.html#8a7d424c0616a1c37a908ead182e2fe5">~graph</a>() {
+<a name="l00250"></a>00250 <a class="code" href="a00262.html#a66b0020f7514b86d030fa8aea073d37">wait_for_all</a>();
+<a name="l00251"></a>00251 my_root_task-><a class="code" href="a00311.html#06a4206a57e8e12a439b14d6d41cfd92">set_ref_count</a>(0);
+<a name="l00252"></a>00252 <a class="code" href="a00311.html#dfaacf92685e5f86393bf657b2853bf8">task::destroy</a>( *my_root_task );
+<a name="l00253"></a>00253 }
+<a name="l00254"></a>00254
+<a name="l00255"></a>00255
+<a name="l00257"></a>00257
+<a name="l00259"></a><a class="code" href="a00262.html#a993b789d1e488e0c3929135beae560e">00259</a> <span class="keywordtype">void</span> <a class="code" href="a00262.html#a993b789d1e488e0c3929135beae560e">increment_wait_count</a>() {
+<a name="l00260"></a>00260 <span class="keywordflow">if</span> (my_root_task)
+<a name="l00261"></a>00261 my_root_task-><a class="code" href="a00311.html#f5fb43c7ad0de5a4b95703cebc39e345">increment_ref_count</a>();
+<a name="l00262"></a>00262 }
+<a name="l00263"></a>00263
+<a name="l00265"></a>00265
+<a name="l00267"></a><a class="code" href="a00262.html#29b85506870f13a884a21655aec2a65d">00267</a> <span class="keywordtype">void</span> <a class="code" href="a00262.html#29b85506870f13a884a21655aec2a65d">decrement_wait_count</a>() {
+<a name="l00268"></a>00268 <span class="keywordflow">if</span> (my_root_task)
+<a name="l00269"></a>00269 my_root_task-><a class="code" href="a00311.html#ef4680f5c148020c5e7e43ddef44cd5d">decrement_ref_count</a>();
+<a name="l00270"></a>00270 }
+<a name="l00271"></a>00271
+<a name="l00273"></a>00273
+<a name="l00275"></a>00275 <span class="keyword">template</span>< <span class="keyword">typename</span> Receiver, <span class="keyword">typename</span> Body >
+<a name="l00276"></a><a class="code" href="a00262.html#50a7938df01b6148ab2c0696835f002e">00276</a> <span class="keywordtype">void</span> <a class="code" href="a00262.html#50a7938df01b6148ab2c0696835f002e">run</a>( Receiver &r, Body body ) {
+<a name="l00277"></a>00277 <a class="code" href="a00311.html#8365d063c0cc9d7bd616bca47256b93c">task::enqueue</a>( * <span class="keyword">new</span> ( task::allocate_additional_child_of( *my_root_task ) )
+<a name="l00278"></a>00278 run_and_put_task< Receiver, Body >( r, body ) );
+<a name="l00279"></a>00279 }
+<a name="l00280"></a>00280
+<a name="l00282"></a>00282
+<a name="l00284"></a>00284 <span class="keyword">template</span>< <span class="keyword">typename</span> Body >
+<a name="l00285"></a><a class="code" href="a00262.html#c1145b00e063793a7e7bf994d202c7a0">00285</a> <span class="keywordtype">void</span> <a class="code" href="a00262.html#50a7938df01b6148ab2c0696835f002e">run</a>( Body body ) {
+<a name="l00286"></a>00286 <a class="code" href="a00311.html#8365d063c0cc9d7bd616bca47256b93c">task::enqueue</a>( * <span class="keyword">new</span> ( task::allocate_additional_child_of( *my_root_task ) )
+<a name="l00287"></a>00287 run_task< Body >( body ) );
+<a name="l00288"></a>00288 }
+<a name="l00289"></a>00289
+<a name="l00291"></a>00291
+<a name="l00292"></a><a class="code" href="a00262.html#a66b0020f7514b86d030fa8aea073d37">00292</a> <span class="keywordtype">void</span> <a class="code" href="a00262.html#a66b0020f7514b86d030fa8aea073d37">wait_for_all</a>() {
+<a name="l00293"></a>00293 <span class="keywordflow">if</span> (my_root_task)
+<a name="l00294"></a>00294 my_root_task-><a class="code" href="a00311.html#53d2615ad9c38859b4c8080936600283">wait_for_all</a>();
+<a name="l00295"></a>00295 my_root_task-><a class="code" href="a00311.html#06a4206a57e8e12a439b14d6d41cfd92">set_ref_count</a>(1);
+<a name="l00296"></a>00296 }
+<a name="l00297"></a>00297
+<a name="l00299"></a><a class="code" href="a00262.html#7f4e3ae90811a5d8b597146b5b586d10">00299</a> <a class="code" href="a00311.html">task</a> * <a class="code" href="a00262.html#7f4e3ae90811a5d8b597146b5b586d10">root_task</a>() {
+<a name="l00300"></a>00300 <span class="keywordflow">return</span> my_root_task;
+<a name="l00301"></a>00301 }
+<a name="l00302"></a>00302
+<a name="l00303"></a>00303 <span class="keyword">private</span>:
+<a name="l00304"></a>00304
+<a name="l00305"></a>00305 <a class="code" href="a00311.html">task</a> *my_root_task;
+<a name="l00306"></a>00306
+<a name="l00307"></a>00307 };
+<a name="l00308"></a>00308
+<a name="l00309"></a>00309 <span class="preprocessor">#include "internal/_flow_graph_node_impl.h"</span>
+<a name="l00310"></a>00310
+<a name="l00312"></a>00312 <span class="keyword">template</span> < <span class="keyword">typename</span> Output >
+<a name="l00313"></a><a class="code" href="a00304.html">00313</a> <span class="keyword">class </span><a class="code" href="a00304.html">source_node</a> : <span class="keyword">public</span> <a class="code" href="a00263.html">graph_node</a>, <span class="keyword">public</span> <a class="code" href="a00301.html">sender</a>< Output > {
+<a name="l00314"></a>00314 <span class="keyword">public</span>:
+<a name="l00315"></a>00315
+<a name="l00317"></a><a class="code" href="a00304.html#407533487cc3f6032c1072cba19c609c">00317</a> <span class="keyword">typedef</span> Output <a class="code" href="a00304.html#407533487cc3f6032c1072cba19c609c">output_type</a>;
+<a name="l00318"></a>00318
+<a name="l00320"></a><a class="code" href="a00304.html#dd7b8fe78f0bec9d6b70cbf1018a69fe">00320</a> <span class="keyword">typedef</span> <a class="code" href="a00295.html">receiver< Output ></a> <a class="code" href="a00295.html">successor_type</a>;
+<a name="l00321"></a>00321
+<a name="l00323"></a>00323 <span class="keyword">template</span>< <span class="keyword">typename</span> Body >
+<a name="l00324"></a><a class="code" href="a00304.html#503c3b395c629296bf5cccd96d6388c1">00324</a> <a class="code" href="a00304.html#503c3b395c629296bf5cccd96d6388c1">source_node</a>( <a class="code" href="a00262.html">graph</a> &g, Body body, <span class="keywordtype">bool</span> is_active = <span class="keyword">true</span> )
+<a name="l00325"></a>00325 : my_root_task(g.root_task()), my_active(is_active), init_my_active(is_active),
+<a name="l00326"></a>00326 my_body( new internal::source_body_leaf< <a class="code" href="a00304.html#407533487cc3f6032c1072cba19c609c">output_type</a>, Body>(body) ),
+<a name="l00327"></a>00327 my_reserved(false), my_has_cached_item(false)
+<a name="l00328"></a>00328 {
+<a name="l00329"></a>00329 my_successors.set_owner(<span class="keyword">this</span>);
+<a name="l00330"></a>00330 }
+<a name="l00331"></a>00331
+<a name="l00333"></a><a class="code" href="a00304.html#adaac111fbcace95804219a5f2929304">00333</a> <a class="code" href="a00304.html#503c3b395c629296bf5cccd96d6388c1">source_node</a>( <span class="keyword">const</span> <a class="code" href="a00304.html">source_node</a>& src ) :
+<a name="l00334"></a>00334 <a class="code" href="a00263.html">graph_node</a>(), <a class="code" href="a00301.html">sender</a><Output>(),
+<a name="l00335"></a>00335 my_root_task( src.my_root_task), my_active(src.init_my_active),
+<a name="l00336"></a>00336 init_my_active(src.init_my_active), my_body( src.my_body->clone() ),
+<a name="l00337"></a>00337 my_reserved(false), my_has_cached_item(false)
+<a name="l00338"></a>00338 {
+<a name="l00339"></a>00339 my_successors.set_owner(<span class="keyword">this</span>);
+<a name="l00340"></a>00340 }
+<a name="l00341"></a>00341
+<a name="l00343"></a><a class="code" href="a00304.html#61700b0865fc17188b0abe26bbde65b6">00343</a> <a class="code" href="a00304.html#61700b0865fc17188b0abe26bbde65b6">~source_node</a>() { <span class="keyword">delete</span> my_body; }
+<a name="l00344"></a>00344
+<a name="l00346"></a><a class="code" href="a00304.html#22960d499df9f1569a9d8a544e35afe3">00346</a> <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00304.html#22960d499df9f1569a9d8a544e35afe3">register_successor</a>( <a class="code" href="a00295.html">receiver<output_type></a> &r ) {
+<a name="l00347"></a>00347 <a class="code" href="a00306.html">spin_mutex::scoped_lock</a> lock(my_mutex);
+<a name="l00348"></a>00348 my_successors.register_successor(r);
+<a name="l00349"></a>00349 <span class="keywordflow">if</span> ( my_active )
+<a name="l00350"></a>00350 spawn_put();
+<a name="l00351"></a>00351 <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00352"></a>00352 }
+<a name="l00353"></a>00353
+<a name="l00355"></a><a class="code" href="a00304.html#222484bf295f39df36415a29e508e5c9">00355</a> <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00304.html#222484bf295f39df36415a29e508e5c9">remove_successor</a>( <a class="code" href="a00295.html">receiver<output_type></a> &r ) {
+<a name="l00356"></a>00356 <a class="code" href="a00306.html">spin_mutex::scoped_lock</a> lock(my_mutex);
+<a name="l00357"></a>00357 my_successors.remove_successor(r);
+<a name="l00358"></a>00358 <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00359"></a>00359 }
+<a name="l00360"></a>00360
+<a name="l00362"></a><a class="code" href="a00304.html#41073ad4d3510ed5a8b6bda9c0f58636">00362</a> <span class="comment">/*override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00304.html#41073ad4d3510ed5a8b6bda9c0f58636">try_get</a>( <a class="code" href="a00304.html#407533487cc3f6032c1072cba19c609c">output_type</a> &v ) {
+<a name="l00363"></a>00363 <a class="code" href="a00306.html">spin_mutex::scoped_lock</a> lock(my_mutex);
+<a name="l00364"></a>00364 <span class="keywordflow">if</span> ( my_reserved )
+<a name="l00365"></a>00365 <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00366"></a>00366
+<a name="l00367"></a>00367 <span class="keywordflow">if</span> ( my_has_cached_item ) {
+<a name="l00368"></a>00368 v = my_cached_item;
+<a name="l00369"></a>00369 my_has_cached_item = <span class="keyword">false</span>;
+<a name="l00370"></a>00370 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( (*my_body)(v) == <span class="keyword">false</span> ) {
+<a name="l00371"></a>00371 <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00372"></a>00372 }
+<a name="l00373"></a>00373 <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00374"></a>00374 }
+<a name="l00375"></a>00375
+<a name="l00377"></a><a class="code" href="a00304.html#ad459713ff3c1c9ad0f4826daa141f65">00377</a> <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00304.html#ad459713ff3c1c9ad0f4826daa141f65">try_reserve</a>( <a class="code" href="a00304.html#407533487cc3f6032c1072cba19c609c">output_type</a> &v ) {
+<a name="l00378"></a>00378 <a class="code" href="a00306.html">spin_mutex::scoped_lock</a> lock(my_mutex);
+<a name="l00379"></a>00379 <span class="keywordflow">if</span> ( my_reserved ) {
+<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
+<a name="l00383"></a>00383 <span class="keywordflow">if</span> ( !my_has_cached_item && (*my_body)(my_cached_item) )
+<a name="l00384"></a>00384 my_has_cached_item = <span class="keyword">true</span>;
+<a name="l00385"></a>00385
+<a name="l00386"></a>00386 <span class="keywordflow">if</span> ( my_has_cached_item ) {
+<a name="l00387"></a>00387 v = my_cached_item;
+<a name="l00388"></a>00388 my_reserved = <span class="keyword">true</span>;
+<a name="l00389"></a>00389 <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00390"></a>00390 } <span class="keywordflow">else</span> {
+<a name="l00391"></a>00391 <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00392"></a>00392 }
+<a name="l00393"></a>00393 }
+<a name="l00394"></a>00394
+<a name="l00396"></a>00396
+<a name="l00397"></a><a class="code" href="a00304.html#494678baf9096835268736b800824460">00397</a> <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00304.html#494678baf9096835268736b800824460">try_release</a>( ) {
+<a name="l00398"></a>00398 <a class="code" href="a00306.html">spin_mutex::scoped_lock</a> lock(my_mutex);
+<a name="l00399"></a>00399 __TBB_ASSERT( my_reserved && my_has_cached_item, <span class="stringliteral">"releasing non-existent reservation"</span> );
+<a name="l00400"></a>00400 my_reserved = <span class="keyword">false</span>;
+<a name="l00401"></a>00401 spawn_put();
+<a name="l00402"></a>00402 <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00403"></a>00403 }
+<a name="l00404"></a>00404
+<a name="l00406"></a><a class="code" href="a00304.html#2c7fcc29e2894b29138be3c1edce9bc9">00406</a> <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00304.html#2c7fcc29e2894b29138be3c1edce9bc9">try_consume</a>( ) {
+<a name="l00407"></a>00407 <a class="code" href="a00306.html">spin_mutex::scoped_lock</a> lock(my_mutex);
+<a name="l00408"></a>00408 __TBB_ASSERT( my_reserved && my_has_cached_item, <span class="stringliteral">"consuming non-existent reservation"</span> );
+<a name="l00409"></a>00409 my_reserved = <span class="keyword">false</span>;
+<a name="l00410"></a>00410 my_has_cached_item = <span class="keyword">false</span>;
+<a name="l00411"></a>00411 <span class="keywordflow">if</span> ( !my_successors.empty() ) {
+<a name="l00412"></a>00412 spawn_put();
+<a name="l00413"></a>00413 }
+<a name="l00414"></a>00414 <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00415"></a>00415 }
+<a name="l00416"></a>00416
+<a name="l00418"></a><a class="code" href="a00304.html#4b647e4a93d08ccdd8d323279e4eaaa6">00418</a> <span class="keywordtype">void</span> <a class="code" href="a00304.html#4b647e4a93d08ccdd8d323279e4eaaa6">activate</a>() {
+<a name="l00419"></a>00419 <a class="code" href="a00306.html">spin_mutex::scoped_lock</a> lock(my_mutex);
+<a name="l00420"></a>00420 my_active = <span class="keyword">true</span>;
+<a name="l00421"></a>00421 <span class="keywordflow">if</span> ( !my_successors.empty() )
+<a name="l00422"></a>00422 spawn_put();
+<a name="l00423"></a>00423 }
+<a name="l00424"></a>00424
+<a name="l00425"></a>00425 <span class="keyword">private</span>:
+<a name="l00426"></a>00426
+<a name="l00427"></a>00427 <a class="code" href="a00311.html">task</a> *my_root_task;
+<a name="l00428"></a>00428 <a class="code" href="a00305.html">spin_mutex</a> my_mutex;
+<a name="l00429"></a>00429 <span class="keywordtype">bool</span> my_active;
+<a name="l00430"></a>00430 <span class="keywordtype">bool</span> init_my_active;
+<a name="l00431"></a>00431 internal::source_body<output_type> *my_body;
+<a name="l00432"></a>00432 internal::broadcast_cache< output_type > my_successors;
+<a name="l00433"></a>00433 <span class="keywordtype">bool</span> my_reserved;
+<a name="l00434"></a>00434 <span class="keywordtype">bool</span> my_has_cached_item;
+<a name="l00435"></a>00435 <a class="code" href="a00304.html#407533487cc3f6032c1072cba19c609c">output_type</a> my_cached_item;
+<a name="l00436"></a>00436
+<a name="l00437"></a>00437 <span class="keyword">friend</span> <span class="keyword">class </span>internal::source_task< source_node< output_type > >;
+<a name="l00438"></a>00438
+<a name="l00440"></a>00440 <span class="comment">/* override */</span> <span class="keywordtype">void</span> apply_body( ) {
+<a name="l00441"></a>00441 output_type v;
+<a name="l00442"></a>00442 <span class="keywordflow">if</span> ( <a class="code" href="a00304.html#ad459713ff3c1c9ad0f4826daa141f65">try_reserve</a>(v) == <span class="keyword">false</span> )
+<a name="l00443"></a>00443 <span class="keywordflow">return</span>;
+<a name="l00444"></a>00444
+<a name="l00445"></a>00445 <span class="keywordflow">if</span> ( my_successors.try_put( v ) )
+<a name="l00446"></a>00446 <a class="code" href="a00304.html#2c7fcc29e2894b29138be3c1edce9bc9">try_consume</a>();
+<a name="l00447"></a>00447 <span class="keywordflow">else</span>
+<a name="l00448"></a>00448 <a class="code" href="a00304.html#494678baf9096835268736b800824460">try_release</a>();
+<a name="l00449"></a>00449 }
+<a name="l00450"></a>00450
+<a name="l00452"></a>00452 <span class="comment">/* override */</span> <span class="keywordtype">void</span> spawn_put( ) {
+<a name="l00453"></a>00453 <a class="code" href="a00311.html#8365d063c0cc9d7bd616bca47256b93c">task::enqueue</a>( * <span class="keyword">new</span> ( task::allocate_additional_child_of( *my_root_task ) )
+<a name="l00454"></a>00454 internal::source_task< <a class="code" href="a00304.html">source_node< output_type ></a> >( *<span class="keyword">this</span> ) );
+<a name="l00455"></a>00455 }
+<a name="l00456"></a>00456
+<a name="l00457"></a>00457 };
+<a name="l00458"></a>00458
+<a name="l00460"></a>00460 <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="l00461"></a><a class="code" href="a00260.html">00461</a> <span class="keyword">class </span><a class="code" href="a00260.html">function_node</a> : <span class="keyword">public</span> <a class="code" href="a00263.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="l00462"></a>00462 <span class="keyword">public</span>:
+<a name="l00463"></a>00463
+<a name="l00464"></a>00464 <span class="keyword">typedef</span> Input input_type;
+<a name="l00465"></a>00465 <span class="keyword">typedef</span> Output output_type;
+<a name="l00466"></a>00466 <span class="keyword">typedef</span> <a class="code" href="a00301.html">sender< input_type ></a> <a class="code" href="a00301.html">predecessor_type</a>;
+<a name="l00467"></a>00467 <span class="keyword">typedef</span> <a class="code" href="a00295.html">receiver< output_type ></a> <a class="code" href="a00295.html">successor_type</a>;
+<a name="l00468"></a>00468 <span class="keyword">typedef</span> internal::function_output<output_type> fOutput_type;
+<a name="l00469"></a>00469
+<a name="l00471"></a>00471 <span class="keyword">template</span>< <span class="keyword">typename</span> Body >
+<a name="l00472"></a><a class="code" href="a00260.html#5c215b40e3daf73d1c6802ecb5aded6c">00472</a> <a class="code" href="a00260.html#5c215b40e3daf73d1c6802ecb5aded6c">function_node</a>( <a class="code" href="a00262.html">graph</a> &g, size_t concurrency, Body body )
+<a name="l00473"></a>00473 : internal::function_input<input_type,output_type,Allocator>( g, concurrency, body ) {
+<a name="l00474"></a>00474 }
+<a name="l00475"></a>00475
+<a name="l00477"></a><a class="code" href="a00260.html#d5132323fd2ac6a00ea0c78beda78723">00477</a> <a class="code" href="a00260.html#5c215b40e3daf73d1c6802ecb5aded6c">function_node</a>( <span class="keyword">const</span> <a class="code" href="a00260.html">function_node</a>& src ) :
+<a name="l00478"></a>00478 <a class="code" href="a00263.html">graph_node</a>(), internal::function_input<input_type,output_type,Allocator>( src ),
+<a name="l00479"></a>00479 fOutput_type() {}
+<a name="l00480"></a>00480
+<a name="l00481"></a>00481 <span class="keyword">protected</span>:
+<a name="l00482"></a>00482
+<a name="l00483"></a>00483 <span class="comment">/* override */</span> internal::broadcast_cache<output_type> &successors () { <span class="keywordflow">return</span> fOutput_type::my_successors; }
+<a name="l00484"></a>00484
+<a name="l00485"></a>00485 };
+<a name="l00486"></a>00486
+<a name="l00488"></a>00488 <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="l00489"></a><a class="code" href="a00261.html">00489</a> <span class="keyword">class </span><a class="code" href="a00260.html">function_node</a><Input,Output,queueing,Allocator> : <span class="keyword">public</span> <a class="code" href="a00263.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="l00490"></a>00490 <span class="keyword">public</span>:
+<a name="l00491"></a>00491
+<a name="l00492"></a>00492 <span class="keyword">typedef</span> Input input_type;
+<a name="l00493"></a>00493 <span class="keyword">typedef</span> Output output_type;
+<a name="l00494"></a>00494 <span class="keyword">typedef</span> <a class="code" href="a00301.html">sender< input_type ></a> <a class="code" href="a00301.html">predecessor_type</a>;
+<a name="l00495"></a>00495 <span class="keyword">typedef</span> <a class="code" href="a00295.html">receiver< output_type ></a> <a class="code" href="a00295.html">successor_type</a>;
+<a name="l00496"></a>00496 <span class="keyword">typedef</span> internal::function_input<input_type,output_type,Allocator> fInput_type;
+<a name="l00497"></a>00497 <span class="keyword">typedef</span> internal::function_input_queue<input_type, Allocator> queue_type;
+<a name="l00498"></a>00498 <span class="keyword">typedef</span> internal::function_output<output_type> fOutput_type;
+<a name="l00499"></a>00499
+<a name="l00501"></a>00501 <span class="keyword">template</span>< <span class="keyword">typename</span> Body >
+<a name="l00502"></a><a class="code" href="a00261.html#5b9019c1e6e9b2c41c986a384bd179db">00502</a> <a class="code" href="a00260.html#5c215b40e3daf73d1c6802ecb5aded6c">function_node</a>( <a class="code" href="a00262.html">graph</a> &g, size_t concurrency, Body body ) : fInput_type( g, concurrency, body, new queue_type() ) {
+<a name="l00503"></a>00503 }
+<a name="l00504"></a>00504
+<a name="l00506"></a><a class="code" href="a00261.html#01055081ed477714503820035db3a965">00506</a> <a class="code" href="a00260.html#5c215b40e3daf73d1c6802ecb5aded6c">function_node</a>( <span class="keyword">const</span> <a class="code" href="a00260.html">function_node</a>& src ) :
+<a name="l00507"></a>00507 <a class="code" href="a00263.html">graph_node</a>(), fInput_type( src, new queue_type() ) , fOutput_type() { }
+<a name="l00508"></a>00508
+<a name="l00509"></a>00509 <span class="keyword">protected</span>:
+<a name="l00510"></a>00510
+<a name="l00511"></a>00511 <span class="comment">/* override */</span> internal::broadcast_cache<output_type> &successors () { <span class="keywordflow">return</span> fOutput_type::my_successors; }
+<a name="l00512"></a>00512
+<a name="l00513"></a>00513 };
+<a name="l00514"></a>00514
+<a name="l00515"></a>00515 <span class="preprocessor">#include "tbb/internal/_flow_graph_types_impl.h"</span>
+<a name="l00516"></a>00516
+<a name="l00517"></a>00517 <span class="preprocessor">#if TBB_PREVIEW_GRAPH_NODES</span>
+<a name="l00519"></a>00519 <span class="preprocessor">// Output is a tuple of output types.</span>
+<a name="l00520"></a>00520 <span class="preprocessor"></span><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="l00521"></a><a class="code" href="a00274.html">00521</a> <span class="keyword">class </span><a class="code" href="a00274.html">multioutput_function_node</a> :
+<a name="l00522"></a>00522 <span class="keyword">public</span> <a class="code" href="a00263.html">graph_node</a>,
+<a name="l00523"></a>00523 <span class="keyword">public</span> internal::multioutput_function_input
+<a name="l00524"></a>00524 <
+<a name="l00525"></a>00525 Input,
+<a name="l00526"></a>00526 typename internal::wrap_tuple_elements<
+<a name="l00527"></a>00527 std::tuple_size<Output>::value, <span class="comment">// #elements in tuple</span>
+<a name="l00528"></a>00528 internal::function_output, <span class="comment">// wrap this around each element</span>
+<a name="l00529"></a>00529 Output <span class="comment">// the tuple providing the types</span>
+<a name="l00530"></a>00530 >::type,
+<a name="l00531"></a>00531 Allocator
+<a name="l00532"></a>00532 > {
+<a name="l00533"></a>00533 <span class="keyword">private</span>:
+<a name="l00534"></a>00534 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">int</span> N = std::tuple_size<Output>::value;
+<a name="l00535"></a>00535 <span class="keyword">public</span>:
+<a name="l00536"></a>00536 <span class="keyword">typedef</span> Input input_type;
+<a name="l00537"></a>00537 <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::wrap_tuple_elements<N,internal::function_output, Output>::type ports_type;
+<a name="l00538"></a>00538 <span class="keyword">private</span>:
+<a name="l00539"></a>00539 <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::multioutput_function_input<input_type, ports_type, Allocator> base_type;
+<a name="l00540"></a>00540 <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::function_input_queue<input_type,Allocator> queue_type;
+<a name="l00541"></a>00541 <span class="keyword">public</span>:
+<a name="l00542"></a>00542 <span class="keyword">template</span><<span class="keyword">typename</span> Body>
+<a name="l00543"></a>00543 <a class="code" href="a00274.html">multioutput_function_node</a>( <a class="code" href="a00262.html">graph</a> &g, size_t concurrency, Body body ) : base_type(g,concurrency, body) {}
+<a name="l00544"></a>00544 <a class="code" href="a00274.html">multioutput_function_node</a>( <span class="keyword">const</span> <a class="code" href="a00274.html">multioutput_function_node</a> &other) :
+<a name="l00545"></a>00545 <a class="code" href="a00263.html">graph_node</a>(), base_type(other) {}
+<a name="l00546"></a>00546 <span class="comment">// all the guts are in multioutput_function_input...</span>
+<a name="l00547"></a>00547
+<a name="l00548"></a>00548 }; <span class="comment">// multioutput_function_node</span>
+<a name="l00549"></a>00549
+<a name="l00550"></a>00550 <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="l00551"></a>00551 <span class="keyword">class </span><a class="code" href="a00274.html">multioutput_function_node</a><Input,Output,queueing,Allocator> : <span class="keyword">public</span> <a class="code" href="a00263.html">graph_node</a>, <span class="keyword">public</span> internal::multioutput_function_input<Input,
+<a name="l00552"></a>00552 typename internal::wrap_tuple_elements<std::tuple_size<Output>::value, internal::function_output, Output>::type, Allocator> {
+<a name="l00553"></a>00553 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">int</span> N = std::tuple_size<Output>::value;
+<a name="l00554"></a>00554 <span class="keyword">public</span>:
+<a name="l00555"></a>00555 <span class="keyword">typedef</span> Input input_type;
+<a name="l00556"></a>00556 <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::wrap_tuple_elements<N, internal::function_output, Output>::type ports_type;
+<a name="l00557"></a>00557 <span class="keyword">private</span>:
+<a name="l00558"></a>00558 <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::multioutput_function_input<input_type, ports_type, Allocator> base_type;
+<a name="l00559"></a>00559 <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::function_input_queue<input_type,Allocator> queue_type;
+<a name="l00560"></a>00560 <span class="keyword">public</span>:
+<a name="l00561"></a>00561
+<a name="l00562"></a>00562 <span class="keyword">template</span><<span class="keyword">typename</span> Body>
+<a name="l00563"></a>00563 <a class="code" href="a00274.html">multioutput_function_node</a>( <a class="code" href="a00262.html">graph</a> &g, size_t concurrency, Body body) : base_type(g,concurrency, body, new queue_type()) {}
+<a name="l00564"></a>00564 <a class="code" href="a00274.html">multioutput_function_node</a>( <span class="keyword">const</span> <a class="code" href="a00274.html">multioutput_function_node</a> &other) :
+<a name="l00565"></a>00565 <a class="code" href="a00263.html">graph_node</a>(), base_type(other, new queue_type()) {}
+<a name="l00566"></a>00566
+<a name="l00567"></a>00567 }; <span class="comment">// multioutput_function_node</span>
+<a name="l00568"></a>00568
+<a name="l00570"></a>00570 <span class="comment">// successors. The node has unlimited concurrency, so though it is marked as</span>
+<a name="l00571"></a>00571 <span class="comment">// "rejecting" it does not reject inputs.</span>
+<a name="l00572"></a>00572 <span class="keyword">template</span><<span class="keyword">typename</span> TupleType, <span class="keyword">typename</span> Allocator=cache_aligned_allocator<TupleType> >
+<a name="l00573"></a><a class="code" href="a00310.html">00573</a> <span class="keyword">class </span><a class="code" href="a00310.html">split_node</a> : <span class="keyword">public</span> <a class="code" href="a00274.html">multioutput_function_node</a><TupleType, TupleType, rejecting, Allocator> {
+<a name="l00574"></a>00574 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">int</span> N = std::tuple_size<TupleType>::value;
+<a name="l00575"></a>00575 <span class="keyword">typedef</span> <a class="code" href="a00274.html">multioutput_function_node<TupleType,TupleType,rejecting,Allocator></a> <a class="code" href="a00274.html">base_type</a>;
+<a name="l00576"></a>00576 <span class="keyword">public</span>:
+<a name="l00577"></a>00577 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::ports_type ports_type;
+<a name="l00578"></a>00578 <span class="keyword">private</span>:
+<a name="l00579"></a>00579
+<a name="l00580"></a>00580 <span class="keyword">struct </span>splitting_body {
+<a name="l00581"></a>00581 <span class="keywordtype">void</span> operator()(<span class="keyword">const</span> TupleType& t, ports_type &p) {
+<a name="l00582"></a>00582 internal::emit_element<N>::emit_this(t, p);
+<a name="l00583"></a>00583 }
+<a name="l00584"></a>00584 };
+<a name="l00585"></a>00585 <span class="keyword">public</span>:
+<a name="l00586"></a>00586 <span class="keyword">typedef</span> TupleType input_type;
+<a name="l00587"></a>00587 <span class="keyword">typedef</span> Allocator allocator_type;
+<a name="l00588"></a>00588 <a class="code" href="a00310.html">split_node</a>(<a class="code" href="a00262.html">graph</a> &g) : <a class="code" href="a00274.html">base_type</a>(g, unlimited, splitting_body()) { }
+<a name="l00589"></a>00589 <a class="code" href="a00310.html">split_node</a>( <span class="keyword">const</span> <a class="code" href="a00310.html">split_node</a> & other) : <a class="code" href="a00274.html">base_type</a>(other) { }
+<a name="l00590"></a>00590 };
+<a name="l00591"></a>00591 <span class="preprocessor">#endif // TBB_PREVIEW_GRAPH_NODES</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> Output>
+<a name="l00595"></a><a class="code" href="a00252.html">00595</a> <span class="keyword">class </span><a class="code" href="a00252.html">continue_node</a> : <span class="keyword">public</span> <a class="code" href="a00263.html">graph_node</a>, <span class="keyword">public</span> internal::continue_input<Output>, <span class="keyword">public</span> internal::function_output<Output> {
+<a name="l00596"></a>00596 <span class="keyword">public</span>:
+<a name="l00597"></a>00597
+<a name="l00598"></a>00598 <span class="keyword">typedef</span> <a class="code" href="a00251.html">continue_msg</a> <a class="code" href="a00251.html">input_type</a>;
+<a name="l00599"></a>00599 <span class="keyword">typedef</span> Output output_type;
+<a name="l00600"></a>00600 <span class="keyword">typedef</span> <a class="code" href="a00301.html">sender< input_type ></a> <a class="code" href="a00301.html">predecessor_type</a>;
+<a name="l00601"></a>00601 <span class="keyword">typedef</span> <a class="code" href="a00295.html">receiver< output_type ></a> <a class="code" href="a00295.html">successor_type</a>;
+<a name="l00602"></a>00602 <span class="keyword">typedef</span> internal::function_output<output_type> fOutput_type;
+<a name="l00603"></a>00603
+<a name="l00605"></a>00605 <span class="keyword">template</span> <<span class="keyword">typename</span> Body >
+<a name="l00606"></a><a class="code" href="a00252.html#2f200db877d2f80c08d09422e8bffd5a">00606</a> <a class="code" href="a00252.html#2f200db877d2f80c08d09422e8bffd5a">continue_node</a>( <a class="code" href="a00262.html">graph</a> &g, Body body )
+<a name="l00607"></a>00607 : internal::continue_input<output_type>( g, body ) {
+<a name="l00608"></a>00608 }
+<a name="l00609"></a>00609
+<a name="l00611"></a>00611 <span class="keyword">template</span> <<span class="keyword">typename</span> Body >
+<a name="l00612"></a><a class="code" href="a00252.html#7817aebf22dd125ca04df53ac488d163">00612</a> <a class="code" href="a00252.html#2f200db877d2f80c08d09422e8bffd5a">continue_node</a>( <a class="code" href="a00262.html">graph</a> &g, <span class="keywordtype">int</span> number_of_predecessors, Body body )
+<a name="l00613"></a>00613 : internal::continue_input<output_type>( g, number_of_predecessors, body )
+<a name="l00614"></a>00614 {
+<a name="l00615"></a>00615 }
+<a name="l00616"></a>00616
+<a name="l00618"></a><a class="code" href="a00252.html#869562787fcb5c57a90aea120f26d492">00618</a> <a class="code" href="a00252.html#2f200db877d2f80c08d09422e8bffd5a">continue_node</a>( <span class="keyword">const</span> <a class="code" href="a00252.html">continue_node</a>& src ) :
+<a name="l00619"></a>00619 <a class="code" href="a00263.html">graph_node</a>(), internal::continue_input<output_type>(src),
+<a name="l00620"></a>00620 internal::function_output<Output>() { }
+<a name="l00621"></a>00621
+<a name="l00622"></a>00622 <span class="keyword">protected</span>:
+<a name="l00623"></a>00623
+<a name="l00624"></a>00624 <span class="comment">/* override */</span> internal::broadcast_cache<output_type> &successors () { <span class="keywordflow">return</span> fOutput_type::my_successors; }
+<a name="l00625"></a>00625
+<a name="l00626"></a>00626 };
+<a name="l00627"></a>00627
+<a name="l00628"></a>00628 <span class="keyword">template</span>< <span class="keyword">typename</span> T >
+<a name="l00629"></a>00629 <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="l00630"></a>00630 <span class="keyword">public</span>:
+<a name="l00631"></a>00631
+<a name="l00632"></a>00632 <span class="keyword">typedef</span> T input_type;
+<a name="l00633"></a>00633 <span class="keyword">typedef</span> T output_type;
+<a name="l00634"></a>00634 <span class="keyword">typedef</span> sender< input_type > predecessor_type;
+<a name="l00635"></a>00635 <span class="keyword">typedef</span> receiver< output_type > successor_type;
+<a name="l00636"></a>00636
+<a name="l00637"></a>00637 overwrite_node() : my_buffer_is_valid(false) {
+<a name="l00638"></a>00638 my_successors.set_owner( <span class="keyword">this</span> );
+<a name="l00639"></a>00639 }
+<a name="l00640"></a>00640
+<a name="l00641"></a>00641 <span class="comment">// Copy constructor; doesn't take anything from src; default won't work</span>
+<a name="l00642"></a>00642 overwrite_node( <span class="keyword">const</span> overwrite_node& ) :
+<a name="l00643"></a>00643 graph_node(), receiver<T>(), sender<T>(), my_buffer_is_valid(false) {
+<a name="l00644"></a>00644 my_successors.set_owner( <span class="keyword">this</span> );
+<a name="l00645"></a>00645 }
+<a name="l00646"></a>00646
+<a name="l00647"></a>00647 ~overwrite_node() {}
+<a name="l00648"></a>00648
+<a name="l00649"></a>00649 <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00301.html#68b8941ad77b9303cf3bcb8cf1f2d28a">register_successor</a>( successor_type &s ) {
+<a name="l00650"></a>00650 spin_mutex::scoped_lock l( my_mutex );
+<a name="l00651"></a>00651 <span class="keywordflow">if</span> ( my_buffer_is_valid ) {
+<a name="l00652"></a>00652 <span class="comment">// We have a valid value that must be forwarded immediately.</span>
+<a name="l00653"></a>00653 <span class="keywordflow">if</span> ( s.try_put( my_buffer ) || !s.register_predecessor( *<span class="keyword">this</span> ) ) {
+<a name="l00654"></a>00654 <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="l00655"></a>00655 my_successors.register_successor( s );
+<a name="l00656"></a>00656 <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00657"></a>00657 } <span class="keywordflow">else</span> {
+<a name="l00658"></a>00658 <span class="comment">// We don't add the successor: it rejected our put and we became its predecessor instead</span>
+<a name="l00659"></a>00659 <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00660"></a>00660 }
+<a name="l00661"></a>00661 } <span class="keywordflow">else</span> {
+<a name="l00662"></a>00662 <span class="comment">// No valid value yet, just add as successor</span>
+<a name="l00663"></a>00663 my_successors.register_successor( s );
+<a name="l00664"></a>00664 <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00665"></a>00665 }
+<a name="l00666"></a>00666 }
+<a name="l00667"></a>00667
+<a name="l00668"></a>00668 <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00301.html#82f363bfb1738bb8789e167590b10ef9">remove_successor</a>( successor_type &s ) {
+<a name="l00669"></a>00669 spin_mutex::scoped_lock l( my_mutex );
+<a name="l00670"></a>00670 my_successors.remove_successor(s);
+<a name="l00671"></a>00671 <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00672"></a>00672 }
+<a name="l00673"></a>00673
+<a name="l00674"></a>00674 <span class="comment">/* override */</span> <span class="keywordtype">bool</span> try_put( <span class="keyword">const</span> T &v ) {
+<a name="l00675"></a>00675 spin_mutex::scoped_lock l( my_mutex );
+<a name="l00676"></a>00676 my_buffer = v;
+<a name="l00677"></a>00677 my_buffer_is_valid = <span class="keyword">true</span>;
+<a name="l00678"></a>00678 my_successors.try_put(v);
+<a name="l00679"></a>00679 <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00680"></a>00680 }
+<a name="l00681"></a>00681
+<a name="l00682"></a>00682 <span class="comment">/* override */</span> <span class="keywordtype">bool</span> try_get( T &v ) {
+<a name="l00683"></a>00683 spin_mutex::scoped_lock l( my_mutex );
+<a name="l00684"></a>00684 <span class="keywordflow">if</span> ( my_buffer_is_valid ) {
+<a name="l00685"></a>00685 v = my_buffer;
+<a name="l00686"></a>00686 <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00687"></a>00687 } <span class="keywordflow">else</span> {
+<a name="l00688"></a>00688 <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00689"></a>00689 }
+<a name="l00690"></a>00690 }
+<a name="l00691"></a>00691
+<a name="l00692"></a>00692 <span class="keywordtype">bool</span> is_valid() {
+<a name="l00693"></a>00693 spin_mutex::scoped_lock l( my_mutex );
+<a name="l00694"></a>00694 <span class="keywordflow">return</span> my_buffer_is_valid;
+<a name="l00695"></a>00695 }
+<a name="l00696"></a>00696
+<a name="l00697"></a>00697 <span class="keywordtype">void</span> clear() {
+<a name="l00698"></a>00698 spin_mutex::scoped_lock l( my_mutex );
+<a name="l00699"></a>00699 my_buffer_is_valid = <span class="keyword">false</span>;
+<a name="l00700"></a>00700 }
+<a name="l00701"></a>00701
+<a name="l00702"></a>00702 <span class="keyword">protected</span>:
+<a name="l00703"></a>00703
+<a name="l00704"></a>00704 spin_mutex my_mutex;
+<a name="l00705"></a>00705 internal::broadcast_cache< T, null_rw_mutex > my_successors;
+<a name="l00706"></a>00706 T my_buffer;
+<a name="l00707"></a>00707 <span class="keywordtype">bool</span> my_buffer_is_valid;
+<a name="l00708"></a>00708
+<a name="l00709"></a>00709 };
+<a name="l00710"></a>00710
+<a name="l00711"></a>00711 <span class="keyword">template</span>< <span class="keyword">typename</span> T >
+<a name="l00712"></a>00712 <span class="keyword">class </span>write_once_node : <span class="keyword">public</span> overwrite_node<T> {
+<a name="l00713"></a>00713 <span class="keyword">public</span>:
+<a name="l00714"></a>00714
+<a name="l00715"></a>00715 <span class="keyword">typedef</span> T input_type;
+<a name="l00716"></a>00716 <span class="keyword">typedef</span> T output_type;
+<a name="l00717"></a>00717 <span class="keyword">typedef</span> sender< input_type > predecessor_type;
+<a name="l00718"></a>00718 <span class="keyword">typedef</span> receiver< output_type > successor_type;
+<a name="l00719"></a>00719
+<a name="l00721"></a>00721 write_once_node() : overwrite_node<T>() {}
+<a name="l00722"></a>00722
+<a name="l00724"></a>00724 write_once_node( <span class="keyword">const</span> write_once_node& src ) : overwrite_node<T>(src) {}
+<a name="l00725"></a>00725
+<a name="l00726"></a>00726 <span class="comment">/* override */</span> <span class="keywordtype">bool</span> try_put( <span class="keyword">const</span> T &v ) {
+<a name="l00727"></a>00727 spin_mutex::scoped_lock l( this->my_mutex );
+<a name="l00728"></a>00728 <span class="keywordflow">if</span> ( this->my_buffer_is_valid ) {
+<a name="l00729"></a>00729 <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00730"></a>00730 } <span class="keywordflow">else</span> {
+<a name="l00731"></a>00731 this->my_buffer = v;
+<a name="l00732"></a>00732 this->my_buffer_is_valid = <span class="keyword">true</span>;
+<a name="l00733"></a>00733 this->my_successors.try_put(v);
+<a name="l00734"></a>00734 <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00735"></a>00735 }
+<a name="l00736"></a>00736 }
+<a name="l00737"></a>00737 };
+<a name="l00738"></a>00738
+<a name="l00740"></a>00740 <span class="keyword">template</span> <<span class="keyword">typename</span> T>
+<a name="l00741"></a><a class="code" href="a00236.html">00741</a> <span class="keyword">class </span><a class="code" href="a00236.html">broadcast_node</a> : <span class="keyword">public</span> <a class="code" href="a00263.html">graph_node</a>, <span class="keyword">public</span> <a class="code" href="a00295.html">receiver</a><T>, <span class="keyword">public</span> <a class="code" href="a00301.html">sender</a><T> {
+<a name="l00742"></a>00742
+<a name="l00743"></a>00743 internal::broadcast_cache<T> my_successors;
+<a name="l00744"></a>00744
+<a name="l00745"></a>00745 <span class="keyword">public</span>:
+<a name="l00746"></a>00746
+<a name="l00747"></a><a class="code" href="a00236.html#43c775d80e98cc601de69764983319f9">00747</a> <span class="keyword">typedef</span> T <a class="code" href="a00236.html#43c775d80e98cc601de69764983319f9">input_type</a>;
+<a name="l00748"></a><a class="code" href="a00236.html#8fd8d3075823e08b879be46c1215ab0f">00748</a> <span class="keyword">typedef</span> T output_type;
+<a name="l00749"></a><a class="code" href="a00236.html#0e2ad9a121cb286aa0d0142fef33c646">00749</a> <span class="keyword">typedef</span> <a class="code" href="a00301.html">sender< input_type ></a> <a class="code" href="a00301.html">predecessor_type</a>;
+<a name="l00750"></a><a class="code" href="a00236.html#cc6a0eb1c4ee65465770628d8366f055">00750</a> <span class="keyword">typedef</span> <a class="code" href="a00295.html">receiver< output_type ></a> <a class="code" href="a00295.html">successor_type</a>;
+<a name="l00751"></a>00751
+<a name="l00752"></a>00752 <a class="code" href="a00236.html">broadcast_node</a>( ) {
+<a name="l00753"></a>00753 my_successors.set_owner( <span class="keyword">this</span> );
+<a name="l00754"></a>00754 }
+<a name="l00755"></a>00755
+<a name="l00756"></a>00756 <span class="comment">// Copy constructor</span>
+<a name="l00757"></a>00757 <a class="code" href="a00236.html">broadcast_node</a>( <span class="keyword">const</span> <a class="code" href="a00236.html">broadcast_node</a>& ) : <a class="code" href="a00263.html">graph_node</a>(), <a class="code" href="a00295.html">receiver</a><T>(), <a class="code" href="a00301.html">sender</a><T>() {
+<a name="l00758"></a>00758 my_successors.set_owner( <span class="keyword">this</span> );
+<a name="l00759"></a>00759 }
+<a name="l00760"></a>00760
+<a name="l00762"></a><a class="code" href="a00236.html#fd0324c9ddb51fe6f95b3d015d338941">00762</a> <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="a00236.html#fd0324c9ddb51fe6f95b3d015d338941">register_successor</a>( <a class="code" href="a00295.html">receiver<T></a> &r ) {
+<a name="l00763"></a>00763 my_successors.register_successor( r );
+<a name="l00764"></a>00764 <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00765"></a>00765 }
+<a name="l00766"></a>00766
+<a name="l00768"></a><a class="code" href="a00236.html#366efcc046ec08a104281109801ae629">00768</a> <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="a00236.html#366efcc046ec08a104281109801ae629">remove_successor</a>( <a class="code" href="a00295.html">receiver<T></a> &r ) {
+<a name="l00769"></a>00769 my_successors.remove_successor( r );
+<a name="l00770"></a>00770 <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00771"></a>00771 }
+<a name="l00772"></a>00772
+<a name="l00773"></a><a class="code" href="a00236.html#29eb768c10b377880bbf83d31ee49acf">00773</a> <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00236.html#29eb768c10b377880bbf83d31ee49acf">try_put</a>( <span class="keyword">const</span> T &t ) {
+<a name="l00774"></a>00774 my_successors.try_put(t);
+<a name="l00775"></a>00775 <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00776"></a>00776 }
+<a name="l00777"></a>00777
+<a name="l00778"></a>00778 };
+<a name="l00779"></a>00779
+<a name="l00780"></a>00780 <span class="preprocessor">#include "internal/_flow_graph_item_buffer_impl.h"</span>
+<a name="l00781"></a>00781
+<a name="l00783"></a>00783 <span class="keyword">template</span> <<span class="keyword">typename</span> T, <span class="keyword">typename</span> A=cache_aligned_allocator<T> >
+<a name="l00784"></a><a class="code" href="a00237.html">00784</a> <span class="keyword">class </span><a class="code" href="a00237.html">buffer_node</a> : <span class="keyword">public</span> <a class="code" href="a00263.html">graph_node</a>, <span class="keyword">public</span> reservable_item_buffer<T, A>, <span class="keyword">public</span> <a class="code" href="a00295.html">receiver</a><T>, <span class="keyword">public</span> <a class="code" href="a00301.html">sender</a><T> {
+<a name="l00785"></a>00785 <span class="keyword">public</span>:
+<a name="l00786"></a><a class="code" href="a00237.html#334efb81b56a2f2b3ae08a16e8d65620">00786</a> <span class="keyword">typedef</span> T <a class="code" href="a00237.html#334efb81b56a2f2b3ae08a16e8d65620">input_type</a>;
+<a name="l00787"></a><a class="code" href="a00237.html#089520db81f6a1551dc94c01efbdd7be">00787</a> <span class="keyword">typedef</span> T output_type;
+<a name="l00788"></a><a class="code" href="a00237.html#5fb0ad03a822ca0fc34ad5d56a4093a2">00788</a> <span class="keyword">typedef</span> <a class="code" href="a00301.html">sender< input_type ></a> <a class="code" href="a00301.html">predecessor_type</a>;
+<a name="l00789"></a><a class="code" href="a00237.html#66f7eda69b75e08f50726e50a11429cd">00789</a> <span class="keyword">typedef</span> <a class="code" href="a00295.html">receiver< output_type ></a> <a class="code" href="a00295.html">successor_type</a>;
+<a name="l00790"></a>00790 <span class="keyword">typedef</span> <a class="code" href="a00237.html">buffer_node<T, A></a> <a class="code" href="a00237.html">my_class</a>;
+<a name="l00791"></a>00791 <span class="keyword">protected</span>:
+<a name="l00792"></a>00792 <span class="keyword">typedef</span> size_t size_type;
+<a name="l00793"></a>00793 internal::round_robin_cache< T, null_rw_mutex > my_successors;
+<a name="l00794"></a>00794
+<a name="l00795"></a>00795 <a class="code" href="a00311.html">task</a> *my_parent;
+<a name="l00796"></a>00796
+<a name="l00797"></a>00797 <span class="keyword">friend</span> <span class="keyword">class </span>internal::forward_task< buffer_node< T, A > >;
+<a name="l00798"></a>00798
+<a name="l00799"></a>00799 <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="l00800"></a>00800 <span class="keyword">enum</span> op_stat {WAIT=0, SUCCEEDED, FAILED};
+<a name="l00801"></a>00801
+<a name="l00802"></a>00802 <span class="comment">// implements the aggregator_operation concept</span>
+<a name="l00803"></a>00803 <span class="keyword">class </span>buffer_operation : <span class="keyword">public</span> internal::aggregated_operation< buffer_operation > {
+<a name="l00804"></a>00804 <span class="keyword">public</span>:
+<a name="l00805"></a>00805 <span class="keywordtype">char</span> type;
+<a name="l00806"></a>00806 T *elem;
+<a name="l00807"></a>00807 <a class="code" href="a00237.html#66f7eda69b75e08f50726e50a11429cd">successor_type</a> *r;
+<a name="l00808"></a>00808 buffer_operation(<span class="keyword">const</span> T& e, op_type t) :
+<a name="l00809"></a>00809 type(char(t)), elem(const_cast<T*>(&e)), r(NULL) {}
+<a name="l00810"></a>00810 buffer_operation(op_type t) : type(char(t)), r(NULL) {}
+<a name="l00811"></a>00811 };
+<a name="l00812"></a>00812
+<a name="l00813"></a>00813 <span class="keywordtype">bool</span> forwarder_busy;
+<a name="l00814"></a>00814 <span class="keyword">typedef</span> internal::aggregating_functor<my_class, buffer_operation> my_handler;
+<a name="l00815"></a>00815 <span class="keyword">friend</span> <span class="keyword">class </span>internal::aggregating_functor<my_class, buffer_operation>;
+<a name="l00816"></a>00816 internal::aggregator< my_handler, buffer_operation> my_aggregator;
+<a name="l00817"></a>00817
+<a name="l00818"></a>00818 <span class="keyword">virtual</span> <span class="keywordtype">void</span> handle_operations(buffer_operation *op_list) {
+<a name="l00819"></a>00819 buffer_operation *tmp;
+<a name="l00820"></a>00820 <span class="keywordtype">bool</span> try_forwarding=<span class="keyword">false</span>;
+<a name="l00821"></a>00821 <span class="keywordflow">while</span> (op_list) {
+<a name="l00822"></a>00822 tmp = op_list;
+<a name="l00823"></a>00823 op_list = op_list->next;
+<a name="l00824"></a>00824 <span class="keywordflow">switch</span> (tmp->type) {
+<a name="l00825"></a>00825 <span class="keywordflow">case</span> reg_succ: <a class="code" href="a00237.html#df21388252b8963e839dca29d2c67ea5">internal_reg_succ</a>(tmp); try_forwarding = <span class="keyword">true</span>; <span class="keywordflow">break</span>;
+<a name="l00826"></a>00826 <span class="keywordflow">case</span> rem_succ: <a class="code" href="a00237.html#6b6cf76dff80fd679251da93351c1291">internal_rem_succ</a>(tmp); <span class="keywordflow">break</span>;
+<a name="l00827"></a>00827 <span class="keywordflow">case</span> req_item: internal_pop(tmp); <span class="keywordflow">break</span>;
+<a name="l00828"></a>00828 <span class="keywordflow">case</span> res_item: internal_reserve(tmp); <span class="keywordflow">break</span>;
+<a name="l00829"></a>00829 <span class="keywordflow">case</span> rel_res: internal_release(tmp); try_forwarding = <span class="keyword">true</span>; <span class="keywordflow">break</span>;
+<a name="l00830"></a>00830 <span class="keywordflow">case</span> con_res: internal_consume(tmp); try_forwarding = <span class="keyword">true</span>; <span class="keywordflow">break</span>;
+<a name="l00831"></a>00831 <span class="keywordflow">case</span> put_item: internal_push(tmp); try_forwarding = <span class="keyword">true</span>; <span class="keywordflow">break</span>;
+<a name="l00832"></a>00832 <span class="keywordflow">case</span> try_fwd: <a class="code" href="a00237.html#dcbffbae514f4d95205b0845785c0a91">internal_forward</a>(tmp); <span class="keywordflow">break</span>;
+<a name="l00833"></a>00833 }
+<a name="l00834"></a>00834 }
+<a name="l00835"></a>00835 <span class="keywordflow">if</span> (try_forwarding && !forwarder_busy) {
+<a name="l00836"></a>00836 forwarder_busy = <span class="keyword">true</span>;
+<a name="l00837"></a>00837 <a class="code" href="a00311.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="l00838"></a>00838 }
+<a name="l00839"></a>00839 }
+<a name="l00840"></a>00840
+<a name="l00842"></a><a class="code" href="a00237.html#2648324ce0a38b40132b8502ef250e3a">00842</a> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="a00237.html#2648324ce0a38b40132b8502ef250e3a">forward</a>() {
+<a name="l00843"></a>00843 buffer_operation op_data(try_fwd);
+<a name="l00844"></a>00844 <span class="keywordflow">do</span> {
+<a name="l00845"></a>00845 op_data.status = WAIT;
+<a name="l00846"></a>00846 my_aggregator.execute(&op_data);
+<a name="l00847"></a>00847 } <span class="keywordflow">while</span> (op_data.status == SUCCEEDED);
+<a name="l00848"></a>00848 }
+<a name="l00849"></a>00849
+<a name="l00851"></a><a class="code" href="a00237.html#df21388252b8963e839dca29d2c67ea5">00851</a> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="a00237.html#df21388252b8963e839dca29d2c67ea5">internal_reg_succ</a>(buffer_operation *op) {
+<a name="l00852"></a>00852 my_successors.register_successor(*(op->r));
+<a name="l00853"></a>00853 __TBB_store_with_release(op->status, SUCCEEDED);
+<a name="l00854"></a>00854 }
+<a name="l00855"></a>00855
+<a name="l00857"></a><a class="code" href="a00237.html#6b6cf76dff80fd679251da93351c1291">00857</a> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="a00237.html#6b6cf76dff80fd679251da93351c1291">internal_rem_succ</a>(buffer_operation *op) {
+<a name="l00858"></a>00858 my_successors.remove_successor(*(op->r));
+<a name="l00859"></a>00859 __TBB_store_with_release(op->status, SUCCEEDED);
+<a name="l00860"></a>00860 }
+<a name="l00861"></a>00861
+<a name="l00863"></a><a class="code" href="a00237.html#dcbffbae514f4d95205b0845785c0a91">00863</a> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="a00237.html#dcbffbae514f4d95205b0845785c0a91">internal_forward</a>(buffer_operation *op) {
+<a name="l00864"></a>00864 T i_copy;
+<a name="l00865"></a>00865 <span class="keywordtype">bool</span> success = <span class="keyword">false</span>; <span class="comment">// flagged when a successor accepts</span>
+<a name="l00866"></a>00866 size_type counter = my_successors.size();
+<a name="l00867"></a>00867 <span class="comment">// Try forwarding, giving each successor a chance</span>
+<a name="l00868"></a>00868 <span class="keywordflow">while</span> (counter>0 && !this->buffer_empty() && this->item_valid(this->my_tail-1)) {
+<a name="l00869"></a>00869 this->fetch_back(i_copy);
+<a name="l00870"></a>00870 <span class="keywordflow">if</span>( my_successors.try_put(i_copy) ) {
+<a name="l00871"></a>00871 this->invalidate_back();
+<a name="l00872"></a>00872 --(this->my_tail);
+<a name="l00873"></a>00873 success = <span class="keyword">true</span>; <span class="comment">// found an accepting successor</span>
+<a name="l00874"></a>00874 }
+<a name="l00875"></a>00875 --counter;
+<a name="l00876"></a>00876 }
+<a name="l00877"></a>00877 <span class="keywordflow">if</span> (success && !counter)
+<a name="l00878"></a>00878 __TBB_store_with_release(op->status, SUCCEEDED);
+<a name="l00879"></a>00879 <span class="keywordflow">else</span> {
+<a name="l00880"></a>00880 __TBB_store_with_release(op->status, FAILED);
+<a name="l00881"></a>00881 forwarder_busy = <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="keyword">virtual</span> <span class="keywordtype">void</span> internal_push(buffer_operation *op) {
+<a name="l00886"></a>00886 this->push_back(*(op->elem));
+<a name="l00887"></a>00887 __TBB_store_with_release(op->status, SUCCEEDED);
+<a name="l00888"></a>00888 }
+<a name="l00889"></a>00889
+<a name="l00890"></a>00890 <span class="keyword">virtual</span> <span class="keywordtype">void</span> internal_pop(buffer_operation *op) {
+<a name="l00891"></a>00891 <span class="keywordflow">if</span>(this->pop_back(*(op->elem))) {
+<a name="l00892"></a>00892 __TBB_store_with_release(op->status, SUCCEEDED);
+<a name="l00893"></a>00893 }
+<a name="l00894"></a>00894 <span class="keywordflow">else</span> {
+<a name="l00895"></a>00895 __TBB_store_with_release(op->status, FAILED);
+<a name="l00896"></a>00896 }
+<a name="l00897"></a>00897 }
+<a name="l00898"></a>00898
+<a name="l00899"></a>00899 <span class="keyword">virtual</span> <span class="keywordtype">void</span> internal_reserve(buffer_operation *op) {
+<a name="l00900"></a>00900 <span class="keywordflow">if</span>(this->reserve_front(*(op->elem))) {
+<a name="l00901"></a>00901 __TBB_store_with_release(op->status, SUCCEEDED);
+<a name="l00902"></a>00902 }
+<a name="l00903"></a>00903 <span class="keywordflow">else</span> {
+<a name="l00904"></a>00904 __TBB_store_with_release(op->status, FAILED);
+<a name="l00905"></a>00905 }
+<a name="l00906"></a>00906 }
+<a name="l00907"></a>00907
+<a name="l00908"></a>00908 <span class="keyword">virtual</span> <span class="keywordtype">void</span> internal_consume(buffer_operation *op) {
+<a name="l00909"></a>00909 this->consume_front();
+<a name="l00910"></a>00910 __TBB_store_with_release(op->status, SUCCEEDED);
+<a name="l00911"></a>00911 }
+<a name="l00912"></a>00912
+<a name="l00913"></a>00913 <span class="keyword">virtual</span> <span class="keywordtype">void</span> internal_release(buffer_operation *op) {
+<a name="l00914"></a>00914 this->release_front();
+<a name="l00915"></a>00915 __TBB_store_with_release(op->status, SUCCEEDED);
+<a name="l00916"></a>00916 }
+<a name="l00917"></a>00917
+<a name="l00918"></a>00918 <span class="keyword">public</span>:
+<a name="l00920"></a><a class="code" href="a00237.html#5fe4b79f780586ff66e002ce32a5c60d">00920</a> <a class="code" href="a00237.html#5fe4b79f780586ff66e002ce32a5c60d">buffer_node</a>( <a class="code" href="a00262.html">graph</a> &g ) : reservable_item_buffer<T>(),
+<a name="l00921"></a>00921 my_parent( g.root_task() ), forwarder_busy(false) {
+<a name="l00922"></a>00922 my_successors.set_owner(<span class="keyword">this</span>);
+<a name="l00923"></a>00923 my_aggregator.initialize_handler(my_handler(<span class="keyword">this</span>));
+<a name="l00924"></a>00924 }
+<a name="l00925"></a>00925
+<a name="l00927"></a><a class="code" href="a00237.html#03ad7b85a8341437f584af06ad050cdc">00927</a> <a class="code" href="a00237.html#5fe4b79f780586ff66e002ce32a5c60d">buffer_node</a>( <span class="keyword">const</span> buffer_node& src ) :
+<a name="l00928"></a>00928 <a class="code" href="a00263.html">graph_node</a>(), reservable_item_buffer<T>(), <a class="code" href="a00295.html">receiver</a><T>(), <a class="code" href="a00301.html">sender</a><T>(),
+<a name="l00929"></a>00929 my_parent( src.my_parent ) {
+<a name="l00930"></a>00930 forwarder_busy = <span class="keyword">false</span>;
+<a name="l00931"></a>00931 my_successors.set_owner(<span class="keyword">this</span>);
+<a name="l00932"></a>00932 my_aggregator.initialize_handler(my_handler(<span class="keyword">this</span>));
+<a name="l00933"></a>00933 }
+<a name="l00934"></a>00934
+<a name="l00935"></a>00935 <span class="keyword">virtual</span> ~buffer_node() {}
+<a name="l00936"></a>00936
+<a name="l00937"></a>00937 <span class="comment">//</span>
+<a name="l00938"></a>00938 <span class="comment">// message sender implementation</span>
+<a name="l00939"></a>00939 <span class="comment">//</span>
+<a name="l00940"></a>00940
+<a name="l00942"></a>00942
+<a name="l00943"></a><a class="code" href="a00237.html#f8bf4944ede4fc106423d67715beb695">00943</a> <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00237.html#f8bf4944ede4fc106423d67715beb695">register_successor</a>( <a class="code" href="a00295.html">receiver<output_type></a> &r ) {
+<a name="l00944"></a>00944 buffer_operation op_data(reg_succ);
+<a name="l00945"></a>00945 op_data.r = &r;
+<a name="l00946"></a>00946 my_aggregator.execute(&op_data);
+<a name="l00947"></a>00947 <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00948"></a>00948 }
+<a name="l00949"></a>00949
+<a name="l00951"></a>00951
+<a name="l00953"></a><a class="code" href="a00237.html#2074da0e39b9477c32897d6e5786196f">00953</a> <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00237.html#2074da0e39b9477c32897d6e5786196f">remove_successor</a>( <a class="code" href="a00295.html">receiver<output_type></a> &r ) {
+<a name="l00954"></a>00954 r.<a class="code" href="a00295.html#3bc76547b51d3c9b633e3987d22dce95">remove_predecessor</a>(*<span class="keyword">this</span>);
+<a name="l00955"></a>00955 buffer_operation op_data(rem_succ);
+<a name="l00956"></a>00956 op_data.r = &r;
+<a name="l00957"></a>00957 my_aggregator.execute(&op_data);
+<a name="l00958"></a>00958 <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00959"></a>00959 }
+<a name="l00960"></a>00960
+<a name="l00962"></a>00962
+<a name="l00964"></a><a class="code" href="a00237.html#aeb8aec46ca99ca022356a792c46735e">00964</a> <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00237.html#aeb8aec46ca99ca022356a792c46735e">try_get</a>( T &v ) {
+<a name="l00965"></a>00965 buffer_operation op_data(req_item);
+<a name="l00966"></a>00966 op_data.elem = &v;
+<a name="l00967"></a>00967 my_aggregator.execute(&op_data);
+<a name="l00968"></a>00968 <span class="keywordflow">return</span> (op_data.status==SUCCEEDED);
+<a name="l00969"></a>00969 }
+<a name="l00970"></a>00970
+<a name="l00972"></a>00972
+<a name="l00974"></a><a class="code" href="a00237.html#1cc889bb6c38bcb81757d0ebbc3a5e64">00974</a> <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00237.html#1cc889bb6c38bcb81757d0ebbc3a5e64">try_reserve</a>( T &v ) {
+<a name="l00975"></a>00975 buffer_operation op_data(res_item);
+<a name="l00976"></a>00976 op_data.elem = &v;
+<a name="l00977"></a>00977 my_aggregator.execute(&op_data);
+<a name="l00978"></a>00978 <span class="keywordflow">return</span> (op_data.status==SUCCEEDED);
+<a name="l00979"></a>00979 }
+<a name="l00980"></a>00980
+<a name="l00982"></a>00982
+<a name="l00983"></a><a class="code" href="a00237.html#2c8e8f2f5f4ff5be27136cc1184a3c3e">00983</a> <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00237.html#2c8e8f2f5f4ff5be27136cc1184a3c3e">try_release</a>() {
+<a name="l00984"></a>00984 buffer_operation op_data(rel_res);
+<a name="l00985"></a>00985 my_aggregator.execute(&op_data);
+<a name="l00986"></a>00986 <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00987"></a>00987 }
+<a name="l00988"></a>00988
+<a name="l00990"></a>00990
+<a name="l00991"></a><a class="code" href="a00237.html#8ef07c434eb763d947a7b4e80c086a49">00991</a> <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00237.html#8ef07c434eb763d947a7b4e80c086a49">try_consume</a>() {
+<a name="l00992"></a>00992 buffer_operation op_data(con_res);
+<a name="l00993"></a>00993 my_aggregator.execute(&op_data);
+<a name="l00994"></a>00994 <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00995"></a>00995 }
+<a name="l00996"></a>00996
+<a name="l00998"></a>00998
+<a name="l00999"></a><a class="code" href="a00237.html#2b02fe332e704bbe14f297802298b63a">00999</a> <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00237.html#2b02fe332e704bbe14f297802298b63a">try_put</a>(<span class="keyword">const</span> T &t) {
+<a name="l01000"></a>01000 buffer_operation op_data(t, put_item);
+<a name="l01001"></a>01001 my_aggregator.execute(&op_data);
+<a name="l01002"></a>01002 <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l01003"></a>01003 }
+<a name="l01004"></a>01004 };
+<a name="l01005"></a>01005
+<a name="l01006"></a>01006
+<a name="l01008"></a>01008 <span class="keyword">template</span> <<span class="keyword">typename</span> T, <span class="keyword">typename</span> A=cache_aligned_allocator<T> >
+<a name="l01009"></a><a class="code" href="a00287.html">01009</a> <span class="keyword">class </span><a class="code" href="a00287.html">queue_node</a> : <span class="keyword">public</span> buffer_node<T, A> {
+<a name="l01010"></a>01010 <span class="keyword">protected</span>:
+<a name="l01011"></a>01011 <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00237.html">buffer_node<T, A>::size_type</a> size_type;
+<a name="l01012"></a>01012 <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00237.html">buffer_node<T, A>::buffer_operation</a> queue_operation;
+<a name="l01013"></a>01013
+<a name="l01014"></a>01014 <span class="keyword">enum</span> op_stat {WAIT=0, SUCCEEDED, FAILED};
+<a name="l01015"></a>01015
+<a name="l01017"></a><a class="code" href="a00287.html#eadcbbb81f9a9d223afabe0f40e77ecb">01017</a> <span class="comment">/* override */</span> <span class="keywordtype">void</span> <a class="code" href="a00287.html#eadcbbb81f9a9d223afabe0f40e77ecb">internal_forward</a>(queue_operation *op) {
+<a name="l01018"></a>01018 T i_copy;
+<a name="l01019"></a>01019 <span class="keywordtype">bool</span> success = <span class="keyword">false</span>; <span class="comment">// flagged when a successor accepts</span>
+<a name="l01020"></a>01020 size_type counter = this->my_successors.size();
+<a name="l01021"></a>01021 <span class="keywordflow">if</span> (this->my_reserved || !this->item_valid(this->my_head)){
+<a name="l01022"></a>01022 __TBB_store_with_release(op->status, FAILED);
+<a name="l01023"></a>01023 this->forwarder_busy = <span class="keyword">false</span>;
+<a name="l01024"></a>01024 <span class="keywordflow">return</span>;
+<a name="l01025"></a>01025 }
+<a name="l01026"></a>01026 <span class="comment">// Keep trying to send items while there is at least one accepting successor</span>
+<a name="l01027"></a>01027 <span class="keywordflow">while</span> (counter>0 && this->item_valid(this->my_head)) {
+<a name="l01028"></a>01028 this->fetch_front(i_copy);
+<a name="l01029"></a>01029 <span class="keywordflow">if</span>(this->my_successors.try_put(i_copy)) {
+<a name="l01030"></a>01030 this->invalidate_front();
+<a name="l01031"></a>01031 ++(this->my_head);
+<a name="l01032"></a>01032 success = <span class="keyword">true</span>; <span class="comment">// found an accepting successor</span>
+<a name="l01033"></a>01033 }
+<a name="l01034"></a>01034 --counter;
+<a name="l01035"></a>01035 }
+<a name="l01036"></a>01036 <span class="keywordflow">if</span> (success && !counter)
+<a name="l01037"></a>01037 __TBB_store_with_release(op->status, SUCCEEDED);
+<a name="l01038"></a>01038 <span class="keywordflow">else</span> {
+<a name="l01039"></a>01039 __TBB_store_with_release(op->status, FAILED);
+<a name="l01040"></a>01040 this->forwarder_busy = <span class="keyword">false</span>;
+<a name="l01041"></a>01041 }
+<a name="l01042"></a>01042 }
+<a name="l01043"></a>01043
+<a name="l01044"></a>01044 <span class="comment">/* override */</span> <span class="keywordtype">void</span> internal_pop(queue_operation *op) {
+<a name="l01045"></a>01045 <span class="keywordflow">if</span> ( this->my_reserved || !this->item_valid(this->my_head)){
+<a name="l01046"></a>01046 __TBB_store_with_release(op->status, FAILED);
+<a name="l01047"></a>01047 }
+<a name="l01048"></a>01048 <span class="keywordflow">else</span> {
+<a name="l01049"></a>01049 this->pop_front(*(op->elem));
+<a name="l01050"></a>01050 __TBB_store_with_release(op->status, SUCCEEDED);
+<a name="l01051"></a>01051 }
+<a name="l01052"></a>01052 }
+<a name="l01053"></a>01053 <span class="comment">/* override */</span> <span class="keywordtype">void</span> internal_reserve(queue_operation *op) {
+<a name="l01054"></a>01054 <span class="keywordflow">if</span> (this->my_reserved || !this->item_valid(this->my_head)) {
+<a name="l01055"></a>01055 __TBB_store_with_release(op->status, FAILED);
+<a name="l01056"></a>01056 }
+<a name="l01057"></a>01057 <span class="keywordflow">else</span> {
+<a name="l01058"></a>01058 this->my_reserved = <span class="keyword">true</span>;
+<a name="l01059"></a>01059 this->fetch_front(*(op->elem));
+<a name="l01060"></a>01060 this->invalidate_front();
+<a name="l01061"></a>01061 __TBB_store_with_release(op->status, SUCCEEDED);
+<a name="l01062"></a>01062 }
+<a name="l01063"></a>01063 }
+<a name="l01064"></a>01064 <span class="comment">/* override */</span> <span class="keywordtype">void</span> internal_consume(queue_operation *op) {
+<a name="l01065"></a>01065 this->consume_front();
+<a name="l01066"></a>01066 __TBB_store_with_release(op->status, SUCCEEDED);
+<a name="l01067"></a>01067 }
+<a name="l01068"></a>01068
+<a name="l01069"></a>01069 <span class="keyword">public</span>:
+<a name="l01070"></a>01070
+<a name="l01071"></a><a class="code" href="a00287.html#1e71030845210b6c4c7380eb9e11a2ac">01071</a> <span class="keyword">typedef</span> T <a class="code" href="a00287.html#1e71030845210b6c4c7380eb9e11a2ac">input_type</a>;
+<a name="l01072"></a><a class="code" href="a00287.html#25b5a53ab1f9a342644fa3759bc0b1ad">01072</a> <span class="keyword">typedef</span> T output_type;
+<a name="l01073"></a><a class="code" href="a00287.html#5e2fdd33c45d44549dee9c1638e19898">01073</a> <span class="keyword">typedef</span> <a class="code" href="a00301.html">sender< input_type ></a> <a class="code" href="a00301.html">predecessor_type</a>;
+<a name="l01074"></a><a class="code" href="a00287.html#f35076a19f256f9e7a61bed77ca1ccc5">01074</a> <span class="keyword">typedef</span> <a class="code" href="a00295.html">receiver< output_type ></a> <a class="code" href="a00295.html">successor_type</a>;
+<a name="l01075"></a>01075
+<a name="l01077"></a><a class="code" href="a00287.html#c716593a92448b0f429d1f3a38e67996">01077</a> <a class="code" href="a00287.html#c716593a92448b0f429d1f3a38e67996">queue_node</a>( <a class="code" href="a00262.html">graph</a> &g ) : buffer_node<T, A>(g) {}
+<a name="l01078"></a>01078
+<a name="l01080"></a><a class="code" href="a00287.html#0226762d9ebba28311b7b1518d948ab1">01080</a> <a class="code" href="a00287.html#c716593a92448b0f429d1f3a38e67996">queue_node</a>( <span class="keyword">const</span> <a class="code" href="a00287.html">queue_node</a>& src) : buffer_node<T, A>(src) {}
+<a name="l01081"></a>01081 };
+<a name="l01082"></a>01082
+<a name="l01084"></a>01084 <span class="keyword">template</span>< <span class="keyword">typename</span> T, <span class="keyword">typename</span> A=cache_aligned_allocator<T> >
+<a name="l01085"></a><a class="code" href="a00302.html">01085</a> <span class="keyword">class </span><a class="code" href="a00302.html">sequencer_node</a> : <span class="keyword">public</span> <a class="code" href="a00287.html">queue_node</a><T, A> {
+<a name="l01086"></a>01086 internal::function_body< T, size_t > *my_sequencer;
+<a name="l01087"></a>01087 <span class="keyword">public</span>:
+<a name="l01088"></a>01088
+<a name="l01089"></a><a class="code" href="a00302.html#af629f26832ff4e476e240637a78bc0c">01089</a> <span class="keyword">typedef</span> T <a class="code" href="a00302.html#af629f26832ff4e476e240637a78bc0c">input_type</a>;
+<a name="l01090"></a><a class="code" href="a00302.html#ca026eaef70e35791c407323199031a7">01090</a> <span class="keyword">typedef</span> T output_type;
+<a name="l01091"></a><a class="code" href="a00302.html#8127e36811832563fe1e9bc3ba391f79">01091</a> <span class="keyword">typedef</span> <a class="code" href="a00301.html">sender< input_type ></a> <a class="code" href="a00301.html">predecessor_type</a>;
+<a name="l01092"></a><a class="code" href="a00302.html#795f3ee75f133b9d3b159172fc4a197f">01092</a> <span class="keyword">typedef</span> <a class="code" href="a00295.html">receiver< output_type ></a> <a class="code" href="a00295.html">successor_type</a>;
+<a name="l01093"></a>01093
+<a name="l01095"></a>01095 <span class="keyword">template</span>< <span class="keyword">typename</span> Sequencer >
+<a name="l01096"></a><a class="code" href="a00302.html#7e71cbdf78f989091bc162b89bee7e66">01096</a> <a class="code" href="a00302.html#7e71cbdf78f989091bc162b89bee7e66">sequencer_node</a>( <a class="code" href="a00262.html">graph</a> &g, <span class="keyword">const</span> Sequencer& s ) : <a class="code" href="a00287.html">queue_node</a><T, A>(g),
+<a name="l01097"></a>01097 my_sequencer(new internal::function_body_leaf< T, size_t, Sequencer>(s) ) {}
+<a name="l01098"></a>01098
+<a name="l01100"></a><a class="code" href="a00302.html#b38e7a070552960384bcc1d91af13a5c">01100</a> <a class="code" href="a00302.html#7e71cbdf78f989091bc162b89bee7e66">sequencer_node</a>( <span class="keyword">const</span> <a class="code" href="a00302.html">sequencer_node</a>& src ) : <a class="code" href="a00287.html">queue_node</a><T, A>(src),
+<a name="l01101"></a>01101 my_sequencer( src.my_sequencer->clone() ) {}
+<a name="l01102"></a>01102
+<a name="l01104"></a><a class="code" href="a00302.html#93d3d8f6a72b3e1387047282116ed6ee">01104</a> <a class="code" href="a00302.html#93d3d8f6a72b3e1387047282116ed6ee">~sequencer_node</a>() { <span class="keyword">delete</span> my_sequencer; }
+<a name="l01105"></a>01105 <span class="keyword">protected</span>:
+<a name="l01106"></a>01106 <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00237.html">buffer_node<T, A>::size_type</a> size_type;
+<a name="l01107"></a>01107 <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00237.html">buffer_node<T, A>::buffer_operation</a> sequencer_operation;
+<a name="l01108"></a>01108
+<a name="l01109"></a>01109 <span class="keyword">enum</span> op_stat {WAIT=0, SUCCEEDED, FAILED};
+<a name="l01110"></a>01110
+<a name="l01111"></a>01111 <span class="keyword">private</span>:
+<a name="l01112"></a>01112 <span class="comment">/* override */</span> <span class="keywordtype">void</span> internal_push(sequencer_operation *op) {
+<a name="l01113"></a>01113 size_type tag = (*my_sequencer)(*(op->elem));
+<a name="l01114"></a>01114
+<a name="l01115"></a>01115 this->my_tail = (tag+1 > this->my_tail) ? tag+1 : this->my_tail;
+<a name="l01116"></a>01116
+<a name="l01117"></a>01117 <span class="keywordflow">if</span>(this->size() > this->capacity())
+<a name="l01118"></a>01118 this->grow_my_array(this->size()); <span class="comment">// tail already has 1 added to it</span>
+<a name="l01119"></a>01119 this->item(tag) = std::make_pair( *(op->elem), <span class="keyword">true</span> );
+<a name="l01120"></a>01120 __TBB_store_with_release(op->status, SUCCEEDED);
+<a name="l01121"></a>01121 }
+<a name="l01122"></a>01122 };
+<a name="l01123"></a>01123
+<a name="l01125"></a>01125 <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="l01126"></a><a class="code" href="a00286.html">01126</a> <span class="keyword">class </span><a class="code" href="a00286.html">priority_queue_node</a> : <span class="keyword">public</span> buffer_node<T, A> {
+<a name="l01127"></a>01127 <span class="keyword">public</span>:
+<a name="l01128"></a><a class="code" href="a00286.html#b2829b518979874ad3d2a939e14ae7bd">01128</a> <span class="keyword">typedef</span> T <a class="code" href="a00286.html#b2829b518979874ad3d2a939e14ae7bd">input_type</a>;
+<a name="l01129"></a><a class="code" href="a00286.html#2cb099b590246b6bc93cc15e78c6ee5c">01129</a> <span class="keyword">typedef</span> T output_type;
+<a name="l01130"></a><a class="code" href="a00286.html#fdea783bf9d5a4c98e794ac7e0f84ccf">01130</a> <span class="keyword">typedef</span> <a class="code" href="a00301.html">sender< input_type ></a> <a class="code" href="a00301.html">predecessor_type</a>;
+<a name="l01131"></a><a class="code" href="a00286.html#09ab5064ca8192e68c03da47603e68eb">01131</a> <span class="keyword">typedef</span> <a class="code" href="a00295.html">receiver< output_type ></a> <a class="code" href="a00295.html">successor_type</a>;
+<a name="l01132"></a>01132
+<a name="l01134"></a><a class="code" href="a00286.html#497ec2612615249bf5a294eb1b7b93b3">01134</a> <a class="code" href="a00286.html#497ec2612615249bf5a294eb1b7b93b3">priority_queue_node</a>( <a class="code" href="a00262.html">graph</a> &g ) : buffer_node<T, A>(g), mark(0) {}
+<a name="l01135"></a>01135
+<a name="l01137"></a><a class="code" href="a00286.html#17a4f66e23d54100b64805405e905d62">01137</a> <a class="code" href="a00286.html#497ec2612615249bf5a294eb1b7b93b3">priority_queue_node</a>( <span class="keyword">const</span> <a class="code" href="a00286.html">priority_queue_node</a> &src ) : buffer_node<T, A>(src), mark(0) {}
+<a name="l01138"></a>01138
+<a name="l01139"></a>01139 <span class="keyword">protected</span>:
+<a name="l01140"></a>01140 <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00237.html">buffer_node<T, A>::size_type</a> size_type;
+<a name="l01141"></a>01141 <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00237.html">buffer_node<T, A>::item_type</a> item_type;
+<a name="l01142"></a>01142 <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00237.html">buffer_node<T, A>::buffer_operation</a> prio_operation;
+<a name="l01143"></a>01143
+<a name="l01144"></a>01144 <span class="keyword">enum</span> op_stat {WAIT=0, SUCCEEDED, FAILED};
+<a name="l01145"></a>01145
+<a name="l01146"></a>01146 <span class="comment">/* override */</span> <span class="keywordtype">void</span> handle_operations(prio_operation *op_list) {
+<a name="l01147"></a>01147 prio_operation *tmp <span class="comment">/*, *pop_list*/</span> ;
+<a name="l01148"></a>01148 <span class="keywordtype">bool</span> try_forwarding=<span class="keyword">false</span>;
+<a name="l01149"></a>01149 <span class="keywordflow">while</span> (op_list) {
+<a name="l01150"></a>01150 tmp = op_list;
+<a name="l01151"></a>01151 op_list = op_list->next;
+<a name="l01152"></a>01152 <span class="keywordflow">switch</span> (tmp->type) {
+<a name="l01153"></a>01153 <span class="keywordflow">case</span> <a class="code" href="a00237.html">buffer_node<T, A>::reg_succ</a>: this-><a class="code" href="a00237.html#df21388252b8963e839dca29d2c67ea5">internal_reg_succ</a>(tmp); try_forwarding = <span class="keyword">true</span>; <span class="keywordflow">break</span>;
+<a name="l01154"></a>01154 <span class="keywordflow">case</span> <a class="code" href="a00237.html">buffer_node<T, A>::rem_succ</a>: this-><a class="code" href="a00237.html#6b6cf76dff80fd679251da93351c1291">internal_rem_succ</a>(tmp); <span class="keywordflow">break</span>;
+<a name="l01155"></a>01155 <span class="keywordflow">case</span> <a class="code" href="a00237.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="l01156"></a>01156 <span class="keywordflow">case</span> <a class="code" href="a00237.html">buffer_node<T, A>::try_fwd</a>: <a class="code" href="a00286.html#ed2d8dc0a9c1c2571e4a69df2f2209e5">internal_forward</a>(tmp); <span class="keywordflow">break</span>;
+<a name="l01157"></a>01157 <span class="keywordflow">case</span> <a class="code" href="a00237.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="l01158"></a>01158 <span class="keywordflow">case</span> <a class="code" href="a00237.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="l01159"></a>01159 <span class="keywordflow">case</span> <a class="code" href="a00237.html">buffer_node<T, A>::req_item</a>: internal_pop(tmp); <span class="keywordflow">break</span>;
+<a name="l01160"></a>01160 <span class="keywordflow">case</span> <a class="code" href="a00237.html">buffer_node<T, A>::res_item</a>: internal_reserve(tmp); <span class="keywordflow">break</span>;
+<a name="l01161"></a>01161 }
+<a name="l01162"></a>01162 }
+<a name="l01163"></a>01163 <span class="comment">// process pops! for now, no special pop processing</span>
+<a name="l01164"></a>01164 <span class="keywordflow">if</span> (mark<this->my_tail) heapify();
+<a name="l01165"></a>01165 <span class="keywordflow">if</span> (try_forwarding && !this->forwarder_busy) {
+<a name="l01166"></a>01166 this->forwarder_busy = <span class="keyword">true</span>;
+<a name="l01167"></a>01167 <a class="code" href="a00311.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="l01168"></a>01168 }
+<a name="l01169"></a>01169 }
+<a name="l01170"></a>01170
+<a name="l01172"></a><a class="code" href="a00286.html#ed2d8dc0a9c1c2571e4a69df2f2209e5">01172</a> <span class="comment">/* override */</span> <span class="keywordtype">void</span> <a class="code" href="a00286.html#ed2d8dc0a9c1c2571e4a69df2f2209e5">internal_forward</a>(prio_operation *op) {
+<a name="l01173"></a>01173 T i_copy;
+<a name="l01174"></a>01174 <span class="keywordtype">bool</span> success = <span class="keyword">false</span>; <span class="comment">// flagged when a successor accepts</span>
+<a name="l01175"></a>01175 size_type counter = this->my_successors.size();
+<a name="l01176"></a>01176
+<a name="l01177"></a>01177 <span class="keywordflow">if</span> (this->my_reserved || this->my_tail == 0) {
+<a name="l01178"></a>01178 __TBB_store_with_release(op->status, FAILED);
+<a name="l01179"></a>01179 this->forwarder_busy = <span class="keyword">false</span>;
+<a name="l01180"></a>01180 <span class="keywordflow">return</span>;
+<a name="l01181"></a>01181 }
+<a name="l01182"></a>01182 <span class="comment">// Keep trying to send while there exists an accepting successor</span>
+<a name="l01183"></a>01183 <span class="keywordflow">while</span> (counter>0 && this->my_tail > 0) {
+<a name="l01184"></a>01184 i_copy = this->my_array[0].first;
+<a name="l01185"></a>01185 <span class="keywordtype">bool</span> msg = this->my_successors.try_put(i_copy);
+<a name="l01186"></a>01186 <span class="keywordflow">if</span> ( msg == <span class="keyword">true</span> ) {
+<a name="l01187"></a>01187 <span class="keywordflow">if</span> (mark == this->my_tail) --mark;
+<a name="l01188"></a>01188 --(this->my_tail);
+<a name="l01189"></a>01189 this->my_array[0].first=this->my_array[this->my_tail].first;
+<a name="l01190"></a>01190 <span class="keywordflow">if</span> (this->my_tail > 1) <span class="comment">// don't reheap for heap of size 1</span>
+<a name="l01191"></a>01191 reheap();
+<a name="l01192"></a>01192 success = <span class="keyword">true</span>; <span class="comment">// found an accepting successor</span>
+<a name="l01193"></a>01193 }
+<a name="l01194"></a>01194 --counter;
+<a name="l01195"></a>01195 }
+<a name="l01196"></a>01196 <span class="keywordflow">if</span> (success && !counter)
+<a name="l01197"></a>01197 __TBB_store_with_release(op->status, SUCCEEDED);
+<a name="l01198"></a>01198 <span class="keywordflow">else</span> {
+<a name="l01199"></a>01199 __TBB_store_with_release(op->status, FAILED);
+<a name="l01200"></a>01200 this->forwarder_busy = <span class="keyword">false</span>;
+<a name="l01201"></a>01201 }
+<a name="l01202"></a>01202 }
+<a name="l01203"></a>01203
+<a name="l01204"></a>01204 <span class="comment">/* override */</span> <span class="keywordtype">void</span> internal_push(prio_operation *op) {
+<a name="l01205"></a>01205 <span class="keywordflow">if</span> ( this->my_tail >= this->my_array_size )
+<a name="l01206"></a>01206 this->grow_my_array( this->my_tail + 1 );
+<a name="l01207"></a>01207 this->my_array[this->my_tail] = std::make_pair( *(op->elem), <span class="keyword">true</span> );
+<a name="l01208"></a>01208 ++(this->my_tail);
+<a name="l01209"></a>01209 __TBB_store_with_release(op->status, SUCCEEDED);
+<a name="l01210"></a>01210 }
+<a name="l01211"></a>01211 <span class="comment">/* override */</span> <span class="keywordtype">void</span> internal_pop(prio_operation *op) {
+<a name="l01212"></a>01212 <span class="keywordflow">if</span> ( this->my_reserved == <span class="keyword">true</span> || this->my_tail == 0 ) {
+<a name="l01213"></a>01213 __TBB_store_with_release(op->status, FAILED);
+<a name="l01214"></a>01214 }
+<a name="l01215"></a>01215 <span class="keywordflow">else</span> {
+<a name="l01216"></a>01216 <span class="keywordflow">if</span> (mark<this->my_tail &&
+<a name="l01217"></a>01217 compare(this->my_array[0].first,
+<a name="l01218"></a>01218 this->my_array[this->my_tail-1].first)) {
+<a name="l01219"></a>01219 <span class="comment">// there are newly pushed elems; last one higher than top</span>
+<a name="l01220"></a>01220 <span class="comment">// copy the data</span>
+<a name="l01221"></a>01221 *(op->elem) = this->my_array[this->my_tail-1].first;
+<a name="l01222"></a>01222 --(this->my_tail);
+<a name="l01223"></a>01223 __TBB_store_with_release(op->status, SUCCEEDED);
+<a name="l01224"></a>01224 }
+<a name="l01225"></a>01225 <span class="keywordflow">else</span> { <span class="comment">// extract and push the last element down heap</span>
+<a name="l01226"></a>01226 *(op->elem) = this->my_array[0].first; <span class="comment">// copy the data</span>
+<a name="l01227"></a>01227 if (mark == this->my_tail) --mark;
+<a name="l01228"></a>01228 --(this->my_tail);
+<a name="l01229"></a>01229 __TBB_store_with_release(op->status, SUCCEEDED);
+<a name="l01230"></a>01230 this->my_array[0].first=this->my_array[this->my_tail].first;
+<a name="l01231"></a>01231 <span class="keywordflow">if</span> (this->my_tail > 1) <span class="comment">// don't reheap for heap of size 1</span>
+<a name="l01232"></a>01232 reheap();
+<a name="l01233"></a>01233 }
+<a name="l01234"></a>01234 }
+<a name="l01235"></a>01235 }
+<a name="l01236"></a>01236 <span class="comment">/* override */</span> <span class="keywordtype">void</span> internal_reserve(prio_operation *op) {
+<a name="l01237"></a>01237 <span class="keywordflow">if</span> (this->my_reserved == <span class="keyword">true</span> || this->my_tail == 0) {
+<a name="l01238"></a>01238 __TBB_store_with_release(op->status, FAILED);
+<a name="l01239"></a>01239 }
+<a name="l01240"></a>01240 <span class="keywordflow">else</span> {
+<a name="l01241"></a>01241 this->my_reserved = <span class="keyword">true</span>;
+<a name="l01242"></a>01242 *(op->elem) = reserved_item = this->my_array[0].first;
+<a name="l01243"></a>01243 if (mark == this->my_tail) --mark;
+<a name="l01244"></a>01244 --(this->my_tail);
+<a name="l01245"></a>01245 __TBB_store_with_release(op->status, SUCCEEDED);
+<a name="l01246"></a>01246 this->my_array[0].first = this->my_array[this->my_tail].first;
+<a name="l01247"></a>01247 <span class="keywordflow">if</span> (this->my_tail > 1) <span class="comment">// don't reheap for heap of size 1</span>
+<a name="l01248"></a>01248 reheap();
+<a name="l01249"></a>01249 }
+<a name="l01250"></a>01250 }
+<a name="l01251"></a>01251 <span class="comment">/* override */</span> <span class="keywordtype">void</span> internal_consume(prio_operation *op) {
+<a name="l01252"></a>01252 this->my_reserved = <span class="keyword">false</span>;
+<a name="l01253"></a>01253 __TBB_store_with_release(op->status, SUCCEEDED);
+<a name="l01254"></a>01254 }
+<a name="l01255"></a>01255 <span class="comment">/* override */</span> <span class="keywordtype">void</span> internal_release(prio_operation *op) {
+<a name="l01256"></a>01256 <span class="keywordflow">if</span> (this->my_tail >= this->my_array_size)
+<a name="l01257"></a>01257 this->grow_my_array( this->my_tail + 1 );
+<a name="l01258"></a>01258 this->my_array[this->my_tail] = std::make_pair(reserved_item, <span class="keyword">true</span>);
+<a name="l01259"></a>01259 ++(this->my_tail);
+<a name="l01260"></a>01260 this->my_reserved = <span class="keyword">false</span>;
+<a name="l01261"></a>01261 __TBB_store_with_release(op->status, SUCCEEDED);
+<a name="l01262"></a>01262 heapify();
+<a name="l01263"></a>01263 }
+<a name="l01264"></a>01264 <span class="keyword">private</span>:
+<a name="l01265"></a>01265 Compare compare;
+<a name="l01266"></a>01266 size_type mark;
+<a name="l01267"></a>01267 <a class="code" href="a00286.html#b2829b518979874ad3d2a939e14ae7bd">input_type</a> reserved_item;
+<a name="l01268"></a>01268
+<a name="l01269"></a>01269 <span class="keywordtype">void</span> heapify() {
+<a name="l01270"></a>01270 <span class="keywordflow">if</span> (!mark) mark = 1;
+<a name="l01271"></a>01271 <span class="keywordflow">for</span> (; mark<this->my_tail; ++mark) { <span class="comment">// for each unheaped element</span>
+<a name="l01272"></a>01272 size_type cur_pos = mark;
+<a name="l01273"></a>01273 <a class="code" href="a00286.html#b2829b518979874ad3d2a939e14ae7bd">input_type</a> to_place = this->my_array[mark].first;
+<a name="l01274"></a>01274 <span class="keywordflow">do</span> { <span class="comment">// push to_place up the heap</span>
+<a name="l01275"></a>01275 size_type parent = (cur_pos-1)>>1;
+<a name="l01276"></a>01276 <span class="keywordflow">if</span> (!compare(this->my_array[parent].first, to_place))
+<a name="l01277"></a>01277 <span class="keywordflow">break</span>;
+<a name="l01278"></a>01278 this->my_array[cur_pos].first = this->my_array[parent].first;
+<a name="l01279"></a>01279 cur_pos = parent;
+<a name="l01280"></a>01280 } <span class="keywordflow">while</span>( cur_pos );
+<a name="l01281"></a>01281 this->my_array[cur_pos].first = to_place;
+<a name="l01282"></a>01282 }
+<a name="l01283"></a>01283 }
+<a name="l01284"></a>01284
+<a name="l01285"></a>01285 <span class="keywordtype">void</span> reheap() {
+<a name="l01286"></a>01286 size_type cur_pos=0, child=1;
+<a name="l01287"></a>01287 <span class="keywordflow">while</span> (child < mark) {
+<a name="l01288"></a>01288 size_type target = child;
+<a name="l01289"></a>01289 <span class="keywordflow">if</span> (child+1<mark &&
+<a name="l01290"></a>01290 compare(this->my_array[child].first,
+<a name="l01291"></a>01291 this->my_array[child+1].first))
+<a name="l01292"></a>01292 ++target;
+<a name="l01293"></a>01293 <span class="comment">// target now has the higher priority child</span>
+<a name="l01294"></a>01294 <span class="keywordflow">if</span> (compare(this->my_array[target].first,
+<a name="l01295"></a>01295 this->my_array[this->my_tail].first))
+<a name="l01296"></a>01296 <span class="keywordflow">break</span>;
+<a name="l01297"></a>01297 this->my_array[cur_pos].first = this->my_array[target].first;
+<a name="l01298"></a>01298 cur_pos = target;
+<a name="l01299"></a>01299 child = (cur_pos<<1)+1;
+<a name="l01300"></a>01300 }
+<a name="l01301"></a>01301 this->my_array[cur_pos].first = this->my_array[this->my_tail].first;
+<a name="l01302"></a>01302 }
+<a name="l01303"></a>01303 };
+<a name="l01304"></a>01304
+<a name="l01306"></a>01306
+<a name="l01309"></a>01309 <span class="keyword">template</span>< <span class="keyword">typename</span> T >
+<a name="l01310"></a><a class="code" href="a00266.html">01310</a> <span class="keyword">class </span><a class="code" href="a00266.html">limiter_node</a> : <span class="keyword">public</span> <a class="code" href="a00263.html">graph_node</a>, <span class="keyword">public</span> <a class="code" href="a00295.html">receiver</a>< T >, <span class="keyword">public</span> <a class="code" href="a00301.html">sender</a>< T > {
+<a name="l01311"></a>01311 <span class="keyword">public</span>:
+<a name="l01312"></a>01312
+<a name="l01313"></a><a class="code" href="a00266.html#035196d3c9240ef041f528ebcde8baa7">01313</a> <span class="keyword">typedef</span> T <a class="code" href="a00266.html#035196d3c9240ef041f528ebcde8baa7">input_type</a>;
+<a name="l01314"></a><a class="code" href="a00266.html#6e67fc480147c0b88a483b85db6457b0">01314</a> <span class="keyword">typedef</span> T output_type;
+<a name="l01315"></a><a class="code" href="a00266.html#f89fcf44f38eb33f965ee5362d3e68e9">01315</a> <span class="keyword">typedef</span> <a class="code" href="a00301.html">sender< input_type ></a> <a class="code" href="a00301.html">predecessor_type</a>;
+<a name="l01316"></a><a class="code" href="a00266.html#e8945e4dd6ea759ff9e4735da13f12ef">01316</a> <span class="keyword">typedef</span> <a class="code" href="a00295.html">receiver< output_type ></a> <a class="code" href="a00295.html">successor_type</a>;
+<a name="l01317"></a>01317
+<a name="l01318"></a>01318 <span class="keyword">private</span>:
+<a name="l01319"></a>01319
+<a name="l01320"></a>01320 <a class="code" href="a00311.html">task</a> *my_root_task;
+<a name="l01321"></a>01321 size_t my_threshold;
+<a name="l01322"></a>01322 size_t my_count;
+<a name="l01323"></a>01323 internal::predecessor_cache< T > my_predecessors;
+<a name="l01324"></a>01324 <a class="code" href="a00305.html">spin_mutex</a> my_mutex;
+<a name="l01325"></a>01325 internal::broadcast_cache< T > my_successors;
+<a name="l01326"></a>01326 <span class="keywordtype">int</span> init_decrement_predecessors;
+<a name="l01327"></a>01327
+<a name="l01328"></a>01328 <span class="keyword">friend</span> <span class="keyword">class </span>internal::forward_task< limiter_node<T> >;
+<a name="l01329"></a>01329
+<a name="l01330"></a>01330 <span class="comment">// Let decrementer call decrement_counter()</span>
+<a name="l01331"></a>01331 <span class="keyword">friend</span> <span class="keyword">class </span>internal::decrementer< limiter_node<T> >;
+<a name="l01332"></a>01332
+<a name="l01333"></a>01333 <span class="keywordtype">void</span> decrement_counter() {
+<a name="l01334"></a>01334 <a class="code" href="a00266.html#035196d3c9240ef041f528ebcde8baa7">input_type</a> v;
+<a name="l01335"></a>01335
+<a name="l01336"></a>01336 <span class="comment">// If we can't get / put an item immediately then drop the count</span>
+<a name="l01337"></a>01337 <span class="keywordflow">if</span> ( my_predecessors.get_item( v ) == <span class="keyword">false</span>
+<a name="l01338"></a>01338 || my_successors.try_put(v) == false ) {
+<a name="l01339"></a>01339 <a class="code" href="a00306.html">spin_mutex::scoped_lock</a> lock(my_mutex);
+<a name="l01340"></a>01340 --my_count;
+<a name="l01341"></a>01341 <span class="keywordflow">if</span> ( !my_predecessors.empty() )
+<a name="l01342"></a>01342 <a class="code" href="a00311.html#8365d063c0cc9d7bd616bca47256b93c">task::enqueue</a>( * <span class="keyword">new</span> ( task::allocate_additional_child_of( *my_root_task ) )
+<a name="l01343"></a>01343 internal::forward_task< <a class="code" href="a00266.html">limiter_node<T></a> >( *<span class="keyword">this</span> ) );
+<a name="l01344"></a>01344 }
+<a name="l01345"></a>01345 }
+<a name="l01346"></a>01346
+<a name="l01347"></a>01347 <span class="keywordtype">void</span> forward() {
+<a name="l01348"></a>01348 {
+<a name="l01349"></a>01349 <a class="code" href="a00306.html">spin_mutex::scoped_lock</a> lock(my_mutex);
+<a name="l01350"></a>01350 <span class="keywordflow">if</span> ( my_count < my_threshold )
+<a name="l01351"></a>01351 ++my_count;
+<a name="l01352"></a>01352 <span class="keywordflow">else</span>
+<a name="l01353"></a>01353 <span class="keywordflow">return</span>;
+<a name="l01354"></a>01354 }
+<a name="l01355"></a>01355 decrement_counter();
+<a name="l01356"></a>01356 }
+<a name="l01357"></a>01357
+<a name="l01358"></a>01358 <span class="keyword">public</span>:
+<a name="l01359"></a>01359
+<a name="l01361"></a><a class="code" href="a00266.html#a3344b2461966631b6ee34b79fb105c7">01361</a> internal::decrementer< limiter_node<T> > <a class="code" href="a00266.html#a3344b2461966631b6ee34b79fb105c7">decrement</a>;
+<a name="l01362"></a>01362
+<a name="l01364"></a><a class="code" href="a00266.html#831b06576f46fe2bf3ed0f86b793c1b2">01364</a> <a class="code" href="a00266.html#831b06576f46fe2bf3ed0f86b793c1b2">limiter_node</a>(<a class="code" href="a00262.html">graph</a> &g, size_t threshold, <span class="keywordtype">int</span> num_decrement_predecessors=0) :
+<a name="l01365"></a>01365 my_root_task(g.root_task()), my_threshold(threshold), my_count(0),
+<a name="l01366"></a>01366 init_decrement_predecessors(num_decrement_predecessors),
+<a name="l01367"></a>01367 <a class="code" href="a00266.html#a3344b2461966631b6ee34b79fb105c7">decrement</a>(num_decrement_predecessors)
+<a name="l01368"></a>01368 {
+<a name="l01369"></a>01369 my_predecessors.set_owner(<span class="keyword">this</span>);
+<a name="l01370"></a>01370 my_successors.set_owner(<span class="keyword">this</span>);
+<a name="l01371"></a>01371 <a class="code" href="a00266.html#a3344b2461966631b6ee34b79fb105c7">decrement</a>.set_owner(<span class="keyword">this</span>);
+<a name="l01372"></a>01372 }
+<a name="l01373"></a>01373
+<a name="l01375"></a><a class="code" href="a00266.html#83d3ab884543b070ee5b345a87f241fa">01375</a> <a class="code" href="a00266.html#831b06576f46fe2bf3ed0f86b793c1b2">limiter_node</a>( <span class="keyword">const</span> limiter_node& src ) :
+<a name="l01376"></a>01376 <a class="code" href="a00263.html">graph_node</a>(), <a class="code" href="a00295.html">receiver</a><T>(), <a class="code" href="a00301.html">sender</a><T>(),
+<a name="l01377"></a>01377 my_root_task(src.my_root_task), my_threshold(src.my_threshold), my_count(0),
+<a name="l01378"></a>01378 init_decrement_predecessors(src.init_decrement_predecessors),
+<a name="l01379"></a>01379 <a class="code" href="a00266.html#a3344b2461966631b6ee34b79fb105c7">decrement</a>(src.init_decrement_predecessors)
+<a name="l01380"></a>01380 {
+<a name="l01381"></a>01381 my_predecessors.set_owner(<span class="keyword">this</span>);
+<a name="l01382"></a>01382 my_successors.set_owner(<span class="keyword">this</span>);
+<a name="l01383"></a>01383 <a class="code" href="a00266.html#a3344b2461966631b6ee34b79fb105c7">decrement</a>.set_owner(<span class="keyword">this</span>);
+<a name="l01384"></a>01384 }
+<a name="l01385"></a>01385
+<a name="l01387"></a><a class="code" href="a00266.html#c76561d8d871b4769876988a4de12a9b">01387</a> <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00266.html#c76561d8d871b4769876988a4de12a9b">register_successor</a>( <a class="code" href="a00295.html">receiver<output_type></a> &r ) {
+<a name="l01388"></a>01388 my_successors.register_successor(r);
+<a name="l01389"></a>01389 <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l01390"></a>01390 }
+<a name="l01391"></a>01391
+<a name="l01393"></a>01393
+<a name="l01394"></a><a class="code" href="a00266.html#275e328063c121b3e506ccef2a825d28">01394</a> <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00266.html#275e328063c121b3e506ccef2a825d28">remove_successor</a>( <a class="code" href="a00295.html">receiver<output_type></a> &r ) {
+<a name="l01395"></a>01395 r.<a class="code" href="a00295.html#3bc76547b51d3c9b633e3987d22dce95">remove_predecessor</a>(*<span class="keyword">this</span>);
+<a name="l01396"></a>01396 my_successors.remove_successor(r);
+<a name="l01397"></a>01397 <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l01398"></a>01398 }
+<a name="l01399"></a>01399
+<a name="l01401"></a><a class="code" href="a00266.html#55a02d458a4d8ffa6accd7a70605da2f">01401</a> <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00266.html#55a02d458a4d8ffa6accd7a70605da2f">try_put</a>( <span class="keyword">const</span> T &t ) {
+<a name="l01402"></a>01402 {
+<a name="l01403"></a>01403 <a class="code" href="a00306.html">spin_mutex::scoped_lock</a> lock(my_mutex);
+<a name="l01404"></a>01404 <span class="keywordflow">if</span> ( my_count >= my_threshold )
+<a name="l01405"></a>01405 <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l01406"></a>01406 <span class="keywordflow">else</span>
+<a name="l01407"></a>01407 ++my_count;
+<a name="l01408"></a>01408 }
+<a name="l01409"></a>01409
+<a name="l01410"></a>01410 <span class="keywordtype">bool</span> msg = my_successors.try_put(t);
+<a name="l01411"></a>01411
+<a name="l01412"></a>01412 <span class="keywordflow">if</span> ( msg != <span class="keyword">true</span> ) {
+<a name="l01413"></a>01413 <a class="code" href="a00306.html">spin_mutex::scoped_lock</a> lock(my_mutex);
+<a name="l01414"></a>01414 --my_count;
+<a name="l01415"></a>01415 <span class="keywordflow">if</span> ( !my_predecessors.empty() )
+<a name="l01416"></a>01416 <a class="code" href="a00311.html#8365d063c0cc9d7bd616bca47256b93c">task::enqueue</a>( * <span class="keyword">new</span> ( task::allocate_additional_child_of( *my_root_task ) )
+<a name="l01417"></a>01417 internal::forward_task< <a class="code" href="a00266.html">limiter_node<T></a> >( *<span class="keyword">this</span> ) );
+<a name="l01418"></a>01418 }
+<a name="l01419"></a>01419
+<a name="l01420"></a>01420 <span class="keywordflow">return</span> msg;
+<a name="l01421"></a>01421 }
+<a name="l01422"></a>01422
+<a name="l01424"></a><a class="code" href="a00266.html#de70a0e88ce7655d8c14b6af57f7496f">01424</a> <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00266.html#de70a0e88ce7655d8c14b6af57f7496f">register_predecessor</a>( <a class="code" href="a00301.html">predecessor_type</a> &src ) {
+<a name="l01425"></a>01425 <a class="code" href="a00306.html">spin_mutex::scoped_lock</a> lock(my_mutex);
+<a name="l01426"></a>01426 my_predecessors.add( src );
+<a name="l01427"></a>01427 <span class="keywordflow">if</span> ( my_count < my_threshold && !my_successors.empty() )
+<a name="l01428"></a>01428 <a class="code" href="a00311.html#8365d063c0cc9d7bd616bca47256b93c">task::enqueue</a>( * <span class="keyword">new</span> ( task::allocate_additional_child_of( *my_root_task ) )
+<a name="l01429"></a>01429 internal::forward_task< <a class="code" href="a00266.html">limiter_node<T></a> >( *<span class="keyword">this</span> ) );
+<a name="l01430"></a>01430 <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l01431"></a>01431 }
+<a name="l01432"></a>01432
+<a name="l01434"></a><a class="code" href="a00266.html#c530e7b469454e2340460795f2da3317">01434</a> <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00266.html#c530e7b469454e2340460795f2da3317">remove_predecessor</a>( <a class="code" href="a00301.html">predecessor_type</a> &src ) {
+<a name="l01435"></a>01435 my_predecessors.remove( src );
+<a name="l01436"></a>01436 <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l01437"></a>01437 }
+<a name="l01438"></a>01438
+<a name="l01439"></a>01439 };
+<a name="l01440"></a>01440
+<a name="l01441"></a>01441 <span class="preprocessor">#include "internal/_flow_graph_join_impl.h"</span>
+<a name="l01442"></a>01442
+<a name="l01443"></a>01443 <span class="keyword">using</span> internal::reserving_port;
+<a name="l01444"></a>01444 <span class="keyword">using</span> internal::queueing_port;
+<a name="l01445"></a>01445 <span class="keyword">using</span> internal::tag_matching_port;
+<a name="l01446"></a>01446 <span class="keyword">using</span> internal::input_port;
+<a name="l01447"></a>01447 <span class="keyword">using</span> internal::tag_value;
+<a name="l01448"></a>01448 <span class="keyword">using</span> internal::NO_TAG;
+<a name="l01449"></a>01449
+<a name="l01450"></a>01450 <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="l01451"></a>01451
+<a name="l01452"></a>01452 <span class="keyword">template</span><<span class="keyword">typename</span> OutputTuple>
+<a name="l01453"></a>01453 <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="l01454"></a>01454 <span class="keyword">private</span>:
+<a name="l01455"></a>01455 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">int</span> N = std::tuple_size<OutputTuple>::value;
+<a name="l01456"></a>01456 <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::unfolded_join_node<N, reserving_port, OutputTuple, reserving> unfolded_type;
+<a name="l01457"></a>01457 <span class="keyword">public</span>:
+<a name="l01458"></a>01458 <span class="keyword">typedef</span> OutputTuple output_type;
+<a name="l01459"></a>01459 <span class="keyword">typedef</span> <span class="keyword">typename</span> unfolded_type::input_ports_tuple_type input_ports_tuple_type;
+<a name="l01460"></a>01460 join_node(<a class="code" href="a00262.html">graph</a> &g) : unfolded_type(g) { }
+<a name="l01461"></a>01461 join_node(<span class="keyword">const</span> join_node &other) : unfolded_type(other) {}
+<a name="l01462"></a>01462 };
+<a name="l01463"></a>01463
+<a name="l01464"></a>01464 <span class="keyword">template</span><<span class="keyword">typename</span> OutputTuple>
+<a name="l01465"></a>01465 <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="l01466"></a>01466 <span class="keyword">private</span>:
+<a name="l01467"></a>01467 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">int</span> N = std::tuple_size<OutputTuple>::value;
+<a name="l01468"></a>01468 <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::unfolded_join_node<N, queueing_port, OutputTuple, queueing> unfolded_type;
+<a name="l01469"></a>01469 <span class="keyword">public</span>:
+<a name="l01470"></a>01470 <span class="keyword">typedef</span> OutputTuple output_type;
+<a name="l01471"></a>01471 <span class="keyword">typedef</span> <span class="keyword">typename</span> unfolded_type::input_ports_tuple_type input_ports_tuple_type;
+<a name="l01472"></a>01472 join_node(graph &g) : unfolded_type(g) { }
+<a name="l01473"></a>01473 join_node(<span class="keyword">const</span> join_node &other) : unfolded_type(other) {}
+<a name="l01474"></a>01474 };
+<a name="l01475"></a>01475
+<a name="l01476"></a>01476 <span class="comment">// template for tag_matching join_node</span>
+<a name="l01477"></a>01477 <span class="keyword">template</span><<span class="keyword">typename</span> OutputTuple>
+<a name="l01478"></a>01478 <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="l01479"></a>01479 tag_matching_port, OutputTuple, tag_matching> {
+<a name="l01480"></a>01480 <span class="keyword">private</span>:
+<a name="l01481"></a>01481 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">int</span> N = std::tuple_size<OutputTuple>::value;
+<a name="l01482"></a>01482 <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="l01483"></a>01483 <span class="keyword">public</span>:
+<a name="l01484"></a>01484 <span class="keyword">typedef</span> OutputTuple output_type;
+<a name="l01485"></a>01485 <span class="keyword">typedef</span> <span class="keyword">typename</span> unfolded_type::input_ports_tuple_type input_ports_tuple_type;
+<a name="l01486"></a>01486 <span class="keyword">template</span><<span class="keyword">typename</span> B0, <span class="keyword">typename</span> B1>
+<a name="l01487"></a>01487 join_node(graph &g, B0 b0, B1 b1) : unfolded_type(g, b0, b1) { }
+<a name="l01488"></a>01488 <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="l01489"></a>01489 join_node(graph &g, B0 b0, B1 b1, B2 b2) : unfolded_type(g, b0, b1, b2) { }
+<a name="l01490"></a>01490 <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="l01491"></a>01491 join_node(graph &g, B0 b0, B1 b1, B2 b2, B3 b3) : unfolded_type(g, b0, b1, b2, b3) { }
+<a name="l01492"></a>01492 <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="l01493"></a>01493 join_node(graph &g, B0 b0, B1 b1, B2 b2, B3 b3, B4 b4) : unfolded_type(g, b0, b1, b2, b3, b4) { }
+<a name="l01494"></a>01494 <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="l01495"></a>01495 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="l01496"></a>01496 <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="l01497"></a>01497 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="l01498"></a>01498 <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="l01499"></a>01499 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="l01500"></a>01500 <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="l01501"></a>01501 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="l01502"></a>01502 <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 class="keyword">typename</span> B9>
+<a name="l01503"></a>01503 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="l01504"></a>01504 join_node(<span class="keyword">const</span> join_node &other) : unfolded_type(other) {}
+<a name="l01505"></a>01505 };
+<a name="l01506"></a>01506
+<a name="l01507"></a>01507 <span class="preprocessor">#if TBB_PREVIEW_GRAPH_NODES</span>
+<a name="l01508"></a>01508 <span class="preprocessor"></span><span class="comment">// or node</span>
+<a name="l01509"></a>01509 <span class="preprocessor">#include "internal/_flow_graph_or_impl.h"</span>
+<a name="l01510"></a>01510
+<a name="l01511"></a>01511 <span class="keyword">template</span><<span class="keyword">typename</span> InputTuple>
+<a name="l01512"></a>01512 <span class="keyword">class </span>or_node : <span class="keyword">public</span> internal::unfolded_or_node<InputTuple> {
+<a name="l01513"></a>01513 <span class="keyword">private</span>:
+<a name="l01514"></a>01514 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">int</span> N = std::tuple_size<InputTuple>::value;
+<a name="l01515"></a>01515 <span class="keyword">public</span>:
+<a name="l01516"></a>01516 <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::or_output_type<InputTuple>::type output_type;
+<a name="l01517"></a>01517 <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::unfolded_or_node<InputTuple> unfolded_type;
+<a name="l01518"></a>01518 or_node() : unfolded_type() { }
+<a name="l01519"></a>01519 <span class="comment">// Copy constructor</span>
+<a name="l01520"></a>01520 or_node( <span class="keyword">const</span> or_node& <span class="comment">/*other*/</span> ) : unfolded_type() { }
+<a name="l01521"></a>01521 };
+<a name="l01522"></a>01522 <span class="preprocessor">#endif // TBB_PREVIEW_GRAPH_NODES</span>
+<a name="l01523"></a>01523 <span class="preprocessor"></span>
+<a name="l01525"></a>01525 <span class="keyword">template</span>< <span class="keyword">typename</span> T >
+<a name="l01526"></a>01526 <span class="keyword">inline</span> <span class="keywordtype">void</span> make_edge( sender<T> &p, receiver<T> &s ) {
+<a name="l01527"></a>01527 p.register_successor( s );
+<a name="l01528"></a>01528 }
+<a name="l01529"></a>01529
+<a name="l01531"></a>01531 <span class="keyword">template</span>< <span class="keyword">typename</span> T >
+<a name="l01532"></a>01532 <span class="keyword">inline</span> <span class="keywordtype">void</span> remove_edge( sender<T> &p, receiver<T> &s ) {
+<a name="l01533"></a>01533 p.remove_successor( s );
+<a name="l01534"></a>01534 }
+<a name="l01535"></a>01535
+<a name="l01537"></a>01537 <span class="keyword">template</span>< <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Node >
+<a name="l01538"></a>01538 Body copy_body( Node &n ) {
+<a name="l01539"></a>01539 <span class="keywordflow">return</span> n.template copy_function_object<Body>();
+<a name="l01540"></a>01540 }
+<a name="l01541"></a>01541
+<a name="l01542"></a>01542
+<a name="l01543"></a>01543 } <span class="comment">// interface6</span>
+<a name="l01544"></a>01544
+<a name="l01545"></a>01545 <span class="keyword">using</span> interface6::graph;
+<a name="l01546"></a>01546 <span class="keyword">using</span> interface6::graph_node;
+<a name="l01547"></a>01547 <span class="keyword">using</span> interface6::continue_msg;
+<a name="l01548"></a>01548 <span class="keyword">using</span> interface6::sender;
+<a name="l01549"></a>01549 <span class="keyword">using</span> interface6::receiver;
+<a name="l01550"></a>01550 <span class="keyword">using</span> interface6::continue_receiver;
+<a name="l01551"></a>01551
+<a name="l01552"></a>01552 <span class="keyword">using</span> interface6::source_node;
+<a name="l01553"></a>01553 <span class="keyword">using</span> interface6::function_node;
+<a name="l01554"></a>01554 <span class="preprocessor">#if TBB_PREVIEW_GRAPH_NODES</span>
+<a name="l01555"></a>01555 <span class="preprocessor"></span> <span class="keyword">using</span> interface6::multioutput_function_node;
+<a name="l01556"></a>01556 <span class="keyword">using</span> interface6::split_node;
+<a name="l01557"></a>01557 <span class="keyword">using</span> interface6::internal::output_port;
+<a name="l01558"></a>01558 <span class="keyword">using</span> interface6::or_node;
+<a name="l01559"></a>01559 <span class="preprocessor">#endif</span>
+<a name="l01560"></a>01560 <span class="preprocessor"></span> <span class="keyword">using</span> interface6::continue_node;
+<a name="l01561"></a>01561 <span class="keyword">using</span> interface6::overwrite_node;
+<a name="l01562"></a>01562 <span class="keyword">using</span> interface6::write_once_node;
+<a name="l01563"></a>01563 <span class="keyword">using</span> interface6::broadcast_node;
+<a name="l01564"></a>01564 <span class="keyword">using</span> interface6::buffer_node;
+<a name="l01565"></a>01565 <span class="keyword">using</span> interface6::queue_node;
+<a name="l01566"></a>01566 <span class="keyword">using</span> interface6::sequencer_node;
+<a name="l01567"></a>01567 <span class="keyword">using</span> interface6::priority_queue_node;
+<a name="l01568"></a>01568 <span class="keyword">using</span> interface6::limiter_node;
+<a name="l01569"></a>01569 <span class="keyword">using namespace </span>interface6::internal::graph_policy_namespace;
+<a name="l01570"></a>01570 <span class="keyword">using</span> interface6::join_node;
+<a name="l01571"></a>01571 <span class="keyword">using</span> interface6::input_port;
+<a name="l01572"></a>01572 <span class="keyword">using</span> interface6::copy_body;
+<a name="l01573"></a>01573 <span class="keyword">using</span> interface6::make_edge;
+<a name="l01574"></a>01574 <span class="keyword">using</span> interface6::remove_edge;
+<a name="l01575"></a>01575 <span class="keyword">using</span> interface6::internal::NO_TAG;
+<a name="l01576"></a>01576 <span class="keyword">using</span> interface6::internal::tag_value;
+<a name="l01577"></a>01577
+<a name="l01578"></a>01578 } <span class="comment">// flow</span>
+<a name="l01579"></a>01579 } <span class="comment">// tbb</span>
+<a name="l01580"></a>01580
+<a name="l01581"></a>01581 <span class="preprocessor">#endif // __TBB_flow_graph_H</span>
+</pre></div><hr>
+<p></p>
+Copyright © 2005-2011 Intel Corporation. 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
new file mode 100644
index 0000000..9b4b4cc
--- /dev/null
+++ b/doc/html/a00480.html
@@ -0,0 +1,259 @@
+<!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="a00344.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-2011 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="a00363.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: Itanium requires linkage with TBB library</span>
+<a name="l00032"></a>00032 <span class="preprocessor">#include <new></span> <span class="comment">// std::bad_alloc</span>
+<a name="l00033"></a>00033
+<a name="l00034"></a>00034 <span class="preprocessor">#if __TBB_EXTRA_DEBUG</span>
+<a name="l00035"></a>00035 <span class="preprocessor"></span><span class="preprocessor">#define __TBBMALLOC_ASSERT ASSERT</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">#define __TBBMALLOC_ASSERT(a,b) ((void)0)</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="keyword">namespace </span>tbb {
+<a name="l00041"></a>00041 <span class="keyword">namespace </span>interface6 {
+<a name="l00043"></a>00043 <span class="keyword">namespace </span>internal {
+<a name="l00044"></a>00044
+<a name="l00046"></a>00046 <span class="keyword">class </span>pool_base : tbb::internal::no_copy {
+<a name="l00047"></a>00047 <span class="comment">// Pool interface is separate from standard allocator classes because it has</span>
+<a name="l00048"></a>00048 <span class="comment">// to maintain internal state, no copy or assignment. Move and swap are possible.</span>
+<a name="l00049"></a>00049 <span class="keyword">public</span>:
+<a name="l00051"></a>00051 <span class="keywordtype">void</span> recycle() { rml::pool_reset(my_pool); }
+<a name="l00052"></a>00052
+<a name="l00054"></a>00054 <span class="keywordtype">void</span> *malloc(size_t size) { <span class="keywordflow">return</span> rml::pool_malloc(my_pool, size); }
+<a name="l00055"></a>00055
+<a name="l00057"></a>00057 <span class="keywordtype">void</span> free(<span class="keywordtype">void</span>* ptr) { rml::pool_free(my_pool, ptr); }
+<a name="l00058"></a>00058
+<a name="l00060"></a>00060 <span class="comment">// Enables some low-level optimization possibilities</span>
+<a name="l00061"></a>00061 <span class="keywordtype">void</span> *realloc(<span class="keywordtype">void</span>* ptr, size_t size) {
+<a name="l00062"></a>00062 <span class="keywordflow">return</span> rml::pool_realloc(my_pool, ptr, size);
+<a name="l00063"></a>00063 }
+<a name="l00064"></a>00064
+<a name="l00065"></a>00065 <span class="keyword">protected</span>:
+<a name="l00067"></a>00067 <span class="keywordtype">void</span> destroy() { rml::pool_destroy(my_pool); }
+<a name="l00068"></a>00068
+<a name="l00069"></a>00069 rml::MemoryPool *my_pool;
+<a name="l00070"></a>00070 };
+<a name="l00071"></a>00071
+<a name="l00072"></a>00072 } <span class="comment">// namespace internal</span>
+<a name="l00074"></a>00074 <span class="comment"></span>
+<a name="l00075"></a>00075 <span class="preprocessor">#if _MSC_VER && !defined(__INTEL_COMPILER)</span>
+<a name="l00076"></a>00076 <span class="preprocessor"></span> <span class="comment">// Workaround for erroneous "unreferenced parameter" warning in method destroy.</span>
+<a name="l00077"></a>00077 <span class="preprocessor"> #pragma warning (push)</span>
+<a name="l00078"></a>00078 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (disable: 4100)</span>
+<a name="l00079"></a>00079 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00080"></a>00080 <span class="preprocessor"></span>
+<a name="l00082"></a>00082
+<a name="l00083"></a>00083 <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="l00084"></a><a class="code" href="a00270.html">00084</a> <span class="keyword">class </span><a class="code" href="a00270.html">memory_pool_allocator</a> {
+<a name="l00085"></a>00085 <span class="keyword">protected</span>:
+<a name="l00086"></a>00086 <span class="keyword">typedef</span> P pool_type;
+<a name="l00087"></a>00087 pool_type *my_pool;
+<a name="l00088"></a>00088 <span class="keyword">template</span><<span class="keyword">typename</span> U, <span class="keyword">typename</span> R>
+<a name="l00089"></a>00089 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00270.html">memory_pool_allocator</a>;
+<a name="l00090"></a>00090 <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="l00091"></a>00091 <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> <a class="code" href="a00270.html">memory_pool_allocator<V,R></a>& a, <span class="keyword">const</span> <a class="code" href="a00270.html">memory_pool_allocator<U,R></a>& b);
+<a name="l00092"></a>00092 <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="l00093"></a>00093 <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator!=( <span class="keyword">const</span> <a class="code" href="a00270.html">memory_pool_allocator<V,R></a>& a, <span class="keyword">const</span> <a class="code" href="a00270.html">memory_pool_allocator<U,R></a>& b);
+<a name="l00094"></a>00094 <span class="keyword">public</span>:
+<a name="l00095"></a>00095 <span class="keyword">typedef</span> <span class="keyword">typename</span> tbb::internal::allocator_type<T>::value_type value_type;
+<a name="l00096"></a>00096 <span class="keyword">typedef</span> value_type* pointer;
+<a name="l00097"></a>00097 <span class="keyword">typedef</span> <span class="keyword">const</span> value_type* const_pointer;
+<a name="l00098"></a>00098 <span class="keyword">typedef</span> value_type& reference;
+<a name="l00099"></a>00099 <span class="keyword">typedef</span> <span class="keyword">const</span> value_type& const_reference;
+<a name="l00100"></a>00100 <span class="keyword">typedef</span> size_t size_type;
+<a name="l00101"></a>00101 <span class="keyword">typedef</span> ptrdiff_t difference_type;
+<a name="l00102"></a>00102 <span class="keyword">template</span><<span class="keyword">typename</span> U> <span class="keyword">struct </span>rebind {
+<a name="l00103"></a>00103 <span class="keyword">typedef</span> <a class="code" href="a00270.html">memory_pool_allocator<U, P></a> other;
+<a name="l00104"></a>00104 };
+<a name="l00105"></a>00105
+<a name="l00106"></a>00106 <a class="code" href="a00270.html">memory_pool_allocator</a>(pool_type &pool) <span class="keywordflow">throw</span>() : my_pool(&pool) {}
+<a name="l00107"></a>00107 <a class="code" href="a00270.html">memory_pool_allocator</a>(<span class="keyword">const</span> <a class="code" href="a00270.html">memory_pool_allocator</a>& src) <span class="keywordflow">throw</span>() : my_pool(src.<a class="code" href="a00270.html#9f22e947018eb99cde5f44ee3d339499">my_pool</a>) {}
+<a name="l00108"></a>00108 <span class="keyword">template</span><<span class="keyword">typename</span> U>
+<a name="l00109"></a>00109 <a class="code" href="a00270.html">memory_pool_allocator</a>(<span class="keyword">const</span> <a class="code" href="a00270.html">memory_pool_allocator<U,P></a>& src) <span class="keywordflow">throw</span>() : my_pool(src.<a class="code" href="a00270.html#9f22e947018eb99cde5f44ee3d339499">my_pool</a>) {}
+<a name="l00110"></a>00110
+<a name="l00111"></a>00111 pointer address(reference x)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> &x; }
+<a name="l00112"></a>00112 const_pointer address(const_reference x)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> &x; }
+<a name="l00113"></a>00113
+<a name="l00115"></a><a class="code" href="a00270.html#365bd64d284c80d85bb2149a12681526">00115</a> pointer <a class="code" href="a00270.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="l00116"></a>00116 <span class="keywordflow">return</span> static_cast<pointer>( my_pool->malloc( n*<span class="keyword">sizeof</span>(value_type) ) );
+<a name="l00117"></a>00117 }
+<a name="l00119"></a><a class="code" href="a00270.html#4e24a03de38638af07548383024c54ab">00119</a> <span class="keywordtype">void</span> <a class="code" href="a00270.html#4e24a03de38638af07548383024c54ab">deallocate</a>( pointer p, size_type ) {
+<a name="l00120"></a>00120 my_pool->free(p);
+<a name="l00121"></a>00121 }
+<a name="l00123"></a><a class="code" href="a00270.html#beebdb6144df8ba219fadfad4de866ea">00123</a> size_type <a class="code" href="a00270.html#beebdb6144df8ba219fadfad4de866ea">max_size</a>() const throw() {
+<a name="l00124"></a>00124 size_type max = static_cast<size_type>(-1) / <span class="keyword">sizeof</span> (value_type);
+<a name="l00125"></a>00125 <span class="keywordflow">return</span> (max > 0 ? max : 1);
+<a name="l00126"></a>00126 }
+<a name="l00128"></a><a class="code" href="a00270.html#c7e1671b725894b94ce9a6ac544e24f2">00128</a> <span class="keywordtype">void</span> <a class="code" href="a00270.html#c7e1671b725894b94ce9a6ac544e24f2">construct</a>( pointer p, <span class="keyword">const</span> value_type& value ) { ::new((<span class="keywordtype">void</span>*)(p)) value_type(value); }
+<a name="l00129"></a>00129
+<a name="l00131"></a><a class="code" href="a00270.html#a3af27e1f8535cc512134ec9a82ff4fc">00131</a> <span class="keywordtype">void</span> <a class="code" href="a00270.html#a3af27e1f8535cc512134ec9a82ff4fc">destroy</a>( pointer p ) { p->~value_type(); }
+<a name="l00132"></a>00132
+<a name="l00133"></a>00133 };
+<a name="l00134"></a>00134
+<a name="l00135"></a>00135 <span class="preprocessor">#if _MSC_VER && !defined(__INTEL_COMPILER)</span>
+<a name="l00136"></a>00136 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (pop)</span>
+<a name="l00137"></a>00137 <span class="preprocessor"></span><span class="preprocessor">#endif // warning 4100 is back</span>
+<a name="l00138"></a>00138 <span class="preprocessor"></span>
+<a name="l00140"></a>00140
+<a name="l00141"></a>00141 <span class="keyword">template</span><<span class="keyword">typename</span> P>
+<a name="l00142"></a><a class="code" href="a00271.html">00142</a> <span class="keyword">class </span><a class="code" href="a00270.html">memory_pool_allocator</a><void, P> {
+<a name="l00143"></a>00143 <span class="keyword">public</span>:
+<a name="l00144"></a>00144 <span class="keyword">typedef</span> P pool_type;
+<a name="l00145"></a>00145 <span class="keyword">typedef</span> <span class="keywordtype">void</span>* pointer;
+<a name="l00146"></a>00146 <span class="keyword">typedef</span> <span class="keyword">const</span> <span class="keywordtype">void</span>* const_pointer;
+<a name="l00147"></a>00147 <span class="keyword">typedef</span> <span class="keywordtype">void</span> value_type;
+<a name="l00148"></a>00148 <span class="keyword">template</span><<span class="keyword">typename</span> U> <span class="keyword">struct </span>rebind {
+<a name="l00149"></a>00149 <span class="keyword">typedef</span> <a class="code" href="a00270.html">memory_pool_allocator<U, P></a> other;
+<a name="l00150"></a>00150 };
+<a name="l00151"></a>00151
+<a name="l00152"></a>00152 <a class="code" href="a00270.html">memory_pool_allocator</a>( pool_type &pool) <span class="keywordflow">throw</span>() : my_pool(&pool) {}
+<a name="l00153"></a>00153 <a class="code" href="a00270.html">memory_pool_allocator</a>( <span class="keyword">const</span> <a class="code" href="a00270.html">memory_pool_allocator</a>& src) <span class="keywordflow">throw</span>() : my_pool(src.<a class="code" href="a00270.html#9f22e947018eb99cde5f44ee3d339499">my_pool</a>) {}
+<a name="l00154"></a>00154 <span class="keyword">template</span><<span class="keyword">typename</span> U>
+<a name="l00155"></a>00155 <a class="code" href="a00270.html">memory_pool_allocator</a>(<span class="keyword">const</span> <a class="code" href="a00270.html">memory_pool_allocator<U,P></a>& src) <span class="keywordflow">throw</span>() : my_pool(src.<a class="code" href="a00270.html#9f22e947018eb99cde5f44ee3d339499">my_pool</a>) {}
+<a name="l00156"></a>00156
+<a name="l00157"></a>00157 <span class="keyword">protected</span>:
+<a name="l00158"></a>00158 pool_type *my_pool;
+<a name="l00159"></a>00159 <span class="keyword">template</span><<span class="keyword">typename</span> U, <span class="keyword">typename</span> R>
+<a name="l00160"></a>00160 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00270.html">memory_pool_allocator</a>;
+<a name="l00161"></a>00161 <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="l00162"></a>00162 <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> <a class="code" href="a00270.html">memory_pool_allocator<V,R></a>& a, <span class="keyword">const</span> <a class="code" href="a00270.html">memory_pool_allocator<U,R></a>& b);
+<a name="l00163"></a>00163 <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="l00164"></a>00164 <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator!=( <span class="keyword">const</span> <a class="code" href="a00270.html">memory_pool_allocator<V,R></a>& a, <span class="keyword">const</span> <a class="code" href="a00270.html">memory_pool_allocator<U,R></a>& b);
+<a name="l00165"></a>00165 };
+<a name="l00166"></a>00166
+<a name="l00167"></a>00167 <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="l00168"></a>00168 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> <a class="code" href="a00270.html">memory_pool_allocator<T,P></a>& a, <span class="keyword">const</span> <a class="code" href="a00270.html">memory_pool_allocator<U,P></a>& b) {<span class="keywordflow">return</span> a.<a class="code" href="a00270.html#9f22e947018eb99cde5f44ee3d339499">my_pool</a>==b.<a class="code" href="a [...]
+<a name="l00169"></a>00169
+<a name="l00170"></a>00170 <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="l00171"></a>00171 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator!=( <span class="keyword">const</span> <a class="code" href="a00270.html">memory_pool_allocator<T,P></a>& a, <span class="keyword">const</span> <a class="code" href="a00270.html">memory_pool_allocator<U,P></a>& b) {<span class="keywordflow">return</span> a.<a class="code" href="a00270.html#9f22e947018eb99cde5f44ee3d339499">my_pool</a>!=b.<a class="code" href="a [...]
+<a name="l00172"></a>00172
+<a name="l00173"></a>00173
+<a name="l00175"></a>00175 <span class="keyword">template</span> <<span class="keyword">typename</span> Alloc>
+<a name="l00176"></a><a class="code" href="a00269.html">00176</a> <span class="keyword">class </span><a class="code" href="a00269.html">memory_pool</a> : <span class="keyword">public</span> internal::pool_base {
+<a name="l00177"></a>00177 Alloc my_alloc; <span class="comment">// TODO: base-class optimization</span>
+<a name="l00178"></a>00178 <span class="keyword">static</span> <span class="keywordtype">void</span> *allocate_request(intptr_t pool_id, size_t & bytes);
+<a name="l00179"></a>00179 <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="l00180"></a>00180
+<a name="l00181"></a>00181 <span class="keyword">public</span>:
+<a name="l00183"></a>00183 <a class="code" href="a00269.html#2822528265718a4c779591fc37c02ca8">memory_pool</a>(<span class="keyword">const</span> Alloc &src = Alloc());
+<a name="l00184"></a>00184
+<a name="l00186"></a><a class="code" href="a00269.html#fdad7c4ed08332ec384491a71b721957">00186</a> <a class="code" href="a00269.html#fdad7c4ed08332ec384491a71b721957">~memory_pool</a>() { destroy(); } <span class="comment">// call the callbacks first and destroy my_alloc latter</span>
+<a name="l00187"></a>00187
+<a name="l00188"></a>00188 };
+<a name="l00189"></a>00189
+<a name="l00190"></a>00190 <span class="keyword">class </span>fixed_pool : <span class="keyword">public</span> internal::pool_base {
+<a name="l00191"></a>00191 <span class="keywordtype">void</span> *my_buffer;
+<a name="l00192"></a>00192 size_t my_size;
+<a name="l00193"></a>00193 <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="l00194"></a>00194
+<a name="l00195"></a>00195 <span class="keyword">public</span>:
+<a name="l00197"></a>00197 <span class="keyword">inline</span> fixed_pool(<span class="keywordtype">void</span> *buf, size_t size);
+<a name="l00199"></a>00199 ~fixed_pool() { destroy(); }
+<a name="l00200"></a>00200 };
+<a name="l00201"></a>00201
+<a name="l00203"></a>00203
+<a name="l00204"></a>00204 <span class="keyword">template</span> <<span class="keyword">typename</span> Alloc>
+<a name="l00205"></a><a class="code" href="a00269.html#2822528265718a4c779591fc37c02ca8">00205</a> <a class="code" href="a00269.html">memory_pool<Alloc>::memory_pool</a>(<span class="keyword">const</span> Alloc &src) : my_alloc(src) {
+<a name="l00206"></a>00206 rml::MemPoolPolicy args = {
+<a name="l00207"></a>00207 allocate_request, deallocate_request, <span class="keyword">sizeof</span>(<span class="keyword">typename</span> Alloc::value_type)
+<a name="l00208"></a>00208 };
+<a name="l00209"></a>00209 my_pool = rml::pool_create(intptr_t(<span class="keyword">this</span>), &args);
+<a name="l00210"></a>00210 __TBBMALLOC_ASSERT(my_pool, <span class="stringliteral">"Pool is not created"</span>);
+<a name="l00211"></a>00211 <span class="keywordflow">if</span>( !my_pool ) __TBB_THROW(std::bad_alloc());
+<a name="l00212"></a>00212 }
+<a name="l00213"></a>00213 <span class="keyword">template</span> <<span class="keyword">typename</span> Alloc>
+<a name="l00214"></a>00214 <span class="keywordtype">void</span> *<a class="code" href="a00269.html">memory_pool<Alloc>::allocate_request</a>(intptr_t pool_id, size_t & bytes) {
+<a name="l00215"></a>00215 <a class="code" href="a00269.html">memory_pool<Alloc></a> &<span class="keyword">self</span> = *reinterpret_cast<memory_pool<Alloc>*>(pool_id);
+<a name="l00216"></a>00216 <span class="keyword">const</span> size_t unit_size = <span class="keyword">sizeof</span>(<span class="keyword">typename</span> Alloc::value_type);
+<a name="l00217"></a>00217 __TBBMALLOC_ASSERT( 0 == bytes%unit_size, NULL);
+<a name="l00218"></a>00218 <span class="keywordtype">void</span> *ptr;
+<a name="l00219"></a>00219 __TBB_TRY { ptr = <span class="keyword">self</span>.my_alloc.allocate( bytes/unit_size ); }
+<a name="l00220"></a>00220 __TBB_CATCH(...) { <span class="keywordflow">return</span> 0; }
+<a name="l00221"></a>00221 <span class="keywordflow">return</span> ptr;
+<a name="l00222"></a>00222 }
+<a name="l00223"></a>00223 <span class="keyword">template</span> <<span class="keyword">typename</span> Alloc>
+<a name="l00224"></a>00224 <span class="keywordtype">int</span> <a class="code" href="a00269.html">memory_pool<Alloc>::deallocate_request</a>(intptr_t pool_id, <span class="keywordtype">void</span>* raw_ptr, size_t raw_bytes) {
+<a name="l00225"></a>00225 <a class="code" href="a00269.html">memory_pool<Alloc></a> &<span class="keyword">self</span> = *reinterpret_cast<memory_pool<Alloc>*>(pool_id);
+<a name="l00226"></a>00226 <span class="keyword">const</span> size_t unit_size = <span class="keyword">sizeof</span>(<span class="keyword">typename</span> Alloc::value_type);
+<a name="l00227"></a>00227 __TBBMALLOC_ASSERT( 0 == raw_bytes%unit_size, NULL);
+<a name="l00228"></a>00228 <span class="keyword">self</span>.my_alloc.deallocate( static_cast<typename Alloc::value_type*>(raw_ptr), raw_bytes/unit_size );
+<a name="l00229"></a>00229 <span class="keywordflow">return</span> 0;
+<a name="l00230"></a>00230 }
+<a name="l00231"></a>00231 <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="l00232"></a>00232 rml::MemPoolPolicy args = { allocate_request, 0, size };
+<a name="l00233"></a>00233 my_pool = rml::pool_create(intptr_t(<span class="keyword">this</span>), &args);
+<a name="l00234"></a>00234 __TBBMALLOC_ASSERT(my_pool, <span class="stringliteral">"Pool is not created"</span>);
+<a name="l00235"></a>00235 <span class="keywordflow">if</span>( !my_pool ) __TBB_THROW(std::bad_alloc());
+<a name="l00236"></a>00236 }
+<a name="l00237"></a>00237 <span class="keyword">inline</span> <span class="keywordtype">void</span> *fixed_pool::allocate_request(intptr_t pool_id, size_t & bytes) {
+<a name="l00238"></a>00238 fixed_pool &<span class="keyword">self</span> = *reinterpret_cast<fixed_pool*>(pool_id);
+<a name="l00239"></a>00239 <span class="keywordflow">if</span>( bytes > <span class="keyword">self</span>.my_size || !__TBB_CompareAndSwapW(&<span class="keyword">self</span>.my_size, 0, (bytes=<span class="keyword">self</span>.my_size)) )
+<a name="l00240"></a>00240 <span class="keywordflow">return</span> 0; <span class="comment">// all the memory was given already</span>
+<a name="l00241"></a>00241 <span class="keywordflow">return</span> <span class="keyword">self</span>.my_buffer;
+<a name="l00242"></a>00242 }
+<a name="l00243"></a>00243
+<a name="l00244"></a>00244 } <span class="comment">//namespace interface6</span>
+<a name="l00245"></a>00245 <span class="keyword">using</span> <a class="code" href="a00270.html">interface6::memory_pool_allocator</a>;
+<a name="l00246"></a>00246 <span class="keyword">using</span> <a class="code" href="a00269.html">interface6::memory_pool</a>;
+<a name="l00247"></a>00247 <span class="keyword">using</span> interface6::fixed_pool;
+<a name="l00248"></a>00248 } <span class="comment">//namespace tbb</span>
+<a name="l00249"></a>00249
+<a name="l00250"></a>00250 <span class="preprocessor">#undef __TBBMALLOC_ASSERT</span>
+<a name="l00251"></a>00251 <span class="preprocessor"></span><span class="preprocessor">#endif// __TBB_memory_pool_H</span>
+</pre></div><hr>
+<p></p>
+Copyright © 2005-2011 Intel Corporation. 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/a00487.html
similarity index 82%
rename from doc/html/a00499.html
rename to doc/html/a00487.html
index d92f103..50a926d 100644
--- a/doc/html/a00499.html
+++ b/doc/html/a00487.html
@@ -56,9 +56,9 @@
<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="a00258.html">00040</a> <span class="keyword">class </span><a class="code" href="a00258.html">mutex</a> {
+<a name="l00040"></a><a class="code" href="a00275.html">00040</a> <span class="keyword">class </span><a class="code" href="a00275.html">mutex</a> {
<a name="l00041"></a>00041 <span class="keyword">public</span>:
-<a name="l00043"></a><a class="code" href="a00258.html#05313cb77d4f85213103d4dab74ed454">00043</a> <a class="code" href="a00258.html#05313cb77d4f85213103d4dab74ed454">mutex</a>() {
+<a name="l00043"></a><a class="code" href="a00275.html#05313cb77d4f85213103d4dab74ed454">00043</a> <a class="code" href="a00275.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>
@@ -72,7 +72,7 @@
<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="a00258.html">mutex</a>() {
+<a name="l00057"></a>00057 ~<a class="code" href="a00275.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>
@@ -89,58 +89,58 @@
<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="a00259.html">00076</a> <span class="keyword">class </span><a class="code" href="a00259.html">scoped_lock</a> : internal::no_copy {
+<a name="l00076"></a><a class="code" href="a00276.html">00076</a> <span class="keyword">class </span><a class="code" href="a00276.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="a00259.html#1d403ae51b484df5d86d85ae38f11e6e">00079</a> <a class="code" href="a00259.html#1d403ae51b484df5d86d85ae38f11e6e">scoped_lock</a>() : my_mutex(NULL) {};
+<a name="l00079"></a><a class="code" href="a00276.html#1d403ae51b484df5d86d85ae38f11e6e">00079</a> <a class="code" href="a00276.html#1d403ae51b484df5d86d85ae38f11e6e">scoped_lock</a>() : my_mutex(NULL) {};
<a name="l00080"></a>00080
-<a name="l00082"></a><a class="code" href="a00259.html#605a6b9af0f8cdabdf81825e0de99600">00082</a> <a class="code" href="a00259.html#1d403ae51b484df5d86d85ae38f11e6e">scoped_lock</a>( <a class="code" href="a00258.html">mutex</a>& <a class="code" href="a00258.html">mutex</a> ) {
-<a name="l00083"></a>00083 <a class="code" href="a00259.html#862e022841cdc522e4296a5533b22efd">acquire</a>( mutex );
+<a name="l00082"></a><a class="code" href="a00276.html#605a6b9af0f8cdabdf81825e0de99600">00082</a> <a class="code" href="a00276.html#1d403ae51b484df5d86d85ae38f11e6e">scoped_lock</a>( <a class="code" href="a00275.html">mutex</a>& <a class="code" href="a00275.html">mutex</a> ) {
+<a name="l00083"></a>00083 <a class="code" href="a00276.html#862e022841cdc522e4296a5533b22efd">acquire</a>( mutex );
<a name="l00084"></a>00084 }
<a name="l00085"></a>00085
-<a name="l00087"></a><a class="code" href="a00259.html#0ebbbecaf4311e9df7362cb76ceaa368">00087</a> <a class="code" href="a00259.html#0ebbbecaf4311e9df7362cb76ceaa368">~scoped_lock</a>() {
+<a name="l00087"></a><a class="code" href="a00276.html#0ebbbecaf4311e9df7362cb76ceaa368">00087</a> <a class="code" href="a00276.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="a00259.html#0d51d18cd99df3b2e93bf07378d0992c">release</a>();
+<a name="l00089"></a>00089 <a class="code" href="a00276.html#0d51d18cd99df3b2e93bf07378d0992c">release</a>();
<a name="l00090"></a>00090 }
<a name="l00091"></a>00091
-<a name="l00093"></a><a class="code" href="a00259.html#862e022841cdc522e4296a5533b22efd">00093</a> <span class="keywordtype">void</span> <a class="code" href="a00259.html#862e022841cdc522e4296a5533b22efd">acquire</a>( <a class="code" href="a00258.html">mutex</a>& <a class="code" href="a00258.html">mutex</a> ) {
+<a name="l00093"></a><a class="code" href="a00276.html#862e022841cdc522e4296a5533b22efd">00093</a> <span class="keywordtype">void</span> <a class="code" href="a00276.html#862e022841cdc522e4296a5533b22efd">acquire</a>( <a class="code" href="a00275.html">mutex</a>& <a class="code" href="a00275.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="a00258.html#4470e61c24c129a0299ca6c17240adbb">lock</a>();
+<a name="l00097"></a>00097 <span class="preprocessor"></span> mutex.<a class="code" href="a00275.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="a00259.html#591e0c49b82bcedffcbe0923f1b915ec">00103</a> <span class="keywordtype">bool</span> <a class="code" href="a00259.html#591e0c49b82bcedffcbe0923f1b915ec">try_acquire</a>( <a class="code" href="a00258.html">mutex</a>& <a class="code" href="a00258.html">mutex</a> ) {
+<a name="l00103"></a><a class="code" href="a00276.html#591e0c49b82bcedffcbe0923f1b915ec">00103</a> <span class="keywordtype">bool</span> <a class="code" href="a00276.html#591e0c49b82bcedffcbe0923f1b915ec">try_acquire</a>( <a class="code" href="a00275.html">mutex</a>& <a class="code" href="a00275.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="a00258.html#4331652c79dea1c1131bd59ab161b234">try_lock</a>();
+<a name="l00107"></a>00107 <span class="preprocessor"></span> <span class="keywordtype">bool</span> result = mutex.<a class="code" href="a00275.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="a00259.html#0d51d18cd99df3b2e93bf07378d0992c">00115</a> <span class="keywordtype">void</span> <a class="code" href="a00259.html#0d51d18cd99df3b2e93bf07378d0992c">release</a>() {
+<a name="l00115"></a><a class="code" href="a00276.html#0d51d18cd99df3b2e93bf07378d0992c">00115</a> <span class="keywordtype">void</span> <a class="code" href="a00276.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="a00258.html#5fc9ef443ae75d966695546be399cc6b">unlock</a>();
+<a name="l00119"></a>00119 <span class="preprocessor"></span> my_mutex-><a class="code" href="a00275.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="a00258.html">mutex</a>* my_mutex;
+<a name="l00126"></a>00126 <a class="code" href="a00275.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="a00258.html">mutex</a>& m );
+<a name="l00129"></a>00129 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_acquire( <a class="code" href="a00275.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="a00258.html">mutex</a>& m );
+<a name="l00132"></a>00132 <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD internal_try_acquire( <a class="code" href="a00275.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="a00258.html">mutex</a>;
+<a name="l00137"></a>00137 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00275.html">mutex</a>;
<a name="l00138"></a>00138 };
<a name="l00139"></a>00139
<a name="l00140"></a>00140 <span class="comment">// Mutex traits</span>
@@ -150,10 +150,10 @@
<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="a00258.html#4470e61c24c129a0299ca6c17240adbb">00148</a> <span class="keywordtype">void</span> <a class="code" href="a00258.html#4470e61c24c129a0299ca6c17240adbb">lock</a>() {
+<a name="l00148"></a><a class="code" href="a00275.html#4470e61c24c129a0299ca6c17240adbb">00148</a> <span class="keywordtype">void</span> <a class="code" href="a00275.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="a00215.html">aligned_space<scoped_lock,1></a> tmp;
-<a name="l00151"></a>00151 <span class="keyword">new</span>(tmp.<a class="code" href="a00215.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>()) <a class="code" href="a00259.html">scoped_lock</a>(*<span class="keyword">this</span>);
+<a name="l00150"></a>00150 <span class="preprocessor"></span> <a class="code" href="a00227.html">aligned_space<scoped_lock,1></a> tmp;
+<a name="l00151"></a>00151 <span class="keyword">new</span>(tmp.<a class="code" href="a00227.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>()) <a class="code" href="a00276.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);
@@ -164,12 +164,12 @@
<a name="l00159"></a>00159 }
<a name="l00160"></a>00160
<a name="l00162"></a>00162
-<a name="l00163"></a><a class="code" href="a00258.html#4331652c79dea1c1131bd59ab161b234">00163</a> <span class="keywordtype">bool</span> <a class="code" href="a00258.html#4331652c79dea1c1131bd59ab161b234">try_lock</a>() {
+<a name="l00163"></a><a class="code" href="a00275.html#4331652c79dea1c1131bd59ab161b234">00163</a> <span class="keywordtype">bool</span> <a class="code" href="a00275.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="a00215.html">aligned_space<scoped_lock,1></a> tmp;
-<a name="l00166"></a>00166 <a class="code" href="a00259.html">scoped_lock</a>& s = *tmp.<a class="code" href="a00215.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>();
-<a name="l00167"></a>00167 s.<a class="code" href="a00259.html#be42c8fe11cce1af4fe1e9eaab717567">my_mutex</a> = NULL;
-<a name="l00168"></a>00168 <span class="keywordflow">return</span> s.<a class="code" href="a00259.html#e86ffb41a026694b16637f78aa337874">internal_try_acquire</a>(*<span class="keyword">this</span>);
+<a name="l00165"></a>00165 <span class="preprocessor"></span> <a class="code" href="a00227.html">aligned_space<scoped_lock,1></a> tmp;
+<a name="l00166"></a>00166 <a class="code" href="a00276.html">scoped_lock</a>& s = *tmp.<a class="code" href="a00227.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>();
+<a name="l00167"></a>00167 s.<a class="code" href="a00276.html#be42c8fe11cce1af4fe1e9eaab717567">my_mutex</a> = NULL;
+<a name="l00168"></a>00168 <span class="keywordflow">return</span> s.<a class="code" href="a00276.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;
@@ -179,12 +179,12 @@
<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="a00258.html#5fc9ef443ae75d966695546be399cc6b">00179</a> <span class="keywordtype">void</span> <a class="code" href="a00258.html#5fc9ef443ae75d966695546be399cc6b">unlock</a>() {
+<a name="l00179"></a><a class="code" href="a00275.html#5fc9ef443ae75d966695546be399cc6b">00179</a> <span class="keywordtype">void</span> <a class="code" href="a00275.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="a00215.html">aligned_space<scoped_lock,1></a> tmp;
-<a name="l00182"></a>00182 <a class="code" href="a00259.html">scoped_lock</a>& s = *tmp.<a class="code" href="a00215.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>();
-<a name="l00183"></a>00183 s.<a class="code" href="a00259.html#be42c8fe11cce1af4fe1e9eaab717567">my_mutex</a> = <span class="keyword">this</span>;
-<a name="l00184"></a>00184 s.<a class="code" href="a00259.html#448b7e9042afcdc455ea3f929ac4c594">internal_release</a>();
+<a name="l00181"></a>00181 <span class="preprocessor"></span> <a class="code" href="a00227.html">aligned_space<scoped_lock,1></a> tmp;
+<a name="l00182"></a>00182 <a class="code" href="a00276.html">scoped_lock</a>& s = *tmp.<a class="code" href="a00227.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>();
+<a name="l00183"></a>00183 s.<a class="code" href="a00276.html#be42c8fe11cce1af4fe1e9eaab717567">my_mutex</a> = <span class="keyword">this</span>;
+<a name="l00184"></a>00184 s.<a class="code" href="a00276.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);
@@ -195,11 +195,11 @@
<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="a00258.html#9f1ec84d5815263ceae853f06ddb4cac">00196</a> <span class="preprocessor"></span> <span class="keyword">typedef</span> LPCRITICAL_SECTION <a class="code" href="a00258.html#9f1ec84d5815263ceae853f06ddb4cac">native_handle_type</a>;
+<a name="l00196"></a><a class="code" href="a00275.html#9f1ec84d5815263ceae853f06ddb4cac">00196</a> <span class="preprocessor"></span> <span class="keyword">typedef</span> LPCRITICAL_SECTION <a class="code" href="a00275.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="a00258.html#9f1ec84d5815263ceae853f06ddb4cac">native_handle_type</a>;
+<a name="l00198"></a>00198 <span class="preprocessor"></span> <span class="keyword">typedef</span> pthread_mutex_t* <a class="code" href="a00275.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="a00258.html#9f1ec84d5815263ceae853f06ddb4cac">native_handle_type</a> native_handle() { <span class="keywordflow">return</span> (<a class="code" href="a00258.html#9f1ec84d5815263ceae853f06ddb4cac">native_handle_type</a>) &impl; }
+<a name="l00200"></a>00200 <span class="preprocessor"></span> <a class="code" href="a00275.html#9f1ec84d5815263ceae853f06ddb4cac">native_handle_type</a> native_handle() { <span class="keywordflow">return</span> (<a class="code" href="a00275.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,
@@ -220,7 +220,7 @@
<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="a00258.html#795649a185b0d6af6dc81c5f378616dd">00224</a> <span class="keywordtype">void</span> <a class="code" href="a00258.html#795649a185b0d6af6dc81c5f378616dd">set_state</a>( state_t to ) { state = to; }
+<a name="l00224"></a><a class="code" href="a00275.html#795649a185b0d6af6dc81c5f378616dd">00224</a> <span class="keywordtype">void</span> <a class="code" href="a00275.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
diff --git a/doc/html/a00501.html b/doc/html/a00489.html
similarity index 86%
rename from doc/html/a00501.html
rename to doc/html/a00489.html
index ca1902a..439546f 100644
--- a/doc/html/a00501.html
+++ b/doc/html/a00489.html
@@ -45,21 +45,21 @@
<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="a00260.html">00029</a> <span class="keyword">class </span><a class="code" href="a00260.html">null_mutex</a> {
-<a name="l00031"></a>00031 <a class="code" href="a00260.html">null_mutex</a>( <span class="keyword">const</span> <a class="code" href="a00260.html">null_mutex</a>& );
-<a name="l00032"></a>00032 <span class="keywordtype">void</span> operator=( <span class="keyword">const</span> <a class="code" href="a00260.html">null_mutex</a>& );
+<a name="l00029"></a><a class="code" href="a00277.html">00029</a> <span class="keyword">class </span><a class="code" href="a00277.html">null_mutex</a> {
+<a name="l00031"></a>00031 <a class="code" href="a00277.html">null_mutex</a>( <span class="keyword">const</span> <a class="code" href="a00277.html">null_mutex</a>& );
+<a name="l00032"></a>00032 <span class="keywordtype">void</span> operator=( <span class="keyword">const</span> <a class="code" href="a00277.html">null_mutex</a>& );
<a name="l00033"></a>00033 <span class="keyword">public</span>:
-<a name="l00035"></a><a class="code" href="a00261.html">00035</a> <span class="keyword">class </span><a class="code" href="a00261.html">scoped_lock</a> {
+<a name="l00035"></a><a class="code" href="a00278.html">00035</a> <span class="keyword">class </span><a class="code" href="a00278.html">scoped_lock</a> {
<a name="l00036"></a>00036 <span class="keyword">public</span>:
-<a name="l00037"></a>00037 <a class="code" href="a00261.html">scoped_lock</a>() {}
-<a name="l00038"></a>00038 <a class="code" href="a00261.html">scoped_lock</a>( <a class="code" href="a00260.html">null_mutex</a>& ) {}
-<a name="l00039"></a>00039 ~<a class="code" href="a00261.html">scoped_lock</a>() {}
-<a name="l00040"></a>00040 <span class="keywordtype">void</span> acquire( <a class="code" href="a00260.html">null_mutex</a>& ) {}
-<a name="l00041"></a>00041 <span class="keywordtype">bool</span> try_acquire( <a class="code" href="a00260.html">null_mutex</a>& ) { <span class="keywordflow">return</span> <span class="keyword">true</span>; }
+<a name="l00037"></a>00037 <a class="code" href="a00278.html">scoped_lock</a>() {}
+<a name="l00038"></a>00038 <a class="code" href="a00278.html">scoped_lock</a>( <a class="code" href="a00277.html">null_mutex</a>& ) {}
+<a name="l00039"></a>00039 ~<a class="code" href="a00278.html">scoped_lock</a>() {}
+<a name="l00040"></a>00040 <span class="keywordtype">void</span> acquire( <a class="code" href="a00277.html">null_mutex</a>& ) {}
+<a name="l00041"></a>00041 <span class="keywordtype">bool</span> try_acquire( <a class="code" href="a00277.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="a00260.html">null_mutex</a>() {}
+<a name="l00045"></a>00045 <a class="code" href="a00277.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>;
diff --git a/doc/html/a00502.html b/doc/html/a00490.html
similarity index 87%
rename from doc/html/a00502.html
rename to doc/html/a00490.html
index c9dd694..883e61a 100644
--- a/doc/html/a00502.html
+++ b/doc/html/a00490.html
@@ -45,23 +45,23 @@
<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="a00262.html">00029</a> <span class="keyword">class </span><a class="code" href="a00262.html">null_rw_mutex</a> {
-<a name="l00031"></a>00031 <a class="code" href="a00262.html">null_rw_mutex</a>( <span class="keyword">const</span> <a class="code" href="a00262.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="a00262.html">null_rw_mutex</a>& );
+<a name="l00029"></a><a class="code" href="a00279.html">00029</a> <span class="keyword">class </span><a class="code" href="a00279.html">null_rw_mutex</a> {
+<a name="l00031"></a>00031 <a class="code" href="a00279.html">null_rw_mutex</a>( <span class="keyword">const</span> <a class="code" href="a00279.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="a00279.html">null_rw_mutex</a>& );
<a name="l00033"></a>00033 <span class="keyword">public</span>:
-<a name="l00035"></a><a class="code" href="a00263.html">00035</a> <span class="keyword">class </span><a class="code" href="a00263.html">scoped_lock</a> {
+<a name="l00035"></a><a class="code" href="a00280.html">00035</a> <span class="keyword">class </span><a class="code" href="a00280.html">scoped_lock</a> {
<a name="l00036"></a>00036 <span class="keyword">public</span>:
-<a name="l00037"></a>00037 <a class="code" href="a00263.html">scoped_lock</a>() {}
-<a name="l00038"></a>00038 <a class="code" href="a00263.html">scoped_lock</a>( <a class="code" href="a00262.html">null_rw_mutex</a>& , <span class="keywordtype">bool</span> = <span class="keyword">true</span> ) {}
-<a name="l00039"></a>00039 ~<a class="code" href="a00263.html">scoped_lock</a>() {}
-<a name="l00040"></a>00040 <span class="keywordtype">void</span> acquire( <a class="code" href="a00262.html">null_rw_mutex</a>& , <span class="keywordtype">bool</span> = <span class="keyword">true</span> ) {}
+<a name="l00037"></a>00037 <a class="code" href="a00280.html">scoped_lock</a>() {}
+<a name="l00038"></a>00038 <a class="code" href="a00280.html">scoped_lock</a>( <a class="code" href="a00279.html">null_rw_mutex</a>& , <span class="keywordtype">bool</span> = <span class="keyword">true</span> ) {}
+<a name="l00039"></a>00039 ~<a class="code" href="a00280.html">scoped_lock</a>() {}
+<a name="l00040"></a>00040 <span class="keywordtype">void</span> acquire( <a class="code" href="a00279.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="a00262.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="l00043"></a>00043 <span class="keywordtype">bool</span> try_acquire( <a class="code" href="a00279.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="a00262.html">null_rw_mutex</a>() {}
+<a name="l00047"></a>00047 <a class="code" href="a00279.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>;
diff --git a/doc/html/a00503.html b/doc/html/a00491.html
similarity index 97%
rename from doc/html/a00503.html
rename to doc/html/a00491.html
index 0d38b3d..2710997 100644
--- a/doc/html/a00503.html
+++ b/doc/html/a00491.html
@@ -74,14 +74,14 @@
<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="a00264.html">00060</a> <span class="keyword">class </span><a class="code" href="a00264.html">parallel_do_feeder</a>: internal::no_copy
+<a name="l00060"></a><a class="code" href="a00281.html">00060</a> <span class="keyword">class </span><a class="code" href="a00281.html">parallel_do_feeder</a>: internal::no_copy
<a name="l00061"></a>00061 {
-<a name="l00062"></a>00062 <a class="code" href="a00264.html">parallel_do_feeder</a>() {}
-<a name="l00063"></a>00063 <span class="keyword">virtual</span> ~<a class="code" href="a00264.html">parallel_do_feeder</a> () {}
+<a name="l00062"></a>00062 <a class="code" href="a00281.html">parallel_do_feeder</a>() {}
+<a name="l00063"></a>00063 <span class="keyword">virtual</span> ~<a class="code" href="a00281.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="a00264.html#40baaf0f6856f4491dd0adf896c93516">00068</a> <span class="keywordtype">void</span> <a class="code" href="a00264.html#40baaf0f6856f4491dd0adf896c93516">add</a>( <span class="keyword">const</span> Item& item ) {internal_add(item);}
+<a name="l00068"></a><a class="code" href="a00281.html#40baaf0f6856f4491dd0adf896c93516">00068</a> <span class="keywordtype">void</span> <a class="code" href="a00281.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 {
@@ -173,14 +173,14 @@
<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="a00291.html#23acb0da0afd690da797f9f882027d34">task::allocate_root</a>() ) empty_task();
+<a name="l00167"></a>00167 my_barrier = <span class="keyword">new</span>( <a class="code" href="a00311.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="a00293.html">tbb::task_group_context</a> &context)
+<a name="l00172"></a>00172 <span class="preprocessor"></span> parallel_do_feeder_impl(<a class="code" href="a00314.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="a00291.html#23acb0da0afd690da797f9f882027d34">task::allocate_root</a>(context) ) empty_task();
+<a name="l00174"></a>00174 my_barrier = <span class="keyword">new</span>( <a class="code" href="a00311.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>
@@ -440,12 +440,12 @@
<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="a00371.html#g3383e2703977012b6f384d673410f1f7">00470</a> <span class="keywordtype">void</span> <a class="code" href="a00371.html#g3383e2703977012b6f384d673410f1f7">parallel_do</a>( Iterator first, Iterator last, <span class="keyword">const</span> Body& body )
+<a name="l00470"></a><a class="code" href="a00395.html#g3383e2703977012b6f384d673410f1f7">00470</a> <span class="keywordtype">void</span> <a class="code" href="a00395.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="a00293.html">task_group_context</a> context;
+<a name="l00475"></a>00475 <span class="preprocessor"></span> <a class="code" href="a00314.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
@@ -457,7 +457,7 @@
<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="a00371.html#g2617dc9b88b3285a7212599d49f74228">00488</a> <span class="preprocessor"></span><span class="keywordtype">void</span> <a class="code" href="a00371.html#g3383e2703977012b6f384d673410f1f7">parallel_do</a>( Iterator first, Iterator last, <span class="keyword">const</span> Body& body, <a class="code" href="a00293.html">task_group_context</a>& context )
+<a name="l00488"></a><a class="code" href="a00395.html#g2617dc9b88b3285a7212599d49f74228">00488</a> <span class="preprocessor"></span><span class="keywordtype">void</span> <a class="code" href="a00395.html#g3383e2703977012b6f384d673410f1f7">parallel_do</a>( Iterator first, Iterator last, <span class="keyword">const</span> Body& body, <a class="code" href="a00314.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>;
diff --git a/doc/html/a00500.html b/doc/html/a00500.html
new file mode 100644
index 0000000..3111633
--- /dev/null
+++ b/doc/html/a00500.html
@@ -0,0 +1,256 @@
+<!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-2011 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="a00311.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="a00311.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="a00311.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="a00233.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="a00233.html#18d2258400756ac1446dac7676b18df3">begin</a>(), k = my_begin + i * my_step; i < r.<a class="code" href="a00233.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="a00395.html#g68cc046ef72c42ce205fccbc435a0d81">00153</a> <span class="keywordtype">void</span> <a class="code" href="a00395.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="a00395.html#g13cac5dd55c7533bccea43a51c33d0e5">00160</a> <span class="keywordtype">void</span> <a class="code" href="a00395.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="a00303.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="a00395.html#ga7ac75d532389b55b9247f3fdb0b00d1">00167</a> <span class="keywordtype">void</span> <a class="code" href="a00395.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="a00231.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="a00395.html#g9cd1b210ceb1c040f30e390b4a21bde8">00174</a> <span class="keywordtype">void</span> <a class="code" href="a00395.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Body& body, <a class="code" href="a00225.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="a00395.html#g2d317a5e0078cd193125439fed60dfdc">00182</a> <span class="preprocessor"></span><span class="keywordtype">void</span> <a class="code" href="a00395.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="a00303.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="a00395.html#g1c0700e3f85e83a788ff3ede88ebb7e9">00189</a> <span class="keywordtype">void</span> <a class="code" href="a00395.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="a00231.html">auto_partitioner</a>& partitioner, <a class="code" href="a00314.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="a00395.html#g04b4696b67370c01353ff5974c8f1196">00196</a> <span class="keywordtype">void</span> <a class="code" href="a00395.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Body& body, <a class="code" href="a00225.html">affinity_partitioner</a>& partitioner, <a class="code" href="a00314.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="a00395.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="a00233.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="a00395.html#g68cc046ef72c42ce205fccbc435a0d81">tbb::parallel_for</a>(range, body, <a class="code" href="a00231.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="a00395.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="a00395.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="a00395.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>(Index first, Index last, Index step, <span class="keyword">const</span> Function& f, <a class="code" href="a00314.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="a00233.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="a00395.html#g68cc046ef72c42ce205fccbc435a0d81">tbb::parallel_for</a>(range, body, <a class="code" href="a00231.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="a00395.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>(Index first, Index last, <span class="keyword">const</span> Function& f, <a class="code" href="a00314.html">tbb::task_group_context</a> &context) {
+<a name="l00241"></a>00241 <a class="code" href="a00395.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="a00395.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-2011 Intel Corporation. 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/a00516.html b/doc/html/a00504.html
similarity index 82%
rename from doc/html/a00516.html
rename to doc/html/a00504.html
index c77c0cb..556b092 100644
--- a/doc/html/a00516.html
+++ b/doc/html/a00504.html
@@ -55,7 +55,7 @@
<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>::value_type& value )<span class="keyword"> const </span>{
+<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 };
@@ -63,18 +63,18 @@
<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="keyword">template</span><<span class="keyword">typename</span> InputIterator, <span class="keyword">typename</span> Function>
-<a name="l00051"></a><a class="code" href="a00371.html#gcd40c32f319747e61a8f73fcfc452001">00051</a> <span class="keywordtype">void</span> <a class="code" href="a00371.html#gcd40c32f319747e61a8f73fcfc452001">parallel_for_each</a>(InputIterator first, InputIterator last, <span class="keyword">const</span> Function& f, <a class="code" href="a00293.html">task_group_context</a> &context) {
-<a name="l00052"></a>00052 internal::parallel_for_each_body<Function, InputIterator> body(f);
-<a name="l00053"></a>00053
-<a name="l00054"></a>00054 <a class="code" href="a00371.html#g3383e2703977012b6f384d673410f1f7">tbb::parallel_do</a> (first, last, body, context);
+<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="a00395.html#gcd40c32f319747e61a8f73fcfc452001">00052</a> <span class="keywordtype">void</span> <a class="code" href="a00395.html#gcd40c32f319747e61a8f73fcfc452001">parallel_for_each</a>(InputIterator first, InputIterator last, <span class="keyword">const</span> Function& f, <a class="code" href="a00314.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="a00395.html#g3383e2703977012b6f384d673410f1f7">tbb::parallel_do</a> (first, last, body, context);
<a name="l00055"></a>00055 }
-<a name="l00056"></a>00056
-<a name="l00058"></a>00058 <span class="keyword">template</span><<span class="keyword">typename</span> InputIterator, <span class="keyword">typename</span> Function>
-<a name="l00059"></a><a class="code" href="a00371.html#gc2d710ca573f0a9bd94379cba3772def">00059</a> <span class="keywordtype">void</span> <a class="code" href="a00371.html#gcd40c32f319747e61a8f73fcfc452001">parallel_for_each</a>(InputIterator first, InputIterator last, <span class="keyword">const</span> Function& f) {
-<a name="l00060"></a>00060 internal::parallel_for_each_body<Function, InputIterator> body(f);
-<a name="l00061"></a>00061
-<a name="l00062"></a>00062 <a class="code" href="a00371.html#g3383e2703977012b6f384d673410f1f7">tbb::parallel_do</a> (first, last, body);
+<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="a00395.html#gc2d710ca573f0a9bd94379cba3772def">00060</a> <span class="keywordtype">void</span> <a class="code" href="a00395.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="a00395.html#g3383e2703977012b6f384d673410f1f7">tbb::parallel_do</a> (first, last, body);
<a name="l00063"></a>00063 }
<a name="l00064"></a>00064
<a name="l00066"></a>00066
diff --git a/doc/html/a00518.html b/doc/html/a00506.html
similarity index 51%
copy from doc/html/a00518.html
copy to doc/html/a00506.html
index 9f8f271..c0f248a 100644
--- a/doc/html/a00518.html
+++ b/doc/html/a00506.html
@@ -46,323 +46,335 @@
<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">// Simple task object, executing user method</span>
-<a name="l00031"></a>00031 <span class="keyword">template</span><<span class="keyword">typename</span> function>
-<a name="l00032"></a>00032 <span class="keyword">class </span>function_invoker : <span class="keyword">public</span> task{
-<a name="l00033"></a>00033 <span class="keyword">public</span>:
-<a name="l00034"></a>00034 function_invoker(<span class="keyword">const</span> function& _function) : my_function(_function) {}
-<a name="l00035"></a>00035 <span class="keyword">private</span>:
-<a name="l00036"></a>00036 <span class="keyword">const</span> function &my_function;
-<a name="l00037"></a>00037 <span class="comment">/*override*/</span>
-<a name="l00038"></a>00038 task* execute()
-<a name="l00039"></a>00039 {
-<a name="l00040"></a>00040 my_function();
-<a name="l00041"></a>00041 <span class="keywordflow">return</span> NULL;
-<a name="l00042"></a>00042 }
-<a name="l00043"></a>00043 };
-<a name="l00044"></a>00044
-<a name="l00045"></a>00045 <span class="comment">// The class spawns two or three child tasks</span>
-<a name="l00046"></a>00046 <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="l00047"></a>00047 <span class="keyword">class </span>spawner : <span class="keyword">public</span> task {
-<a name="l00048"></a>00048 <span class="keyword">private</span>:
-<a name="l00049"></a>00049 <span class="keyword">const</span> function1& my_func1;
-<a name="l00050"></a>00050 <span class="keyword">const</span> function2& my_func2;
-<a name="l00051"></a>00051 <span class="keyword">const</span> function3& my_func3;
-<a name="l00052"></a>00052 <span class="keywordtype">bool</span> is_recycled;
-<a name="l00053"></a>00053
-<a name="l00054"></a>00054 task* execute (){
-<a name="l00055"></a>00055 <span class="keywordflow">if</span>(is_recycled){
-<a name="l00056"></a>00056 <span class="keywordflow">return</span> NULL;
-<a name="l00057"></a>00057 }<span class="keywordflow">else</span>{
-<a name="l00058"></a>00058 __TBB_ASSERT(N==2 || N==3, <span class="stringliteral">"Number of arguments passed to spawner is wrong"</span>);
-<a name="l00059"></a>00059 set_ref_count(N);
-<a name="l00060"></a>00060 recycle_as_safe_continuation();
-<a name="l00061"></a>00061 internal::function_invoker<function2>* invoker2 = <span class="keyword">new</span> (allocate_child()) internal::function_invoker<function2>(my_func2);
-<a name="l00062"></a>00062 __TBB_ASSERT(invoker2, <span class="stringliteral">"Child task allocation failed"</span>);
-<a name="l00063"></a>00063 spawn(*invoker2);
-<a name="l00064"></a>00064 size_t n = N; <span class="comment">// To prevent compiler warnings</span>
-<a name="l00065"></a>00065 <span class="keywordflow">if</span> (n>2) {
-<a name="l00066"></a>00066 internal::function_invoker<function3>* invoker3 = <span class="keyword">new</span> (allocate_child()) internal::function_invoker<function3>(my_func3);
-<a name="l00067"></a>00067 __TBB_ASSERT(invoker3, <span class="stringliteral">"Child task allocation failed"</span>);
-<a name="l00068"></a>00068 spawn(*invoker3);
-<a name="l00069"></a>00069 }
-<a name="l00070"></a>00070 my_func1();
-<a name="l00071"></a>00071 is_recycled = <span class="keyword">true</span>;
-<a name="l00072"></a>00072 <span class="keywordflow">return</span> NULL;
-<a name="l00073"></a>00073 }
-<a name="l00074"></a>00074 } <span class="comment">// execute</span>
-<a name="l00075"></a>00075
-<a name="l00076"></a>00076 <span class="keyword">public</span>:
-<a name="l00077"></a>00077 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="l00078"></a>00078 };
-<a name="l00079"></a>00079
-<a name="l00080"></a>00080 <span class="comment">// Creates and spawns child tasks</span>
-<a name="l00081"></a>00081 <span class="keyword">class </span>parallel_invoke_helper : <span class="keyword">public</span> empty_task {
-<a name="l00082"></a>00082 <span class="keyword">public</span>:
-<a name="l00083"></a>00083 <span class="comment">// Dummy functor class</span>
-<a name="l00084"></a>00084 <span class="keyword">class </span>parallel_invoke_noop {
-<a name="l00085"></a>00085 <span class="keyword">public</span>:
-<a name="l00086"></a>00086 <span class="keywordtype">void</span> operator() ()<span class="keyword"> const </span>{}
-<a name="l00087"></a>00087 };
-<a name="l00088"></a>00088 <span class="comment">// Creates a helper object with user-defined number of children expected</span>
-<a name="l00089"></a>00089 parallel_invoke_helper(<span class="keywordtype">int</span> number_of_children)
-<a name="l00090"></a>00090 {
-<a name="l00091"></a>00091 set_ref_count(number_of_children + 1);
-<a name="l00092"></a>00092 }
-<a name="l00093"></a>00093 <span class="comment">// Adds child task and spawns it</span>
-<a name="l00094"></a>00094 <span class="keyword">template</span> <<span class="keyword">typename</span> function>
-<a name="l00095"></a>00095 <span class="keywordtype">void</span> add_child (<span class="keyword">const</span> function &_func)
-<a name="l00096"></a>00096 {
-<a name="l00097"></a>00097 internal::function_invoker<function>* invoker = <span class="keyword">new</span> (allocate_child()) internal::function_invoker<function>(_func);
-<a name="l00098"></a>00098 __TBB_ASSERT(invoker, <span class="stringliteral">"Child task allocation failed"</span>);
-<a name="l00099"></a>00099 spawn(*invoker);
-<a name="l00100"></a>00100 }
-<a name="l00101"></a>00101
-<a name="l00102"></a>00102 <span class="comment">// Adds a task with multiple child tasks and spawns it</span>
-<a name="l00103"></a>00103 <span class="comment">// two arguments</span>
-<a name="l00104"></a>00104 <span class="keyword">template</span> <<span class="keyword">typename</span> function1, <span class="keyword">typename</span> function2>
-<a name="l00105"></a>00105 <span class="keywordtype">void</span> add_children (<span class="keyword">const</span> function1& _func1, <span class="keyword">const</span> function2& _func2)
-<a name="l00106"></a>00106 {
-<a name="l00107"></a>00107 <span class="comment">// The third argument is dummy, it is ignored actually.</span>
-<a name="l00108"></a>00108 parallel_invoke_noop noop;
-<a name="l00109"></a>00109 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="l00110"></a>00110 spawn(sub_root);
-<a name="l00111"></a>00111 }
-<a name="l00112"></a>00112 <span class="comment">// three arguments</span>
-<a name="l00113"></a>00113 <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="l00114"></a>00114 <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="l00115"></a>00115 {
-<a name="l00116"></a>00116 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="l00117"></a>00117 spawn(sub_root);
-<a name="l00118"></a>00118 }
-<a name="l00119"></a>00119
-<a name="l00120"></a>00120 <span class="comment">// Waits for all child tasks</span>
-<a name="l00121"></a>00121 <span class="keyword">template</span> <<span class="keyword">typename</span> F0>
-<a name="l00122"></a>00122 <span class="keywordtype">void</span> run_and_finish(<span class="keyword">const</span> F0& f0)
-<a name="l00123"></a>00123 {
-<a name="l00124"></a>00124 internal::function_invoker<F0>* invoker = <span class="keyword">new</span> (allocate_child()) internal::function_invoker<F0>(f0);
-<a name="l00125"></a>00125 __TBB_ASSERT(invoker, <span class="stringliteral">"Child task allocation failed"</span>);
-<a name="l00126"></a>00126 spawn_and_wait_for_all(*invoker);
-<a name="l00127"></a>00127 }
-<a name="l00128"></a>00128 };
-<a name="l00129"></a>00129 <span class="comment">// The class destroys root if exception occured as well as in normal case</span>
-<a name="l00130"></a>00130 <span class="keyword">class </span>parallel_invoke_cleaner: internal::no_copy {
-<a name="l00131"></a>00131 <span class="keyword">public</span>:
-<a name="l00132"></a>00132 parallel_invoke_cleaner(<span class="keywordtype">int</span> number_of_children, <a class="code" href="a00293.html">tbb::task_group_context</a>& context) : root(*new(task::allocate_root(context)) internal::parallel_invoke_helper(number_of_children))
-<a name="l00133"></a>00133 {}
-<a name="l00134"></a>00134 ~parallel_invoke_cleaner(){
-<a name="l00135"></a>00135 root.destroy(root);
-<a name="l00136"></a>00136 }
-<a name="l00137"></a>00137 internal::parallel_invoke_helper& root;
-<a name="l00138"></a>00138 };
-<a name="l00139"></a>00139 } <span class="comment">// namespace internal</span>
-<a name="l00141"></a>00141 <span class="comment"></span>
+<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="a00314.html">00030</a> <span class="keyword">struct </span><a class="code" href="a00314.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="a00311.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 occured 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="a00314.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
-<a name="l00148"></a>00148 <span class="comment">// parallel_invoke with user-defined context</span>
-<a name="l00149"></a>00149 <span class="comment">// two arguments</span>
-<a name="l00150"></a>00150 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1 >
-<a name="l00151"></a><a class="code" href="a00371.html#gd3e2998f171494f94c2103f4eb924084">00151</a> <span class="keywordtype">void</span> <a class="code" href="a00371.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <a class="code" href="a00293.html">tbb::task_group_context</a>& context) {
-<a name="l00152"></a>00152 internal::parallel_invoke_cleaner cleaner(2, context);
-<a name="l00153"></a>00153 internal::parallel_invoke_helper& root = cleaner.root;
-<a name="l00154"></a>00154
-<a name="l00155"></a>00155 root.add_child(f1);
-<a name="l00156"></a>00156
-<a name="l00157"></a>00157 root.run_and_finish(f0);
-<a name="l00158"></a>00158 }
-<a name="l00159"></a>00159
-<a name="l00160"></a>00160 <span class="comment">// three arguments</span>
-<a name="l00161"></a>00161 <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="l00162"></a>00162 <span class="keywordtype">void</span> <a class="code" href="a00371.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="a00293.html">tbb::task_group_context</a>& context) {
-<a name="l00163"></a>00163 internal::parallel_invoke_cleaner cleaner(3, context);
-<a name="l00164"></a>00164 internal::parallel_invoke_helper& root = cleaner.root;
-<a name="l00165"></a>00165
-<a name="l00166"></a>00166 root.add_child(f2);
+<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="a00395.html#gd3e2998f171494f94c2103f4eb924084">00163</a> <span class="keywordtype">void</span> <a class="code" href="a00395.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <a class="code" href="a00314.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">// four 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, <span class="keyword">typename</span> F3>
-<a name="l00174"></a>00174 <span class="keywordtype">void</span> <a class="code" href="a00371.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="l00175"></a>00175 <a class="code" href="a00293.html">tbb::task_group_context</a>& context)
-<a name="l00176"></a>00176 {
-<a name="l00177"></a>00177 internal::parallel_invoke_cleaner cleaner(4, context);
-<a name="l00178"></a>00178 internal::parallel_invoke_helper& root = cleaner.root;
-<a name="l00179"></a>00179
-<a name="l00180"></a>00180 root.add_child(f3);
-<a name="l00181"></a>00181 root.add_child(f2);
-<a name="l00182"></a>00182 root.add_child(f1);
+<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="a00395.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="a00314.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 root.run_and_finish(f0);
-<a name="l00185"></a>00185 }
-<a name="l00186"></a>00186
-<a name="l00187"></a>00187 <span class="comment">// five arguments</span>
-<a name="l00188"></a>00188 <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="l00189"></a>00189 <span class="keywordtype">void</span> <a class="code" href="a00371.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="l00190"></a>00190 <a class="code" href="a00293.html">tbb::task_group_context</a>& context)
-<a name="l00191"></a>00191 {
-<a name="l00192"></a>00192 internal::parallel_invoke_cleaner cleaner(3, context);
-<a name="l00193"></a>00193 internal::parallel_invoke_helper& root = cleaner.root;
-<a name="l00194"></a>00194
-<a name="l00195"></a>00195 root.add_children(f4, f3);
-<a name="l00196"></a>00196 root.add_children(f2, f1);
-<a name="l00197"></a>00197
-<a name="l00198"></a>00198 root.run_and_finish(f0);
-<a name="l00199"></a>00199 }
-<a name="l00200"></a>00200
-<a name="l00201"></a>00201 <span class="comment">// six arguments</span>
-<a name="l00202"></a>00202 <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="l00203"></a>00203 <span class="keywordtype">void</span> <a class="code" href="a00371.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="l00204"></a>00204 <a class="code" href="a00293.html">tbb::task_group_context</a>& context)
-<a name="l00205"></a>00205 {
-<a name="l00206"></a>00206 internal::parallel_invoke_cleaner cleaner(3, context);
-<a name="l00207"></a>00207 internal::parallel_invoke_helper& root = cleaner.root;
-<a name="l00208"></a>00208
-<a name="l00209"></a>00209 root.add_children(f5, f4, f3);
-<a name="l00210"></a>00210 root.add_children(f2, f1);
-<a name="l00211"></a>00211
-<a name="l00212"></a>00212 root.run_and_finish(f0);
-<a name="l00213"></a>00213 }
-<a name="l00214"></a>00214
-<a name="l00215"></a>00215 <span class="comment">// seven arguments</span>
-<a name="l00216"></a>00216 <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="l00217"></a>00217 <span class="keywordtype">void</span> <a class="code" href="a00371.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="l00218"></a>00218 <span class="keyword">const</span> F5& f5, <span class="keyword">const</span> F6& f6,
-<a name="l00219"></a>00219 <a class="code" href="a00293.html">tbb::task_group_context</a>& context)
-<a name="l00220"></a>00220 {
-<a name="l00221"></a>00221 internal::parallel_invoke_cleaner cleaner(3, context);
-<a name="l00222"></a>00222 internal::parallel_invoke_helper& root = cleaner.root;
+<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="a00395.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="a00314.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="a00395.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="a00314.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="a00395.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="a00314.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.add_children(f6, f5, f4);
-<a name="l00225"></a>00225 root.add_children(f3, f2, f1);
+<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 root.run_and_finish(f0);
-<a name="l00228"></a>00228 }
-<a name="l00229"></a>00229
-<a name="l00230"></a>00230 <span class="comment">// eight arguments</span>
-<a name="l00231"></a>00231 <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="l00232"></a>00232 <span class="keyword">typename</span> F5, <span class="keyword">typename</span> F6, <span class="keyword">typename</span> F7>
-<a name="l00233"></a>00233 <span class="keywordtype">void</span> <a class="code" href="a00371.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="l00234"></a>00234 <span class="keyword">const</span> F5& f5, <span class="keyword">const</span> F6& f6, <span class="keyword">const</span> F7& f7,
-<a name="l00235"></a>00235 <a class="code" href="a00293.html">tbb::task_group_context</a>& context)
-<a name="l00236"></a>00236 {
-<a name="l00237"></a>00237 internal::parallel_invoke_cleaner cleaner(4, context);
-<a name="l00238"></a>00238 internal::parallel_invoke_helper& root = cleaner.root;
-<a name="l00239"></a>00239
-<a name="l00240"></a>00240 root.add_children(f7, f6, f5);
-<a name="l00241"></a>00241 root.add_children(f4, f3);
-<a name="l00242"></a>00242 root.add_children(f2, f1);
-<a name="l00243"></a>00243
-<a name="l00244"></a>00244 root.run_and_finish(f0);
-<a name="l00245"></a>00245 }
-<a name="l00246"></a>00246
-<a name="l00247"></a>00247 <span class="comment">// nine arguments</span>
-<a name="l00248"></a>00248 <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="l00249"></a>00249 <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="l00250"></a>00250 <span class="keywordtype">void</span> <a class="code" href="a00371.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="l00251"></a>00251 <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="l00252"></a>00252 <a class="code" href="a00293.html">tbb::task_group_context</a>& context)
-<a name="l00253"></a>00253 {
-<a name="l00254"></a>00254 internal::parallel_invoke_cleaner cleaner(4, context);
-<a name="l00255"></a>00255 internal::parallel_invoke_helper& root = cleaner.root;
-<a name="l00256"></a>00256
-<a name="l00257"></a>00257 root.add_children(f8, f7, f6);
-<a name="l00258"></a>00258 root.add_children(f5, f4, f3);
-<a name="l00259"></a>00259 root.add_children(f2, f1);
-<a name="l00260"></a>00260
-<a name="l00261"></a>00261 root.run_and_finish(f0);
-<a name="l00262"></a>00262 }
-<a name="l00263"></a>00263
-<a name="l00264"></a>00264 <span class="comment">// ten arguments</span>
-<a name="l00265"></a>00265 <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="l00266"></a>00266 <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="l00267"></a>00267 <span class="keywordtype">void</span> <a class="code" href="a00371.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="l00268"></a>00268 <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="l00269"></a>00269 <a class="code" href="a00293.html">tbb::task_group_context</a>& context)
-<a name="l00270"></a>00270 {
-<a name="l00271"></a>00271 internal::parallel_invoke_cleaner cleaner(4, context);
-<a name="l00272"></a>00272 internal::parallel_invoke_helper& root = cleaner.root;
-<a name="l00273"></a>00273
-<a name="l00274"></a>00274 root.add_children(f9, f8, f7);
-<a name="l00275"></a>00275 root.add_children(f6, f5, f4);
-<a name="l00276"></a>00276 root.add_children(f3, f2, f1);
-<a name="l00277"></a>00277
-<a name="l00278"></a>00278 root.run_and_finish(f0);
-<a name="l00279"></a>00279 }
-<a name="l00280"></a>00280
-<a name="l00281"></a>00281 <span class="comment">// two arguments</span>
-<a name="l00282"></a>00282 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1>
-<a name="l00283"></a>00283 <span class="keywordtype">void</span> <a class="code" href="a00371.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1) {
-<a name="l00284"></a>00284 task_group_context context;
-<a name="l00285"></a>00285 parallel_invoke<F0, F1>(f0, f1, context);
-<a name="l00286"></a>00286 }
-<a name="l00287"></a>00287 <span class="comment">// three arguments</span>
-<a name="l00288"></a>00288 <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="l00289"></a>00289 <span class="keywordtype">void</span> <a class="code" href="a00371.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="l00290"></a>00290 task_group_context context;
-<a name="l00291"></a>00291 parallel_invoke<F0, F1, F2>(f0, f1, f2, context);
-<a name="l00292"></a>00292 }
-<a name="l00293"></a>00293 <span class="comment">// four arguments</span>
-<a name="l00294"></a>00294 <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="l00295"></a>00295 <span class="keywordtype">void</span> <a class="code" href="a00371.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="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="a00395.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="a00314.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="a00395.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="a00314.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="a00395.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="a00314.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="a00395.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="a00314.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="a00395.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, F2, F3>(f0, f1, f2, f3, 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">// five 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, <span class="keyword">typename</span> F3, <span class="keyword">typename</span> F4>
-<a name="l00301"></a>00301 <span class="keywordtype">void</span> <a class="code" href="a00371.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="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="a00395.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, F3, F4>(f0, f1, f2, f3, f4, 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">// six 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, <span class="keyword">typename</span> F4, <span class="keyword">typename</span> F5>
-<a name="l00307"></a>00307 <span class="keywordtype">void</span> <a class="code" href="a00371.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="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="a00395.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, F4, F5>(f0, f1, f2, f3, f4, f5, 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">// seven 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, <span class="keyword">typename</span> F5, <span class="keyword">typename</span> F6>
-<a name="l00313"></a>00313 <span class="keywordtype">void</span> <a class="code" href="a00371.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 <span class="keyword">const</span> F5& f5, <span class="keyword">const</span> F6& f6)
-<a name="l00315"></a>00315 {
-<a name="l00316"></a>00316 task_group_context context;
-<a name="l00317"></a>00317 parallel_invoke<F0, F1, F2, F3, F4, F5, F6>(f0, f1, f2, f3, f4, f5, f6, context);
-<a name="l00318"></a>00318 }
-<a name="l00319"></a>00319 <span class="comment">// eigth arguments</span>
-<a name="l00320"></a>00320 <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="l00321"></a>00321 <span class="keyword">typename</span> F5, <span class="keyword">typename</span> F6, <span class="keyword">typename</span> F7>
-<a name="l00322"></a>00322 <span class="keywordtype">void</span> <a class="code" href="a00371.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="l00323"></a>00323 <span class="keyword">const</span> F5& f5, <span class="keyword">const</span> F6& f6, <span class="keyword">const</span> F7& f7)
-<a name="l00324"></a>00324 {
-<a name="l00325"></a>00325 task_group_context context;
-<a name="l00326"></a>00326 parallel_invoke<F0, F1, F2, F3, F4, F5, F6, F7>(f0, f1, f2, f3, f4, f5, f6, f7, context);
-<a name="l00327"></a>00327 }
-<a name="l00328"></a>00328 <span class="comment">// nine arguments</span>
-<a name="l00329"></a>00329 <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="l00330"></a>00330 <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="l00331"></a>00331 <span class="keywordtype">void</span> <a class="code" href="a00371.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="l00332"></a>00332 <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="l00333"></a>00333 {
-<a name="l00334"></a>00334 task_group_context context;
-<a name="l00335"></a>00335 parallel_invoke<F0, F1, F2, F3, F4, F5, F6, F7, F8>(f0, f1, f2, f3, f4, f5, f6, f7, f8, context);
-<a name="l00336"></a>00336 }
-<a name="l00337"></a>00337 <span class="comment">// ten arguments</span>
-<a name="l00338"></a>00338 <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="l00339"></a>00339 <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="l00340"></a>00340 <span class="keywordtype">void</span> <a class="code" href="a00371.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="l00341"></a>00341 <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="l00342"></a>00342 {
-<a name="l00343"></a>00343 task_group_context context;
-<a name="l00344"></a>00344 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="l00345"></a>00345 }
-<a name="l00346"></a>00346
-<a name="l00348"></a>00348
-<a name="l00349"></a>00349 } <span class="comment">// namespace</span>
-<a name="l00350"></a>00350
-<a name="l00351"></a>00351 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_parallel_invoke_H */</span>
+<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="a00395.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="a00395.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="a00395.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="a00395.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="a00395.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="a00395.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-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00512.html b/doc/html/a00512.html
index 05b4eeb..ea4e0bb 100644
--- a/doc/html/a00512.html
+++ b/doc/html/a00512.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>parallel_for.h Source File</title>
+<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>
@@ -19,7 +19,7 @@
<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>
+<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-2011 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>
@@ -39,190 +39,429 @@
<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="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 "task.h"</span>
-<a name="l00025"></a>00025 <span class="preprocessor">#include "partitioner.h"</span>
-<a name="l00026"></a>00026 <span class="preprocessor">#include "blocked_range.h"</span>
-<a name="l00027"></a>00027 <span class="preprocessor">#include <new></span>
-<a name="l00028"></a>00028 <span class="preprocessor">#include "tbb_exception.h"</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="l00033"></a>00033 <span class="keyword">namespace </span>internal {
-<a name="l00034"></a>00034
-<a name="l00036"></a>00036
-<a name="l00037"></a>00037 <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="l00038"></a>00038 <span class="keyword">class </span>start_for: <span class="keyword">public</span> task {
-<a name="l00039"></a>00039 Range my_range;
-<a name="l00040"></a>00040 <span class="keyword">const</span> Body my_body;
-<a name="l00041"></a>00041 <span class="keyword">typename</span> Partitioner::partition_type my_partition;
-<a name="l00042"></a>00042 <span class="comment">/*override*/</span> task* execute();
+<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
+<a name="l00040"></a>00040 <span class="keyword">typedef</span> <span class="keywordtype">char</span> reduction_context;
+<a name="l00041"></a>00041
<a name="l00043"></a>00043
-<a name="l00045"></a>00045 start_for( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Body& body, Partitioner& partitioner ) :
-<a name="l00046"></a>00046 my_range(range),
-<a name="l00047"></a>00047 my_body(body),
-<a name="l00048"></a>00048 my_partition(partitioner)
-<a name="l00049"></a>00049 {
-<a name="l00050"></a>00050 }
-<a name="l00052"></a>00052
-<a name="l00053"></a>00053 start_for( start_for& parent_, split ) :
-<a name="l00054"></a>00054 my_range(parent_.my_range,split()),
-<a name="l00055"></a>00055 my_body(parent_.my_body),
-<a name="l00056"></a>00056 my_partition(parent_.my_partition,split())
-<a name="l00057"></a>00057 {
-<a name="l00058"></a>00058 my_partition.set_affinity(*<span class="keyword">this</span>);
-<a name="l00059"></a>00059 }
-<a name="l00061"></a>00061 <span class="comment">/*override*/</span> <span class="keywordtype">void</span> note_affinity( affinity_id <span class="keywordtype">id</span> ) {
-<a name="l00062"></a>00062 my_partition.note_affinity( <span class="keywordtype">id</span> );
-<a name="l00063"></a>00063 }
-<a name="l00064"></a>00064 <span class="keyword">public</span>:
-<a name="l00065"></a>00065 <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="l00066"></a>00066 <span class="keywordflow">if</span>( !range.empty() ) {
-<a name="l00067"></a>00067 #<span class="keywordflow">if</span> !__TBB_TASK_GROUP_CONTEXT || TBB_JOIN_OUTER_TASK_GROUP
-<a name="l00068"></a>00068 start_for& a = *<span class="keyword">new</span>(<a class="code" href="a00291.html#23acb0da0afd690da797f9f882027d34">task::allocate_root</a>()) start_for(range,body,const_cast<Partitioner&>(partitioner));
-<a name="l00069"></a>00069 <span class="preprocessor">#else</span>
-<a name="l00070"></a>00070 <span class="preprocessor"></span> <span class="comment">// Bound context prevents exceptions from body to affect nesting or sibling algorithms,</span>
-<a name="l00071"></a>00071 <span class="comment">// and allows users to handle exceptions safely by wrapping parallel_for in the try-block.</span>
-<a name="l00072"></a>00072 task_group_context context;
-<a name="l00073"></a>00073 start_for& a = *<span class="keyword">new</span>(task::allocate_root(context)) start_for(range,body,const_cast<Partitioner&>(partitioner));
-<a name="l00074"></a>00074 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT && !TBB_JOIN_OUTER_TASK_GROUP */</span>
-<a name="l00075"></a>00075 <a class="code" href="a00291.html#ce8ce689c26a4ddf343829bc3c73290a">task::spawn_root_and_wait</a>(a);
-<a name="l00076"></a>00076 }
-<a name="l00077"></a>00077 }
-<a name="l00078"></a>00078 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00079"></a>00079 <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="l00080"></a>00080 <span class="keywordflow">if</span>( !range.empty() ) {
-<a name="l00081"></a>00081 start_for& a = *<span class="keyword">new</span>(task::allocate_root(context)) start_for(range,body,const_cast<Partitioner&>(partitioner));
-<a name="l00082"></a>00082 <a class="code" href="a00291.html#ce8ce689c26a4ddf343829bc3c73290a">task::spawn_root_and_wait</a>(a);
-<a name="l00083"></a>00083 }
-<a name="l00084"></a>00084 }
-<a name="l00085"></a>00085 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
-<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>
-<a name="l00089"></a>00089 task* start_for<Range,Body,Partitioner>::execute() {
-<a name="l00090"></a>00090 <span class="keywordflow">if</span>( !my_range.is_divisible() || my_partition.should_execute_range(*<span class="keyword">this</span>) ) {
-<a name="l00091"></a>00091 my_body( my_range );
-<a name="l00092"></a>00092 <span class="keywordflow">return</span> my_partition.continue_after_execute_range();
-<a name="l00093"></a>00093 } <span class="keywordflow">else</span> {
-<a name="l00094"></a>00094 empty_task& c = *<span class="keyword">new</span>( this->allocate_continuation() ) empty_task;
-<a name="l00095"></a>00095 recycle_as_child_of(c);
-<a name="l00096"></a>00096 c.set_ref_count(2);
-<a name="l00097"></a>00097 <span class="keywordtype">bool</span> delay = my_partition.decide_whether_to_delay();
-<a name="l00098"></a>00098 start_for& b = *<span class="keyword">new</span>( c.allocate_child() ) start_for(*<span class="keyword">this</span>,split());
-<a name="l00099"></a>00099 my_partition.spawn_or_delay(delay,b);
-<a name="l00100"></a>00100 <span class="keywordflow">return</span> <span class="keyword">this</span>;
-<a name="l00101"></a>00101 }
-<a name="l00102"></a>00102 }
-<a name="l00103"></a>00103 } <span class="comment">// namespace internal</span>
-<a name="l00105"></a>00105 <span class="comment"></span>
+<a name="l00044"></a>00044 <span class="keyword">template</span><<span class="keyword">typename</span> Body>
+<a name="l00045"></a>00045 <span class="keyword">class </span>finish_reduce: <span class="keyword">public</span> flag_task {
+<a name="l00047"></a>00047 <span class="keywordtype">bool</span> has_right_zombie;
+<a name="l00048"></a>00048 <span class="keyword">const</span> reduction_context my_context;
+<a name="l00049"></a>00049 Body* my_body;
+<a name="l00050"></a>00050 aligned_space<Body,1> zombie_space;
+<a name="l00051"></a>00051 finish_reduce( reduction_context context_ ) :
+<a name="l00052"></a>00052 has_right_zombie(false), <span class="comment">// TODO: substitute by flag_task::child_stolen?</span>
+<a name="l00053"></a>00053 my_context(context_),
+<a name="l00054"></a>00054 my_body(NULL)
+<a name="l00055"></a>00055 {
+<a name="l00056"></a>00056 }
+<a name="l00057"></a>00057 task* execute() {
+<a name="l00058"></a>00058 <span class="keywordflow">if</span>( has_right_zombie ) {
+<a name="l00059"></a>00059 <span class="comment">// Right child was stolen.</span>
+<a name="l00060"></a>00060 Body* s = zombie_space.begin();
+<a name="l00061"></a>00061 my_body->join( *s );
+<a name="l00062"></a>00062 s->~Body();
+<a name="l00063"></a>00063 }
+<a name="l00064"></a>00064 <span class="keywordflow">if</span>( my_context==1 ) <span class="comment">// left child</span>
+<a name="l00065"></a>00065 itt_store_word_with_release( static_cast<finish_reduce*>(parent())->my_body, my_body );
+<a name="l00066"></a>00066 <span class="keywordflow">return</span> NULL;
+<a name="l00067"></a>00067 }
+<a name="l00068"></a>00068 <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="l00069"></a>00069 <span class="keyword">friend</span> <span class="keyword">class </span>start_reduce;
+<a name="l00070"></a>00070 };
+<a name="l00071"></a>00071
+<a name="l00073"></a>00073
+<a name="l00074"></a>00074 <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="l00075"></a>00075 <span class="keyword">class </span>start_reduce: <span class="keyword">public</span> task {
+<a name="l00076"></a>00076 <span class="keyword">typedef</span> finish_reduce<Body> finish_type;
+<a name="l00077"></a>00077 Body* my_body;
+<a name="l00078"></a>00078 Range my_range;
+<a name="l00079"></a>00079 <span class="keyword">typename</span> Partitioner::task_partition_type my_partition;
+<a name="l00080"></a>00080 reduction_context my_context; <span class="comment">// TODO: factor out into start_reduce_base</span>
+<a name="l00081"></a>00081 <span class="comment">/*override*/</span> task* execute();
+<a name="l00082"></a>00082 <span class="keyword">template</span><<span class="keyword">typename</span> Body_>
+<a name="l00083"></a>00083 <span class="keyword">friend</span> <span class="keyword">class </span>finish_reduce;
+<a name="l00084"></a>00084
+<a name="l00085"></a>00085 <span class="keyword">public</span>:
+<a name="l00087"></a>00087 start_reduce( <span class="keyword">const</span> Range& range, Body* body, Partitioner& partitioner ) :
+<a name="l00088"></a>00088 my_body(body),
+<a name="l00089"></a>00089 my_range(range),
+<a name="l00090"></a>00090 my_partition(partitioner),
+<a name="l00091"></a>00091 my_context(0)
+<a name="l00092"></a>00092 {
+<a name="l00093"></a>00093 }
+<a name="l00095"></a>00095
+<a name="l00096"></a>00096 start_reduce( start_reduce& parent_, split ) :
+<a name="l00097"></a>00097 my_body(parent_.my_body),
+<a name="l00098"></a>00098 my_range(parent_.my_range,split()),
+<a name="l00099"></a>00099 my_partition(parent_.my_partition,split()),
+<a name="l00100"></a>00100 my_context(2)
+<a name="l00101"></a>00101 {
+<a name="l00102"></a>00102 my_partition.set_affinity(*<span class="keyword">this</span>);
+<a name="l00103"></a>00103 parent_.my_context = 1;
+<a name="l00104"></a>00104 }
<a name="l00106"></a>00106
-<a name="l00107"></a>00107 <span class="comment">// Requirements on Range concept are documented in blocked_range.h</span>
-<a name="l00108"></a>00108
-<a name="l00119"></a>00119
-<a name="l00121"></a>00121
-<a name="l00122"></a>00122 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
-<a name="l00123"></a><a class="code" href="a00371.html#g68cc046ef72c42ce205fccbc435a0d81">00123</a> <span class="keywordtype">void</span> <a class="code" href="a00371.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Body& body ) {
-<a name="l00124"></a>00124 internal::start_for<Range,Body,__TBB_DEFAULT_PARTITIONER>::run(range,body,__TBB_DEFAULT_PARTITIONER());
-<a name="l00125"></a>00125 }
-<a name="l00126"></a>00126
-<a name="l00128"></a>00128
-<a name="l00129"></a>00129 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
-<a name="l00130"></a><a class="code" href="a00371.html#g13cac5dd55c7533bccea43a51c33d0e5">00130</a> <span class="keywordtype">void</span> <a class="code" href="a00371.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="a00284.html">simple_partitioner</a>& partitioner ) {
-<a name="l00131"></a>00131 internal::start_for<Range,Body,simple_partitioner>::run(range,body,partitioner);
-<a name="l00132"></a>00132 }
-<a name="l00133"></a>00133
-<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><a class="code" href="a00371.html#ga7ac75d532389b55b9247f3fdb0b00d1">00137</a> <span class="keywordtype">void</span> <a class="code" href="a00371.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="a00219.html">auto_partitioner</a>& partitioner ) {
-<a name="l00138"></a>00138 internal::start_for<Range,Body,auto_partitioner>::run(range,body,partitioner);
-<a name="l00139"></a>00139 }
-<a name="l00140"></a>00140
-<a name="l00142"></a>00142
-<a name="l00143"></a>00143 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
-<a name="l00144"></a><a class="code" href="a00371.html#g9cd1b210ceb1c040f30e390b4a21bde8">00144</a> <span class="keywordtype">void</span> <a class="code" href="a00371.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Body& body, <a class="code" href="a00212.html">affinity_partitioner</a>& partitioner ) {
-<a name="l00145"></a>00145 internal::start_for<Range,Body,affinity_partitioner>::run(range,body,partitioner);
-<a name="l00146"></a>00146 }
-<a name="l00147"></a>00147
-<a name="l00148"></a>00148 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00150"></a>00150 <span class="preprocessor"></span>
-<a name="l00151"></a>00151 <span class="preprocessor">template<typename Range, typename Body></span>
-<a name="l00152"></a><a class="code" href="a00371.html#g2d317a5e0078cd193125439fed60dfdc">00152</a> <span class="preprocessor"></span><span class="keywordtype">void</span> <a class="code" href="a00371.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="a00284.html">simple_partitioner</a>& partitioner, <a class="code" hr [...]
-<a name="l00153"></a>00153 internal::start_for<Range,Body,simple_partitioner>::run(range, body, partitioner, context);
-<a name="l00154"></a>00154 }
-<a name="l00155"></a>00155
-<a name="l00157"></a>00157
-<a name="l00158"></a>00158 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
-<a name="l00159"></a><a class="code" href="a00371.html#g1c0700e3f85e83a788ff3ede88ebb7e9">00159</a> <span class="keywordtype">void</span> <a class="code" href="a00371.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="a00219.html">auto_partitioner</a>& partitioner, <a class="code" href="a00293.html">task_group_context< [...]
-<a name="l00160"></a>00160 internal::start_for<Range,Body,auto_partitioner>::run(range, body, partitioner, context);
-<a name="l00161"></a>00161 }
-<a name="l00162"></a>00162
+<a name="l00107"></a>00107 start_reduce( start_reduce& parent_, <span class="keyword">const</span> Range& r, depth_t d ) :
+<a name="l00108"></a>00108 my_body(parent_.my_body),
+<a name="l00109"></a>00109 my_range(r),
+<a name="l00110"></a>00110 my_partition(parent_.my_partition,split()),
+<a name="l00111"></a>00111 my_context(2) <span class="comment">// right leaf mark</span>
+<a name="l00112"></a>00112 {
+<a name="l00113"></a>00113 my_partition.set_affinity(*<span class="keyword">this</span>);
+<a name="l00114"></a>00114 my_partition.align_depth( d );
+<a name="l00115"></a>00115 parent_.my_context = 1; <span class="comment">// left leaf mark</span>
+<a name="l00116"></a>00116 }
+<a name="l00118"></a>00118 <span class="comment">/*override*/</span> <span class="keywordtype">void</span> note_affinity( affinity_id <span class="keywordtype">id</span> ) {
+<a name="l00119"></a>00119 my_partition.note_affinity( <span class="keywordtype">id</span> );
+<a name="l00120"></a>00120 }
+<a name="l00121"></a>00121 <span class="keyword">static</span> <span class="keywordtype">void</span> run( <span class="keyword">const</span> Range& range, Body& body, Partitioner& partitioner ) {
+<a name="l00122"></a>00122 <span class="keywordflow">if</span>( !range.empty() ) {
+<a name="l00123"></a>00123 #<span class="keywordflow">if</span> !__TBB_TASK_GROUP_CONTEXT || TBB_JOIN_OUTER_TASK_GROUP
+<a name="l00124"></a>00124 <a class="code" href="a00311.html#ce8ce689c26a4ddf343829bc3c73290a">task::spawn_root_and_wait</a>( *<span class="keyword">new</span>(<a class="code" href="a00311.html#23acb0da0afd690da797f9f882027d34">task::allocate_root</a>()) start_reduce(range,&body,partitioner) );
+<a name="l00125"></a>00125 <span class="preprocessor">#else</span>
+<a name="l00126"></a>00126 <span class="preprocessor"></span> <span class="comment">// Bound context prevents exceptions from body to affect nesting or sibling algorithms,</span>
+<a name="l00127"></a>00127 <span class="comment">// and allows users to handle exceptions safely by wrapping parallel_for in the try-block.</span>
+<a name="l00128"></a>00128 task_group_context context;
+<a name="l00129"></a>00129 <a class="code" href="a00311.html#ce8ce689c26a4ddf343829bc3c73290a">task::spawn_root_and_wait</a>( *<span class="keyword">new</span>(task::allocate_root(context)) start_reduce(range,&body,partitioner) );
+<a name="l00130"></a>00130 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT && !TBB_JOIN_OUTER_TASK_GROUP */</span>
+<a name="l00131"></a>00131 }
+<a name="l00132"></a>00132 }
+<a name="l00133"></a>00133 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
+<a name="l00134"></a>00134 <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="l00135"></a>00135 <span class="keywordflow">if</span>( !range.empty() )
+<a name="l00136"></a>00136 <a class="code" href="a00311.html#ce8ce689c26a4ddf343829bc3c73290a">task::spawn_root_and_wait</a>( *<span class="keyword">new</span>(task::allocate_root(context)) start_reduce(range,&body,partitioner) );
+<a name="l00137"></a>00137 }
+<a name="l00138"></a>00138 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
+<a name="l00140"></a>00140 finish_type *create_continuation() {
+<a name="l00141"></a>00141 <span class="keywordflow">return</span> <span class="keyword">new</span>( allocate_continuation() ) finish_type(my_context);
+<a name="l00142"></a>00142 }
+<a name="l00144"></a>00144 <span class="keywordtype">void</span> run_body( Range &r ) { (*my_body)( r ); }
+<a name="l00145"></a>00145 };
+<a name="l00146"></a>00146 <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="l00147"></a>00147 task* start_reduce<Range,Body,Partitioner>::execute() {
+<a name="l00148"></a>00148 my_partition.check_being_stolen( *<span class="keyword">this</span> );
+<a name="l00149"></a>00149 <span class="keywordflow">if</span>( my_context==2 ) { <span class="comment">// right child</span>
+<a name="l00150"></a>00150 finish_type* parent_ptr = static_cast<finish_type*>(parent());
+<a name="l00151"></a>00151 <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="l00152"></a>00152 my_body = <span class="keyword">new</span>( parent_ptr->zombie_space.begin() ) Body(*my_body,split());
+<a name="l00153"></a>00153 parent_ptr->has_right_zombie = <span class="keyword">true</span>;
+<a name="l00154"></a>00154 }
+<a name="l00155"></a>00155 } <span class="keywordflow">else</span> __TBB_ASSERT(my_context==0,0);<span class="comment">// because left leaf spawns right leafs without recycling</span>
+<a name="l00156"></a>00156 my_partition.execute(*<span class="keyword">this</span>, my_range);
+<a name="l00157"></a>00157 <span class="keywordflow">if</span>( my_context==1 ) {
+<a name="l00158"></a>00158 finish_type* parent_ptr = static_cast<finish_type*>(parent());
+<a name="l00159"></a>00159 __TBB_ASSERT(my_body!=parent_ptr->zombie_space.begin(),0);
+<a name="l00160"></a>00160 itt_store_word_with_release(parent_ptr->my_body, my_body );
+<a name="l00161"></a>00161 }
+<a name="l00162"></a>00162 <span class="keywordflow">return</span> NULL;
+<a name="l00163"></a>00163 }
<a name="l00164"></a>00164
-<a name="l00165"></a>00165 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
-<a name="l00166"></a><a class="code" href="a00371.html#g04b4696b67370c01353ff5974c8f1196">00166</a> <span class="keywordtype">void</span> <a class="code" href="a00371.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Body& body, <a class="code" href="a00212.html">affinity_partitioner</a>& partitioner, <a class="code" href="a00293.html">task_group_context</a>& context ) {
-<a name="l00167"></a>00167 internal::start_for<Range,Body,affinity_partitioner>::run(range,body,partitioner, context);
-<a name="l00168"></a>00168 }
-<a name="l00169"></a>00169 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
-<a name="l00170"></a>00170
-<a name="l00171"></a>00171
-<a name="l00173"></a>00173 <span class="keyword">namespace </span>internal {
-<a name="l00175"></a>00175 <span class="keyword">template</span><<span class="keyword">typename</span> Function, <span class="keyword">typename</span> Index>
-<a name="l00176"></a>00176 <span class="keyword">class </span>parallel_for_body : internal::no_assign {
-<a name="l00177"></a>00177 <span class="keyword">const</span> Function &my_func;
-<a name="l00178"></a>00178 <span class="keyword">const</span> Index my_begin;
-<a name="l00179"></a>00179 <span class="keyword">const</span> Index my_step;
-<a name="l00180"></a>00180 <span class="keyword">public</span>:
-<a name="l00181"></a>00181 parallel_for_body( <span class="keyword">const</span> Function& _func, Index& _begin, Index& _step)
-<a name="l00182"></a>00182 : my_func(_func), my_begin(_begin), my_step(_step) {}
-<a name="l00183"></a>00183
-<a name="l00184"></a>00184 <span class="keywordtype">void</span> operator()( <a class="code" href="a00221.html">tbb::blocked_range<Index></a>& r )<span class="keyword"> const </span>{
-<a name="l00185"></a>00185 <span class="keywordflow">for</span>( Index i = r.<a class="code" href="a00221.html#18d2258400756ac1446dac7676b18df3">begin</a>(), k = my_begin + i * my_step; i < r.<a class="code" href="a00221.html#8b929d93ddc13f148b11bceef3a3bdf8">end</a>(); i++, k = k + my_step)
-<a name="l00186"></a>00186 my_func( k );
-<a name="l00187"></a>00187 }
-<a name="l00188"></a>00188 };
-<a name="l00189"></a>00189 } <span class="comment">// namespace internal</span>
-<a name="l00191"></a>00191 <span class="comment"></span>
-<a name="l00192"></a>00192 <span class="keyword">namespace </span>strict_ppl {
-<a name="l00193"></a>00193
-<a name="l00195"></a>00195
-<a name="l00196"></a>00196 <span class="keyword">template</span> <<span class="keyword">typename</span> Index, <span class="keyword">typename</span> Function>
-<a name="l00197"></a><a class="code" href="a00370.html#15c764c70c8a32e7a4b8c291d0cc8dde">00197</a> <span class="keywordtype">void</span> <a class="code" href="a00371.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>(Index first, Index last, Index step, <span class="keyword">const</span> Function& f) {
-<a name="l00198"></a>00198 <a class="code" href="a00293.html">tbb::task_group_context</a> context;
-<a name="l00199"></a>00199 <a class="code" href="a00371.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>(first, last, step, f, context);
-<a name="l00200"></a>00200 }
-<a name="l00201"></a>00201 <span class="keyword">template</span> <<span class="keyword">typename</span> Index, <span class="keyword">typename</span> Function>
-<a name="l00202"></a>00202 <span class="keywordtype">void</span> <a class="code" href="a00371.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>(Index first, Index last, Index step, <span class="keyword">const</span> Function& f, <a class="code" href="a00293.html">tbb::task_group_context</a> &context) {
-<a name="l00203"></a>00203 <span class="keywordflow">if</span> (step <= 0 )
-<a name="l00204"></a>00204 internal::throw_exception(internal::eid_nonpositive_step); <span class="comment">// throws std::invalid_argument</span>
-<a name="l00205"></a>00205 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (last > first) {
-<a name="l00206"></a>00206 <span class="comment">// Above "else" avoids "potential divide by zero" warning on some platforms</span>
-<a name="l00207"></a>00207 Index end = (last - first - Index(1)) / step + Index(1);
-<a name="l00208"></a>00208 <a class="code" href="a00221.html">tbb::blocked_range<Index></a> range(static_cast<Index>(0), end);
-<a name="l00209"></a>00209 internal::parallel_for_body<Function, Index> body(f, first, step);
-<a name="l00210"></a>00210 <a class="code" href="a00371.html#g68cc046ef72c42ce205fccbc435a0d81">tbb::parallel_for</a>(range, body, <a class="code" href="a00219.html">tbb::auto_partitioner</a>(), context);
-<a name="l00211"></a>00211 }
-<a name="l00212"></a>00212 }
-<a name="l00214"></a>00214 <span class="keyword">template</span> <<span class="keyword">typename</span> Index, <span class="keyword">typename</span> Function>
-<a name="l00215"></a><a class="code" href="a00370.html#490399525b1e690ec31d6db964c6b272">00215</a> <span class="keywordtype">void</span> <a class="code" href="a00371.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>(Index first, Index last, <span class="keyword">const</span> Function& f) {
-<a name="l00216"></a>00216 <a class="code" href="a00293.html">tbb::task_group_context</a> context;
-<a name="l00217"></a>00217 <a class="code" href="a00371.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>(first, last, static_cast<Index>(1), f, context);
-<a name="l00218"></a>00218 }
-<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="a00371.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>(Index first, Index last, <span class="keyword">const</span> Function& f, <a class="code" href="a00293.html">tbb::task_group_context</a> &context) {
-<a name="l00221"></a>00221 <a class="code" href="a00371.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>(first, last, static_cast<Index>(1), f, context);
-<a name="l00222"></a>00222 }
-<a name="l00223"></a>00223
-<a name="l00225"></a>00225
-<a name="l00226"></a>00226 } <span class="comment">// namespace strict_ppl</span>
-<a name="l00227"></a>00227
-<a name="l00228"></a>00228 <span class="keyword">using</span> <a class="code" href="a00371.html#g68cc046ef72c42ce205fccbc435a0d81">strict_ppl::parallel_for</a>;
+<a name="l00165"></a>00165 <span class="preprocessor">#if TBB_PREVIEW_DETERMINISTIC_REDUCE</span>
+<a name="l00167"></a>00167 <span class="preprocessor"></span>
+<a name="l00168"></a>00168 <span class="preprocessor"> template<typename Body></span>
+<a name="l00169"></a>00169 <span class="preprocessor"></span> <span class="keyword">class </span>finish_deterministic_reduce: <span class="keyword">public</span> task {
+<a name="l00170"></a>00170 Body &my_left_body;
+<a name="l00171"></a>00171 Body my_right_body;
+<a name="l00172"></a>00172
+<a name="l00173"></a>00173 finish_deterministic_reduce( Body &body ) :
+<a name="l00174"></a>00174 my_left_body( body ),
+<a name="l00175"></a>00175 my_right_body( body, split() )
+<a name="l00176"></a>00176 {
+<a name="l00177"></a>00177 }
+<a name="l00178"></a>00178 task* execute() {
+<a name="l00179"></a>00179 my_left_body.join( my_right_body );
+<a name="l00180"></a>00180 <span class="keywordflow">return</span> NULL;
+<a name="l00181"></a>00181 }
+<a name="l00182"></a>00182 <span class="keyword">template</span><<span class="keyword">typename</span> Range,<span class="keyword">typename</span> Body_>
+<a name="l00183"></a>00183 <span class="keyword">friend</span> <span class="keyword">class </span>start_deterministic_reduce;
+<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>00189 <span class="keyword">class </span>start_deterministic_reduce: <span class="keyword">public</span> task {
+<a name="l00190"></a>00190 <span class="keyword">typedef</span> finish_deterministic_reduce<Body> finish_type;
+<a name="l00191"></a>00191 Body &my_body;
+<a name="l00192"></a>00192 Range my_range;
+<a name="l00193"></a>00193 <span class="comment">/*override*/</span> task* execute();
+<a name="l00194"></a>00194
+<a name="l00196"></a>00196 start_deterministic_reduce( <span class="keyword">const</span> Range& range, Body& body ) :
+<a name="l00197"></a>00197 my_body( body ),
+<a name="l00198"></a>00198 my_range( range )
+<a name="l00199"></a>00199 {
+<a name="l00200"></a>00200 }
+<a name="l00202"></a>00202
+<a name="l00203"></a>00203 start_deterministic_reduce( start_deterministic_reduce& parent_, finish_type& c ) :
+<a name="l00204"></a>00204 my_body( c.my_right_body ),
+<a name="l00205"></a>00205 my_range( parent_.my_range, split() )
+<a name="l00206"></a>00206 {
+<a name="l00207"></a>00207 }
+<a name="l00208"></a>00208
+<a name="l00209"></a>00209 <span class="keyword">public</span>:
+<a name="l00210"></a>00210 <span class="keyword">static</span> <span class="keywordtype">void</span> run( <span class="keyword">const</span> Range& range, Body& body ) {
+<a name="l00211"></a>00211 <span class="keywordflow">if</span>( !range.empty() ) {
+<a name="l00212"></a>00212 #<span class="keywordflow">if</span> !__TBB_TASK_GROUP_CONTEXT || TBB_JOIN_OUTER_TASK_GROUP
+<a name="l00213"></a>00213 task::spawn_root_and_wait( *<span class="keyword">new</span>(task::allocate_root()) start_deterministic_reduce(range,&body) );
+<a name="l00214"></a>00214 <span class="preprocessor">#else</span>
+<a name="l00215"></a>00215 <span class="preprocessor"></span> <span class="comment">// Bound context prevents exceptions from body to affect nesting or sibling algorithms,</span>
+<a name="l00216"></a>00216 <span class="comment">// and allows users to handle exceptions safely by wrapping parallel_for in the try-block.</span>
+<a name="l00217"></a>00217 task_group_context context;
+<a name="l00218"></a>00218 task::spawn_root_and_wait( *<span class="keyword">new</span>(task::allocate_root(context)) start_deterministic_reduce(range,body) );
+<a name="l00219"></a>00219 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT && !TBB_JOIN_OUTER_TASK_GROUP */</span>
+<a name="l00220"></a>00220 }
+<a name="l00221"></a>00221 }
+<a name="l00222"></a>00222 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
+<a name="l00223"></a>00223 <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="l00224"></a>00224 <span class="keywordflow">if</span>( !range.empty() )
+<a name="l00225"></a>00225 task::spawn_root_and_wait( *<span class="keyword">new</span>(task::allocate_root(context)) start_deterministic_reduce(range,body) );
+<a name="l00226"></a>00226 }
+<a name="l00227"></a>00227 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
+<a name="l00228"></a>00228 };
<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_parallel_for_H */</span>
-<a name="l00233"></a>00233
+<a name="l00230"></a>00230 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
+<a name="l00231"></a>00231 task* start_deterministic_reduce<Range,Body>::execute() {
+<a name="l00232"></a>00232 <span class="keywordflow">if</span>( !my_range.is_divisible() ) {
+<a name="l00233"></a>00233 my_body( my_range );
+<a name="l00234"></a>00234 <span class="keywordflow">return</span> NULL;
+<a name="l00235"></a>00235 } <span class="keywordflow">else</span> {
+<a name="l00236"></a>00236 finish_type& c = *<span class="keyword">new</span>( allocate_continuation() ) finish_type( my_body );
+<a name="l00237"></a>00237 recycle_as_child_of(c);
+<a name="l00238"></a>00238 c.set_ref_count(2);
+<a name="l00239"></a>00239 start_deterministic_reduce& b = *<span class="keyword">new</span>( c.allocate_child() ) start_deterministic_reduce( *<span class="keyword">this</span>, c );
+<a name="l00240"></a>00240 task::spawn(b);
+<a name="l00241"></a>00241 <span class="keywordflow">return</span> <span class="keyword">this</span>;
+<a name="l00242"></a>00242 }
+<a name="l00243"></a>00243 }
+<a name="l00244"></a>00244 <span class="preprocessor">#endif </span><span class="comment">/* TBB_PREVIEW_DETERMINISTIC_REDUCE */</span>
+<a name="l00245"></a>00245 } <span class="comment">// namespace internal</span>
+<a name="l00247"></a>00247 <span class="comment"></span>} <span class="comment">//namespace interfaceX</span>
+<a name="l00248"></a>00248
+<a name="l00250"></a>00250 <span class="keyword">namespace </span>internal {
+<a name="l00251"></a>00251 <span class="keyword">using</span> interface6::internal::start_reduce;
+<a name="l00252"></a>00252 <span class="preprocessor">#if TBB_PREVIEW_DETERMINISTIC_REDUCE</span>
+<a name="l00253"></a>00253 <span class="preprocessor"></span> <span class="keyword">using</span> interface6::internal::start_deterministic_reduce;
+<a name="l00254"></a>00254 <span class="preprocessor">#endif</span>
+<a name="l00256"></a>00256 <span class="preprocessor"></span>
+<a name="l00260"></a>00260 <span class="preprocessor"> template<typename Range, typename Value, typename RealBody, typename Reduction></span>
+<a name="l00261"></a>00261 <span class="preprocessor"></span> <span class="keyword">class </span>lambda_reduce_body {
+<a name="l00262"></a>00262
+<a name="l00263"></a>00263 <span class="comment">//FIXME: decide if my_real_body, my_reduction, and identity_element should be copied or referenced</span>
+<a name="l00264"></a>00264 <span class="comment">// (might require some performance measurements)</span>
+<a name="l00265"></a>00265
+<a name="l00266"></a>00266 <span class="keyword">const</span> Value& identity_element;
+<a name="l00267"></a>00267 <span class="keyword">const</span> RealBody& my_real_body;
+<a name="l00268"></a>00268 <span class="keyword">const</span> Reduction& my_reduction;
+<a name="l00269"></a>00269 Value my_value;
+<a name="l00270"></a>00270 lambda_reduce_body& operator= ( <span class="keyword">const</span> lambda_reduce_body& other );
+<a name="l00271"></a>00271 <span class="keyword">public</span>:
+<a name="l00272"></a>00272 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="l00273"></a>00273 : identity_element(identity)
+<a name="l00274"></a>00274 , my_real_body(body)
+<a name="l00275"></a>00275 , my_reduction(reduction)
+<a name="l00276"></a>00276 , my_value(identity)
+<a name="l00277"></a>00277 { }
+<a name="l00278"></a>00278 lambda_reduce_body( <span class="keyword">const</span> lambda_reduce_body& other )
+<a name="l00279"></a>00279 : identity_element(other.identity_element)
+<a name="l00280"></a>00280 , my_real_body(other.my_real_body)
+<a name="l00281"></a>00281 , my_reduction(other.my_reduction)
+<a name="l00282"></a>00282 , my_value(other.my_value)
+<a name="l00283"></a>00283 { }
+<a name="l00284"></a>00284 lambda_reduce_body( lambda_reduce_body& other, <a class="code" href="a00309.html">tbb::split</a> )
+<a name="l00285"></a>00285 : identity_element(other.identity_element)
+<a name="l00286"></a>00286 , my_real_body(other.my_real_body)
+<a name="l00287"></a>00287 , my_reduction(other.my_reduction)
+<a name="l00288"></a>00288 , my_value(other.identity_element)
+<a name="l00289"></a>00289 { }
+<a name="l00290"></a>00290 <span class="keywordtype">void</span> operator()(Range& range) {
+<a name="l00291"></a>00291 my_value = my_real_body(range, const_cast<const Value&>(my_value));
+<a name="l00292"></a>00292 }
+<a name="l00293"></a>00293 <span class="keywordtype">void</span> join( lambda_reduce_body& rhs ) {
+<a name="l00294"></a>00294 my_value = my_reduction(const_cast<const Value&>(my_value), const_cast<const Value&>(rhs.my_value));
+<a name="l00295"></a>00295 }
+<a name="l00296"></a>00296 Value result()<span class="keyword"> const </span>{
+<a name="l00297"></a>00297 <span class="keywordflow">return</span> my_value;
+<a name="l00298"></a>00298 }
+<a name="l00299"></a>00299 };
+<a name="l00300"></a>00300
+<a name="l00301"></a>00301 } <span class="comment">// namespace internal</span>
+<a name="l00303"></a>00303 <span class="comment"></span>
+<a name="l00304"></a>00304 <span class="comment">// Requirements on Range concept are documented in blocked_range.h</span>
+<a name="l00305"></a>00305
+<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="a00395.html#g1b3d59c5eb62683c5754db6970392fa3">00328</a> <span class="keywordtype">void</span> <a class="code" href="a00395.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, Body& body ) {
+<a name="l00329"></a>00329 internal::start_reduce<Range,Body, const __TBB_DEFAULT_PARTITIONER>::run( range, body, __TBB_DEFAULT_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="a00395.html#gec1b7c03f9da909bef5db12e3d41bed3">00335</a> <span class="keywordtype">void</span> <a class="code" href="a00395.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, Body& body, <span class="keyword">const</span> <a class="code" href="a00303.html">simple_partitioner</a>& partitioner ) {
+<a name="l00336"></a>00336 internal::start_reduce<Range,Body,const simple_partitioner>::run( range, body, partitioner );
+<a name="l00337"></a>00337 }
+<a name="l00338"></a>00338
+<a name="l00340"></a>00340
+<a name="l00341"></a>00341 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
+<a name="l00342"></a><a class="code" href="a00395.html#g18a19157e6245992fc00ca0adeb7dd37">00342</a> <span class="keywordtype">void</span> <a class="code" href="a00395.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, Body& body, <span class="keyword">const</span> <a class="code" href="a00231.html">auto_partitioner</a>& partitioner ) {
+<a name="l00343"></a>00343 internal::start_reduce<Range,Body,const auto_partitioner>::run( range, body, partitioner );
+<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> Range, <span class="keyword">typename</span> Body>
+<a name="l00349"></a><a class="code" href="a00395.html#gc61e73fcc36c92d79a217fc355ff4a6b">00349</a> <span class="keywordtype">void</span> <a class="code" href="a00395.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, Body& body, <a class="code" href="a00225.html">affinity_partitioner</a>& partitioner ) {
+<a name="l00350"></a>00350 internal::start_reduce<Range,Body,affinity_partitioner>::run( range, body, partitioner );
+<a name="l00351"></a>00351 }
+<a name="l00352"></a>00352
+<a name="l00353"></a>00353 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
+<a name="l00355"></a>00355 <span class="preprocessor"></span>
+<a name="l00356"></a>00356 <span class="preprocessor">template<typename Range, typename Body></span>
+<a name="l00357"></a><a class="code" href="a00395.html#g45cb00c42a18e334bbde8b7535afe460">00357</a> <span class="preprocessor"></span><span class="keywordtype">void</span> <a class="code" href="a00395.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, Body& body, <span class="keyword">const</span> <a class="code" href="a00303.html">simple_partitioner</a>& partitioner, <a class="code" href="a00314.html">task_group_cont [...]
+<a name="l00358"></a>00358 internal::start_reduce<Range,Body,const simple_partitioner>::run( range, body, partitioner, context );
+<a name="l00359"></a>00359 }
+<a name="l00360"></a>00360
+<a name="l00362"></a>00362
+<a name="l00363"></a>00363 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
+<a name="l00364"></a><a class="code" href="a00395.html#g1c1ea1d7c61b3c225e92c70d669a53a5">00364</a> <span class="keywordtype">void</span> <a class="code" href="a00395.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, Body& body, <span class="keyword">const</span> <a class="code" href="a00231.html">auto_partitioner</a>& partitioner, <a class="code" href="a00314.html">task_group_context</a>& context ) {
+<a name="l00365"></a>00365 internal::start_reduce<Range,Body,const auto_partitioner>::run( range, body, partitioner, context );
+<a name="l00366"></a>00366 }
+<a name="l00367"></a>00367
+<a name="l00369"></a>00369
+<a name="l00370"></a>00370 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
+<a name="l00371"></a><a class="code" href="a00395.html#gd9ac3a3811060314695f33b703c6e11b">00371</a> <span class="keywordtype">void</span> <a class="code" href="a00395.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, Body& body, <a class="code" href="a00225.html">affinity_partitioner</a>& partitioner, <a class="code" href="a00314.html">task_group_context</a>& context ) {
+<a name="l00372"></a>00372 internal::start_reduce<Range,Body,affinity_partitioner>::run( range, body, partitioner, context );
+<a name="l00373"></a>00373 }
+<a name="l00374"></a>00374 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
+<a name="l00375"></a>00375
+<a name="l00379"></a>00379
+<a name="l00380"></a>00380
+<a name="l00381"></a>00381 <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="l00382"></a><a class="code" href="a00395.html#gc9412e09fb01fcad8c018ea9cffb28ef">00382</a> Value <a class="code" href="a00395.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="l00383"></a>00383 internal::lambda_reduce_body<Range,Value,RealBody,Reduction> body(identity, real_body, reduction);
+<a name="l00384"></a>00384 internal::start_reduce<Range,internal::lambda_reduce_body<Range,Value,RealBody,Reduction>,<span class="keyword">const</span> __TBB_DEFAULT_PARTITIONER>
+<a name="l00385"></a>00385 ::run(range, body, __TBB_DEFAULT_PARTITIONER() );
+<a name="l00386"></a>00386 <span class="keywordflow">return</span> body.result();
+<a name="l00387"></a>00387 }
+<a name="l00388"></a>00388
+<a name="l00390"></a>00390
+<a name="l00391"></a>00391 <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="l00392"></a><a class="code" href="a00395.html#gaddffeec0e892ac3d6fc7fc2053e1eca">00392</a> Value <a class="code" href="a00395.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="l00393"></a>00393 <span class="keyword">const</span> <a class="code" href="a00303.html">simple_partitioner</a>& partitioner ) {
+<a name="l00394"></a>00394 internal::lambda_reduce_body<Range,Value,RealBody,Reduction> body(identity, real_body, reduction);
+<a name="l00395"></a>00395 internal::start_reduce<Range,internal::lambda_reduce_body<Range,Value,RealBody,Reduction>,<span class="keyword">const</span> <a class="code" href="a00303.html">simple_partitioner</a>>
+<a name="l00396"></a>00396 ::run(range, body, partitioner );
+<a name="l00397"></a>00397 <span class="keywordflow">return</span> body.result();
+<a name="l00398"></a>00398 }
+<a name="l00399"></a>00399
+<a name="l00401"></a>00401
+<a name="l00402"></a>00402 <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="l00403"></a><a class="code" href="a00395.html#gb175401f0729e40dd2c5860a17c14385">00403</a> Value <a class="code" href="a00395.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="l00404"></a>00404 <span class="keyword">const</span> <a class="code" href="a00231.html">auto_partitioner</a>& partitioner ) {
+<a name="l00405"></a>00405 internal::lambda_reduce_body<Range,Value,RealBody,Reduction> body(identity, real_body, reduction);
+<a name="l00406"></a>00406 internal::start_reduce<Range,internal::lambda_reduce_body<Range,Value,RealBody,Reduction>,<span class="keyword">const</span> <a class="code" href="a00231.html">auto_partitioner</a>>
+<a name="l00407"></a>00407 ::run( range, body, partitioner );
+<a name="l00408"></a>00408 <span class="keywordflow">return</span> body.result();
+<a name="l00409"></a>00409 }
+<a name="l00410"></a>00410
+<a name="l00412"></a>00412
+<a name="l00413"></a>00413 <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="l00414"></a><a class="code" href="a00395.html#gb7f1f1828ae2b330ce05b8513a495154">00414</a> Value <a class="code" href="a00395.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="l00415"></a>00415 <a class="code" href="a00225.html">affinity_partitioner</a>& partitioner ) {
+<a name="l00416"></a>00416 internal::lambda_reduce_body<Range,Value,RealBody,Reduction> body(identity, real_body, reduction);
+<a name="l00417"></a>00417 internal::start_reduce<Range,internal::lambda_reduce_body<Range,Value,RealBody,Reduction>,<a class="code" href="a00225.html">affinity_partitioner</a>>
+<a name="l00418"></a>00418 ::run( range, body, partitioner );
+<a name="l00419"></a>00419 <span class="keywordflow">return</span> body.result();
+<a name="l00420"></a>00420 }
+<a name="l00421"></a>00421
+<a name="l00422"></a>00422 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
+<a name="l00424"></a>00424 <span class="preprocessor"></span>
+<a name="l00425"></a>00425 <span class="preprocessor">template<typename Range, typename Value, typename RealBody, typename Reduction></span>
+<a name="l00426"></a><a class="code" href="a00395.html#gfbc0cc2026d87f11a96bcd62788f5bb5">00426</a> <span class="preprocessor"></span>Value <a class="code" href="a00395.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="l00427"></a>00427 <span class="keyword">const</span> <a class="code" href="a00303.html">simple_partitioner</a>& partitioner, <a class="code" href="a00314.html">task_group_context</a>& context ) {
+<a name="l00428"></a>00428 internal::lambda_reduce_body<Range,Value,RealBody,Reduction> body(identity, real_body, reduction);
+<a name="l00429"></a>00429 internal::start_reduce<Range,internal::lambda_reduce_body<Range,Value,RealBody,Reduction>,<span class="keyword">const</span> <a class="code" href="a00303.html">simple_partitioner</a>>
+<a name="l00430"></a>00430 ::run( range, body, partitioner, context );
+<a name="l00431"></a>00431 <span class="keywordflow">return</span> body.result();
+<a name="l00432"></a>00432 }
+<a name="l00433"></a>00433
+<a name="l00435"></a>00435
+<a name="l00436"></a>00436 <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="l00437"></a><a class="code" href="a00395.html#g630c90a399937d9d4ae70ff883186dfd">00437</a> Value <a class="code" href="a00395.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="l00438"></a>00438 <span class="keyword">const</span> <a class="code" href="a00231.html">auto_partitioner</a>& partitioner, <a class="code" href="a00314.html">task_group_context</a>& context ) {
+<a name="l00439"></a>00439 internal::lambda_reduce_body<Range,Value,RealBody,Reduction> body(identity, real_body, reduction);
+<a name="l00440"></a>00440 internal::start_reduce<Range,internal::lambda_reduce_body<Range,Value,RealBody,Reduction>,<span class="keyword">const</span> <a class="code" href="a00231.html">auto_partitioner</a>>
+<a name="l00441"></a>00441 ::run( range, body, partitioner, context );
+<a name="l00442"></a>00442 <span class="keywordflow">return</span> body.result();
+<a name="l00443"></a>00443 }
+<a name="l00444"></a>00444
+<a name="l00446"></a>00446
+<a name="l00447"></a>00447 <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="l00448"></a><a class="code" href="a00395.html#g496bd7eadb3b97495ccb5655ef90319e">00448</a> Value <a class="code" href="a00395.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="l00449"></a>00449 <a class="code" href="a00225.html">affinity_partitioner</a>& partitioner, <a class="code" href="a00314.html">task_group_context</a>& context ) {
+<a name="l00450"></a>00450 internal::lambda_reduce_body<Range,Value,RealBody,Reduction> body(identity, real_body, reduction);
+<a name="l00451"></a>00451 internal::start_reduce<Range,internal::lambda_reduce_body<Range,Value,RealBody,Reduction>,<a class="code" href="a00225.html">affinity_partitioner</a>>
+<a name="l00452"></a>00452 ::run( range, body, partitioner, context );
+<a name="l00453"></a>00453 <span class="keywordflow">return</span> body.result();
+<a name="l00454"></a>00454 }
+<a name="l00455"></a>00455 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
+<a name="l00456"></a>00456
+<a name="l00457"></a>00457 <span class="preprocessor">#if TBB_PREVIEW_DETERMINISTIC_REDUCE</span>
+<a name="l00459"></a>00459 <span class="preprocessor"></span>
+<a name="l00460"></a>00460 <span class="preprocessor">template<typename Range, typename Body></span>
+<a name="l00461"></a><a class="code" href="a00395.html#g873006cc80868b5b4604822bf100ddeb">00461</a> <span class="preprocessor"></span><span class="keywordtype">void</span> <a class="code" href="a00395.html#g873006cc80868b5b4604822bf100ddeb">parallel_deterministic_reduce</a>( <span class="keyword">const</span> Range& range, Body& body ) {
+<a name="l00462"></a>00462 internal::start_deterministic_reduce<Range,Body>::run( range, body );
+<a name="l00463"></a>00463 }
+<a name="l00464"></a>00464
+<a name="l00465"></a>00465 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
+<a name="l00467"></a>00467 <span class="preprocessor"></span>
+<a name="l00468"></a>00468 <span class="preprocessor">template<typename Range, typename Body></span>
+<a name="l00469"></a><a class="code" href="a00395.html#gfd08c56b3a98d4437dadc5365326928a">00469</a> <span class="preprocessor"></span><span class="keywordtype">void</span> <a class="code" href="a00395.html#g873006cc80868b5b4604822bf100ddeb">parallel_deterministic_reduce</a>( <span class="keyword">const</span> Range& range, Body& body, <a class="code" href="a00314.html">task_group_context</a>& context ) {
+<a name="l00470"></a>00470 internal::start_deterministic_reduce<Range,Body>::run( range, body, context );
+<a name="l00471"></a>00471 }
+<a name="l00472"></a>00472 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
+<a name="l00473"></a>00473
+<a name="l00477"></a>00477
+<a name="l00478"></a>00478
+<a name="l00479"></a>00479 <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="l00480"></a><a class="code" href="a00395.html#g3edb17bb1967c291d227556e0e47e507">00480</a> Value <a class="code" href="a00395.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="l00481"></a>00481 internal::lambda_reduce_body<Range,Value,RealBody,Reduction> body(identity, real_body, reduction);
+<a name="l00482"></a>00482 internal::start_deterministic_reduce<Range,internal::lambda_reduce_body<Range,Value,RealBody,Reduction> >
+<a name="l00483"></a>00483 ::run(range, body);
+<a name="l00484"></a>00484 <span class="keywordflow">return</span> body.result();
+<a name="l00485"></a>00485 }
+<a name="l00486"></a>00486
+<a name="l00487"></a>00487 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
+<a name="l00489"></a>00489 <span class="preprocessor"></span>
+<a name="l00490"></a>00490 <span class="preprocessor">template<typename Range, typename Value, typename RealBody, typename Reduction></span>
+<a name="l00491"></a><a class="code" href="a00395.html#g0a66bc67567b2d01d709b59b9bddf84a">00491</a> <span class="preprocessor"></span>Value <a class="code" href="a00395.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="l00492"></a>00492 <a class="code" href="a00314.html">task_group_context</a>& context ) {
+<a name="l00493"></a>00493 internal::lambda_reduce_body<Range,Value,RealBody,Reduction> body(identity, real_body, reduction);
+<a name="l00494"></a>00494 internal::start_deterministic_reduce<Range,internal::lambda_reduce_body<Range,Value,RealBody,Reduction> >
+<a name="l00495"></a>00495 ::run( range, body, context );
+<a name="l00496"></a>00496 <span class="keywordflow">return</span> body.result();
+<a name="l00497"></a>00497 }
+<a name="l00498"></a>00498 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
+<a name="l00499"></a>00499 <span class="preprocessor">#endif </span><span class="comment">/* TBB_PREVIEW_DETERMINISTIC_REDUCE */</span>
+<a name="l00500"></a>00500
+<a name="l00501"></a>00501
+<a name="l00502"></a>00502 } <span class="comment">// namespace tbb</span>
+<a name="l00503"></a>00503
+<a name="l00504"></a>00504 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_parallel_reduce_H */</span>
+<a name="l00505"></a>00505
</pre></div><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00518.html b/doc/html/a00518.html
index 9f8f271..b3be504 100644
--- a/doc/html/a00518.html
+++ b/doc/html/a00518.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>parallel_invoke.h Source File</title>
+<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>
@@ -19,7 +19,7 @@
<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>
+<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-2011 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>
@@ -39,330 +39,297 @@
<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="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
-<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">// Simple task object, executing user method</span>
-<a name="l00031"></a>00031 <span class="keyword">template</span><<span class="keyword">typename</span> function>
-<a name="l00032"></a>00032 <span class="keyword">class </span>function_invoker : <span class="keyword">public</span> task{
-<a name="l00033"></a>00033 <span class="keyword">public</span>:
-<a name="l00034"></a>00034 function_invoker(<span class="keyword">const</span> function& _function) : my_function(_function) {}
-<a name="l00035"></a>00035 <span class="keyword">private</span>:
-<a name="l00036"></a>00036 <span class="keyword">const</span> function &my_function;
-<a name="l00037"></a>00037 <span class="comment">/*override*/</span>
-<a name="l00038"></a>00038 task* execute()
-<a name="l00039"></a>00039 {
-<a name="l00040"></a>00040 my_function();
-<a name="l00041"></a>00041 <span class="keywordflow">return</span> NULL;
-<a name="l00042"></a>00042 }
-<a name="l00043"></a>00043 };
-<a name="l00044"></a>00044
-<a name="l00045"></a>00045 <span class="comment">// The class spawns two or three child tasks</span>
-<a name="l00046"></a>00046 <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="l00047"></a>00047 <span class="keyword">class </span>spawner : <span class="keyword">public</span> task {
-<a name="l00048"></a>00048 <span class="keyword">private</span>:
-<a name="l00049"></a>00049 <span class="keyword">const</span> function1& my_func1;
-<a name="l00050"></a>00050 <span class="keyword">const</span> function2& my_func2;
-<a name="l00051"></a>00051 <span class="keyword">const</span> function3& my_func3;
-<a name="l00052"></a>00052 <span class="keywordtype">bool</span> is_recycled;
-<a name="l00053"></a>00053
-<a name="l00054"></a>00054 task* execute (){
-<a name="l00055"></a>00055 <span class="keywordflow">if</span>(is_recycled){
-<a name="l00056"></a>00056 <span class="keywordflow">return</span> NULL;
-<a name="l00057"></a>00057 }<span class="keywordflow">else</span>{
-<a name="l00058"></a>00058 __TBB_ASSERT(N==2 || N==3, <span class="stringliteral">"Number of arguments passed to spawner is wrong"</span>);
-<a name="l00059"></a>00059 set_ref_count(N);
-<a name="l00060"></a>00060 recycle_as_safe_continuation();
-<a name="l00061"></a>00061 internal::function_invoker<function2>* invoker2 = <span class="keyword">new</span> (allocate_child()) internal::function_invoker<function2>(my_func2);
-<a name="l00062"></a>00062 __TBB_ASSERT(invoker2, <span class="stringliteral">"Child task allocation failed"</span>);
-<a name="l00063"></a>00063 spawn(*invoker2);
-<a name="l00064"></a>00064 size_t n = N; <span class="comment">// To prevent compiler warnings</span>
-<a name="l00065"></a>00065 <span class="keywordflow">if</span> (n>2) {
-<a name="l00066"></a>00066 internal::function_invoker<function3>* invoker3 = <span class="keyword">new</span> (allocate_child()) internal::function_invoker<function3>(my_func3);
-<a name="l00067"></a>00067 __TBB_ASSERT(invoker3, <span class="stringliteral">"Child task allocation failed"</span>);
-<a name="l00068"></a>00068 spawn(*invoker3);
-<a name="l00069"></a>00069 }
-<a name="l00070"></a>00070 my_func1();
-<a name="l00071"></a>00071 is_recycled = <span class="keyword">true</span>;
-<a name="l00072"></a>00072 <span class="keywordflow">return</span> NULL;
-<a name="l00073"></a>00073 }
-<a name="l00074"></a>00074 } <span class="comment">// execute</span>
-<a name="l00075"></a>00075
-<a name="l00076"></a>00076 <span class="keyword">public</span>:
-<a name="l00077"></a>00077 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="l00078"></a>00078 };
+<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="a00285.html">00033</a> <span class="keyword">struct </span><a class="code" href="a00285.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="a00258.html">00039</a> <span class="keyword">struct </span><a class="code" href="a00258.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="a00311.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="a00227.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="a00309.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="comment">// Creates and spawns child tasks</span>
-<a name="l00081"></a>00081 <span class="keyword">class </span>parallel_invoke_helper : <span class="keyword">public</span> empty_task {
-<a name="l00082"></a>00082 <span class="keyword">public</span>:
-<a name="l00083"></a>00083 <span class="comment">// Dummy functor class</span>
-<a name="l00084"></a>00084 <span class="keyword">class </span>parallel_invoke_noop {
-<a name="l00085"></a>00085 <span class="keyword">public</span>:
-<a name="l00086"></a>00086 <span class="keywordtype">void</span> operator() ()<span class="keyword"> const </span>{}
-<a name="l00087"></a>00087 };
-<a name="l00088"></a>00088 <span class="comment">// Creates a helper object with user-defined number of children expected</span>
-<a name="l00089"></a>00089 parallel_invoke_helper(<span class="keywordtype">int</span> number_of_children)
-<a name="l00090"></a>00090 {
-<a name="l00091"></a>00091 set_ref_count(number_of_children + 1);
-<a name="l00092"></a>00092 }
-<a name="l00093"></a>00093 <span class="comment">// Adds child task and spawns it</span>
-<a name="l00094"></a>00094 <span class="keyword">template</span> <<span class="keyword">typename</span> function>
-<a name="l00095"></a>00095 <span class="keywordtype">void</span> add_child (<span class="keyword">const</span> function &_func)
-<a name="l00096"></a>00096 {
-<a name="l00097"></a>00097 internal::function_invoker<function>* invoker = <span class="keyword">new</span> (allocate_child()) internal::function_invoker<function>(_func);
-<a name="l00098"></a>00098 __TBB_ASSERT(invoker, <span class="stringliteral">"Child task allocation failed"</span>);
-<a name="l00099"></a>00099 spawn(*invoker);
-<a name="l00100"></a>00100 }
-<a name="l00101"></a>00101
-<a name="l00102"></a>00102 <span class="comment">// Adds a task with multiple child tasks and spawns it</span>
-<a name="l00103"></a>00103 <span class="comment">// two arguments</span>
-<a name="l00104"></a>00104 <span class="keyword">template</span> <<span class="keyword">typename</span> function1, <span class="keyword">typename</span> function2>
-<a name="l00105"></a>00105 <span class="keywordtype">void</span> add_children (<span class="keyword">const</span> function1& _func1, <span class="keyword">const</span> function2& _func2)
-<a name="l00106"></a>00106 {
-<a name="l00107"></a>00107 <span class="comment">// The third argument is dummy, it is ignored actually.</span>
-<a name="l00108"></a>00108 parallel_invoke_noop noop;
-<a name="l00109"></a>00109 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="l00110"></a>00110 spawn(sub_root);
-<a name="l00111"></a>00111 }
-<a name="l00112"></a>00112 <span class="comment">// three arguments</span>
-<a name="l00113"></a>00113 <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="l00114"></a>00114 <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="l00115"></a>00115 {
-<a name="l00116"></a>00116 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="l00117"></a>00117 spawn(sub_root);
-<a name="l00118"></a>00118 }
-<a name="l00119"></a>00119
-<a name="l00120"></a>00120 <span class="comment">// Waits for all child tasks</span>
-<a name="l00121"></a>00121 <span class="keyword">template</span> <<span class="keyword">typename</span> F0>
-<a name="l00122"></a>00122 <span class="keywordtype">void</span> run_and_finish(<span class="keyword">const</span> F0& f0)
-<a name="l00123"></a>00123 {
-<a name="l00124"></a>00124 internal::function_invoker<F0>* invoker = <span class="keyword">new</span> (allocate_child()) internal::function_invoker<F0>(f0);
-<a name="l00125"></a>00125 __TBB_ASSERT(invoker, <span class="stringliteral">"Child task allocation failed"</span>);
-<a name="l00126"></a>00126 spawn_and_wait_for_all(*invoker);
-<a name="l00127"></a>00127 }
-<a name="l00128"></a>00128 };
-<a name="l00129"></a>00129 <span class="comment">// The class destroys root if exception occured as well as in normal case</span>
-<a name="l00130"></a>00130 <span class="keyword">class </span>parallel_invoke_cleaner: internal::no_copy {
-<a name="l00131"></a>00131 <span class="keyword">public</span>:
-<a name="l00132"></a>00132 parallel_invoke_cleaner(<span class="keywordtype">int</span> number_of_children, <a class="code" href="a00293.html">tbb::task_group_context</a>& context) : root(*new(task::allocate_root(context)) internal::parallel_invoke_helper(number_of_children))
-<a name="l00133"></a>00133 {}
-<a name="l00134"></a>00134 ~parallel_invoke_cleaner(){
-<a name="l00135"></a>00135 root.destroy(root);
-<a name="l00136"></a>00136 }
-<a name="l00137"></a>00137 internal::parallel_invoke_helper& root;
+<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 } <span class="comment">// namespace internal</span>
-<a name="l00141"></a>00141 <span class="comment"></span>
-<a name="l00145"></a>00145
-<a name="l00146"></a>00146
-<a name="l00148"></a>00148 <span class="comment">// parallel_invoke with user-defined context</span>
-<a name="l00149"></a>00149 <span class="comment">// two arguments</span>
-<a name="l00150"></a>00150 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1 >
-<a name="l00151"></a><a class="code" href="a00371.html#gd3e2998f171494f94c2103f4eb924084">00151</a> <span class="keywordtype">void</span> <a class="code" href="a00371.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <a class="code" href="a00293.html">tbb::task_group_context</a>& context) {
-<a name="l00152"></a>00152 internal::parallel_invoke_cleaner cleaner(2, context);
-<a name="l00153"></a>00153 internal::parallel_invoke_helper& root = cleaner.root;
-<a name="l00154"></a>00154
-<a name="l00155"></a>00155 root.add_child(f1);
-<a name="l00156"></a>00156
-<a name="l00157"></a>00157 root.run_and_finish(f0);
-<a name="l00158"></a>00158 }
-<a name="l00159"></a>00159
-<a name="l00160"></a>00160 <span class="comment">// three arguments</span>
-<a name="l00161"></a>00161 <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="l00162"></a>00162 <span class="keywordtype">void</span> <a class="code" href="a00371.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="a00293.html">tbb::task_group_context</a>& context) {
-<a name="l00163"></a>00163 internal::parallel_invoke_cleaner cleaner(3, context);
-<a name="l00164"></a>00164 internal::parallel_invoke_helper& root = cleaner.root;
-<a name="l00165"></a>00165
-<a name="l00166"></a>00166 root.add_child(f2);
-<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">// four 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, <span class="keyword">typename</span> F3>
-<a name="l00174"></a>00174 <span class="keywordtype">void</span> <a class="code" href="a00371.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="l00175"></a>00175 <a class="code" href="a00293.html">tbb::task_group_context</a>& context)
-<a name="l00176"></a>00176 {
-<a name="l00177"></a>00177 internal::parallel_invoke_cleaner cleaner(4, context);
-<a name="l00178"></a>00178 internal::parallel_invoke_helper& root = cleaner.root;
+<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 root.add_child(f3);
-<a name="l00181"></a>00181 root.add_child(f2);
-<a name="l00182"></a>00182 root.add_child(f1);
-<a name="l00183"></a>00183
-<a name="l00184"></a>00184 root.run_and_finish(f0);
-<a name="l00185"></a>00185 }
-<a name="l00186"></a>00186
-<a name="l00187"></a>00187 <span class="comment">// five arguments</span>
-<a name="l00188"></a>00188 <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="l00189"></a>00189 <span class="keywordtype">void</span> <a class="code" href="a00371.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="l00190"></a>00190 <a class="code" href="a00293.html">tbb::task_group_context</a>& context)
-<a name="l00191"></a>00191 {
-<a name="l00192"></a>00192 internal::parallel_invoke_cleaner cleaner(3, context);
-<a name="l00193"></a>00193 internal::parallel_invoke_helper& root = cleaner.root;
-<a name="l00194"></a>00194
-<a name="l00195"></a>00195 root.add_children(f4, f3);
-<a name="l00196"></a>00196 root.add_children(f2, f1);
-<a name="l00197"></a>00197
-<a name="l00198"></a>00198 root.run_and_finish(f0);
-<a name="l00199"></a>00199 }
-<a name="l00200"></a>00200
-<a name="l00201"></a>00201 <span class="comment">// six arguments</span>
-<a name="l00202"></a>00202 <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="l00203"></a>00203 <span class="keywordtype">void</span> <a class="code" href="a00371.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="l00204"></a>00204 <a class="code" href="a00293.html">tbb::task_group_context</a>& context)
-<a name="l00205"></a>00205 {
-<a name="l00206"></a>00206 internal::parallel_invoke_cleaner cleaner(3, context);
-<a name="l00207"></a>00207 internal::parallel_invoke_helper& root = cleaner.root;
+<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 root.add_children(f5, f4, f3);
-<a name="l00210"></a>00210 root.add_children(f2, f1);
-<a name="l00211"></a>00211
-<a name="l00212"></a>00212 root.run_and_finish(f0);
-<a name="l00213"></a>00213 }
-<a name="l00214"></a>00214
-<a name="l00215"></a>00215 <span class="comment">// seven arguments</span>
-<a name="l00216"></a>00216 <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="l00217"></a>00217 <span class="keywordtype">void</span> <a class="code" href="a00371.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="l00218"></a>00218 <span class="keyword">const</span> F5& f5, <span class="keyword">const</span> F6& f6,
-<a name="l00219"></a>00219 <a class="code" href="a00293.html">tbb::task_group_context</a>& context)
-<a name="l00220"></a>00220 {
-<a name="l00221"></a>00221 internal::parallel_invoke_cleaner cleaner(3, context);
-<a name="l00222"></a>00222 internal::parallel_invoke_helper& root = cleaner.root;
-<a name="l00223"></a>00223
-<a name="l00224"></a>00224 root.add_children(f6, f5, f4);
-<a name="l00225"></a>00225 root.add_children(f3, f2, f1);
-<a name="l00226"></a>00226
-<a name="l00227"></a>00227 root.run_and_finish(f0);
-<a name="l00228"></a>00228 }
-<a name="l00229"></a>00229
-<a name="l00230"></a>00230 <span class="comment">// eight arguments</span>
-<a name="l00231"></a>00231 <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="l00232"></a>00232 <span class="keyword">typename</span> F5, <span class="keyword">typename</span> F6, <span class="keyword">typename</span> F7>
-<a name="l00233"></a>00233 <span class="keywordtype">void</span> <a class="code" href="a00371.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="l00234"></a>00234 <span class="keyword">const</span> F5& f5, <span class="keyword">const</span> F6& f6, <span class="keyword">const</span> F7& f7,
-<a name="l00235"></a>00235 <a class="code" href="a00293.html">tbb::task_group_context</a>& context)
-<a name="l00236"></a>00236 {
-<a name="l00237"></a>00237 internal::parallel_invoke_cleaner cleaner(4, context);
-<a name="l00238"></a>00238 internal::parallel_invoke_helper& root = cleaner.root;
-<a name="l00239"></a>00239
-<a name="l00240"></a>00240 root.add_children(f7, f6, f5);
-<a name="l00241"></a>00241 root.add_children(f4, f3);
-<a name="l00242"></a>00242 root.add_children(f2, f1);
-<a name="l00243"></a>00243
-<a name="l00244"></a>00244 root.run_and_finish(f0);
-<a name="l00245"></a>00245 }
-<a name="l00246"></a>00246
-<a name="l00247"></a>00247 <span class="comment">// nine arguments</span>
-<a name="l00248"></a>00248 <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="l00249"></a>00249 <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="l00250"></a>00250 <span class="keywordtype">void</span> <a class="code" href="a00371.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="l00251"></a>00251 <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="l00252"></a>00252 <a class="code" href="a00293.html">tbb::task_group_context</a>& context)
-<a name="l00253"></a>00253 {
-<a name="l00254"></a>00254 internal::parallel_invoke_cleaner cleaner(4, context);
-<a name="l00255"></a>00255 internal::parallel_invoke_helper& root = cleaner.root;
-<a name="l00256"></a>00256
-<a name="l00257"></a>00257 root.add_children(f8, f7, f6);
-<a name="l00258"></a>00258 root.add_children(f5, f4, f3);
-<a name="l00259"></a>00259 root.add_children(f2, f1);
-<a name="l00260"></a>00260
-<a name="l00261"></a>00261 root.run_and_finish(f0);
-<a name="l00262"></a>00262 }
-<a name="l00263"></a>00263
-<a name="l00264"></a>00264 <span class="comment">// ten arguments</span>
-<a name="l00265"></a>00265 <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="l00266"></a>00266 <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="l00267"></a>00267 <span class="keywordtype">void</span> <a class="code" href="a00371.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="l00268"></a>00268 <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="l00269"></a>00269 <a class="code" href="a00293.html">tbb::task_group_context</a>& context)
-<a name="l00270"></a>00270 {
-<a name="l00271"></a>00271 internal::parallel_invoke_cleaner cleaner(4, context);
-<a name="l00272"></a>00272 internal::parallel_invoke_helper& root = cleaner.root;
-<a name="l00273"></a>00273
-<a name="l00274"></a>00274 root.add_children(f9, f8, f7);
-<a name="l00275"></a>00275 root.add_children(f6, f5, f4);
-<a name="l00276"></a>00276 root.add_children(f3, f2, f1);
-<a name="l00277"></a>00277
-<a name="l00278"></a>00278 root.run_and_finish(f0);
-<a name="l00279"></a>00279 }
-<a name="l00280"></a>00280
-<a name="l00281"></a>00281 <span class="comment">// two arguments</span>
-<a name="l00282"></a>00282 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1>
-<a name="l00283"></a>00283 <span class="keywordtype">void</span> <a class="code" href="a00371.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1) {
-<a name="l00284"></a>00284 task_group_context context;
-<a name="l00285"></a>00285 parallel_invoke<F0, F1>(f0, f1, context);
-<a name="l00286"></a>00286 }
-<a name="l00287"></a>00287 <span class="comment">// three arguments</span>
-<a name="l00288"></a>00288 <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="l00289"></a>00289 <span class="keywordtype">void</span> <a class="code" href="a00371.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="l00290"></a>00290 task_group_context context;
-<a name="l00291"></a>00291 parallel_invoke<F0, F1, F2>(f0, f1, f2, context);
-<a name="l00292"></a>00292 }
-<a name="l00293"></a>00293 <span class="comment">// four arguments</span>
-<a name="l00294"></a>00294 <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="l00295"></a>00295 <span class="keywordtype">void</span> <a class="code" href="a00371.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="l00296"></a>00296 task_group_context context;
-<a name="l00297"></a>00297 parallel_invoke<F0, F1, F2, F3>(f0, f1, f2, f3, context);
-<a name="l00298"></a>00298 }
-<a name="l00299"></a>00299 <span class="comment">// five 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, <span class="keyword">typename</span> F3, <span class="keyword">typename</span> F4>
-<a name="l00301"></a>00301 <span class="keywordtype">void</span> <a class="code" href="a00371.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="l00302"></a>00302 task_group_context context;
-<a name="l00303"></a>00303 parallel_invoke<F0, F1, F2, F3, F4>(f0, f1, f2, f3, f4, context);
-<a name="l00304"></a>00304 }
-<a name="l00305"></a>00305 <span class="comment">// six 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, <span class="keyword">typename</span> F4, <span class="keyword">typename</span> F5>
-<a name="l00307"></a>00307 <span class="keywordtype">void</span> <a class="code" href="a00371.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="l00308"></a>00308 task_group_context context;
-<a name="l00309"></a>00309 parallel_invoke<F0, F1, F2, F3, F4, F5>(f0, f1, f2, f3, f4, f5, context);
-<a name="l00310"></a>00310 }
-<a name="l00311"></a>00311 <span class="comment">// seven 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, <span class="keyword">typename</span> F5, <span class="keyword">typename</span> F6>
-<a name="l00313"></a>00313 <span class="keywordtype">void</span> <a class="code" href="a00371.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 <span class="keyword">const</span> F5& f5, <span class="keyword">const</span> F6& f6)
-<a name="l00315"></a>00315 {
-<a name="l00316"></a>00316 task_group_context context;
-<a name="l00317"></a>00317 parallel_invoke<F0, F1, F2, F3, F4, F5, F6>(f0, f1, f2, f3, f4, f5, f6, context);
-<a name="l00318"></a>00318 }
-<a name="l00319"></a>00319 <span class="comment">// eigth arguments</span>
-<a name="l00320"></a>00320 <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="l00321"></a>00321 <span class="keyword">typename</span> F5, <span class="keyword">typename</span> F6, <span class="keyword">typename</span> F7>
-<a name="l00322"></a>00322 <span class="keywordtype">void</span> <a class="code" href="a00371.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="l00323"></a>00323 <span class="keyword">const</span> F5& f5, <span class="keyword">const</span> F6& f6, <span class="keyword">const</span> F7& f7)
-<a name="l00324"></a>00324 {
-<a name="l00325"></a>00325 task_group_context context;
-<a name="l00326"></a>00326 parallel_invoke<F0, F1, F2, F3, F4, F5, F6, F7>(f0, f1, f2, f3, f4, f5, f6, f7, context);
-<a name="l00327"></a>00327 }
-<a name="l00328"></a>00328 <span class="comment">// nine arguments</span>
-<a name="l00329"></a>00329 <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="l00330"></a>00330 <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="l00331"></a>00331 <span class="keywordtype">void</span> <a class="code" href="a00371.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="l00332"></a>00332 <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="l00333"></a>00333 {
-<a name="l00334"></a>00334 task_group_context context;
-<a name="l00335"></a>00335 parallel_invoke<F0, F1, F2, F3, F4, F5, F6, F7, F8>(f0, f1, f2, f3, f4, f5, f6, f7, f8, context);
-<a name="l00336"></a>00336 }
-<a name="l00337"></a>00337 <span class="comment">// ten arguments</span>
-<a name="l00338"></a>00338 <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="l00339"></a>00339 <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="l00340"></a>00340 <span class="keywordtype">void</span> <a class="code" href="a00371.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="l00341"></a>00341 <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="l00342"></a>00342 {
-<a name="l00343"></a>00343 task_group_context context;
-<a name="l00344"></a>00344 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="l00345"></a>00345 }
-<a name="l00346"></a>00346
-<a name="l00348"></a>00348
-<a name="l00349"></a>00349 } <span class="comment">// namespace</span>
-<a name="l00350"></a>00350
-<a name="l00351"></a>00351 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_parallel_invoke_H */</span>
+<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="a00311.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="a00311.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="a00311.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="a00311.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="a00311.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="a00395.html#ged143f31dd3d96ded02ab3db915b91c7">00321</a> <span class="keywordtype">void</span> <a class="code" href="a00395.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="a00395.html#gc9fac8870b2e6365fb337014404529df">00328</a> <span class="keywordtype">void</span> <a class="code" href="a00395.html#ged143f31dd3d96ded02ab3db915b91c7">parallel_scan</a>( <span class="keyword">const</span> Range& range, Body& body, <span class="keyword">const</span> <a class="code" href="a00303.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="a00395.html#g62fde400a37bbca1a2fddc8e3d22f556">00335</a> <span class="keywordtype">void</span> <a class="code" href="a00395.html#ged143f31dd3d96ded02ab3db915b91c7">parallel_scan</a>( <span class="keyword">const</span> Range& range, Body& body, <span class="keyword">const</span> <a class="code" href="a00231.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-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00533.html b/doc/html/a00523.html
similarity index 69%
rename from doc/html/a00533.html
rename to doc/html/a00523.html
index 4867322..2d5cf5b 100644
--- a/doc/html/a00533.html
+++ b/doc/html/a00523.html
@@ -120,100 +120,104 @@
<a name="l00103"></a>00103 }
<a name="l00104"></a>00104 };
<a name="l00105"></a>00105
-<a name="l00107"></a>00107
-<a name="l00108"></a>00108 <span class="keyword">template</span><<span class="keyword">typename</span> RandomAccessIterator, <span class="keyword">typename</span> Compare>
-<a name="l00109"></a>00109 <span class="keyword">class </span>quick_sort_pretest_body : internal::no_assign {
-<a name="l00110"></a>00110 <span class="keyword">const</span> Compare ∁
-<a name="l00111"></a>00111
-<a name="l00112"></a>00112 <span class="keyword">public</span>:
-<a name="l00113"></a>00113 quick_sort_pretest_body(<span class="keyword">const</span> Compare &_comp) : comp(_comp) {}
-<a name="l00114"></a>00114
-<a name="l00115"></a>00115 <span class="keywordtype">void</span> operator()( <span class="keyword">const</span> blocked_range<RandomAccessIterator>& range )<span class="keyword"> const </span>{
-<a name="l00116"></a>00116 task &my_task = <a class="code" href="a00291.html#bd43e8d6249738efafd12d6a4c72c5e3">task::self</a>();
-<a name="l00117"></a>00117 RandomAccessIterator my_end = range.end();
-<a name="l00118"></a>00118
-<a name="l00119"></a>00119 <span class="keywordtype">int</span> i = 0;
-<a name="l00120"></a>00120 <span class="keywordflow">for</span> (RandomAccessIterator k = range.begin(); k != my_end; ++k, ++i) {
-<a name="l00121"></a>00121 <span class="keywordflow">if</span> ( i%64 == 0 && my_task.is_cancelled() ) <span class="keywordflow">break</span>;
-<a name="l00122"></a>00122
-<a name="l00123"></a>00123 <span class="comment">// The k-1 is never out-of-range because the first chunk starts at begin+serial_cutoff+1</span>
-<a name="l00124"></a>00124 <span class="keywordflow">if</span> ( comp( *(k), *(k-1) ) ) {
-<a name="l00125"></a>00125 my_task.cancel_group_execution();
-<a name="l00126"></a>00126 <span class="keywordflow">break</span>;
-<a name="l00127"></a>00127 }
-<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="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="a00311.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="l00135"></a>00135 <span class="keyword">template</span><<span class="keyword">typename</span> RandomAccessIterator, <span class="keyword">typename</span> Compare>
-<a name="l00136"></a>00136 <span class="keyword">struct </span>quick_sort_body {
-<a name="l00137"></a>00137 <span class="keywordtype">void</span> operator()( <span class="keyword">const</span> quick_sort_range<RandomAccessIterator,Compare>& range )<span class="keyword"> const </span>{
-<a name="l00138"></a>00138 <span class="comment">//SerialQuickSort( range.begin, range.size, range.comp );</span>
-<a name="l00139"></a>00139 std::sort( range.begin, range.begin + range.size, range.comp );
-<a name="l00140"></a>00140 }
-<a name="l00141"></a>00141 };
-<a name="l00142"></a>00142
+<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="l00145"></a>00145 <span class="keyword">template</span><<span class="keyword">typename</span> RandomAccessIterator, <span class="keyword">typename</span> Compare>
-<a name="l00146"></a>00146 <span class="keywordtype">void</span> parallel_quick_sort( RandomAccessIterator begin, RandomAccessIterator end, <span class="keyword">const</span> Compare& comp ) {
-<a name="l00147"></a>00147 task_group_context my_context;
-<a name="l00148"></a>00148 <span class="keyword">const</span> <span class="keywordtype">int</span> serial_cutoff = 9;
-<a name="l00149"></a>00149
-<a name="l00150"></a>00150 __TBB_ASSERT( begin + serial_cutoff < end, <span class="stringliteral">"min_parallel_size is smaller than serial cutoff?"</span> );
-<a name="l00151"></a>00151 RandomAccessIterator k;
-<a name="l00152"></a>00152 <span class="keywordflow">for</span> ( k = begin ; k != begin + serial_cutoff; ++k ) {
-<a name="l00153"></a>00153 <span class="keywordflow">if</span> ( comp( *(k+1), *k ) ) {
-<a name="l00154"></a>00154 <span class="keywordflow">goto</span> do_parallel_quick_sort;
-<a name="l00155"></a>00155 }
-<a name="l00156"></a>00156 }
-<a name="l00157"></a>00157
-<a name="l00158"></a>00158 <a class="code" href="a00371.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>( blocked_range<RandomAccessIterator>(k+1, end),
-<a name="l00159"></a>00159 quick_sort_pretest_body<RandomAccessIterator,Compare>(comp),
-<a name="l00160"></a>00160 auto_partitioner(),
-<a name="l00161"></a>00161 my_context);
-<a name="l00162"></a>00162
-<a name="l00163"></a>00163 <span class="keywordflow">if</span> (my_context.is_group_execution_cancelled())
-<a name="l00164"></a>00164 do_parallel_quick_sort:
-<a name="l00165"></a>00165 <a class="code" href="a00371.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>( quick_sort_range<RandomAccessIterator,Compare>(begin, end-begin, comp ),
-<a name="l00166"></a>00166 quick_sort_body<RandomAccessIterator,Compare>(),
-<a name="l00167"></a>00167 auto_partitioner() );
-<a name="l00168"></a>00168 }
-<a name="l00169"></a>00169
-<a name="l00170"></a>00170 } <span class="comment">// namespace internal</span>
-<a name="l00172"></a>00172 <span class="comment"></span>
-<a name="l00183"></a>00183
-<a name="l00185"></a>00185
-<a name="l00188"></a>00188 <span class="keyword">template</span><<span class="keyword">typename</span> RandomAccessIterator, <span class="keyword">typename</span> Compare>
-<a name="l00189"></a><a class="code" href="a00371.html#g49edcf9447cd91a9527a3f8e8512b7aa">00189</a> <span class="keywordtype">void</span> <a class="code" href="a00371.html#g49edcf9447cd91a9527a3f8e8512b7aa">parallel_sort</a>( RandomAccessIterator begin, RandomAccessIterator end, <span class="keyword">const</span> Compare& comp) {
-<a name="l00190"></a>00190 <span class="keyword">const</span> <span class="keywordtype">int</span> min_parallel_size = 500;
-<a name="l00191"></a>00191 <span class="keywordflow">if</span>( end > begin ) {
-<a name="l00192"></a>00192 <span class="keywordflow">if</span> (end - begin < min_parallel_size) {
-<a name="l00193"></a>00193 std::sort(begin, end, comp);
-<a name="l00194"></a>00194 } <span class="keywordflow">else</span> {
-<a name="l00195"></a>00195 internal::parallel_quick_sort(begin, end, comp);
-<a name="l00196"></a>00196 }
-<a name="l00197"></a>00197 }
-<a name="l00198"></a>00198 }
-<a name="l00199"></a>00199
-<a name="l00201"></a>00201
-<a name="l00202"></a>00202 <span class="keyword">template</span><<span class="keyword">typename</span> RandomAccessIterator>
-<a name="l00203"></a><a class="code" href="a00371.html#g16c3eb77d0e530834c51ce3857f01012">00203</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="a00371.html#g49edcf9447cd91a9527a3f8e8512b7aa">parallel_sort</a>( RandomAccessIterator begin, RandomAccessIterator end ) {
-<a name="l00204"></a>00204 <a class="code" href="a00371.html#g49edcf9447cd91a9527a3f8e8512b7aa">parallel_sort</a>( begin, end, std::less< <span class="keyword">typename</span> std::iterator_traits<RandomAccessIterator>::value_type >() );
-<a name="l00205"></a>00205 }
-<a name="l00206"></a>00206
-<a name="l00208"></a>00208
-<a name="l00209"></a>00209 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00210"></a><a class="code" href="a00371.html#gc7576f82fdedc8a701a6c17ad9415926">00210</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="a00371.html#g49edcf9447cd91a9527a3f8e8512b7aa">parallel_sort</a>( T * begin, T * end ) {
-<a name="l00211"></a>00211 <a class="code" href="a00371.html#g49edcf9447cd91a9527a3f8e8512b7aa">parallel_sort</a>( begin, end, std::less< T >() );
-<a name="l00212"></a>00212 }
-<a name="l00214"></a>00214
-<a name="l00215"></a>00215
-<a name="l00216"></a>00216 } <span class="comment">// namespace tbb</span>
-<a name="l00217"></a>00217
-<a name="l00218"></a>00218 <span class="preprocessor">#endif</span>
-<a name="l00219"></a>00219 <span class="preprocessor"></span>
+<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="a00395.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="a00395.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="a00395.html#g49edcf9447cd91a9527a3f8e8512b7aa">00193</a> <span class="keywordtype">void</span> <a class="code" href="a00395.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="a00395.html#g16c3eb77d0e530834c51ce3857f01012">00207</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="a00395.html#g49edcf9447cd91a9527a3f8e8512b7aa">parallel_sort</a>( RandomAccessIterator begin, RandomAccessIterator end ) {
+<a name="l00208"></a>00208 <a class="code" href="a00395.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="a00395.html#gc7576f82fdedc8a701a6c17ad9415926">00214</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="a00395.html#g49edcf9447cd91a9527a3f8e8512b7aa">parallel_sort</a>( T * begin, T * end ) {
+<a name="l00215"></a>00215 <a class="code" href="a00395.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-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00524.html b/doc/html/a00524.html
deleted file mode 100644
index 55c0bdd..0000000
--- a/doc/html/a00524.html
+++ /dev/null
@@ -1,340 +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-2011 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 "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 "partitioner.h"</span>
-<a name="l00027"></a>00027 <span class="preprocessor">#include "tbb_profiling.h"</span>
-<a name="l00028"></a>00028 <span class="preprocessor">#include <new></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="l00035"></a>00035
-<a name="l00036"></a>00036 <span class="keyword">typedef</span> <span class="keywordtype">char</span> reduction_context;
-<a name="l00037"></a>00037
-<a name="l00039"></a>00039
-<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>finish_reduce: <span class="keyword">public</span> task {
-<a name="l00043"></a>00043 Body* my_body;
-<a name="l00044"></a>00044 <span class="keywordtype">bool</span> has_right_zombie;
-<a name="l00045"></a>00045 <span class="keyword">const</span> reduction_context my_context;
-<a name="l00046"></a>00046 aligned_space<Body,1> zombie_space;
-<a name="l00047"></a>00047 finish_reduce( reduction_context context_ ) :
-<a name="l00048"></a>00048 my_body(NULL),
-<a name="l00049"></a>00049 has_right_zombie(false),
-<a name="l00050"></a>00050 my_context(context_)
-<a name="l00051"></a>00051 {
-<a name="l00052"></a>00052 }
-<a name="l00053"></a>00053 task* execute() {
-<a name="l00054"></a>00054 <span class="keywordflow">if</span>( has_right_zombie ) {
-<a name="l00055"></a>00055 <span class="comment">// Right child was stolen.</span>
-<a name="l00056"></a>00056 Body* s = zombie_space.begin();
-<a name="l00057"></a>00057 my_body->join( *s );
-<a name="l00058"></a>00058 s->~Body();
-<a name="l00059"></a>00059 }
-<a name="l00060"></a>00060 <span class="keywordflow">if</span>( my_context==1 ) <span class="comment">// left child</span>
-<a name="l00061"></a>00061 itt_store_word_with_release( static_cast<finish_reduce*>(parent())->my_body, my_body );
-<a name="l00062"></a>00062 <span class="keywordflow">return</span> NULL;
-<a name="l00063"></a>00063 }
-<a name="l00064"></a>00064 <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="l00065"></a>00065 <span class="keyword">friend</span> <span class="keyword">class </span>start_reduce;
-<a name="l00066"></a>00066 };
-<a name="l00067"></a>00067
-<a name="l00069"></a>00069
-<a name="l00070"></a>00070 <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="l00071"></a>00071 <span class="keyword">class </span>start_reduce: <span class="keyword">public</span> task {
-<a name="l00072"></a>00072 <span class="keyword">typedef</span> finish_reduce<Body> finish_type;
-<a name="l00073"></a>00073 Body* my_body;
-<a name="l00074"></a>00074 Range my_range;
-<a name="l00075"></a>00075 <span class="keyword">typename</span> Partitioner::partition_type my_partition;
-<a name="l00076"></a>00076 reduction_context my_context;
-<a name="l00077"></a>00077 <span class="comment">/*override*/</span> task* execute();
-<a name="l00078"></a>00078 <span class="keyword">template</span><<span class="keyword">typename</span> Body_>
-<a name="l00079"></a>00079 <span class="keyword">friend</span> <span class="keyword">class </span>finish_reduce;
-<a name="l00080"></a>00080
-<a name="l00082"></a>00082 start_reduce( <span class="keyword">const</span> Range& range, Body* body, Partitioner& partitioner ) :
-<a name="l00083"></a>00083 my_body(body),
-<a name="l00084"></a>00084 my_range(range),
-<a name="l00085"></a>00085 my_partition(partitioner),
-<a name="l00086"></a>00086 my_context(0)
-<a name="l00087"></a>00087 {
-<a name="l00088"></a>00088 }
-<a name="l00090"></a>00090
-<a name="l00091"></a>00091 start_reduce( start_reduce& parent_, split ) :
-<a name="l00092"></a>00092 my_body(parent_.my_body),
-<a name="l00093"></a>00093 my_range(parent_.my_range,split()),
-<a name="l00094"></a>00094 my_partition(parent_.my_partition,split()),
-<a name="l00095"></a>00095 my_context(2)
-<a name="l00096"></a>00096 {
-<a name="l00097"></a>00097 my_partition.set_affinity(*<span class="keyword">this</span>);
-<a name="l00098"></a>00098 parent_.my_context = 1;
-<a name="l00099"></a>00099 }
-<a name="l00101"></a>00101 <span class="comment">/*override*/</span> <span class="keywordtype">void</span> note_affinity( affinity_id <span class="keywordtype">id</span> ) {
-<a name="l00102"></a>00102 my_partition.note_affinity( <span class="keywordtype">id</span> );
-<a name="l00103"></a>00103 }
-<a name="l00104"></a>00104
-<a name="l00105"></a>00105 <span class="keyword">public</span>:
-<a name="l00106"></a>00106 <span class="keyword">static</span> <span class="keywordtype">void</span> run( <span class="keyword">const</span> Range& range, Body& body, Partitioner& partitioner ) {
-<a name="l00107"></a>00107 <span class="keywordflow">if</span>( !range.empty() ) {
-<a name="l00108"></a>00108 #<span class="keywordflow">if</span> !__TBB_TASK_GROUP_CONTEXT || TBB_JOIN_OUTER_TASK_GROUP
-<a name="l00109"></a>00109 <a class="code" href="a00291.html#ce8ce689c26a4ddf343829bc3c73290a">task::spawn_root_and_wait</a>( *<span class="keyword">new</span>(<a class="code" href="a00291.html#23acb0da0afd690da797f9f882027d34">task::allocate_root</a>()) start_reduce(range,&body,partitioner) );
-<a name="l00110"></a>00110 <span class="preprocessor">#else</span>
-<a name="l00111"></a>00111 <span class="preprocessor"></span> <span class="comment">// Bound context prevents exceptions from body to affect nesting or sibling algorithms,</span>
-<a name="l00112"></a>00112 <span class="comment">// and allows users to handle exceptions safely by wrapping parallel_for in the try-block.</span>
-<a name="l00113"></a>00113 task_group_context context;
-<a name="l00114"></a>00114 <a class="code" href="a00291.html#ce8ce689c26a4ddf343829bc3c73290a">task::spawn_root_and_wait</a>( *<span class="keyword">new</span>(task::allocate_root(context)) start_reduce(range,&body,partitioner) );
-<a name="l00115"></a>00115 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT && !TBB_JOIN_OUTER_TASK_GROUP */</span>
-<a name="l00116"></a>00116 }
-<a name="l00117"></a>00117 }
-<a name="l00118"></a>00118 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00119"></a>00119 <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="l00120"></a>00120 <span class="keywordflow">if</span>( !range.empty() )
-<a name="l00121"></a>00121 <a class="code" href="a00291.html#ce8ce689c26a4ddf343829bc3c73290a">task::spawn_root_and_wait</a>( *<span class="keyword">new</span>(task::allocate_root(context)) start_reduce(range,&body,partitioner) );
-<a name="l00122"></a>00122 }
-<a name="l00123"></a>00123 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
-<a name="l00124"></a>00124 };
-<a name="l00125"></a>00125
-<a name="l00126"></a>00126 <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="l00127"></a>00127 task* start_reduce<Range,Body,Partitioner>::execute() {
-<a name="l00128"></a>00128 <span class="keywordflow">if</span>( my_context==2 ) { <span class="comment">// right child</span>
-<a name="l00129"></a>00129 finish_type* p = static_cast<finish_type*>(parent());
-<a name="l00130"></a>00130 <span class="keywordflow">if</span>( !itt_load_word_with_acquire(p->my_body) ) {
-<a name="l00131"></a>00131 my_body = <span class="keyword">new</span>( p->zombie_space.begin() ) Body(*my_body,split());
-<a name="l00132"></a>00132 p->has_right_zombie = <span class="keyword">true</span>;
-<a name="l00133"></a>00133 }
-<a name="l00134"></a>00134 }
-<a name="l00135"></a>00135 <span class="keywordflow">if</span>( !my_range.is_divisible() || my_partition.should_execute_range(*<span class="keyword">this</span>) ) {
-<a name="l00136"></a>00136 (*my_body)( my_range );
-<a name="l00137"></a>00137 <span class="keywordflow">if</span>( my_context==1 )
-<a name="l00138"></a>00138 itt_store_word_with_release(static_cast<finish_type*>(parent())->my_body, my_body );
-<a name="l00139"></a>00139 <span class="keywordflow">return</span> my_partition.continue_after_execute_range();
-<a name="l00140"></a>00140 } <span class="keywordflow">else</span> {
-<a name="l00141"></a>00141 finish_type& c = *<span class="keyword">new</span>( allocate_continuation()) finish_type(my_context);
-<a name="l00142"></a>00142 recycle_as_child_of(c);
-<a name="l00143"></a>00143 c.set_ref_count(2);
-<a name="l00144"></a>00144 <span class="keywordtype">bool</span> delay = my_partition.decide_whether_to_delay();
-<a name="l00145"></a>00145 start_reduce& b = *<span class="keyword">new</span>( c.allocate_child() ) start_reduce(*<span class="keyword">this</span>,split());
-<a name="l00146"></a>00146 my_partition.spawn_or_delay(delay,b);
-<a name="l00147"></a>00147 <span class="keywordflow">return</span> <span class="keyword">this</span>;
-<a name="l00148"></a>00148 }
-<a name="l00149"></a>00149 }
-<a name="l00150"></a>00150
-<a name="l00152"></a>00152
-<a name="l00156"></a>00156 <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="l00157"></a>00157 <span class="keyword">class </span>lambda_reduce_body {
-<a name="l00158"></a>00158
-<a name="l00159"></a>00159 <span class="comment">//FIXME: decide if my_real_body, my_reduction, and identity_element should be copied or referenced</span>
-<a name="l00160"></a>00160 <span class="comment">// (might require some performance measurements)</span>
-<a name="l00161"></a>00161
-<a name="l00162"></a>00162 <span class="keyword">const</span> Value& identity_element;
-<a name="l00163"></a>00163 <span class="keyword">const</span> RealBody& my_real_body;
-<a name="l00164"></a>00164 <span class="keyword">const</span> Reduction& my_reduction;
-<a name="l00165"></a>00165 Value my_value;
-<a name="l00166"></a>00166 lambda_reduce_body& operator= ( <span class="keyword">const</span> lambda_reduce_body& other );
-<a name="l00167"></a>00167 <span class="keyword">public</span>:
-<a name="l00168"></a>00168 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="l00169"></a>00169 : identity_element(identity)
-<a name="l00170"></a>00170 , my_real_body(body)
-<a name="l00171"></a>00171 , my_reduction(reduction)
-<a name="l00172"></a>00172 , my_value(identity)
-<a name="l00173"></a>00173 { }
-<a name="l00174"></a>00174 lambda_reduce_body( <span class="keyword">const</span> lambda_reduce_body& other )
-<a name="l00175"></a>00175 : identity_element(other.identity_element)
-<a name="l00176"></a>00176 , my_real_body(other.my_real_body)
-<a name="l00177"></a>00177 , my_reduction(other.my_reduction)
-<a name="l00178"></a>00178 , my_value(other.my_value)
-<a name="l00179"></a>00179 { }
-<a name="l00180"></a>00180 lambda_reduce_body( lambda_reduce_body& other, <a class="code" href="a00290.html">tbb::split</a> )
-<a name="l00181"></a>00181 : identity_element(other.identity_element)
-<a name="l00182"></a>00182 , my_real_body(other.my_real_body)
-<a name="l00183"></a>00183 , my_reduction(other.my_reduction)
-<a name="l00184"></a>00184 , my_value(other.identity_element)
-<a name="l00185"></a>00185 { }
-<a name="l00186"></a>00186 <span class="keywordtype">void</span> operator()(Range& range) {
-<a name="l00187"></a>00187 my_value = my_real_body(range, const_cast<const Value&>(my_value));
-<a name="l00188"></a>00188 }
-<a name="l00189"></a>00189 <span class="keywordtype">void</span> join( lambda_reduce_body& rhs ) {
-<a name="l00190"></a>00190 my_value = my_reduction(const_cast<const Value&>(my_value), const_cast<const Value&>(rhs.my_value));
-<a name="l00191"></a>00191 }
-<a name="l00192"></a>00192 Value result()<span class="keyword"> const </span>{
-<a name="l00193"></a>00193 <span class="keywordflow">return</span> my_value;
-<a name="l00194"></a>00194 }
-<a name="l00195"></a>00195 };
-<a name="l00196"></a>00196
-<a name="l00197"></a>00197 } <span class="comment">// namespace internal</span>
-<a name="l00199"></a>00199 <span class="comment"></span>
-<a name="l00200"></a>00200 <span class="comment">// Requirements on Range concept are documented in blocked_range.h</span>
-<a name="l00201"></a>00201
-<a name="l00220"></a>00220
-<a name="l00222"></a>00222
-<a name="l00223"></a>00223 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
-<a name="l00224"></a><a class="code" href="a00371.html#g1b3d59c5eb62683c5754db6970392fa3">00224</a> <span class="keywordtype">void</span> <a class="code" href="a00371.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, Body& body ) {
-<a name="l00225"></a>00225 internal::start_reduce<Range,Body, const __TBB_DEFAULT_PARTITIONER>::run( range, body, __TBB_DEFAULT_PARTITIONER() );
-<a name="l00226"></a>00226 }
-<a name="l00227"></a>00227
-<a name="l00229"></a>00229
-<a name="l00230"></a>00230 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
-<a name="l00231"></a><a class="code" href="a00371.html#gec1b7c03f9da909bef5db12e3d41bed3">00231</a> <span class="keywordtype">void</span> <a class="code" href="a00371.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, Body& body, <span class="keyword">const</span> <a class="code" href="a00284.html">simple_partitioner</a>& partitioner ) {
-<a name="l00232"></a>00232 internal::start_reduce<Range,Body,const simple_partitioner>::run( range, body, partitioner );
-<a name="l00233"></a>00233 }
-<a name="l00234"></a>00234
-<a name="l00236"></a>00236
-<a name="l00237"></a>00237 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
-<a name="l00238"></a><a class="code" href="a00371.html#g18a19157e6245992fc00ca0adeb7dd37">00238</a> <span class="keywordtype">void</span> <a class="code" href="a00371.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, Body& body, <span class="keyword">const</span> <a class="code" href="a00219.html">auto_partitioner</a>& partitioner ) {
-<a name="l00239"></a>00239 internal::start_reduce<Range,Body,const auto_partitioner>::run( range, body, partitioner );
-<a name="l00240"></a>00240 }
-<a name="l00241"></a>00241
-<a name="l00243"></a>00243
-<a name="l00244"></a>00244 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
-<a name="l00245"></a><a class="code" href="a00371.html#gc61e73fcc36c92d79a217fc355ff4a6b">00245</a> <span class="keywordtype">void</span> <a class="code" href="a00371.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, Body& body, <a class="code" href="a00212.html">affinity_partitioner</a>& partitioner ) {
-<a name="l00246"></a>00246 internal::start_reduce<Range,Body,affinity_partitioner>::run( range, body, partitioner );
-<a name="l00247"></a>00247 }
-<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"></span>
-<a name="l00252"></a>00252 <span class="preprocessor">template<typename Range, typename Body></span>
-<a name="l00253"></a><a class="code" href="a00371.html#g45cb00c42a18e334bbde8b7535afe460">00253</a> <span class="preprocessor"></span><span class="keywordtype">void</span> <a class="code" href="a00371.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, Body& body, <span class="keyword">const</span> <a class="code" href="a00284.html">simple_partitioner</a>& partitioner, <a class="code" href="a00293.html">task_group_cont [...]
-<a name="l00254"></a>00254 internal::start_reduce<Range,Body,const simple_partitioner>::run( range, body, partitioner, context );
-<a name="l00255"></a>00255 }
-<a name="l00256"></a>00256
-<a name="l00258"></a>00258
-<a name="l00259"></a>00259 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
-<a name="l00260"></a><a class="code" href="a00371.html#g1c1ea1d7c61b3c225e92c70d669a53a5">00260</a> <span class="keywordtype">void</span> <a class="code" href="a00371.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, Body& body, <span class="keyword">const</span> <a class="code" href="a00219.html">auto_partitioner</a>& partitioner, <a class="code" href="a00293.html">task_group_context</a>& context ) {
-<a name="l00261"></a>00261 internal::start_reduce<Range,Body,const auto_partitioner>::run( range, body, partitioner, context );
-<a name="l00262"></a>00262 }
-<a name="l00263"></a>00263
-<a name="l00265"></a>00265
-<a name="l00266"></a>00266 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
-<a name="l00267"></a><a class="code" href="a00371.html#gd9ac3a3811060314695f33b703c6e11b">00267</a> <span class="keywordtype">void</span> <a class="code" href="a00371.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, Body& body, <a class="code" href="a00212.html">affinity_partitioner</a>& partitioner, <a class="code" href="a00293.html">task_group_context</a>& context ) {
-<a name="l00268"></a>00268 internal::start_reduce<Range,Body,affinity_partitioner>::run( range, body, partitioner, context );
-<a name="l00269"></a>00269 }
-<a name="l00270"></a>00270 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
-<a name="l00271"></a>00271
-<a name="l00275"></a>00275
-<a name="l00276"></a>00276
-<a name="l00277"></a>00277 <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="l00278"></a><a class="code" href="a00371.html#gc9412e09fb01fcad8c018ea9cffb28ef">00278</a> Value <a class="code" href="a00371.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="l00279"></a>00279 internal::lambda_reduce_body<Range,Value,RealBody,Reduction> body(identity, real_body, reduction);
-<a name="l00280"></a>00280 internal::start_reduce<Range,internal::lambda_reduce_body<Range,Value,RealBody,Reduction>,<span class="keyword">const</span> __TBB_DEFAULT_PARTITIONER>
-<a name="l00281"></a>00281 ::run(range, body, __TBB_DEFAULT_PARTITIONER() );
-<a name="l00282"></a>00282 <span class="keywordflow">return</span> body.result();
-<a name="l00283"></a>00283 }
-<a name="l00284"></a>00284
-<a name="l00286"></a>00286
-<a name="l00287"></a>00287 <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="l00288"></a><a class="code" href="a00371.html#gaddffeec0e892ac3d6fc7fc2053e1eca">00288</a> Value <a class="code" href="a00371.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="l00289"></a>00289 <span class="keyword">const</span> <a class="code" href="a00284.html">simple_partitioner</a>& partitioner ) {
-<a name="l00290"></a>00290 internal::lambda_reduce_body<Range,Value,RealBody,Reduction> body(identity, real_body, reduction);
-<a name="l00291"></a>00291 internal::start_reduce<Range,internal::lambda_reduce_body<Range,Value,RealBody,Reduction>,<span class="keyword">const</span> <a class="code" href="a00284.html">simple_partitioner</a>>
-<a name="l00292"></a>00292 ::run(range, body, partitioner );
-<a name="l00293"></a>00293 <span class="keywordflow">return</span> body.result();
-<a name="l00294"></a>00294 }
-<a name="l00295"></a>00295
-<a name="l00297"></a>00297
-<a name="l00298"></a>00298 <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="l00299"></a><a class="code" href="a00371.html#gb175401f0729e40dd2c5860a17c14385">00299</a> Value <a class="code" href="a00371.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="l00300"></a>00300 <span class="keyword">const</span> <a class="code" href="a00219.html">auto_partitioner</a>& partitioner ) {
-<a name="l00301"></a>00301 internal::lambda_reduce_body<Range,Value,RealBody,Reduction> body(identity, real_body, reduction);
-<a name="l00302"></a>00302 internal::start_reduce<Range,internal::lambda_reduce_body<Range,Value,RealBody,Reduction>,<span class="keyword">const</span> <a class="code" href="a00219.html">auto_partitioner</a>>
-<a name="l00303"></a>00303 ::run( range, body, partitioner );
-<a name="l00304"></a>00304 <span class="keywordflow">return</span> body.result();
-<a name="l00305"></a>00305 }
-<a name="l00306"></a>00306
-<a name="l00308"></a>00308
-<a name="l00309"></a>00309 <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="l00310"></a><a class="code" href="a00371.html#gb7f1f1828ae2b330ce05b8513a495154">00310</a> Value <a class="code" href="a00371.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="l00311"></a>00311 <a class="code" href="a00212.html">affinity_partitioner</a>& partitioner ) {
-<a name="l00312"></a>00312 internal::lambda_reduce_body<Range,Value,RealBody,Reduction> body(identity, real_body, reduction);
-<a name="l00313"></a>00313 internal::start_reduce<Range,internal::lambda_reduce_body<Range,Value,RealBody,Reduction>,<a class="code" href="a00212.html">affinity_partitioner</a>>
-<a name="l00314"></a>00314 ::run( range, body, partitioner );
-<a name="l00315"></a>00315 <span class="keywordflow">return</span> body.result();
-<a name="l00316"></a>00316 }
-<a name="l00317"></a>00317
-<a name="l00318"></a>00318 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00320"></a>00320 <span class="preprocessor"></span>
-<a name="l00321"></a>00321 <span class="preprocessor">template<typename Range, typename Value, typename RealBody, typename Reduction></span>
-<a name="l00322"></a><a class="code" href="a00371.html#gfbc0cc2026d87f11a96bcd62788f5bb5">00322</a> <span class="preprocessor"></span>Value <a class="code" href="a00371.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="l00323"></a>00323 <span class="keyword">const</span> <a class="code" href="a00284.html">simple_partitioner</a>& partitioner, <a class="code" href="a00293.html">task_group_context</a>& context ) {
-<a name="l00324"></a>00324 internal::lambda_reduce_body<Range,Value,RealBody,Reduction> body(identity, real_body, reduction);
-<a name="l00325"></a>00325 internal::start_reduce<Range,internal::lambda_reduce_body<Range,Value,RealBody,Reduction>,<span class="keyword">const</span> <a class="code" href="a00284.html">simple_partitioner</a>>
-<a name="l00326"></a>00326 ::run( range, body, partitioner, context );
-<a name="l00327"></a>00327 <span class="keywordflow">return</span> body.result();
-<a name="l00328"></a>00328 }
-<a name="l00329"></a>00329
-<a name="l00331"></a>00331
-<a name="l00332"></a>00332 <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="l00333"></a><a class="code" href="a00371.html#g630c90a399937d9d4ae70ff883186dfd">00333</a> Value <a class="code" href="a00371.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="l00334"></a>00334 <span class="keyword">const</span> <a class="code" href="a00219.html">auto_partitioner</a>& partitioner, <a class="code" href="a00293.html">task_group_context</a>& context ) {
-<a name="l00335"></a>00335 internal::lambda_reduce_body<Range,Value,RealBody,Reduction> body(identity, real_body, reduction);
-<a name="l00336"></a>00336 internal::start_reduce<Range,internal::lambda_reduce_body<Range,Value,RealBody,Reduction>,<span class="keyword">const</span> <a class="code" href="a00219.html">auto_partitioner</a>>
-<a name="l00337"></a>00337 ::run( range, body, partitioner, context );
-<a name="l00338"></a>00338 <span class="keywordflow">return</span> body.result();
-<a name="l00339"></a>00339 }
-<a name="l00340"></a>00340
-<a name="l00342"></a>00342
-<a name="l00343"></a>00343 <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="l00344"></a><a class="code" href="a00371.html#g496bd7eadb3b97495ccb5655ef90319e">00344</a> Value <a class="code" href="a00371.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="l00345"></a>00345 <a class="code" href="a00212.html">affinity_partitioner</a>& partitioner, <a class="code" href="a00293.html">task_group_context</a>& context ) {
-<a name="l00346"></a>00346 internal::lambda_reduce_body<Range,Value,RealBody,Reduction> body(identity, real_body, reduction);
-<a name="l00347"></a>00347 internal::start_reduce<Range,internal::lambda_reduce_body<Range,Value,RealBody,Reduction>,<a class="code" href="a00212.html">affinity_partitioner</a>>
-<a name="l00348"></a>00348 ::run( range, body, partitioner, context );
-<a name="l00349"></a>00349 <span class="keywordflow">return</span> body.result();
-<a name="l00350"></a>00350 }
-<a name="l00351"></a>00351 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
-<a name="l00352"></a>00352
-<a name="l00353"></a>00353
-<a name="l00354"></a>00354 } <span class="comment">// namespace tbb</span>
-<a name="l00355"></a>00355
-<a name="l00356"></a>00356 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_parallel_reduce_H */</span>
-<a name="l00357"></a>00357
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2011 Intel Corporation. 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/a00537.html b/doc/html/a00527.html
similarity index 89%
rename from doc/html/a00537.html
rename to doc/html/a00527.html
index 0285ca3..c55ab0f 100644
--- a/doc/html/a00537.html
+++ b/doc/html/a00527.html
@@ -67,7 +67,7 @@
<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="a00265.html">tbb::parallel_while</a><Body>;
+<a name="l00052"></a>00052 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00282.html">tbb::parallel_while</a><Body>;
<a name="l00053"></a>00053 };
<a name="l00054"></a>00054
<a name="l00056"></a>00056
@@ -127,59 +127,59 @@
<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="a00265.html">tbb::parallel_while</a><Body>;
+<a name="l00116"></a>00116 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00282.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="a00265.html">00129</a> <span class="keyword">class </span><a class="code" href="a00265.html">parallel_while</a>: internal::no_copy {
+<a name="l00129"></a><a class="code" href="a00282.html">00129</a> <span class="keyword">class </span><a class="code" href="a00282.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="a00265.html#36e26ba3880c7bcf804a97ba0cbe133f">00132</a> <a class="code" href="a00265.html#36e26ba3880c7bcf804a97ba0cbe133f">parallel_while</a>() : my_body(NULL), my_barrier(NULL) {}
+<a name="l00132"></a><a class="code" href="a00282.html#36e26ba3880c7bcf804a97ba0cbe133f">00132</a> <a class="code" href="a00282.html#36e26ba3880c7bcf804a97ba0cbe133f">parallel_while</a>() : my_body(NULL), my_barrier(NULL) {}
<a name="l00133"></a>00133
-<a name="l00135"></a><a class="code" href="a00265.html#6fcfc973cc56b79c6d0fbb8a31be7e84">00135</a> <a class="code" href="a00265.html#6fcfc973cc56b79c6d0fbb8a31be7e84">~parallel_while</a>() {
+<a name="l00135"></a><a class="code" href="a00282.html#6fcfc973cc56b79c6d0fbb8a31be7e84">00135</a> <a class="code" href="a00282.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="a00291.html#dfaacf92685e5f86393bf657b2853bf8">destroy</a>(*my_barrier);
+<a name="l00137"></a>00137 my_barrier-><a class="code" href="a00311.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="a00265.html#fa297e53d3af2a101e712bc200233e9c">00143</a> <span class="keyword">typedef</span> <span class="keyword">typename</span> Body::argument_type <a class="code" href="a00265.html#fa297e53d3af2a101e712bc200233e9c">value_type</a>;
+<a name="l00143"></a><a class="code" href="a00282.html#fa297e53d3af2a101e712bc200233e9c">00143</a> <span class="keyword">typedef</span> <span class="keyword">typename</span> Body::argument_type <a class="code" href="a00282.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="a00265.html#b32a0a6e5e09ebb7fad3e6652c19afe5">run</a>( Stream& stream, <span class="keyword">const</span> Body& body );
+<a name="l00150"></a>00150 <span class="keywordtype">void</span> <a class="code" href="a00282.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="a00265.html#e131c560057a58229992b61eb8dba4c6">add</a>( <span class="keyword">const</span> <a class="code" href="a00265.html#fa297e53d3af2a101e712bc200233e9c">value_type</a>& item );
+<a name="l00154"></a>00154 <span class="keywordtype">void</span> <a class="code" href="a00282.html#e131c560057a58229992b61eb8dba4c6">add</a>( <span class="keyword">const</span> <a class="code" href="a00282.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="a00242.html">empty_task</a>* my_barrier;
+<a name="l00158"></a>00158 <a class="code" href="a00254.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="a00265.html#b32a0a6e5e09ebb7fad3e6652c19afe5">00163</a> <span class="keywordtype">void</span> <a class="code" href="a00265.html">parallel_while<Body>::run</a>( Stream& stream, <span class="keyword">const</span> Body& body ) {
+<a name="l00163"></a><a class="code" href="a00282.html#b32a0a6e5e09ebb7fad3e6652c19afe5">00163</a> <span class="keywordtype">void</span> <a class="code" href="a00282.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="a00242.html">empty_task</a>& barrier = *<span class="keyword">new</span>( <a class="code" href="a00291.html#23acb0da0afd690da797f9f882027d34">task::allocate_root</a>() ) <a class="code" href="a00242.html">empty_task</a>();
+<a name="l00165"></a>00165 <a class="code" href="a00254.html">empty_task</a>& barrier = *<span class="keyword">new</span>( <a class="code" href="a00311.html#23acb0da0afd690da797f9f882027d34">task::allocate_root</a>() ) <a class="code" href="a00254.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="a00291.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="a00291.html#1ff794f7053cd9148d5f280fbf07377f">allocate_child</a>() ) while_task<Stream,Body>( stream, body, barrier );
-<a name="l00170"></a>00170 my_barrier-><a class="code" href="a00291.html#3ce28ca9baa771cfc37ecd72e69c4f3c">spawn_and_wait_for_all</a>(w);
-<a name="l00171"></a>00171 my_barrier-><a class="code" href="a00291.html#dfaacf92685e5f86393bf657b2853bf8">destroy</a>(*my_barrier);
+<a name="l00168"></a>00168 my_barrier-><a class="code" href="a00311.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="a00311.html#1ff794f7053cd9148d5f280fbf07377f">allocate_child</a>() ) while_task<Stream,Body>( stream, body, barrier );
+<a name="l00170"></a>00170 my_barrier-><a class="code" href="a00311.html#3ce28ca9baa771cfc37ecd72e69c4f3c">spawn_and_wait_for_all</a>(w);
+<a name="l00171"></a>00171 my_barrier-><a class="code" href="a00311.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="a00265.html#e131c560057a58229992b61eb8dba4c6">00177</a> <span class="keywordtype">void</span> <a class="code" href="a00265.html">parallel_while<Body>::add</a>( <span class="keyword">const</span> value_type& item ) {
+<a name="l00177"></a><a class="code" href="a00282.html#e131c560057a58229992b61eb8dba4c6">00177</a> <span class="keywordtype">void</span> <a class="code" href="a00282.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="a00291.html#bd43e8d6249738efafd12d6a4c72c5e3">task::self</a>().spawn( i );
+<a name="l00181"></a>00181 <a class="code" href="a00311.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>
diff --git a/doc/html/a00528.html b/doc/html/a00528.html
deleted file mode 100644
index b8c18db..0000000
--- a/doc/html/a00528.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-2011 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="a00267.html">00033</a> <span class="keyword">struct </span><a class="code" href="a00267.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="a00247.html">00039</a> <span class="keyword">struct </span><a class="code" href="a00247.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="a00291.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="a00215.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="a00290.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="a00291.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="a00291.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="a00291.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="a00291.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="a00291.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="a00371.html#ged143f31dd3d96ded02ab3db915b91c7">00321</a> <span class="keywordtype">void</span> <a class="code" href="a00371.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="a00371.html#gc9fac8870b2e6365fb337014404529df">00328</a> <span class="keywordtype">void</span> <a class="code" href="a00371.html#ged143f31dd3d96ded02ab3db915b91c7">parallel_scan</a>( <span class="keyword">const</span> Range& range, Body& body, <span class="keyword">const</span> <a class="code" href="a00284.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="a00371.html#g62fde400a37bbca1a2fddc8e3d22f556">00335</a> <span class="keywordtype">void</span> <a class="code" href="a00371.html#ged143f31dd3d96ded02ab3db915b91c7">parallel_scan</a>( <span class="keyword">const</span> Range& range, Body& body, <span class="keyword">const</span> <a class="code" href="a00219.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-2011 Intel Corporation. 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
new file mode 100644
index 0000000..a62ae53
--- /dev/null
+++ b/doc/html/a00531.html
@@ -0,0 +1,500 @@
+<!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-2011 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="a00226.html">00059</a> <span class="keyword">class </span><a class="code" href="a00226.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="a00225.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="a00226.html">affinity_partitioner_base_v3</a>() : my_array(NULL), my_size(0) {}
+<a name="l00070"></a>00070 ~<a class="code" href="a00226.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="a00283.html">00077</a> <span class="keyword">class </span><a class="code" href="a00283.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="a00311.html">task</a> & ) {}
+<a name="l00080"></a>00080 <span class="keywordtype">void</span> note_affinity( <a class="code" href="a00311.html#d61bb32389d3857bf7511d69beaafb76">task::affinity_id</a> ) {}
+<a name="l00081"></a>00081 <a class="code" href="a00311.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="a00311.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="a00228.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="a00227.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="a00311.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 mathods 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">// correctess of the cast rely 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="a00226.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="a00226.html#d9122ca5725982c602da44dae0acc603">resize</a>(factor);
+<a name="l00344"></a>00344 my_array = ap.<a class="code" href="a00226.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="a00226.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 excatly 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 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="a00311.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="a00303.html">00439</a> <span class="keyword">class </span><a class="code" href="a00303.html">simple_partitioner</a> {
+<a name="l00440"></a>00440 <span class="keyword">public</span>:
+<a name="l00441"></a>00441 <a class="code" href="a00303.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="a00311.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="a00303.html">simple_partitioner</a>& ) {}
+<a name="l00452"></a>00452 partition_type( <span class="keyword">const</span> partition_type&, <a class="code" href="a00309.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="a00231.html">00462</a> <span class="keyword">class </span><a class="code" href="a00231.html">auto_partitioner</a> {
+<a name="l00463"></a>00463 <span class="keyword">public</span>:
+<a name="l00464"></a>00464 <a class="code" href="a00231.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="a00225.html">00478</a> <span class="keyword">class </span><a class="code" href="a00225.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="a00225.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-2011 Intel Corporation. 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/a00541.html b/doc/html/a00541.html
deleted file mode 100644
index 76fd8ca..0000000
--- a/doc/html/a00541.html
+++ /dev/null
@@ -1,230 +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-2011 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">#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 <span class="keyword">class </span>affinity_partitioner;
-<a name="l00028"></a>00028
-<a name="l00030"></a>00030 <span class="keyword">namespace </span>internal {
-<a name="l00031"></a>00031 size_t __TBB_EXPORTED_FUNC get_initial_auto_partitioner_divisor();
-<a name="l00032"></a>00032
-<a name="l00034"></a>00034
-<a name="l00035"></a>00035 <span class="keyword">class </span>affinity_partitioner_base_v3: no_copy {
-<a name="l00036"></a>00036 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00212.html">tbb::affinity_partitioner</a>;
-<a name="l00038"></a>00038
-<a name="l00039"></a>00039 affinity_id* my_array;
-<a name="l00041"></a>00041 size_t my_size;
-<a name="l00043"></a>00043 affinity_partitioner_base_v3() : my_array(NULL), my_size(0) {}
-<a name="l00045"></a>00045 ~affinity_partitioner_base_v3() {resize(0);}
-<a name="l00047"></a>00047
-<a name="l00048"></a>00048 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD resize( <span class="keywordtype">unsigned</span> factor );
-<a name="l00049"></a>00049 <span class="keyword">friend</span> <span class="keyword">class </span>affinity_partition_type;
-<a name="l00050"></a>00050 };
-<a name="l00051"></a>00051
-<a name="l00053"></a>00053 <span class="keyword">class </span>partition_type_base {
-<a name="l00054"></a>00054 <span class="keyword">public</span>:
-<a name="l00055"></a>00055 <span class="keywordtype">void</span> set_affinity( task & ) {}
-<a name="l00056"></a>00056 <span class="keywordtype">void</span> note_affinity( <a class="code" href="a00291.html#d61bb32389d3857bf7511d69beaafb76">task::affinity_id</a> ) {}
-<a name="l00057"></a>00057 task* continue_after_execute_range() {<span class="keywordflow">return</span> NULL;}
-<a name="l00058"></a>00058 <span class="keywordtype">bool</span> decide_whether_to_delay() {<span class="keywordflow">return</span> <span class="keyword">false</span>;}
-<a name="l00059"></a>00059 <span class="keywordtype">void</span> spawn_or_delay( <span class="keywordtype">bool</span>, task& b ) {
-<a name="l00060"></a>00060 task::spawn(b);
-<a name="l00061"></a>00061 }
-<a name="l00062"></a>00062 };
-<a name="l00063"></a>00063
-<a name="l00064"></a>00064 <span class="keyword">class </span>affinity_partition_type;
-<a name="l00065"></a>00065
-<a name="l00066"></a>00066 <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="l00067"></a>00067 <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="l00068"></a>00068 <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="l00069"></a>00069
-<a name="l00070"></a>00070 } <span class="comment">// namespace internal</span>
-<a name="l00072"></a>00072 <span class="comment"></span>
-<a name="l00074"></a>00074
-<a name="l00076"></a><a class="code" href="a00284.html">00076</a> <span class="keyword">class </span><a class="code" href="a00284.html">simple_partitioner</a> {
-<a name="l00077"></a>00077 <span class="keyword">public</span>:
-<a name="l00078"></a>00078 <a class="code" href="a00284.html">simple_partitioner</a>() {}
-<a name="l00079"></a>00079 <span class="keyword">private</span>:
-<a name="l00080"></a>00080 <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_for;
-<a name="l00081"></a>00081 <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_reduce;
-<a name="l00082"></a>00082 <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="l00083"></a>00083
-<a name="l00084"></a>00084 <span class="keyword">class </span>partition_type: <span class="keyword">public</span> internal::partition_type_base {
-<a name="l00085"></a>00085 <span class="keyword">public</span>:
-<a name="l00086"></a>00086 <span class="keywordtype">bool</span> should_execute_range(<span class="keyword">const</span> <a class="code" href="a00291.html">task</a>& ) {<span class="keywordflow">return</span> <span class="keyword">false</span>;}
-<a name="l00087"></a>00087 partition_type( <span class="keyword">const</span> <a class="code" href="a00284.html">simple_partitioner</a>& ) {}
-<a name="l00088"></a>00088 partition_type( <span class="keyword">const</span> partition_type&, <a class="code" href="a00290.html">split</a> ) {}
-<a name="l00089"></a>00089 };
-<a name="l00090"></a>00090 };
-<a name="l00091"></a>00091
-<a name="l00093"></a>00093
-<a name="l00096"></a><a class="code" href="a00219.html">00096</a> <span class="keyword">class </span><a class="code" href="a00219.html">auto_partitioner</a> {
-<a name="l00097"></a>00097 <span class="keyword">public</span>:
-<a name="l00098"></a>00098 <a class="code" href="a00219.html">auto_partitioner</a>() {}
-<a name="l00099"></a>00099
-<a name="l00100"></a>00100 <span class="keyword">private</span>:
-<a name="l00101"></a>00101 <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_for;
-<a name="l00102"></a>00102 <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_reduce;
-<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">friend</span> <span class="keyword">class </span>internal::start_scan;
-<a name="l00104"></a>00104
-<a name="l00105"></a>00105 <span class="keyword">class </span>partition_type: <span class="keyword">public</span> internal::partition_type_base {
-<a name="l00106"></a>00106 size_t num_chunks;
-<a name="l00107"></a>00107 <span class="keyword">static</span> <span class="keyword">const</span> size_t VICTIM_CHUNKS = 4;
-<a name="l00108"></a>00108 <span class="keyword">public</span>:
-<a name="l00109"></a>00109 <span class="keywordtype">bool</span> should_execute_range(<span class="keyword">const</span> <a class="code" href="a00291.html">task</a> &t) {
-<a name="l00110"></a>00110 <span class="keywordflow">if</span>( num_chunks<VICTIM_CHUNKS && t.<a class="code" href="a00291.html#f9169402702f56bf519448aaf34450aa">is_stolen_task</a>() )
-<a name="l00111"></a>00111 num_chunks = VICTIM_CHUNKS;
-<a name="l00112"></a>00112 <span class="keywordflow">return</span> num_chunks==1;
-<a name="l00113"></a>00113 }
-<a name="l00114"></a>00114 partition_type( <span class="keyword">const</span> <a class="code" href="a00219.html">auto_partitioner</a>& ) : num_chunks(internal::get_initial_auto_partitioner_divisor()) {}
-<a name="l00115"></a>00115 partition_type( partition_type& pt, <a class="code" href="a00290.html">split</a> ) {
-<a name="l00116"></a>00116 num_chunks = pt.num_chunks /= 2u;
-<a name="l00117"></a>00117 }
-<a name="l00118"></a>00118 };
-<a name="l00119"></a>00119 };
-<a name="l00120"></a>00120
-<a name="l00122"></a><a class="code" href="a00212.html">00122</a> <span class="keyword">class </span><a class="code" href="a00212.html">affinity_partitioner</a>: internal::affinity_partitioner_base_v3 {
-<a name="l00123"></a>00123 <span class="keyword">public</span>:
-<a name="l00124"></a>00124 <a class="code" href="a00212.html">affinity_partitioner</a>() {}
-<a name="l00125"></a>00125
-<a name="l00126"></a>00126 <span class="keyword">private</span>:
-<a name="l00127"></a>00127 <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_for;
-<a name="l00128"></a>00128 <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_reduce;
-<a name="l00129"></a>00129 <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="l00130"></a>00130
-<a name="l00131"></a>00131 <span class="keyword">typedef</span> internal::affinity_partition_type partition_type;
-<a name="l00132"></a>00132 <span class="keyword">friend</span> <span class="keyword">class </span>internal::affinity_partition_type;
-<a name="l00133"></a>00133 };
-<a name="l00134"></a>00134
-<a name="l00136"></a>00136 <span class="keyword">namespace </span>internal {
-<a name="l00137"></a>00137
-<a name="l00138"></a>00138 <span class="keyword">class </span>affinity_partition_type: <span class="keyword">public</span> no_copy {
-<a name="l00140"></a>00140 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> factor = 16;
-<a name="l00141"></a>00141 <span class="keyword">static</span> <span class="keyword">const</span> size_t VICTIM_CHUNKS = 4;
-<a name="l00142"></a>00142
-<a name="l00143"></a>00143 internal::affinity_id* my_array;
-<a name="l00144"></a>00144 <a class="code" href="a00294.html">task_list</a> delay_list;
-<a name="l00145"></a>00145 <span class="keywordtype">unsigned</span> map_begin, map_end;
-<a name="l00146"></a>00146 size_t num_chunks;
-<a name="l00147"></a>00147 <span class="keyword">public</span>:
-<a name="l00148"></a>00148 affinity_partition_type( <a class="code" href="a00212.html">affinity_partitioner</a>& ap ) {
-<a name="l00149"></a>00149 __TBB_ASSERT( (factor&(factor-1))==0, <span class="stringliteral">"factor must be power of two"</span> );
-<a name="l00150"></a>00150 ap.resize(factor);
-<a name="l00151"></a>00151 my_array = ap.my_array;
-<a name="l00152"></a>00152 map_begin = 0;
-<a name="l00153"></a>00153 map_end = unsigned(ap.my_size);
-<a name="l00154"></a>00154 num_chunks = internal::get_initial_auto_partitioner_divisor();
-<a name="l00155"></a>00155 }
-<a name="l00156"></a>00156 affinity_partition_type(affinity_partition_type& p, split) : my_array(p.my_array) {
-<a name="l00157"></a>00157 __TBB_ASSERT( p.map_end-p.map_begin<factor || (p.map_end-p.map_begin)%factor==0, NULL );
-<a name="l00158"></a>00158 num_chunks = p.num_chunks /= 2;
-<a name="l00159"></a>00159 <span class="keywordtype">unsigned</span> e = p.map_end;
-<a name="l00160"></a>00160 <span class="keywordtype">unsigned</span> d = (e - p.map_begin)/2;
-<a name="l00161"></a>00161 <span class="keywordflow">if</span>( d>factor )
-<a name="l00162"></a>00162 d &= 0u-factor;
-<a name="l00163"></a>00163 map_end = e;
-<a name="l00164"></a>00164 map_begin = p.map_end = e-d;
-<a name="l00165"></a>00165 }
-<a name="l00166"></a>00166
-<a name="l00167"></a>00167 <span class="keywordtype">bool</span> should_execute_range(<span class="keyword">const</span> task &t) {
-<a name="l00168"></a>00168 <span class="keywordflow">if</span>( num_chunks < VICTIM_CHUNKS && t.is_stolen_task() )
-<a name="l00169"></a>00169 num_chunks = VICTIM_CHUNKS;
-<a name="l00170"></a>00170 <span class="keywordflow">return</span> num_chunks == 1;
-<a name="l00171"></a>00171 }
-<a name="l00172"></a>00172
-<a name="l00173"></a>00173 <span class="keywordtype">void</span> set_affinity( task &t ) {
-<a name="l00174"></a>00174 <span class="keywordflow">if</span>( map_begin<map_end )
-<a name="l00175"></a>00175 t.set_affinity( my_array[map_begin] );
-<a name="l00176"></a>00176 }
-<a name="l00177"></a>00177 <span class="keywordtype">void</span> note_affinity( <a class="code" href="a00291.html#d61bb32389d3857bf7511d69beaafb76">task::affinity_id</a> <span class="keywordtype">id</span> ) {
-<a name="l00178"></a>00178 <span class="keywordflow">if</span>( map_begin<map_end )
-<a name="l00179"></a>00179 my_array[map_begin] = id;
-<a name="l00180"></a>00180 }
-<a name="l00181"></a>00181 task* continue_after_execute_range() {
-<a name="l00182"></a>00182 task* first = NULL;
-<a name="l00183"></a>00183 <span class="keywordflow">if</span>( !delay_list.empty() ) {
-<a name="l00184"></a>00184 first = &delay_list.pop_front();
-<a name="l00185"></a>00185 <span class="keywordflow">while</span>( !delay_list.empty() ) {
-<a name="l00186"></a>00186 task::spawn(*first);
-<a name="l00187"></a>00187 first = &delay_list.pop_front();
-<a name="l00188"></a>00188 }
-<a name="l00189"></a>00189 }
-<a name="l00190"></a>00190 <span class="keywordflow">return</span> first;
-<a name="l00191"></a>00191 }
-<a name="l00192"></a>00192 <span class="keywordtype">bool</span> decide_whether_to_delay() {
-<a name="l00193"></a>00193 <span class="comment">// The possible underflow caused by "-1u" is deliberate</span>
-<a name="l00194"></a>00194 <span class="keywordflow">return</span> (map_begin&(factor-1))==0 && map_end-map_begin-1u<factor;
-<a name="l00195"></a>00195 }
-<a name="l00196"></a>00196 <span class="keywordtype">void</span> spawn_or_delay( <span class="keywordtype">bool</span> delay, task& b ) {
-<a name="l00197"></a>00197 <span class="keywordflow">if</span>( delay )
-<a name="l00198"></a>00198 delay_list.push_back(b);
-<a name="l00199"></a>00199 <span class="keywordflow">else</span>
-<a name="l00200"></a>00200 task::spawn(b);
-<a name="l00201"></a>00201 }
-<a name="l00202"></a>00202
-<a name="l00203"></a>00203 ~affinity_partition_type() {
-<a name="l00204"></a>00204 <span class="comment">// The delay_list can be non-empty if an exception is thrown.</span>
-<a name="l00205"></a>00205 <span class="keywordflow">while</span>( !delay_list.empty() ) {
-<a name="l00206"></a>00206 task& t = delay_list.pop_front();
-<a name="l00207"></a>00207 t.destroy(t);
-<a name="l00208"></a>00208 }
-<a name="l00209"></a>00209 }
-<a name="l00210"></a>00210 };
-<a name="l00211"></a>00211
-<a name="l00212"></a>00212 } <span class="comment">// namespace internal</span>
-<a name="l00214"></a>00214 <span class="comment"></span>
-<a name="l00215"></a>00215
-<a name="l00216"></a>00216 } <span class="comment">// namespace tbb</span>
-<a name="l00217"></a>00217
-<a name="l00218"></a>00218 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_partitioner_H */</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2011 Intel Corporation. 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/a00546.html b/doc/html/a00543.html
similarity index 87%
rename from doc/html/a00546.html
rename to doc/html/a00543.html
index a78de64..3d01e0f 100644
--- a/doc/html/a00546.html
+++ b/doc/html/a00543.html
@@ -76,20 +76,20 @@
<a name="l00056"></a>00056
<a name="l00058"></a>00058
<a name="l00060"></a>00060
-<a name="l00061"></a><a class="code" href="a00245.html">00061</a> <span class="keyword">class </span><a class="code" href="a00245.html">filter</a>: internal::no_copy {
+<a name="l00061"></a><a class="code" href="a00256.html">00061</a> <span class="keyword">class </span><a class="code" href="a00256.html">filter</a>: internal::no_copy {
<a name="l00062"></a>00062 <span class="keyword">private</span>:
-<a name="l00064"></a>00064 <span class="keyword">static</span> <a class="code" href="a00245.html">filter</a>* not_in_pipeline() {<span class="keywordflow">return</span> reinterpret_cast<filter*>(intptr_t(-1));}
+<a name="l00064"></a>00064 <span class="keyword">static</span> <a class="code" href="a00256.html">filter</a>* not_in_pipeline() {<span class="keywordflow">return</span> reinterpret_cast<filter*>(intptr_t(-1));}
<a name="l00065"></a>00065 <span class="keyword">protected</span>:
-<a name="l00067"></a><a class="code" href="a00245.html#4b7de3a76e744f3d9c1bc5d437ea851d">00067</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="a00245.html#4b7de3a76e744f3d9c1bc5d437ea851d">filter_is_serial</a> = 0x1;
+<a name="l00067"></a><a class="code" href="a00256.html#4b7de3a76e744f3d9c1bc5d437ea851d">00067</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="a00256.html#4b7de3a76e744f3d9c1bc5d437ea851d">filter_is_serial</a> = 0x1;
<a name="l00068"></a>00068
<a name="l00070"></a>00070
-<a name="l00072"></a><a class="code" href="a00245.html#2e5eb65f95d8050186278077e433c5b1">00072</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="a00245.html#2e5eb65f95d8050186278077e433c5b1">filter_is_out_of_order</a> = 0x1<<4;
+<a name="l00072"></a><a class="code" href="a00256.html#2e5eb65f95d8050186278077e433c5b1">00072</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="a00256.html#2e5eb65f95d8050186278077e433c5b1">filter_is_out_of_order</a> = 0x1<<4;
<a name="l00073"></a>00073
-<a name="l00075"></a><a class="code" href="a00245.html#dd6a6e7210efc9bcaf2c5e08767d92b5">00075</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="a00245.html#dd6a6e7210efc9bcaf2c5e08767d92b5">filter_is_bound</a> = 0x1<<5;
+<a name="l00075"></a><a class="code" href="a00256.html#dd6a6e7210efc9bcaf2c5e08767d92b5">00075</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="a00256.html#dd6a6e7210efc9bcaf2c5e08767d92b5">filter_is_bound</a> = 0x1<<5;
<a name="l00076"></a>00076
-<a name="l00078"></a><a class="code" href="a00245.html#bdd02a434a6e7499dd1e8f43aae96793">00078</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="a00245.html#bdd02a434a6e7499dd1e8f43aae96793">filter_may_emit_null</a> = 0x1<<6;
+<a name="l00078"></a><a class="code" href="a00256.html#bdd02a434a6e7499dd1e8f43aae96793">00078</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="a00256.html#bdd02a434a6e7499dd1e8f43aae96793">filter_may_emit_null</a> = 0x1<<6;
<a name="l00079"></a>00079
-<a name="l00081"></a><a class="code" href="a00245.html#f17200974c33be21f42a5f00893de028">00081</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="a00245.html#f17200974c33be21f42a5f00893de028">exact_exception_propagation</a> =
+<a name="l00081"></a><a class="code" href="a00256.html#f17200974c33be21f42a5f00893de028">00081</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="a00256.html#f17200974c33be21f42a5f00893de028">exact_exception_propagation</a> =
<a name="l00082"></a>00082 <span class="preprocessor">#if TBB_USE_CAPTURED_EXCEPTION</span>
<a name="l00083"></a>00083 <span class="preprocessor"></span> 0x0;
<a name="l00084"></a>00084 <span class="preprocessor">#else</span>
@@ -100,16 +100,16 @@
<a name="l00089"></a>00089 <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="l00090"></a>00090 <span class="keyword">public</span>:
<a name="l00091"></a>00091 <span class="keyword">enum</span> mode {
-<a name="l00093"></a>00093 parallel = current_version | <a class="code" href="a00245.html#2e5eb65f95d8050186278077e433c5b1">filter_is_out_of_order</a>,
-<a name="l00095"></a>00095 serial_in_order = current_version | <a class="code" href="a00245.html#4b7de3a76e744f3d9c1bc5d437ea851d">filter_is_serial</a>,
-<a name="l00097"></a>00097 serial_out_of_order = current_version | <a class="code" href="a00245.html#4b7de3a76e744f3d9c1bc5d437ea851d">filter_is_serial</a> | <a class="code" href="a00245.html#2e5eb65f95d8050186278077e433c5b1">filter_is_out_of_order</a>,
+<a name="l00093"></a>00093 parallel = current_version | <a class="code" href="a00256.html#2e5eb65f95d8050186278077e433c5b1">filter_is_out_of_order</a>,
+<a name="l00095"></a>00095 serial_in_order = current_version | <a class="code" href="a00256.html#4b7de3a76e744f3d9c1bc5d437ea851d">filter_is_serial</a>,
+<a name="l00097"></a>00097 serial_out_of_order = current_version | <a class="code" href="a00256.html#4b7de3a76e744f3d9c1bc5d437ea851d">filter_is_serial</a> | <a class="code" href="a00256.html#2e5eb65f95d8050186278077e433c5b1">filter_is_out_of_order</a>,
<a name="l00099"></a>00099 serial = serial_in_order
<a name="l00100"></a>00100 };
<a name="l00101"></a>00101 <span class="keyword">protected</span>:
-<a name="l00102"></a>00102 <a class="code" href="a00245.html">filter</a>( <span class="keywordtype">bool</span> is_serial_ ) :
+<a name="l00102"></a>00102 <a class="code" href="a00256.html">filter</a>( <span class="keywordtype">bool</span> is_serial_ ) :
<a name="l00103"></a>00103 next_filter_in_pipeline(not_in_pipeline()),
<a name="l00104"></a>00104 my_input_buffer(NULL),
-<a name="l00105"></a>00105 my_filter_mode(static_cast<unsigned char>((is_serial_ ? serial : parallel) | <a class="code" href="a00245.html#f17200974c33be21f42a5f00893de028">exact_exception_propagation</a>)),
+<a name="l00105"></a>00105 my_filter_mode(static_cast<unsigned char>((is_serial_ ? serial : parallel) | <a class="code" href="a00256.html#f17200974c33be21f42a5f00893de028">exact_exception_propagation</a>)),
<a name="l00106"></a>00106 prev_filter_in_pipeline(not_in_pipeline()),
<a name="l00107"></a>00107 my_pipeline(NULL),
<a name="l00108"></a>00108 next_segment(NULL)
@@ -118,7 +118,7 @@
<a name="l00111"></a>00111 filter( mode filter_mode ) :
<a name="l00112"></a>00112 next_filter_in_pipeline(not_in_pipeline()),
<a name="l00113"></a>00113 my_input_buffer(NULL),
-<a name="l00114"></a>00114 my_filter_mode(static_cast<unsigned char>(filter_mode | <a class="code" href="a00245.html#f17200974c33be21f42a5f00893de028">exact_exception_propagation</a>)),
+<a name="l00114"></a>00114 my_filter_mode(static_cast<unsigned char>(filter_mode | <a class="code" href="a00256.html#f17200974c33be21f42a5f00893de028">exact_exception_propagation</a>)),
<a name="l00115"></a>00115 prev_filter_in_pipeline(not_in_pipeline()),
<a name="l00116"></a>00116 my_pipeline(NULL),
<a name="l00117"></a>00117 next_segment(NULL)
@@ -128,35 +128,35 @@
<a name="l00121"></a>00121 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD set_end_of_input();
<a name="l00122"></a>00122
<a name="l00123"></a>00123 <span class="keyword">public</span>:
-<a name="l00125"></a><a class="code" href="a00245.html#fcfec27656a69ff2072802ac001e936f">00125</a> <span class="keywordtype">bool</span> <a class="code" href="a00245.html#fcfec27656a69ff2072802ac001e936f">is_serial</a>()<span class="keyword"> const </span>{
-<a name="l00126"></a>00126 <span class="keywordflow">return</span> bool( my_filter_mode & <a class="code" href="a00245.html#4b7de3a76e744f3d9c1bc5d437ea851d">filter_is_serial</a> );
+<a name="l00125"></a><a class="code" href="a00256.html#fcfec27656a69ff2072802ac001e936f">00125</a> <span class="keywordtype">bool</span> <a class="code" href="a00256.html#fcfec27656a69ff2072802ac001e936f">is_serial</a>()<span class="keyword"> const </span>{
+<a name="l00126"></a>00126 <span class="keywordflow">return</span> bool( my_filter_mode & <a class="code" href="a00256.html#4b7de3a76e744f3d9c1bc5d437ea851d">filter_is_serial</a> );
<a name="l00127"></a>00127 }
<a name="l00128"></a>00128
-<a name="l00130"></a><a class="code" href="a00245.html#cd53206c4795ef2df5df26b795caf692">00130</a> <span class="keywordtype">bool</span> <a class="code" href="a00245.html#cd53206c4795ef2df5df26b795caf692">is_ordered</a>()<span class="keyword"> const </span>{
-<a name="l00131"></a>00131 <span class="keywordflow">return</span> (my_filter_mode & (<a class="code" href="a00245.html#2e5eb65f95d8050186278077e433c5b1">filter_is_out_of_order</a>|<a class="code" href="a00245.html#4b7de3a76e744f3d9c1bc5d437ea851d">filter_is_serial</a>))==<a class="code" href="a00245.html#4b7de3a76e744f3d9c1bc5d437ea851d">filter_is_serial</a>;
+<a name="l00130"></a><a class="code" href="a00256.html#cd53206c4795ef2df5df26b795caf692">00130</a> <span class="keywordtype">bool</span> <a class="code" href="a00256.html#cd53206c4795ef2df5df26b795caf692">is_ordered</a>()<span class="keyword"> const </span>{
+<a name="l00131"></a>00131 <span class="keywordflow">return</span> (my_filter_mode & (<a class="code" href="a00256.html#2e5eb65f95d8050186278077e433c5b1">filter_is_out_of_order</a>|<a class="code" href="a00256.html#4b7de3a76e744f3d9c1bc5d437ea851d">filter_is_serial</a>))==<a class="code" href="a00256.html#4b7de3a76e744f3d9c1bc5d437ea851d">filter_is_serial</a>;
<a name="l00132"></a>00132 }
<a name="l00133"></a>00133
-<a name="l00135"></a><a class="code" href="a00245.html#15c29cae5d237e6d63dbfe5c94af89d5">00135</a> <span class="keywordtype">bool</span> <a class="code" href="a00245.html#15c29cae5d237e6d63dbfe5c94af89d5">is_bound</a>()<span class="keyword"> const </span>{
-<a name="l00136"></a>00136 <span class="keywordflow">return</span> ( my_filter_mode & <a class="code" href="a00245.html#dd6a6e7210efc9bcaf2c5e08767d92b5">filter_is_bound</a> )==filter_is_bound;
+<a name="l00135"></a><a class="code" href="a00256.html#15c29cae5d237e6d63dbfe5c94af89d5">00135</a> <span class="keywordtype">bool</span> <a class="code" href="a00256.html#15c29cae5d237e6d63dbfe5c94af89d5">is_bound</a>()<span class="keyword"> const </span>{
+<a name="l00136"></a>00136 <span class="keywordflow">return</span> ( my_filter_mode & <a class="code" href="a00256.html#dd6a6e7210efc9bcaf2c5e08767d92b5">filter_is_bound</a> )==filter_is_bound;
<a name="l00137"></a>00137 }
<a name="l00138"></a>00138
-<a name="l00140"></a><a class="code" href="a00245.html#8ec4dfe053e94a2349d56781ddea8477">00140</a> <span class="keywordtype">bool</span> <a class="code" href="a00245.html#8ec4dfe053e94a2349d56781ddea8477">object_may_be_null</a>() {
-<a name="l00141"></a>00141 <span class="keywordflow">return</span> ( my_filter_mode & <a class="code" href="a00245.html#bdd02a434a6e7499dd1e8f43aae96793">filter_may_emit_null</a> ) == filter_may_emit_null;
+<a name="l00140"></a><a class="code" href="a00256.html#8ec4dfe053e94a2349d56781ddea8477">00140</a> <span class="keywordtype">bool</span> <a class="code" href="a00256.html#8ec4dfe053e94a2349d56781ddea8477">object_may_be_null</a>() {
+<a name="l00141"></a>00141 <span class="keywordflow">return</span> ( my_filter_mode & <a class="code" href="a00256.html#bdd02a434a6e7499dd1e8f43aae96793">filter_may_emit_null</a> ) == filter_may_emit_null;
<a name="l00142"></a>00142 }
<a name="l00143"></a>00143
<a name="l00145"></a>00145
-<a name="l00146"></a>00146 <span class="keyword">virtual</span> <span class="keywordtype">void</span>* <a class="code" href="a00245.html#fa1b3dc1f4f47563ccab7f4d92f5b543">operator()</a>( <span class="keywordtype">void</span>* item ) = 0;
+<a name="l00146"></a>00146 <span class="keyword">virtual</span> <span class="keywordtype">void</span>* <a class="code" href="a00256.html#fa1b3dc1f4f47563ccab7f4d92f5b543">operator()</a>( <span class="keywordtype">void</span>* item ) = 0;
<a name="l00147"></a>00147
<a name="l00149"></a>00149
-<a name="l00150"></a>00150 <span class="keyword">virtual</span> __TBB_EXPORTED_METHOD <a class="code" href="a00245.html#66d159f362293e3964ba3da8bc1d2604">~filter</a>();
+<a name="l00150"></a>00150 <span class="keyword">virtual</span> __TBB_EXPORTED_METHOD <a class="code" href="a00256.html#66d159f362293e3964ba3da8bc1d2604">~filter</a>();
<a name="l00151"></a>00151
<a name="l00152"></a>00152 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
<a name="l00154"></a>00154 <span class="preprocessor"></span>
-<a name="l00156"></a><a class="code" href="a00245.html#56275eb889c77c4807967133e21401bd">00156</a> <span class="preprocessor"> virtual void finalize( void* </span><span class="comment">/*item*/</span> ) {};
+<a name="l00156"></a><a class="code" href="a00256.html#56275eb889c77c4807967133e21401bd">00156</a> <span class="preprocessor"> virtual void finalize( void* </span><span class="comment">/*item*/</span> ) {};
<a name="l00157"></a>00157 <span class="preprocessor">#endif</span>
<a name="l00158"></a>00158 <span class="preprocessor"></span>
<a name="l00159"></a>00159 <span class="keyword">private</span>:
-<a name="l00161"></a>00161 <a class="code" href="a00245.html">filter</a>* next_filter_in_pipeline;
+<a name="l00161"></a>00161 <a class="code" href="a00256.html">filter</a>* next_filter_in_pipeline;
<a name="l00162"></a>00162
<a name="l00164"></a>00164 <span class="comment">// (pipeline has not yet reached end_of_input or this filter has not yet</span>
<a name="l00165"></a>00165 <span class="comment">// seen the last token produced by input_filter)</span>
@@ -167,21 +167,21 @@
<a name="l00171"></a>00171
<a name="l00172"></a>00172 <span class="keyword">friend</span> <span class="keyword">class </span>internal::stage_task;
<a name="l00173"></a>00173 <span class="keyword">friend</span> <span class="keyword">class </span>internal::pipeline_root_task;
-<a name="l00174"></a>00174 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00266.html">pipeline</a>;
-<a name="l00175"></a>00175 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00301.html">thread_bound_filter</a>;
+<a name="l00174"></a>00174 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00284.html">pipeline</a>;
+<a name="l00175"></a>00175 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00322.html">thread_bound_filter</a>;
<a name="l00176"></a>00176
<a name="l00178"></a>00178 <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> my_filter_mode;
<a name="l00179"></a>00179
-<a name="l00181"></a>00181 <a class="code" href="a00245.html">filter</a>* prev_filter_in_pipeline;
+<a name="l00181"></a>00181 <a class="code" href="a00256.html">filter</a>* prev_filter_in_pipeline;
<a name="l00182"></a>00182
-<a name="l00184"></a>00184 <a class="code" href="a00266.html">pipeline</a>* my_pipeline;
+<a name="l00184"></a>00184 <a class="code" href="a00284.html">pipeline</a>* my_pipeline;
<a name="l00185"></a>00185
<a name="l00187"></a>00187
-<a name="l00188"></a>00188 <a class="code" href="a00245.html">filter</a>* next_segment;
+<a name="l00188"></a>00188 <a class="code" href="a00256.html">filter</a>* next_segment;
<a name="l00189"></a>00189 };
<a name="l00190"></a>00190
<a name="l00192"></a>00192
-<a name="l00193"></a><a class="code" href="a00301.html">00193</a> <span class="keyword">class </span><a class="code" href="a00301.html">thread_bound_filter</a>: <span class="keyword">public</span> <a class="code" href="a00245.html">filter</a> {
+<a name="l00193"></a><a class="code" href="a00322.html">00193</a> <span class="keyword">class </span><a class="code" href="a00322.html">thread_bound_filter</a>: <span class="keyword">public</span> <a class="code" href="a00256.html">filter</a> {
<a name="l00194"></a>00194 <span class="keyword">public</span>:
<a name="l00195"></a>00195 <span class="keyword">enum</span> result_type {
<a name="l00196"></a>00196 <span class="comment">// item was processed</span>
@@ -192,62 +192,62 @@
<a name="l00201"></a>00201 end_of_stream
<a name="l00202"></a>00202 };
<a name="l00203"></a>00203 <span class="keyword">protected</span>:
-<a name="l00204"></a>00204 <a class="code" href="a00301.html">thread_bound_filter</a>(mode filter_mode):
-<a name="l00205"></a>00205 <a class="code" href="a00245.html">filter</a>(static_cast<mode>(filter_mode | <a class="code" href="a00245.html#dd6a6e7210efc9bcaf2c5e08767d92b5">filter::filter_is_bound</a>))
+<a name="l00204"></a>00204 <a class="code" href="a00322.html">thread_bound_filter</a>(mode filter_mode):
+<a name="l00205"></a>00205 <a class="code" href="a00256.html">filter</a>(static_cast<mode>(filter_mode | <a class="code" href="a00256.html#dd6a6e7210efc9bcaf2c5e08767d92b5">filter::filter_is_bound</a>))
<a name="l00206"></a>00206 {}
<a name="l00207"></a>00207 <span class="keyword">public</span>:
<a name="l00209"></a>00209
-<a name="l00214"></a>00214 result_type __TBB_EXPORTED_METHOD <a class="code" href="a00301.html#c4f90f2c771bce748beb9be734fa286c">try_process_item</a>();
+<a name="l00214"></a>00214 result_type __TBB_EXPORTED_METHOD <a class="code" href="a00322.html#c4f90f2c771bce748beb9be734fa286c">try_process_item</a>();
<a name="l00215"></a>00215
<a name="l00217"></a>00217
-<a name="l00221"></a>00221 result_type __TBB_EXPORTED_METHOD <a class="code" href="a00301.html#5e726bdc7fbd924c0b07bd558b1d4d5d">process_item</a>();
+<a name="l00221"></a>00221 result_type __TBB_EXPORTED_METHOD <a class="code" href="a00322.html#5e726bdc7fbd924c0b07bd558b1d4d5d">process_item</a>();
<a name="l00222"></a>00222
<a name="l00223"></a>00223 <span class="keyword">private</span>:
<a name="l00225"></a>00225 result_type internal_process_item(<span class="keywordtype">bool</span> is_blocking);
<a name="l00226"></a>00226 };
<a name="l00227"></a>00227
<a name="l00229"></a>00229
-<a name="l00230"></a><a class="code" href="a00266.html">00230</a> <span class="keyword">class </span><a class="code" href="a00266.html">pipeline</a> {
+<a name="l00230"></a><a class="code" href="a00284.html">00230</a> <span class="keyword">class </span><a class="code" href="a00284.html">pipeline</a> {
<a name="l00231"></a>00231 <span class="keyword">public</span>:
-<a name="l00233"></a>00233 __TBB_EXPORTED_METHOD <a class="code" href="a00266.html#596dc3beba27099c4c8581cb419e1a59">pipeline</a>();
+<a name="l00233"></a>00233 __TBB_EXPORTED_METHOD <a class="code" href="a00284.html#596dc3beba27099c4c8581cb419e1a59">pipeline</a>();
<a name="l00234"></a>00234
-<a name="l00237"></a>00237 <span class="keyword">virtual</span> __TBB_EXPORTED_METHOD <a class="code" href="a00266.html#49513c6c24f9d5bbbb27edca5efe01c9">~pipeline</a>();
+<a name="l00237"></a>00237 <span class="keyword">virtual</span> __TBB_EXPORTED_METHOD <a class="code" href="a00284.html#49513c6c24f9d5bbbb27edca5efe01c9">~pipeline</a>();
<a name="l00238"></a>00238
-<a name="l00240"></a>00240 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00266.html#38fb5c9c8395dd6f89a4ae2011a83e0d">add_filter</a>( <a class="code" href="a00245.html">filter</a>& filter_ );
+<a name="l00240"></a>00240 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00284.html#38fb5c9c8395dd6f89a4ae2011a83e0d">add_filter</a>( <a class="code" href="a00256.html">filter</a>& filter_ );
<a name="l00241"></a>00241
-<a name="l00243"></a>00243 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00266.html#f627616049b3fe36801f37ee40403ef8">run</a>( size_t max_number_of_live_tokens );
+<a name="l00243"></a>00243 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00284.html#f627616049b3fe36801f37ee40403ef8">run</a>( size_t max_number_of_live_tokens );
<a name="l00244"></a>00244
<a name="l00245"></a>00245 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
<a name="l00247"></a>00247 <span class="preprocessor"> void __TBB_EXPORTED_METHOD run( size_t max_number_of_live_tokens, tbb::task_group_context& context );</span>
<a name="l00248"></a>00248 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
<a name="l00249"></a>00249 <span class="preprocessor"></span>
-<a name="l00251"></a>00251 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00266.html#2c84aef5b834b555ee220b176e25931e">clear</a>();
+<a name="l00251"></a>00251 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00284.html#2c84aef5b834b555ee220b176e25931e">clear</a>();
<a name="l00252"></a>00252
<a name="l00253"></a>00253 <span class="keyword">private</span>:
<a name="l00254"></a>00254 <span class="keyword">friend</span> <span class="keyword">class </span>internal::stage_task;
<a name="l00255"></a>00255 <span class="keyword">friend</span> <span class="keyword">class </span>internal::pipeline_root_task;
-<a name="l00256"></a>00256 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00245.html">filter</a>;
-<a name="l00257"></a>00257 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00301.html">thread_bound_filter</a>;
+<a name="l00256"></a>00256 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00256.html">filter</a>;
+<a name="l00257"></a>00257 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00322.html">thread_bound_filter</a>;
<a name="l00258"></a>00258 <span class="keyword">friend</span> <span class="keyword">class </span>internal::pipeline_cleaner;
<a name="l00259"></a>00259 <span class="keyword">friend</span> <span class="keyword">class </span>tbb::interface6::internal::pipeline_proxy;
<a name="l00260"></a>00260
-<a name="l00262"></a>00262 <a class="code" href="a00245.html">filter</a>* filter_list;
+<a name="l00262"></a>00262 <a class="code" href="a00256.html">filter</a>* filter_list;
<a name="l00263"></a>00263
-<a name="l00265"></a>00265 <a class="code" href="a00245.html">filter</a>* filter_end;
+<a name="l00265"></a>00265 <a class="code" href="a00256.html">filter</a>* filter_end;
<a name="l00266"></a>00266
-<a name="l00268"></a>00268 <a class="code" href="a00291.html">task</a>* end_counter;
+<a name="l00268"></a>00268 <a class="code" href="a00311.html">task</a>* end_counter;
<a name="l00269"></a>00269
-<a name="l00271"></a>00271 <a class="code" href="a00216.html">atomic<internal::Token></a> input_tokens;
+<a name="l00271"></a>00271 <a class="code" href="a00228.html">atomic<internal::Token></a> input_tokens;
<a name="l00272"></a>00272
-<a name="l00274"></a>00274 <a class="code" href="a00216.html">atomic<internal::Token></a> token_counter;
+<a name="l00274"></a>00274 <a class="code" href="a00228.html">atomic<internal::Token></a> token_counter;
<a name="l00275"></a>00275
<a name="l00277"></a>00277 <span class="keywordtype">bool</span> end_of_input;
<a name="l00278"></a>00278
<a name="l00280"></a>00280 <span class="keywordtype">bool</span> has_thread_bound_filters;
<a name="l00281"></a>00281
-<a name="l00283"></a>00283 <span class="keywordtype">void</span> remove_filter( <a class="code" href="a00245.html">filter</a>& filter_ );
+<a name="l00283"></a>00283 <span class="keywordtype">void</span> remove_filter( <a class="code" href="a00256.html">filter</a>& filter_ );
<a name="l00284"></a>00284
-<a name="l00286"></a>00286 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD inject_token( <a class="code" href="a00291.html">task</a>& <span class="keyword">self</span> );
+<a name="l00286"></a>00286 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD inject_token( <a class="code" href="a00311.html">task</a>& <span class="keyword">self</span> );
<a name="l00287"></a>00287
<a name="l00288"></a>00288 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
<a name="l00290"></a>00290 <span class="preprocessor"> void clear_filters();</span>
@@ -264,9 +264,9 @@
<a name="l00301"></a>00301 <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="l00302"></a>00302 }
<a name="l00303"></a>00303
-<a name="l00305"></a><a class="code" href="a00248.html">00305</a> <span class="keyword">class </span><a class="code" href="a00248.html">flow_control</a> {
+<a name="l00305"></a><a class="code" href="a00259.html">00305</a> <span class="keyword">class </span><a class="code" href="a00259.html">flow_control</a> {
<a name="l00306"></a>00306 <span class="keywordtype">bool</span> is_pipeline_stopped;
-<a name="l00307"></a>00307 <a class="code" href="a00248.html">flow_control</a>() { is_pipeline_stopped = <span class="keyword">false</span>; }
+<a name="l00307"></a>00307 <a class="code" href="a00259.html">flow_control</a>() { is_pipeline_stopped = <span class="keyword">false</span>; }
<a name="l00308"></a>00308 <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="l00309"></a>00309 <span class="keyword">public</span>:
<a name="l00310"></a>00310 <span class="keywordtype">void</span> stop() { is_pipeline_stopped = <span class="keyword">true</span>; }
@@ -282,7 +282,7 @@
<a name="l00321"></a>00321 <span class="keyword">template</span><<span class="keyword">typename</span> T>
<a name="l00322"></a>00322 <span class="keyword">class </span>token_helper<T, true> {
<a name="l00323"></a>00323 <span class="keyword">public</span>:
-<a name="l00324"></a>00324 <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00296.html">tbb::tbb_allocator<T></a> allocator;
+<a name="l00324"></a>00324 <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00317.html">tbb::tbb_allocator<T></a> allocator;
<a name="l00325"></a>00325 <span class="keyword">typedef</span> T* pointer;
<a name="l00326"></a>00326 <span class="keyword">typedef</span> T value_type;
<a name="l00327"></a>00327 <span class="keyword">static</span> pointer create_token(<span class="keyword">const</span> value_type & source) {
@@ -414,19 +414,19 @@
<a name="l00454"></a>00454
<a name="l00456"></a>00456
<a name="l00457"></a>00457 <span class="keyword">class </span>pipeline_proxy {
-<a name="l00458"></a>00458 <a class="code" href="a00266.html">tbb::pipeline</a> my_pipe;
+<a name="l00458"></a>00458 <a class="code" href="a00284.html">tbb::pipeline</a> my_pipe;
<a name="l00459"></a>00459 <span class="keyword">public</span>:
<a name="l00460"></a>00460 pipeline_proxy( <span class="keyword">const</span> filter_t<void,void>& filter_chain );
<a name="l00461"></a>00461 ~pipeline_proxy() {
<a name="l00462"></a>00462 <span class="keywordflow">while</span>( filter* f = my_pipe.filter_list )
<a name="l00463"></a>00463 <span class="keyword">delete</span> f; <span class="comment">// filter destructor removes it from the pipeline</span>
<a name="l00464"></a>00464 }
-<a name="l00465"></a>00465 <a class="code" href="a00266.html">tbb::pipeline</a>* operator->() { <span class="keywordflow">return</span> &my_pipe; }
+<a name="l00465"></a>00465 <a class="code" href="a00284.html">tbb::pipeline</a>* operator->() { <span class="keywordflow">return</span> &my_pipe; }
<a name="l00466"></a>00466 };
<a name="l00467"></a>00467
<a name="l00469"></a>00469
<a name="l00470"></a>00470 <span class="keyword">class </span>filter_node: tbb::internal::no_copy {
-<a name="l00472"></a>00472 <a class="code" href="a00216.html">tbb::atomic<intptr_t></a> ref_count;
+<a name="l00472"></a>00472 <a class="code" href="a00228.html">tbb::atomic<intptr_t></a> ref_count;
<a name="l00473"></a>00473 <span class="keyword">protected</span>:
<a name="l00474"></a>00474 filter_node() {
<a name="l00475"></a>00475 ref_count = 0;
@@ -483,49 +483,49 @@
<a name="l00531"></a>00531 } <span class="comment">// namespace internal</span>
<a name="l00533"></a>00533 <span class="comment"></span>
<a name="l00535"></a>00535 <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="l00536"></a><a class="code" href="a00246.html#85c2892eff1fddcd06e28911e75838bd">00536</a> <a class="code" href="a00246.html">filter_t<T,U></a> make_filter(tbb::filter::mode mode, <span class="keyword">const</span> Body& body) {
+<a name="l00536"></a><a class="code" href="a00257.html#85c2892eff1fddcd06e28911e75838bd">00536</a> <a class="code" href="a00257.html">filter_t<T,U></a> make_filter(tbb::filter::mode mode, <span class="keyword">const</span> Body& body) {
<a name="l00537"></a>00537 <span class="keywordflow">return</span> <span class="keyword">new</span> internal::filter_node_leaf<T,U,Body>(mode, body);
<a name="l00538"></a>00538 }
<a name="l00539"></a>00539
<a name="l00540"></a>00540 <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="l00541"></a>00541 <a class="code" href="a00246.html">filter_t<T,U></a> operator& (<span class="keyword">const</span> <a class="code" href="a00246.html">filter_t<T,V></a>& left, <span class="keyword">const</span> <a class="code" href="a00246.html">filter_t<V,U></a>& right) {
-<a name="l00542"></a>00542 __TBB_ASSERT(left.<a class="code" href="a00246.html#756d88b0cb01ed3cb9af741c1c4bed52">root</a>,<span class="stringliteral">"cannot use default-constructed filter_t as left argument of '&'"</span>);
-<a name="l00543"></a>00543 __TBB_ASSERT(right.<a class="code" href="a00246.html#756d88b0cb01ed3cb9af741c1c4bed52">root</a>,<span class="stringliteral">"cannot use default-constructed filter_t as right argument of '&'"</span>);
-<a name="l00544"></a>00544 <span class="keywordflow">return</span> <span class="keyword">new</span> internal::filter_node_join(*left.<a class="code" href="a00246.html#756d88b0cb01ed3cb9af741c1c4bed52">root</a>,*right.<a class="code" href="a00246.html#756d88b0cb01ed3cb9af741c1c4bed52">root</a>);
+<a name="l00541"></a>00541 <a class="code" href="a00257.html">filter_t<T,U></a> operator& (<span class="keyword">const</span> <a class="code" href="a00257.html">filter_t<T,V></a>& left, <span class="keyword">const</span> <a class="code" href="a00257.html">filter_t<V,U></a>& right) {
+<a name="l00542"></a>00542 __TBB_ASSERT(left.<a class="code" href="a00257.html#756d88b0cb01ed3cb9af741c1c4bed52">root</a>,<span class="stringliteral">"cannot use default-constructed filter_t as left argument of '&'"</span>);
+<a name="l00543"></a>00543 __TBB_ASSERT(right.<a class="code" href="a00257.html#756d88b0cb01ed3cb9af741c1c4bed52">root</a>,<span class="stringliteral">"cannot use default-constructed filter_t as right argument of '&'"</span>);
+<a name="l00544"></a>00544 <span class="keywordflow">return</span> <span class="keyword">new</span> internal::filter_node_join(*left.<a class="code" href="a00257.html#756d88b0cb01ed3cb9af741c1c4bed52">root</a>,*right.<a class="code" href="a00257.html#756d88b0cb01ed3cb9af741c1c4bed52">root</a>);
<a name="l00545"></a>00545 }
<a name="l00546"></a>00546
<a name="l00548"></a>00548 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00549"></a><a class="code" href="a00246.html">00549</a> <span class="keyword">class </span><a class="code" href="a00246.html">filter_t</a> {
+<a name="l00549"></a><a class="code" href="a00257.html">00549</a> <span class="keyword">class </span><a class="code" href="a00257.html">filter_t</a> {
<a name="l00550"></a>00550 <span class="keyword">typedef</span> internal::filter_node filter_node;
<a name="l00551"></a>00551 filter_node* root;
-<a name="l00552"></a>00552 <a class="code" href="a00246.html">filter_t</a>( filter_node* root_ ) : root(root_) {
+<a name="l00552"></a>00552 <a class="code" href="a00257.html">filter_t</a>( filter_node* root_ ) : root(root_) {
<a name="l00553"></a>00553 root->add_ref();
<a name="l00554"></a>00554 }
<a name="l00555"></a>00555 <span class="keyword">friend</span> <span class="keyword">class </span>internal::pipeline_proxy;
<a name="l00556"></a>00556 <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="l00557"></a>00557 <span class="keyword">friend</span> <a class="code" href="a00246.html">filter_t<T_,U_></a> <a class="code" href="a00246.html#85c2892eff1fddcd06e28911e75838bd">make_filter</a>(tbb::filter::mode, <span class="keyword">const</span> Body& );
+<a name="l00557"></a>00557 <span class="keyword">friend</span> <a class="code" href="a00257.html">filter_t<T_,U_></a> <a class="code" href="a00257.html#85c2892eff1fddcd06e28911e75838bd">make_filter</a>(tbb::filter::mode, <span class="keyword">const</span> Body& );
<a name="l00558"></a>00558 <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="l00559"></a>00559 <span class="keyword">friend</span> <a class="code" href="a00246.html">filter_t<T_,U_></a> operator& (<span class="keyword">const</span> <a class="code" href="a00246.html">filter_t<T_,V_></a>& , <span class="keyword">const</span> <a class="code" href="a00246.html">filter_t<V_,U_></a>& );
+<a name="l00559"></a>00559 <span class="keyword">friend</span> <a class="code" href="a00257.html">filter_t<T_,U_></a> operator& (<span class="keyword">const</span> <a class="code" href="a00257.html">filter_t<T_,V_></a>& , <span class="keyword">const</span> <a class="code" href="a00257.html">filter_t<V_,U_></a>& );
<a name="l00560"></a>00560 <span class="keyword">public</span>:
-<a name="l00561"></a>00561 <a class="code" href="a00246.html">filter_t</a>() : root(NULL) {}
-<a name="l00562"></a>00562 <a class="code" href="a00246.html">filter_t</a>( <span class="keyword">const</span> <a class="code" href="a00246.html">filter_t<T,U></a>& rhs ) : root(rhs.<a class="code" href="a00246.html#756d88b0cb01ed3cb9af741c1c4bed52">root</a>) {
+<a name="l00561"></a>00561 <a class="code" href="a00257.html">filter_t</a>() : root(NULL) {}
+<a name="l00562"></a>00562 <a class="code" href="a00257.html">filter_t</a>( <span class="keyword">const</span> <a class="code" href="a00257.html">filter_t<T,U></a>& rhs ) : root(rhs.<a class="code" href="a00257.html#756d88b0cb01ed3cb9af741c1c4bed52">root</a>) {
<a name="l00563"></a>00563 <span class="keywordflow">if</span>( root ) root->add_ref();
<a name="l00564"></a>00564 }
<a name="l00565"></a>00565 <span class="keyword">template</span><<span class="keyword">typename</span> Body>
-<a name="l00566"></a>00566 <a class="code" href="a00246.html">filter_t</a>( tbb::filter::mode mode, <span class="keyword">const</span> Body& body ) :
+<a name="l00566"></a>00566 <a class="code" href="a00257.html">filter_t</a>( tbb::filter::mode mode, <span class="keyword">const</span> Body& body ) :
<a name="l00567"></a>00567 root( <span class="keyword">new</span> internal::filter_node_leaf<T,U,Body>(mode, body) ) {
<a name="l00568"></a>00568 root->add_ref();
<a name="l00569"></a>00569 }
<a name="l00570"></a>00570
-<a name="l00571"></a>00571 <span class="keywordtype">void</span> operator=( <span class="keyword">const</span> <a class="code" href="a00246.html">filter_t<T,U></a>& rhs ) {
+<a name="l00571"></a>00571 <span class="keywordtype">void</span> operator=( <span class="keyword">const</span> <a class="code" href="a00257.html">filter_t<T,U></a>& rhs ) {
<a name="l00572"></a>00572 <span class="comment">// Order of operations below carefully chosen so that reference counts remain correct</span>
<a name="l00573"></a>00573 <span class="comment">// in unlikely event that remove_ref throws exception.</span>
<a name="l00574"></a>00574 filter_node* old = root;
-<a name="l00575"></a>00575 root = rhs.<a class="code" href="a00246.html#756d88b0cb01ed3cb9af741c1c4bed52">root</a>;
+<a name="l00575"></a>00575 root = rhs.<a class="code" href="a00257.html#756d88b0cb01ed3cb9af741c1c4bed52">root</a>;
<a name="l00576"></a>00576 <span class="keywordflow">if</span>( root ) root->add_ref();
<a name="l00577"></a>00577 <span class="keywordflow">if</span>( old ) old->remove_ref();
<a name="l00578"></a>00578 }
-<a name="l00579"></a>00579 ~<a class="code" href="a00246.html">filter_t</a>() {
+<a name="l00579"></a>00579 ~<a class="code" href="a00257.html">filter_t</a>() {
<a name="l00580"></a>00580 <span class="keywordflow">if</span>( root ) root->remove_ref();
<a name="l00581"></a>00581 }
<a name="l00582"></a>00582 <span class="keywordtype">void</span> clear() {
@@ -538,14 +538,14 @@
<a name="l00589"></a>00589 }
<a name="l00590"></a>00590 };
<a name="l00591"></a>00591
-<a name="l00592"></a>00592 <span class="keyword">inline</span> internal::pipeline_proxy::pipeline_proxy( <span class="keyword">const</span> <a class="code" href="a00246.html">filter_t<void,void></a>& filter_chain ) : my_pipe() {
-<a name="l00593"></a>00593 __TBB_ASSERT( filter_chain.<a class="code" href="a00246.html#756d88b0cb01ed3cb9af741c1c4bed52">root</a>, <span class="stringliteral">"cannot apply parallel_pipeline to default-constructed filter_t"</span> );
-<a name="l00594"></a>00594 filter_chain.<a class="code" href="a00246.html#756d88b0cb01ed3cb9af741c1c4bed52">root</a>->add_to(my_pipe);
+<a name="l00592"></a>00592 <span class="keyword">inline</span> internal::pipeline_proxy::pipeline_proxy( <span class="keyword">const</span> <a class="code" href="a00257.html">filter_t<void,void></a>& filter_chain ) : my_pipe() {
+<a name="l00593"></a>00593 __TBB_ASSERT( filter_chain.<a class="code" href="a00257.html#756d88b0cb01ed3cb9af741c1c4bed52">root</a>, <span class="stringliteral">"cannot apply parallel_pipeline to default-constructed filter_t"</span> );
+<a name="l00594"></a>00594 filter_chain.<a class="code" href="a00257.html#756d88b0cb01ed3cb9af741c1c4bed52">root</a>->add_to(my_pipe);
<a name="l00595"></a>00595 }
<a name="l00596"></a>00596
-<a name="l00597"></a>00597 <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="a00246.html">filter_t<void,void></a>& filter_chain
+<a name="l00597"></a>00597 <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="a00257.html">filter_t<void,void></a>& filter_chain
<a name="l00598"></a>00598 #<span class="keywordflow">if</span> __TBB_TASK_GROUP_CONTEXT
-<a name="l00599"></a>00599 , <a class="code" href="a00293.html">tbb::task_group_context</a>& context
+<a name="l00599"></a>00599 , <a class="code" href="a00314.html">tbb::task_group_context</a>& context
<a name="l00600"></a>00600 #endif
<a name="l00601"></a>00601 ) {
<a name="l00602"></a>00602 internal::pipeline_proxy pipe(filter_chain);
@@ -559,7 +559,7 @@
<a name="l00610"></a>00610
<a name="l00611"></a>00611 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
<a name="l00612"></a>00612 <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="l00613"></a>00613 <a class="code" href="a00293.html">tbb::task_group_context</a> context;
+<a name="l00613"></a>00613 <a class="code" href="a00314.html">tbb::task_group_context</a> context;
<a name="l00614"></a>00614 parallel_pipeline(max_number_of_live_tokens, filter_chain, context);
<a name="l00615"></a>00615 }
<a name="l00616"></a>00616 <span class="preprocessor">#endif // __TBB_TASK_GROUP_CONTEXT</span>
diff --git a/doc/html/a00560.html b/doc/html/a00557.html
similarity index 81%
copy from doc/html/a00560.html
copy to doc/html/a00557.html
index c0a44a9..efc804c 100644
--- a/doc/html/a00560.html
+++ b/doc/html/a00557.html
@@ -62,9 +62,9 @@
<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="a00270.html">00045</a> <span class="keyword">class </span><a class="code" href="a00270.html">queuing_mutex</a> {
+<a name="l00045"></a><a class="code" href="a00288.html">00045</a> <span class="keyword">class </span><a class="code" href="a00288.html">queuing_mutex</a> {
<a name="l00046"></a>00046 <span class="keyword">public</span>:
-<a name="l00048"></a><a class="code" href="a00270.html#b389ad9c4db7293e4bdb5b8cda69ec04">00048</a> <a class="code" href="a00270.html#b389ad9c4db7293e4bdb5b8cda69ec04">queuing_mutex</a>() {
+<a name="l00048"></a><a class="code" href="a00288.html#b389ad9c4db7293e4bdb5b8cda69ec04">00048</a> <a class="code" href="a00288.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();
@@ -72,36 +72,36 @@
<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="a00271.html">00058</a> <span class="keyword">class </span><a class="code" href="a00271.html">scoped_lock</a>: internal::no_copy {
+<a name="l00058"></a><a class="code" href="a00289.html">00058</a> <span class="keyword">class </span><a class="code" href="a00289.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="a00258.html">mutex</a> = NULL;
+<a name="l00061"></a>00061 <a class="code" href="a00275.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 <span class="keyword">public</span>:
<a name="l00068"></a>00068
-<a name="l00069"></a><a class="code" href="a00271.html#db0fa3967491014572e24d6607bdc971">00069</a> <a class="code" href="a00271.html#db0fa3967491014572e24d6607bdc971">scoped_lock</a>() {initialize();}
+<a name="l00069"></a><a class="code" href="a00289.html#db0fa3967491014572e24d6607bdc971">00069</a> <a class="code" href="a00289.html#db0fa3967491014572e24d6607bdc971">scoped_lock</a>() {initialize();}
<a name="l00070"></a>00070
-<a name="l00072"></a><a class="code" href="a00271.html#9b51ef972f5618ac17caadb58841ab6d">00072</a> <a class="code" href="a00271.html#db0fa3967491014572e24d6607bdc971">scoped_lock</a>( <a class="code" href="a00270.html">queuing_mutex</a>& m ) {
+<a name="l00072"></a><a class="code" href="a00289.html#9b51ef972f5618ac17caadb58841ab6d">00072</a> <a class="code" href="a00289.html#db0fa3967491014572e24d6607bdc971">scoped_lock</a>( <a class="code" href="a00288.html">queuing_mutex</a>& m ) {
<a name="l00073"></a>00073 initialize();
-<a name="l00074"></a>00074 <a class="code" href="a00271.html#533e4fc8355ee321206a0609c42d909d">acquire</a>(m);
+<a name="l00074"></a>00074 <a class="code" href="a00289.html#533e4fc8355ee321206a0609c42d909d">acquire</a>(m);
<a name="l00075"></a>00075 }
<a name="l00076"></a>00076
-<a name="l00078"></a><a class="code" href="a00271.html#ac2c576a93570957d694192a5f491443">00078</a> <a class="code" href="a00271.html#ac2c576a93570957d694192a5f491443">~scoped_lock</a>() {
-<a name="l00079"></a>00079 <span class="keywordflow">if</span>( <a class="code" href="a00258.html">mutex</a> ) <a class="code" href="a00271.html#3bf2b8c87ff22115be9b2eac179f2d30">release</a>();
+<a name="l00078"></a><a class="code" href="a00289.html#ac2c576a93570957d694192a5f491443">00078</a> <a class="code" href="a00289.html#ac2c576a93570957d694192a5f491443">~scoped_lock</a>() {
+<a name="l00079"></a>00079 <span class="keywordflow">if</span>( <a class="code" href="a00275.html">mutex</a> ) <a class="code" href="a00289.html#3bf2b8c87ff22115be9b2eac179f2d30">release</a>();
<a name="l00080"></a>00080 }
<a name="l00081"></a>00081
-<a name="l00083"></a>00083 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00271.html#533e4fc8355ee321206a0609c42d909d">acquire</a>( <a class="code" href="a00270.html">queuing_mutex</a>& m );
+<a name="l00083"></a>00083 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00289.html#533e4fc8355ee321206a0609c42d909d">acquire</a>( <a class="code" href="a00288.html">queuing_mutex</a>& m );
<a name="l00084"></a>00084
-<a name="l00086"></a>00086 <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD <a class="code" href="a00271.html#e5a014fb817599386a87170cf2cf51a9">try_acquire</a>( <a class="code" href="a00270.html">queuing_mutex</a>& m );
+<a name="l00086"></a>00086 <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD <a class="code" href="a00289.html#e5a014fb817599386a87170cf2cf51a9">try_acquire</a>( <a class="code" href="a00288.html">queuing_mutex</a>& m );
<a name="l00087"></a>00087
-<a name="l00089"></a>00089 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00271.html#3bf2b8c87ff22115be9b2eac179f2d30">release</a>();
+<a name="l00089"></a>00089 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00289.html#3bf2b8c87ff22115be9b2eac179f2d30">release</a>();
<a name="l00090"></a>00090
<a name="l00091"></a>00091 <span class="keyword">private</span>:
-<a name="l00093"></a>00093 <a class="code" href="a00270.html">queuing_mutex</a>* <a class="code" href="a00258.html">mutex</a>;
+<a name="l00093"></a>00093 <a class="code" href="a00288.html">queuing_mutex</a>* <a class="code" href="a00275.html">mutex</a>;
<a name="l00094"></a>00094
-<a name="l00096"></a>00096 <a class="code" href="a00271.html">scoped_lock</a> *next;
+<a name="l00096"></a>00096 <a class="code" href="a00289.html">scoped_lock</a> *next;
<a name="l00097"></a>00097
<a name="l00099"></a>00099
<a name="l00102"></a>00102 uintptr_t going;
@@ -113,18 +113,16 @@
<a name="l00108"></a>00108 <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="l00109"></a>00109 <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="l00110"></a>00110 <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="l00111"></a>00111
-<a name="l00112"></a>00112 <span class="keyword">friend</span> <span class="keyword">class </span>scoped_lock;
-<a name="l00113"></a>00113 <span class="keyword">private</span>:
-<a name="l00115"></a>00115 <a class="code" href="a00216.html">atomic<scoped_lock*></a> q_tail;
+<a name="l00111"></a>00111 <span class="keyword">private</span>:
+<a name="l00113"></a>00113 <a class="code" href="a00228.html">atomic<scoped_lock*></a> q_tail;
+<a name="l00114"></a>00114
+<a name="l00115"></a>00115 };
<a name="l00116"></a>00116
-<a name="l00117"></a>00117 };
+<a name="l00117"></a>00117 __TBB_DEFINE_PROFILING_SET_NAME(queuing_mutex)
<a name="l00118"></a>00118
-<a name="l00119"></a>00119 __TBB_DEFINE_PROFILING_SET_NAME(queuing_mutex)
+<a name="l00119"></a>00119 } <span class="comment">// namespace tbb</span>
<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>
+<a name="l00121"></a>00121 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_queuing_mutex_H */</span>
</pre></div><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00561.html b/doc/html/a00558.html
similarity index 82%
copy from doc/html/a00561.html
copy to doc/html/a00558.html
index 26c60be..18f42a9 100644
--- a/doc/html/a00561.html
+++ b/doc/html/a00558.html
@@ -62,16 +62,16 @@
<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="a00272.html">00047</a> <span class="keyword">class </span><a class="code" href="a00272.html">queuing_rw_mutex</a> {
+<a name="l00047"></a><a class="code" href="a00290.html">00047</a> <span class="keyword">class </span><a class="code" href="a00290.html">queuing_rw_mutex</a> {
<a name="l00048"></a>00048 <span class="keyword">public</span>:
-<a name="l00050"></a><a class="code" href="a00272.html#85c90877c3447690ac4e2ac4ff8dea5e">00050</a> <a class="code" href="a00272.html#85c90877c3447690ac4e2ac4ff8dea5e">queuing_rw_mutex</a>() {
+<a name="l00050"></a><a class="code" href="a00290.html#85c90877c3447690ac4e2ac4ff8dea5e">00050</a> <a class="code" href="a00290.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="a00272.html#1ba73e3d95cfdf8323880bc623af9099">00058</a> <a class="code" href="a00272.html#1ba73e3d95cfdf8323880bc623af9099">~queuing_rw_mutex</a>() {
+<a name="l00058"></a><a class="code" href="a00290.html#1ba73e3d95cfdf8323880bc623af9099">00058</a> <a class="code" href="a00290.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>
@@ -81,52 +81,52 @@
<a name="l00065"></a>00065 <span class="keyword">friend</span> <span class="keyword">class </span>scoped_lock;
<a name="l00066"></a>00066
<a name="l00068"></a>00068
-<a name="l00070"></a><a class="code" href="a00273.html">00070</a> <span class="keyword">class </span><a class="code" href="a00273.html">scoped_lock</a>: internal::no_copy {
+<a name="l00070"></a><a class="code" href="a00291.html">00070</a> <span class="keyword">class </span><a class="code" href="a00291.html">scoped_lock</a>: internal::no_copy {
<a name="l00072"></a>00072 <span class="keywordtype">void</span> initialize() {
-<a name="l00073"></a>00073 <a class="code" href="a00258.html">mutex</a> = NULL;
+<a name="l00073"></a>00073 my_mutex = NULL;
<a name="l00074"></a>00074 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00075"></a>00075 <span class="preprocessor"></span> state = 0xFF; <span class="comment">// Set to invalid state</span>
-<a name="l00076"></a>00076 internal::poison_pointer(next);
-<a name="l00077"></a>00077 internal::poison_pointer(prev);
+<a name="l00075"></a>00075 <span class="preprocessor"></span> my_state = 0xFF; <span class="comment">// Set to invalid state</span>
+<a name="l00076"></a>00076 internal::poison_pointer(my_next);
+<a name="l00077"></a>00077 internal::poison_pointer(my_prev);
<a name="l00078"></a>00078 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
<a name="l00079"></a>00079 }
<a name="l00080"></a>00080 <span class="keyword">public</span>:
<a name="l00082"></a>00082
-<a name="l00083"></a><a class="code" href="a00273.html#c62e365be7bcbba091c9ea7454a4d22c">00083</a> <a class="code" href="a00273.html#c62e365be7bcbba091c9ea7454a4d22c">scoped_lock</a>() {initialize();}
+<a name="l00083"></a><a class="code" href="a00291.html#c62e365be7bcbba091c9ea7454a4d22c">00083</a> <a class="code" href="a00291.html#c62e365be7bcbba091c9ea7454a4d22c">scoped_lock</a>() {initialize();}
<a name="l00084"></a>00084
-<a name="l00086"></a><a class="code" href="a00273.html#fbb8798792d3aebb136c46fc63d2529e">00086</a> <a class="code" href="a00273.html#c62e365be7bcbba091c9ea7454a4d22c">scoped_lock</a>( <a class="code" href="a00272.html">queuing_rw_mutex</a>& m, <span class="keywordtype">bool</span> write=<span class="keyword">true</span> ) {
+<a name="l00086"></a><a class="code" href="a00291.html#fbb8798792d3aebb136c46fc63d2529e">00086</a> <a class="code" href="a00291.html#c62e365be7bcbba091c9ea7454a4d22c">scoped_lock</a>( <a class="code" href="a00290.html">queuing_rw_mutex</a>& m, <span class="keywordtype">bool</span> write=<span class="keyword">true</span> ) {
<a name="l00087"></a>00087 initialize();
-<a name="l00088"></a>00088 <a class="code" href="a00273.html#a8dd5ab8686e76de21587544dbb681e0">acquire</a>(m,write);
+<a name="l00088"></a>00088 <a class="code" href="a00291.html#a8dd5ab8686e76de21587544dbb681e0">acquire</a>(m,write);
<a name="l00089"></a>00089 }
<a name="l00090"></a>00090
-<a name="l00092"></a><a class="code" href="a00273.html#32c7d67a660d23ebbaab1a1d2826d31a">00092</a> <a class="code" href="a00273.html#32c7d67a660d23ebbaab1a1d2826d31a">~scoped_lock</a>() {
-<a name="l00093"></a>00093 <span class="keywordflow">if</span>( <a class="code" href="a00258.html">mutex</a> ) <a class="code" href="a00273.html#67ae221109ddc69510ab593874e435d4">release</a>();
+<a name="l00092"></a><a class="code" href="a00291.html#32c7d67a660d23ebbaab1a1d2826d31a">00092</a> <a class="code" href="a00291.html#32c7d67a660d23ebbaab1a1d2826d31a">~scoped_lock</a>() {
+<a name="l00093"></a>00093 <span class="keywordflow">if</span>( my_mutex ) <a class="code" href="a00291.html#67ae221109ddc69510ab593874e435d4">release</a>();
<a name="l00094"></a>00094 }
<a name="l00095"></a>00095
-<a name="l00097"></a>00097 <span class="keywordtype">void</span> <a class="code" href="a00273.html#a8dd5ab8686e76de21587544dbb681e0">acquire</a>( <a class="code" href="a00272.html">queuing_rw_mutex</a>& m, <span class="keywordtype">bool</span> write=<span class="keyword">true</span> );
+<a name="l00097"></a>00097 <span class="keywordtype">void</span> <a class="code" href="a00291.html#a8dd5ab8686e76de21587544dbb681e0">acquire</a>( <a class="code" href="a00290.html">queuing_rw_mutex</a>& m, <span class="keywordtype">bool</span> write=<span class="keyword">true</span> );
<a name="l00098"></a>00098
-<a name="l00100"></a>00100 <span class="keywordtype">bool</span> <a class="code" href="a00273.html#2e4ff6c9ec2fee6682f95290d1f42baa">try_acquire</a>( <a class="code" href="a00272.html">queuing_rw_mutex</a>& m, <span class="keywordtype">bool</span> write=<span class="keyword">true</span> );
+<a name="l00100"></a>00100 <span class="keywordtype">bool</span> <a class="code" href="a00291.html#2e4ff6c9ec2fee6682f95290d1f42baa">try_acquire</a>( <a class="code" href="a00290.html">queuing_rw_mutex</a>& m, <span class="keywordtype">bool</span> write=<span class="keyword">true</span> );
<a name="l00101"></a>00101
-<a name="l00103"></a>00103 <span class="keywordtype">void</span> <a class="code" href="a00273.html#67ae221109ddc69510ab593874e435d4">release</a>();
+<a name="l00103"></a>00103 <span class="keywordtype">void</span> <a class="code" href="a00291.html#67ae221109ddc69510ab593874e435d4">release</a>();
<a name="l00104"></a>00104
<a name="l00106"></a>00106
-<a name="l00107"></a>00107 <span class="keywordtype">bool</span> <a class="code" href="a00273.html#11ba1da4a722c9e6f73339a52c487e82">upgrade_to_writer</a>();
+<a name="l00107"></a>00107 <span class="keywordtype">bool</span> <a class="code" href="a00291.html#11ba1da4a722c9e6f73339a52c487e82">upgrade_to_writer</a>();
<a name="l00108"></a>00108
-<a name="l00110"></a>00110 <span class="keywordtype">bool</span> <a class="code" href="a00273.html#0d2f93edf7b15ec4bcee138823220c52">downgrade_to_reader</a>();
+<a name="l00110"></a>00110 <span class="keywordtype">bool</span> <a class="code" href="a00291.html#0d2f93edf7b15ec4bcee138823220c52">downgrade_to_reader</a>();
<a name="l00111"></a>00111
<a name="l00112"></a>00112 <span class="keyword">private</span>:
-<a name="l00114"></a>00114 <a class="code" href="a00272.html">queuing_rw_mutex</a>* <a class="code" href="a00258.html">mutex</a>;
+<a name="l00114"></a>00114 <a class="code" href="a00290.html">queuing_rw_mutex</a>* my_mutex;
<a name="l00115"></a>00115
-<a name="l00117"></a>00117 <a class="code" href="a00273.html">scoped_lock</a> * prev, * next;
+<a name="l00117"></a>00117 <a class="code" href="a00291.html">scoped_lock</a> *__TBB_atomic my_prev, *__TBB_atomic my_next;
<a name="l00118"></a>00118
<a name="l00119"></a>00119 <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> state_t;
<a name="l00120"></a>00120
-<a name="l00122"></a>00122 <a class="code" href="a00216.html">atomic<state_t></a> state;
+<a name="l00122"></a>00122 <a class="code" href="a00228.html">atomic<state_t></a> my_state;
<a name="l00123"></a>00123
<a name="l00125"></a>00125
-<a name="l00126"></a>00126 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> going;
+<a name="l00126"></a>00126 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> __TBB_atomic my_going;
<a name="l00127"></a>00127
-<a name="l00129"></a>00129 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> internal_lock;
+<a name="l00129"></a>00129 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> my_internal_lock;
<a name="l00130"></a>00130
<a name="l00132"></a>00132 <span class="keywordtype">void</span> acquire_internal_lock();
<a name="l00133"></a>00133
@@ -148,7 +148,7 @@
<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">true</span>;
<a name="l00154"></a>00154
<a name="l00155"></a>00155 <span class="keyword">private</span>:
-<a name="l00157"></a>00157 <a class="code" href="a00216.html">atomic<scoped_lock*></a> q_tail;
+<a name="l00157"></a>00157 <a class="code" href="a00228.html">atomic<scoped_lock*></a> q_tail;
<a name="l00158"></a>00158
<a name="l00159"></a>00159 };
<a name="l00160"></a>00160
diff --git a/doc/html/a00562.html b/doc/html/a00559.html
similarity index 82%
copy from doc/html/a00562.html
copy to doc/html/a00559.html
index 738d3ed..2ed52ff 100644
--- a/doc/html/a00562.html
+++ b/doc/html/a00559.html
@@ -49,31 +49,31 @@
<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="a00274.html">00034</a> <span class="keyword">class </span><a class="code" href="a00274.html">reader_writer_lock</a> : tbb::internal::no_copy {
+<a name="l00034"></a><a class="code" href="a00292.html">00034</a> <span class="keyword">class </span><a class="code" href="a00292.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="a00275.html">scoped_lock</a>;
-<a name="l00037"></a>00037 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00276.html">scoped_lock_read</a>;
+<a name="l00036"></a>00036 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00293.html">scoped_lock</a>;
+<a name="l00037"></a>00037 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00294.html">scoped_lock_read</a>;
<a name="l00039"></a>00039
-<a name="l00074"></a><a class="code" href="a00274.html#6f921f0d7c1812ceb5674418c8b6ccaf">00074</a> <span class="keyword">enum</span> <a class="code" href="a00274.html#6f921f0d7c1812ceb5674418c8b6ccaf">status_t</a> { waiting_nonblocking, waiting, active, invalid };
+<a name="l00074"></a><a class="code" href="a00292.html#6f921f0d7c1812ceb5674418c8b6ccaf">00074</a> <span class="keyword">enum</span> <a class="code" href="a00292.html#6f921f0d7c1812ceb5674418c8b6ccaf">status_t</a> { waiting_nonblocking, waiting, active, invalid };
<a name="l00075"></a>00075
-<a name="l00077"></a><a class="code" href="a00274.html#c1431c4293e777efd9aab9a95c2a46e1">00077</a> <a class="code" href="a00274.html#c1431c4293e777efd9aab9a95c2a46e1">reader_writer_lock</a>() {
+<a name="l00077"></a><a class="code" href="a00292.html#c1431c4293e777efd9aab9a95c2a46e1">00077</a> <a class="code" href="a00292.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="a00274.html#5135f64f7b7339017f33d956445edbee">00082</a> <a class="code" href="a00274.html#5135f64f7b7339017f33d956445edbee">~reader_writer_lock</a>() {
+<a name="l00082"></a><a class="code" href="a00292.html#5135f64f7b7339017f33d956445edbee">00082</a> <a class="code" href="a00292.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="a00275.html">00089</a> <span class="keyword">class </span><a class="code" href="a00275.html">scoped_lock</a> : tbb::internal::no_copy {
+<a name="l00089"></a><a class="code" href="a00293.html">00089</a> <span class="keyword">class </span><a class="code" href="a00293.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="a00274.html">reader_writer_lock</a>;
+<a name="l00091"></a>00091 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00292.html">reader_writer_lock</a>;
<a name="l00092"></a>00092
-<a name="l00094"></a><a class="code" href="a00275.html#cf19f20e082887c1bb0ba6b0911c3583">00094</a> <a class="code" href="a00275.html">scoped_lock</a>(<a class="code" href="a00274.html">reader_writer_lock</a>& <a class="code" href="a00274.html#2653d1a2d560059a51219a8ceab3ade9">lock</a>) {
-<a name="l00095"></a>00095 internal_construct(<a class="code" href="a00274.html#2653d1a2d560059a51219a8ceab3ade9">lock</a>);
+<a name="l00094"></a><a class="code" href="a00293.html#cf19f20e082887c1bb0ba6b0911c3583">00094</a> <a class="code" href="a00293.html">scoped_lock</a>(<a class="code" href="a00292.html">reader_writer_lock</a>& <a class="code" href="a00292.html#2653d1a2d560059a51219a8ceab3ade9">lock</a>) {
+<a name="l00095"></a>00095 internal_construct(<a class="code" href="a00292.html#2653d1a2d560059a51219a8ceab3ade9">lock</a>);
<a name="l00096"></a>00096 }
<a name="l00097"></a>00097
-<a name="l00099"></a><a class="code" href="a00275.html#70246e0260493625ff956fa5926fc71f">00099</a> <a class="code" href="a00275.html#70246e0260493625ff956fa5926fc71f">~scoped_lock</a>() {
+<a name="l00099"></a><a class="code" href="a00293.html#70246e0260493625ff956fa5926fc71f">00099</a> <a class="code" href="a00293.html#70246e0260493625ff956fa5926fc71f">~scoped_lock</a>() {
<a name="l00100"></a>00100 internal_destroy();
<a name="l00101"></a>00101 }
<a name="l00102"></a>00102
@@ -85,25 +85,25 @@
<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="a00274.html">reader_writer_lock</a> *<a class="code" href="a00258.html">mutex</a>;
+<a name="l00112"></a>00112 <a class="code" href="a00292.html">reader_writer_lock</a> *<a class="code" href="a00275.html">mutex</a>;
<a name="l00114"></a>00114 scoped_lock* next;
-<a name="l00116"></a>00116 <a class="code" href="a00216.html">atomic<status_t></a> status;
+<a name="l00116"></a>00116 <a class="code" href="a00228.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="a00274.html">reader_writer_lock</a>&);
+<a name="l00121"></a>00121 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_construct(<a class="code" href="a00292.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="a00276.html">00126</a> <span class="keyword">class </span><a class="code" href="a00276.html">scoped_lock_read</a> : tbb::internal::no_copy {
+<a name="l00126"></a><a class="code" href="a00294.html">00126</a> <span class="keyword">class </span><a class="code" href="a00294.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="a00274.html">reader_writer_lock</a>;
+<a name="l00128"></a>00128 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00292.html">reader_writer_lock</a>;
<a name="l00129"></a>00129
-<a name="l00131"></a><a class="code" href="a00276.html#87ab0dc8f7216e6ba0f7acd6aec33064">00131</a> <a class="code" href="a00276.html">scoped_lock_read</a>(<a class="code" href="a00274.html">reader_writer_lock</a>& <a class="code" href="a00274.html#2653d1a2d560059a51219a8ceab3ade9">lock</a>) {
-<a name="l00132"></a>00132 internal_construct(<a class="code" href="a00274.html#2653d1a2d560059a51219a8ceab3ade9">lock</a>);
+<a name="l00131"></a><a class="code" href="a00294.html#87ab0dc8f7216e6ba0f7acd6aec33064">00131</a> <a class="code" href="a00294.html">scoped_lock_read</a>(<a class="code" href="a00292.html">reader_writer_lock</a>& <a class="code" href="a00292.html#2653d1a2d560059a51219a8ceab3ade9">lock</a>) {
+<a name="l00132"></a>00132 internal_construct(<a class="code" href="a00292.html#2653d1a2d560059a51219a8ceab3ade9">lock</a>);
<a name="l00133"></a>00133 }
<a name="l00134"></a>00134
-<a name="l00136"></a><a class="code" href="a00276.html#bd21c5f3d555d64d1de8658e15bf4966">00136</a> <a class="code" href="a00276.html#bd21c5f3d555d64d1de8658e15bf4966">~scoped_lock_read</a>() {
+<a name="l00136"></a><a class="code" href="a00294.html#bd21c5f3d555d64d1de8658e15bf4966">00136</a> <a class="code" href="a00294.html#bd21c5f3d555d64d1de8658e15bf4966">~scoped_lock_read</a>() {
<a name="l00137"></a>00137 internal_destroy();
<a name="l00138"></a>00138 }
<a name="l00139"></a>00139
@@ -115,29 +115,29 @@
<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="a00274.html">reader_writer_lock</a> *<a class="code" href="a00258.html">mutex</a>;
+<a name="l00149"></a>00149 <a class="code" href="a00292.html">reader_writer_lock</a> *<a class="code" href="a00275.html">mutex</a>;
<a name="l00151"></a>00151 scoped_lock_read *next;
-<a name="l00153"></a>00153 <a class="code" href="a00216.html">atomic<status_t></a> status;
+<a name="l00153"></a>00153 <a class="code" href="a00228.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="a00274.html">reader_writer_lock</a>&);
+<a name="l00158"></a>00158 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_construct(<a class="code" href="a00292.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="a00274.html#2653d1a2d560059a51219a8ceab3ade9">lock</a>();
+<a name="l00168"></a>00168 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00292.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="a00274.html#721eb173e154ab38292273e9266a9b07">try_lock</a>();
+<a name="l00175"></a>00175 <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD <a class="code" href="a00292.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="a00274.html#d9d16a24d9f6c3dada73c6b9ff214f5b">lock_read</a>();
+<a name="l00182"></a>00182 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00292.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="a00274.html#595fb23952e3b89426b1f7938dea9b11">try_lock_read</a>();
+<a name="l00187"></a>00187 <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD <a class="code" href="a00292.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="a00274.html#5113b32689305599b2c36b5831547704">unlock</a>();
+<a name="l00190"></a>00190 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00292.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();
diff --git a/doc/html/a00560.html b/doc/html/a00560.html
index c0a44a9..38f7304 100644
--- a/doc/html/a00560.html
+++ b/doc/html/a00560.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>queuing_mutex.h Source File</title>
+<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>
@@ -19,7 +19,7 @@
<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>
+<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-2011 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>
@@ -39,92 +39,197 @@
<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="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">#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="a00270.html">00045</a> <span class="keyword">class </span><a class="code" href="a00270.html">queuing_mutex</a> {
-<a name="l00046"></a>00046 <span class="keyword">public</span>:
-<a name="l00048"></a><a class="code" href="a00270.html#b389ad9c4db7293e4bdb5b8cda69ec04">00048</a> <a class="code" href="a00270.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="a00271.html">00058</a> <span class="keyword">class </span><a class="code" href="a00271.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="a00258.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 <span class="keyword">public</span>:
-<a name="l00068"></a>00068
-<a name="l00069"></a><a class="code" href="a00271.html#db0fa3967491014572e24d6607bdc971">00069</a> <a class="code" href="a00271.html#db0fa3967491014572e24d6607bdc971">scoped_lock</a>() {initialize();}
-<a name="l00070"></a>00070
-<a name="l00072"></a><a class="code" href="a00271.html#9b51ef972f5618ac17caadb58841ab6d">00072</a> <a class="code" href="a00271.html#db0fa3967491014572e24d6607bdc971">scoped_lock</a>( <a class="code" href="a00270.html">queuing_mutex</a>& m ) {
-<a name="l00073"></a>00073 initialize();
-<a name="l00074"></a>00074 <a class="code" href="a00271.html#533e4fc8355ee321206a0609c42d909d">acquire</a>(m);
-<a name="l00075"></a>00075 }
+<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="a00296.html">00039</a> <span class="keyword">class </span><a class="code" href="a00296.html">recursive_mutex</a> {
+<a name="l00040"></a>00040 <span class="keyword">public</span>:
+<a name="l00042"></a><a class="code" href="a00296.html#d2fceb7f95c24a8cd1457d4527e4b8c6">00042</a> <a class="code" href="a00296.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="a00296.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="l00078"></a><a class="code" href="a00271.html#ac2c576a93570957d694192a5f491443">00078</a> <a class="code" href="a00271.html#ac2c576a93570957d694192a5f491443">~scoped_lock</a>() {
-<a name="l00079"></a>00079 <span class="keywordflow">if</span>( <a class="code" href="a00258.html">mutex</a> ) <a class="code" href="a00271.html#3bf2b8c87ff22115be9b2eac179f2d30">release</a>();
-<a name="l00080"></a>00080 }
+<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>00083 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00271.html#533e4fc8355ee321206a0609c42d909d">acquire</a>( <a class="code" href="a00270.html">queuing_mutex</a>& m );
-<a name="l00084"></a>00084
-<a name="l00086"></a>00086 <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD <a class="code" href="a00271.html#e5a014fb817599386a87170cf2cf51a9">try_acquire</a>( <a class="code" href="a00270.html">queuing_mutex</a>& m );
+<a name="l00083"></a><a class="code" href="a00297.html">00083</a> <span class="keyword">class </span><a class="code" href="a00297.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="a00297.html#d82d4d36fbf9727a493d26ae50855fe7">00086</a> <a class="code" href="a00297.html#d82d4d36fbf9727a493d26ae50855fe7">scoped_lock</a>() : my_mutex(NULL) {};
<a name="l00087"></a>00087
-<a name="l00089"></a>00089 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00271.html#3bf2b8c87ff22115be9b2eac179f2d30">release</a>();
-<a name="l00090"></a>00090
-<a name="l00091"></a>00091 <span class="keyword">private</span>:
-<a name="l00093"></a>00093 <a class="code" href="a00270.html">queuing_mutex</a>* <a class="code" href="a00258.html">mutex</a>;
-<a name="l00094"></a>00094
-<a name="l00096"></a>00096 <a class="code" href="a00271.html">scoped_lock</a> *next;
-<a name="l00097"></a>00097
-<a name="l00099"></a>00099
-<a name="l00102"></a>00102 uintptr_t going;
-<a name="l00103"></a>00103 };
-<a name="l00104"></a>00104
-<a name="l00105"></a>00105 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_construct();
-<a name="l00106"></a>00106
-<a name="l00107"></a>00107 <span class="comment">// Mutex traits</span>
-<a name="l00108"></a>00108 <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="l00109"></a>00109 <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="l00110"></a>00110 <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="l00089"></a><a class="code" href="a00297.html#dec17713c4c1321ac8fec66816d0c602">00089</a> <a class="code" href="a00297.html#d82d4d36fbf9727a493d26ae50855fe7">scoped_lock</a>( <a class="code" href="a00296.html">recursive_mutex</a>& <a class="code" href="a00275.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="a00297.html#7fb04da37cccf8c99b1f9102d9074f9a">acquire</a>( mutex );
+<a name="l00094"></a>00094 }
+<a name="l00095"></a>00095
+<a name="l00097"></a><a class="code" href="a00297.html#c1197ffb8f3cd9d4fed71d7e06265b7c">00097</a> <a class="code" href="a00297.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="a00297.html#ac480ea0e9d5ea0345a67d57008b6263">release</a>();
+<a name="l00100"></a>00100 }
+<a name="l00101"></a>00101
+<a name="l00103"></a><a class="code" href="a00297.html#7fb04da37cccf8c99b1f9102d9074f9a">00103</a> <span class="keywordtype">void</span> <a class="code" href="a00297.html#7fb04da37cccf8c99b1f9102d9074f9a">acquire</a>( <a class="code" href="a00296.html">recursive_mutex</a>& <a class="code" href="a00275.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="a00296.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="l00112"></a>00112 <span class="keyword">friend</span> <span class="keyword">class </span>scoped_lock;
-<a name="l00113"></a>00113 <span class="keyword">private</span>:
-<a name="l00115"></a>00115 <a class="code" href="a00216.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>
+<a name="l00113"></a><a class="code" href="a00297.html#36bfc3e93e3ef6340abef4901444d340">00113</a> <span class="keywordtype">bool</span> <a class="code" href="a00297.html#36bfc3e93e3ef6340abef4901444d340">try_acquire</a>( <a class="code" href="a00296.html">recursive_mutex</a>& <a class="code" href="a00275.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="a00296.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="a00297.html#ac480ea0e9d5ea0345a67d57008b6263">00125</a> <span class="keywordtype">void</span> <a class="code" href="a00297.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="a00296.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="a00296.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="a00296.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="a00296.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="a00296.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="a00296.html#4c342c69d47f4bb0b393535dee4015d6">00158</a> <span class="keywordtype">void</span> <a class="code" href="a00296.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="a00227.html">aligned_space<scoped_lock,1></a> tmp;
+<a name="l00161"></a>00161 <span class="keyword">new</span>(tmp.<a class="code" href="a00227.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>()) <a class="code" href="a00297.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="a00296.html#86e719b0afee25704af11ab97694d240">00173</a> <span class="keywordtype">bool</span> <a class="code" href="a00296.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="a00227.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="a00227.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>()) <a class="code" href="a00297.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="a00296.html#f0a96e26b7f074588dc31e32524856ae">00187</a> <span class="keywordtype">void</span> <a class="code" href="a00296.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="a00227.html">aligned_space<scoped_lock,1></a> tmp;
+<a name="l00190"></a>00190 <a class="code" href="a00297.html">scoped_lock</a>& s = *tmp.<a class="code" href="a00227.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>();
+<a name="l00191"></a>00191 s.<a class="code" href="a00297.html#3efd10a49e2435ea5215b49907f93ba2">my_mutex</a> = <span class="keyword">this</span>;
+<a name="l00192"></a>00192 s.<a class="code" href="a00297.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="a00296.html#889fa8cc32dd707eef7c0f52dda09c0d">00204</a> <span class="preprocessor"></span> <span class="keyword">typedef</span> LPCRITICAL_SECTION <a class="code" href="a00296.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="a00296.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="a00296.html#889fa8cc32dd707eef7c0f52dda09c0d">native_handle_type</a> native_handle() { <span class="keywordflow">return</span> (<a class="code" href="a00296.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-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00561.html b/doc/html/a00561.html
index 26c60be..0ffc1de 100644
--- a/doc/html/a00561.html
+++ b/doc/html/a00561.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>queuing_rw_mutex.h Source File</title>
+<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>
@@ -19,7 +19,7 @@
<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>
+<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-2011 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>
@@ -39,124 +39,93 @@
<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="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">#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="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="l00047"></a><a class="code" href="a00272.html">00047</a> <span class="keyword">class </span><a class="code" href="a00272.html">queuing_rw_mutex</a> {
-<a name="l00048"></a>00048 <span class="keyword">public</span>:
-<a name="l00050"></a><a class="code" href="a00272.html#85c90877c3447690ac4e2ac4ff8dea5e">00050</a> <a class="code" href="a00272.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="a00272.html#1ba73e3d95cfdf8323880bc623af9099">00058</a> <a class="code" href="a00272.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="l00064"></a>00064 <span class="keyword">class </span>scoped_lock;
-<a name="l00065"></a>00065 <span class="keyword">friend</span> <span class="keyword">class </span>scoped_lock;
-<a name="l00066"></a>00066
-<a name="l00068"></a>00068
-<a name="l00070"></a><a class="code" href="a00273.html">00070</a> <span class="keyword">class </span><a class="code" href="a00273.html">scoped_lock</a>: internal::no_copy {
-<a name="l00072"></a>00072 <span class="keywordtype">void</span> initialize() {
-<a name="l00073"></a>00073 <a class="code" href="a00258.html">mutex</a> = NULL;
-<a name="l00074"></a>00074 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00075"></a>00075 <span class="preprocessor"></span> state = 0xFF; <span class="comment">// Set to invalid state</span>
-<a name="l00076"></a>00076 internal::poison_pointer(next);
-<a name="l00077"></a>00077 internal::poison_pointer(prev);
-<a name="l00078"></a>00078 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
-<a name="l00079"></a>00079 }
-<a name="l00080"></a>00080 <span class="keyword">public</span>:
-<a name="l00082"></a>00082
-<a name="l00083"></a><a class="code" href="a00273.html#c62e365be7bcbba091c9ea7454a4d22c">00083</a> <a class="code" href="a00273.html#c62e365be7bcbba091c9ea7454a4d22c">scoped_lock</a>() {initialize();}
-<a name="l00084"></a>00084
-<a name="l00086"></a><a class="code" href="a00273.html#fbb8798792d3aebb136c46fc63d2529e">00086</a> <a class="code" href="a00273.html#c62e365be7bcbba091c9ea7454a4d22c">scoped_lock</a>( <a class="code" href="a00272.html">queuing_rw_mutex</a>& m, <span class="keywordtype">bool</span> write=<span class="keyword">true</span> ) {
-<a name="l00087"></a>00087 initialize();
-<a name="l00088"></a>00088 <a class="code" href="a00273.html#a8dd5ab8686e76de21587544dbb681e0">acquire</a>(m,write);
-<a name="l00089"></a>00089 }
-<a name="l00090"></a>00090
-<a name="l00092"></a><a class="code" href="a00273.html#32c7d67a660d23ebbaab1a1d2826d31a">00092</a> <a class="code" href="a00273.html#32c7d67a660d23ebbaab1a1d2826d31a">~scoped_lock</a>() {
-<a name="l00093"></a>00093 <span class="keywordflow">if</span>( <a class="code" href="a00258.html">mutex</a> ) <a class="code" href="a00273.html#67ae221109ddc69510ab593874e435d4">release</a>();
-<a name="l00094"></a>00094 }
+<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="a00298.html">00085</a> <span class="keyword">class </span><a class="code" href="a00298.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="a00298.html#bb0130fe0f596399707e61431231ebcb">00090</a> <span class="keyword">enum</span> <a class="code" href="a00298.html#bb0130fe0f596399707e61431231ebcb">error_mode</a> {
+<a name="l00091"></a>00091 <a class="code" href="a00298.html#bb0130fe0f596399707e61431231ebcbdb47fe5ffbd2eaf47e6de0af433ada38">em_status</a>,
+<a name="l00092"></a>00092 <a class="code" href="a00298.html#bb0130fe0f596399707e61431231ebcbdeb59ca2912432b47fd3ec831574653b">em_throw</a>,
+<a name="l00093"></a><a class="code" href="a00298.html#bb0130fe0f596399707e61431231ebcb630dd30c9ba61d5ab187e80313bbad94">00093</a> <a class="code" href="a00298.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>00097 <span class="keywordtype">void</span> <a class="code" href="a00273.html#a8dd5ab8686e76de21587544dbb681e0">acquire</a>( <a class="code" href="a00272.html">queuing_rw_mutex</a>& m, <span class="keywordtype">bool</span> write=<span class="keyword">true</span> );
-<a name="l00098"></a>00098
-<a name="l00100"></a>00100 <span class="keywordtype">bool</span> <a class="code" href="a00273.html#2e4ff6c9ec2fee6682f95290d1f42baa">try_acquire</a>( <a class="code" href="a00272.html">queuing_rw_mutex</a>& m, <span class="keywordtype">bool</span> write=<span class="keyword">true</span> );
-<a name="l00101"></a>00101
-<a name="l00103"></a>00103 <span class="keywordtype">void</span> <a class="code" href="a00273.html#67ae221109ddc69510ab593874e435d4">release</a>();
-<a name="l00104"></a>00104
-<a name="l00106"></a>00106
-<a name="l00107"></a>00107 <span class="keywordtype">bool</span> <a class="code" href="a00273.html#11ba1da4a722c9e6f73339a52c487e82">upgrade_to_writer</a>();
+<a name="l00097"></a><a class="code" href="a00298.html#6831be91cdc64e57e565ce0dde018789">00097</a> <span class="keyword">enum</span> <a class="code" href="a00298.html#6831be91cdc64e57e565ce0dde018789">error_code</a> {
+<a name="l00098"></a>00098 <a class="code" href="a00298.html#6831be91cdc64e57e565ce0dde0187891e3a364f63f419e5ea2f1d1e52289b27">ec_ok</a>,
+<a name="l00099"></a>00099 <a class="code" href="a00298.html#6831be91cdc64e57e565ce0dde018789e6ce2b091083b80878cbb70cd00782a1">ec_bad_call</a>,
+<a name="l00100"></a>00100 <a class="code" href="a00298.html#6831be91cdc64e57e565ce0dde01878927e94a7b173bb8d0623bf48aad8fc703">ec_bad_arg</a>,
+<a name="l00101"></a>00101 <a class="code" href="a00298.html#6831be91cdc64e57e565ce0dde01878903ee81d8c05966bc1125666713dee5f6">ec_bad_lib</a>,
+<a name="l00102"></a>00102 <a class="code" href="a00298.html#6831be91cdc64e57e565ce0dde01878907790f32918e60d670a96c1f0349e8d6">ec_bad_ver</a>,
+<a name="l00103"></a><a class="code" href="a00298.html#6831be91cdc64e57e565ce0dde01878902acc03ebfcdb16e3e26b24f64da2bdb">00103</a> <a class="code" href="a00298.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="a00298.html#7caa4ff6e44c2348e67f601cc5d97c34">runtime_loader</a>( <a class="code" href="a00298.html#bb0130fe0f596399707e61431231ebcb">error_mode</a> mode = <a class="code" href="a00298.html#bb0130fe0f596399707e61431231ebcb630dd30c9ba61d5ab187e80313bbad94">em_abort</a> );
<a name="l00108"></a>00108
-<a name="l00110"></a>00110 <span class="keywordtype">bool</span> <a class="code" href="a00273.html#0d2f93edf7b15ec4bcee138823220c52">downgrade_to_reader</a>();
-<a name="l00111"></a>00111
-<a name="l00112"></a>00112 <span class="keyword">private</span>:
-<a name="l00114"></a>00114 <a class="code" href="a00272.html">queuing_rw_mutex</a>* <a class="code" href="a00258.html">mutex</a>;
-<a name="l00115"></a>00115
-<a name="l00117"></a>00117 <a class="code" href="a00273.html">scoped_lock</a> * prev, * next;
-<a name="l00118"></a>00118
-<a name="l00119"></a>00119 <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> state_t;
-<a name="l00120"></a>00120
-<a name="l00122"></a>00122 <a class="code" href="a00216.html">atomic<state_t></a> state;
-<a name="l00123"></a>00123
-<a name="l00125"></a>00125
-<a name="l00126"></a>00126 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> going;
-<a name="l00127"></a>00127
-<a name="l00129"></a>00129 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> internal_lock;
-<a name="l00130"></a>00130
-<a name="l00132"></a>00132 <span class="keywordtype">void</span> acquire_internal_lock();
-<a name="l00133"></a>00133
-<a name="l00135"></a>00135
-<a name="l00136"></a>00136 <span class="keywordtype">bool</span> try_acquire_internal_lock();
-<a name="l00137"></a>00137
-<a name="l00139"></a>00139 <span class="keywordtype">void</span> release_internal_lock();
-<a name="l00140"></a>00140
-<a name="l00142"></a>00142 <span class="keywordtype">void</span> wait_for_release_of_internal_lock();
-<a name="l00143"></a>00143
-<a name="l00145"></a>00145 <span class="keywordtype">void</span> unblock_or_wait_on_internal_lock( uintptr_t );
-<a name="l00146"></a>00146 };
-<a name="l00147"></a>00147
-<a name="l00148"></a>00148 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_construct();
-<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">true</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">false</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">true</span>;
-<a name="l00154"></a>00154
-<a name="l00155"></a>00155 <span class="keyword">private</span>:
-<a name="l00157"></a>00157 <a class="code" href="a00216.html">atomic<scoped_lock*></a> q_tail;
+<a name="l00110"></a>00110
+<a name="l00115"></a>00115 <a class="code" href="a00298.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="a00298.html#bb0130fe0f596399707e61431231ebcb">error_mode</a> mode = <a class="code" href="a00298.html#bb0130fe0f596399707e61431231ebcb630dd30c9ba61d5ab187e80313bbad94">em_abort</a>
+<a name="l00120"></a>00120 );
+<a name="l00121"></a>00121
+<a name="l00123"></a>00123 <a class="code" href="a00298.html#c25fec923a751a3e03f5cbe969f1f0c5">~runtime_loader</a>();
+<a name="l00124"></a>00124
+<a name="l00126"></a>00126
+<a name="l00150"></a>00150 <a class="code" href="a00298.html#6831be91cdc64e57e565ce0dde018789">error_code</a>
+<a name="l00151"></a>00151 <a class="code" href="a00298.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="l00159"></a>00159 };
<a name="l00160"></a>00160
-<a name="l00161"></a>00161 __TBB_DEFINE_PROFILING_SET_NAME(queuing_rw_mutex)
-<a name="l00162"></a>00162
-<a name="l00163"></a>00163 } <span class="comment">// namespace tbb</span>
+<a name="l00163"></a>00163 <a class="code" href="a00298.html#6831be91cdc64e57e565ce0dde018789">error_code</a> <a class="code" href="a00298.html#78d938ed2e54d38dd38d6609e6c60389">status</a>();
<a name="l00164"></a>00164
-<a name="l00165"></a>00165 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_queuing_rw_mutex_H */</span>
+<a name="l00165"></a>00165 <span class="keyword">private</span>:
+<a name="l00166"></a>00166
+<a name="l00167"></a>00167 <a class="code" href="a00298.html#bb0130fe0f596399707e61431231ebcb">error_mode</a> <span class="keyword">const</span> my_mode;
+<a name="l00168"></a>00168 <a class="code" href="a00298.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-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00562.html b/doc/html/a00562.html
index 738d3ed..f804ef8 100644
--- a/doc/html/a00562.html
+++ b/doc/html/a00562.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>reader_writer_lock.h Source File</title>
+<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>
@@ -19,7 +19,7 @@
<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>
+<h1>scalable_allocator.h</h1><a href="a00363.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-2011 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>
@@ -39,135 +39,181 @@
<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="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="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="a00274.html">00034</a> <span class="keyword">class </span><a class="code" href="a00274.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="a00275.html">scoped_lock</a>;
-<a name="l00037"></a>00037 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00276.html">scoped_lock_read</a>;
-<a name="l00039"></a>00039
-<a name="l00074"></a><a class="code" href="a00274.html#6f921f0d7c1812ceb5674418c8b6ccaf">00074</a> <span class="keyword">enum</span> <a class="code" href="a00274.html#6f921f0d7c1812ceb5674418c8b6ccaf">status_t</a> { waiting_nonblocking, waiting, active, invalid };
-<a name="l00075"></a>00075
-<a name="l00077"></a><a class="code" href="a00274.html#c1431c4293e777efd9aab9a95c2a46e1">00077</a> <a class="code" href="a00274.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="a00274.html#5135f64f7b7339017f33d956445edbee">00082</a> <a class="code" href="a00274.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="a00275.html">00089</a> <span class="keyword">class </span><a class="code" href="a00275.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="a00274.html">reader_writer_lock</a>;
-<a name="l00092"></a>00092
-<a name="l00094"></a><a class="code" href="a00275.html#cf19f20e082887c1bb0ba6b0911c3583">00094</a> <a class="code" href="a00275.html">scoped_lock</a>(<a class="code" href="a00274.html">reader_writer_lock</a>& <a class="code" href="a00274.html#2653d1a2d560059a51219a8ceab3ade9">lock</a>) {
-<a name="l00095"></a>00095 internal_construct(<a class="code" href="a00274.html#2653d1a2d560059a51219a8ceab3ade9">lock</a>);
-<a name="l00096"></a>00096 }
-<a name="l00097"></a>00097
-<a name="l00099"></a><a class="code" href="a00275.html#70246e0260493625ff956fa5926fc71f">00099</a> <a class="code" href="a00275.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="a00274.html">reader_writer_lock</a> *<a class="code" href="a00258.html">mutex</a>;
-<a name="l00114"></a>00114 scoped_lock* next;
-<a name="l00116"></a>00116 <a class="code" href="a00216.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="a00274.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="a00276.html">00126</a> <span class="keyword">class </span><a class="code" href="a00276.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="a00274.html">reader_writer_lock</a>;
-<a name="l00129"></a>00129
-<a name="l00131"></a><a class="code" href="a00276.html#87ab0dc8f7216e6ba0f7acd6aec33064">00131</a> <a class="code" href="a00276.html">scoped_lock_read</a>(<a class="code" href="a00274.html">reader_writer_lock</a>& <a class="code" href="a00274.html#2653d1a2d560059a51219a8ceab3ade9">lock</a>) {
-<a name="l00132"></a>00132 internal_construct(<a class="code" href="a00274.html#2653d1a2d560059a51219a8ceab3ade9">lock</a>);
-<a name="l00133"></a>00133 }
-<a name="l00134"></a>00134
-<a name="l00136"></a><a class="code" href="a00276.html#bd21c5f3d555d64d1de8658e15bf4966">00136</a> <a class="code" href="a00276.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="a00274.html">reader_writer_lock</a> *<a class="code" href="a00258.html">mutex</a>;
-<a name="l00151"></a>00151 scoped_lock_read *next;
-<a name="l00153"></a>00153 <a class="code" href="a00216.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="a00274.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="a00274.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="a00274.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="a00274.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="a00274.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="a00274.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="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="a00397.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="a00397.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="a00397.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="a00397.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="a00397.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="a00397.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="a00397.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="a00397.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="a00397.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>00089 <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="preprocessor">#define MEM_POLICY_DEFINED 1</span>
+<a name="l00093"></a>00093 <span class="preprocessor"></span><span class="keyword">typedef</span> <span class="keywordtype">void</span> *(*rawAllocType)(intptr_t pool_id, size_t &bytes);
+<a name="l00094"></a>00094 <span class="keyword">typedef</span> int (*rawFreeType)(intptr_t pool_id, <span class="keywordtype">void</span>* raw_ptr, size_t raw_bytes);
+<a name="l00095"></a>00095
+<a name="l00096"></a>00096 <span class="keyword">struct </span>MemPoolPolicy {
+<a name="l00097"></a>00097 rawAllocType pAlloc;
+<a name="l00098"></a>00098 rawFreeType pFree;
+<a name="l00099"></a>00099 size_t granularity; <span class="comment">// granularity of pAlloc allocations</span>
+<a name="l00100"></a>00100 <span class="keywordtype">void</span> *pReserved; <span class="comment">// reserved for future extensions</span>
+<a name="l00101"></a>00101 size_t szReserved; <span class="comment">// size of pReserved data</span>
+<a name="l00102"></a>00102 };
+<a name="l00103"></a>00103
+<a name="l00104"></a>00104 MemoryPool *pool_create(intptr_t pool_id, <span class="keyword">const</span> MemPoolPolicy* memPoolPolicy);
+<a name="l00105"></a>00105 <span class="keywordtype">bool</span> pool_destroy(MemoryPool* memPool);
+<a name="l00106"></a>00106 <span class="keywordtype">void</span> *pool_malloc(MemoryPool* memPool, size_t size);
+<a name="l00107"></a>00107 <span class="keywordtype">void</span> *pool_realloc(MemoryPool* memPool, <span class="keywordtype">void</span> *object, size_t size);
+<a name="l00108"></a>00108 <span class="keywordtype">bool</span> pool_reset(MemoryPool* memPool);
+<a name="l00109"></a>00109 <span class="keywordtype">bool</span> pool_free(MemoryPool *memPool, <span class="keywordtype">void</span> *object);
+<a name="l00110"></a>00110 }
+<a name="l00111"></a>00111
+<a name="l00112"></a>00112 <span class="preprocessor">#include <new></span> <span class="comment">/* To use new with the placement argument */</span>
+<a name="l00113"></a>00113
+<a name="l00114"></a>00114 <span class="comment">/* Ensure that including this header does not cause implicit linkage with TBB */</span>
+<a name="l00115"></a>00115 <span class="preprocessor">#ifndef __TBB_NO_IMPLICIT_LINKAGE</span>
+<a name="l00116"></a>00116 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_NO_IMPLICIT_LINKAGE 1</span>
+<a name="l00117"></a>00117 <span class="preprocessor"></span><span class="preprocessor"> #include "tbb_stddef.h"</span>
+<a name="l00118"></a>00118 <span class="preprocessor"> #undef __TBB_NO_IMPLICIT_LINKAGE</span>
+<a name="l00119"></a>00119 <span class="preprocessor"></span><span class="preprocessor">#else</span>
+<a name="l00120"></a>00120 <span class="preprocessor"></span><span class="preprocessor"> #include "tbb_stddef.h"</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">namespace </span>tbb {
+<a name="l00125"></a>00125
+<a name="l00126"></a>00126 <span class="preprocessor">#if _MSC_VER && !defined(__INTEL_COMPILER)</span>
+<a name="l00127"></a>00127 <span class="preprocessor"></span> <span class="comment">// Workaround for erroneous "unreferenced parameter" warning in method destroy.</span>
+<a name="l00128"></a>00128 <span class="preprocessor"> #pragma warning (push)</span>
+<a name="l00129"></a>00129 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (disable: 4100)</span>
+<a name="l00130"></a>00130 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00131"></a>00131 <span class="preprocessor"></span>
+<a name="l00133"></a>00133
+<a name="l00136"></a>00136 <span class="keyword">template</span><<span class="keyword">typename</span> T>
+<a name="l00137"></a><a class="code" href="a00299.html">00137</a> <span class="keyword">class </span><a class="code" href="a00299.html">scalable_allocator</a> {
+<a name="l00138"></a>00138 <span class="keyword">public</span>:
+<a name="l00139"></a>00139 <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::allocator_type<T>::value_type value_type;
+<a name="l00140"></a>00140 <span class="keyword">typedef</span> value_type* pointer;
+<a name="l00141"></a>00141 <span class="keyword">typedef</span> <span class="keyword">const</span> value_type* const_pointer;
+<a name="l00142"></a>00142 <span class="keyword">typedef</span> value_type& reference;
+<a name="l00143"></a>00143 <span class="keyword">typedef</span> <span class="keyword">const</span> value_type& const_reference;
+<a name="l00144"></a>00144 <span class="keyword">typedef</span> size_t size_type;
+<a name="l00145"></a>00145 <span class="keyword">typedef</span> ptrdiff_t difference_type;
+<a name="l00146"></a>00146 <span class="keyword">template</span><<span class="keyword">class</span> U> <span class="keyword">struct </span>rebind {
+<a name="l00147"></a>00147 <span class="keyword">typedef</span> <a class="code" href="a00299.html">scalable_allocator<U></a> other;
+<a name="l00148"></a>00148 };
+<a name="l00149"></a>00149
+<a name="l00150"></a>00150 <a class="code" href="a00299.html">scalable_allocator</a>() <span class="keywordflow">throw</span>() {}
+<a name="l00151"></a>00151 <a class="code" href="a00299.html">scalable_allocator</a>( <span class="keyword">const</span> <a class="code" href="a00299.html">scalable_allocator</a>& ) <span class="keywordflow">throw</span>() {}
+<a name="l00152"></a>00152 <span class="keyword">template</span><<span class="keyword">typename</span> U> <a class="code" href="a00299.html">scalable_allocator</a>(<span class="keyword">const</span> <a class="code" href="a00299.html">scalable_allocator<U></a>&) <span class="keywordflow">throw</span>() {}
+<a name="l00153"></a>00153
+<a name="l00154"></a>00154 pointer address(reference x)<span class="keyword"> const </span>{<span class="keywordflow">return</span> &x;}
+<a name="l00155"></a>00155 const_pointer address(const_reference x)<span class="keyword"> const </span>{<span class="keywordflow">return</span> &x;}
+<a name="l00156"></a>00156
+<a name="l00158"></a><a class="code" href="a00299.html#726b1586d05d44665a36e1c7b2699bfd">00158</a> pointer <a class="code" href="a00299.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="l00159"></a>00159 <span class="keywordflow">return</span> static_cast<pointer>( <a class="code" href="a00397.html#gc25b8e6c76db0b346a8249796a7a2475">scalable_malloc</a>( n * <span class="keyword">sizeof</span>(value_type) ) );
+<a name="l00160"></a>00160 }
+<a name="l00161"></a>00161
+<a name="l00163"></a><a class="code" href="a00299.html#f806a238c18cbcfb531e1e0a0d2ec59d">00163</a> <span class="keywordtype">void</span> <a class="code" href="a00299.html#f806a238c18cbcfb531e1e0a0d2ec59d">deallocate</a>( pointer p, size_type ) {
+<a name="l00164"></a>00164 <a class="code" href="a00397.html#gca3579c21244dba9f0c351e5984d4565">scalable_free</a>( p );
+<a name="l00165"></a>00165 }
+<a name="l00166"></a>00166
+<a name="l00168"></a><a class="code" href="a00299.html#880e766f1d913988c21973dbdd874fd5">00168</a> size_type <a class="code" href="a00299.html#880e766f1d913988c21973dbdd874fd5">max_size</a>() const throw() {
+<a name="l00169"></a>00169 size_type absolutemax = static_cast<size_type>(-1) / <span class="keyword">sizeof</span> (value_type);
+<a name="l00170"></a>00170 <span class="keywordflow">return</span> (absolutemax > 0 ? absolutemax : 1);
+<a name="l00171"></a>00171 }
+<a name="l00172"></a>00172 <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="l00173"></a>00173 <span class="keywordtype">void</span> destroy( pointer p ) {p->~value_type();}
+<a name="l00174"></a>00174 };
+<a name="l00175"></a>00175
+<a name="l00176"></a>00176 <span class="preprocessor">#if _MSC_VER && !defined(__INTEL_COMPILER)</span>
+<a name="l00177"></a>00177 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (pop)</span>
+<a name="l00178"></a>00178 <span class="preprocessor"></span><span class="preprocessor">#endif // warning 4100 is back</span>
+<a name="l00179"></a>00179 <span class="preprocessor"></span>
+<a name="l00181"></a>00181
+<a name="l00182"></a>00182 <span class="keyword">template</span><>
+<a name="l00183"></a><a class="code" href="a00300.html">00183</a> <span class="keyword">class </span><a class="code" href="a00299.html">scalable_allocator</a><void> {
+<a name="l00184"></a>00184 <span class="keyword">public</span>:
+<a name="l00185"></a>00185 <span class="keyword">typedef</span> <span class="keywordtype">void</span>* pointer;
+<a name="l00186"></a>00186 <span class="keyword">typedef</span> <span class="keyword">const</span> <span class="keywordtype">void</span>* const_pointer;
+<a name="l00187"></a>00187 <span class="keyword">typedef</span> <span class="keywordtype">void</span> value_type;
+<a name="l00188"></a>00188 <span class="keyword">template</span><<span class="keyword">class</span> U> <span class="keyword">struct </span>rebind {
+<a name="l00189"></a>00189 <span class="keyword">typedef</span> <a class="code" href="a00299.html">scalable_allocator<U></a> other;
+<a name="l00190"></a>00190 };
+<a name="l00191"></a>00191 };
+<a name="l00192"></a>00192
+<a name="l00193"></a>00193 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
+<a name="l00194"></a>00194 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> <a class="code" href="a00299.html">scalable_allocator<T></a>&, <span class="keyword">const</span> <a class="code" href="a00299.html">scalable_allocator<U></a>& ) {<span class="keywordflow">return</span> <span class="keyword">true</span>;}
<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<unsigned> rdr_count_and_flags;
-<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>
+<a name="l00196"></a>00196 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
+<a name="l00197"></a>00197 <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="l00198"></a>00198
+<a name="l00199"></a>00199 } <span class="comment">// namespace tbb</span>
+<a name="l00200"></a>00200
+<a name="l00201"></a>00201 <span class="preprocessor">#if _MSC_VER</span>
+<a name="l00202"></a>00202 <span class="preprocessor"></span><span class="preprocessor"> #if __TBB_BUILD && !defined(__TBBMALLOC_NO_IMPLICIT_LINKAGE)</span>
+<a name="l00203"></a>00203 <span class="preprocessor"></span><span class="preprocessor"> #define __TBBMALLOC_NO_IMPLICIT_LINKAGE 1</span>
+<a name="l00204"></a>00204 <span class="preprocessor"></span><span class="preprocessor"> #endif</span>
+<a name="l00205"></a>00205 <span class="preprocessor"></span>
+<a name="l00206"></a>00206 <span class="preprocessor"> #if !__TBBMALLOC_NO_IMPLICIT_LINKAGE</span>
+<a name="l00207"></a>00207 <span class="preprocessor"></span><span class="preprocessor"> #ifdef _DEBUG</span>
+<a name="l00208"></a>00208 <span class="preprocessor"></span><span class="preprocessor"> #pragma comment(lib, "tbbmalloc_debug.lib")</span>
+<a name="l00209"></a>00209 <span class="preprocessor"></span><span class="preprocessor"> #else</span>
+<a name="l00210"></a>00210 <span class="preprocessor"></span><span class="preprocessor"> #pragma comment(lib, "tbbmalloc.lib")</span>
+<a name="l00211"></a>00211 <span class="preprocessor"></span><span class="preprocessor"> #endif</span>
+<a name="l00212"></a>00212 <span class="preprocessor"></span><span class="preprocessor"> #endif</span>
+<a name="l00213"></a>00213 <span class="preprocessor"></span>
+<a name="l00214"></a>00214
+<a name="l00215"></a>00215 <span class="preprocessor">#endif</span>
+<a name="l00216"></a>00216 <span class="preprocessor"></span>
+<a name="l00217"></a>00217 <span class="preprocessor">#endif </span><span class="comment">/* __cplusplus */</span>
+<a name="l00218"></a>00218
+<a name="l00219"></a>00219 <span class="preprocessor">#if !defined(__cplusplus) && __ICC==1100</span>
+<a name="l00220"></a>00220 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (pop)</span>
+<a name="l00221"></a>00221 <span class="preprocessor"></span><span class="preprocessor">#endif // ICC 11.0 warning 991 is back</span>
+<a name="l00222"></a>00222 <span class="preprocessor"></span>
+<a name="l00223"></a>00223 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_scalable_allocator_H */</span>
</pre></div><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00563.html b/doc/html/a00563.html
deleted file mode 100644
index bf595a7..0000000
--- a/doc/html/a00563.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-2011 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="a00278.html">00039</a> <span class="keyword">class </span><a class="code" href="a00278.html">recursive_mutex</a> {
-<a name="l00040"></a>00040 <span class="keyword">public</span>:
-<a name="l00042"></a><a class="code" href="a00278.html#d2fceb7f95c24a8cd1457d4527e4b8c6">00042</a> <a class="code" href="a00278.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="a00278.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="a00279.html">00083</a> <span class="keyword">class </span><a class="code" href="a00279.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="a00279.html#d82d4d36fbf9727a493d26ae50855fe7">00086</a> <a class="code" href="a00279.html#d82d4d36fbf9727a493d26ae50855fe7">scoped_lock</a>() : my_mutex(NULL) {};
-<a name="l00087"></a>00087
-<a name="l00089"></a><a class="code" href="a00279.html#dec17713c4c1321ac8fec66816d0c602">00089</a> <a class="code" href="a00279.html#d82d4d36fbf9727a493d26ae50855fe7">scoped_lock</a>( <a class="code" href="a00278.html">recursive_mutex</a>& <a class="code" href="a00258.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="a00279.html#7fb04da37cccf8c99b1f9102d9074f9a">acquire</a>( mutex );
-<a name="l00094"></a>00094 }
-<a name="l00095"></a>00095
-<a name="l00097"></a><a class="code" href="a00279.html#c1197ffb8f3cd9d4fed71d7e06265b7c">00097</a> <a class="code" href="a00279.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="a00279.html#ac480ea0e9d5ea0345a67d57008b6263">release</a>();
-<a name="l00100"></a>00100 }
-<a name="l00101"></a>00101
-<a name="l00103"></a><a class="code" href="a00279.html#7fb04da37cccf8c99b1f9102d9074f9a">00103</a> <span class="keywordtype">void</span> <a class="code" href="a00279.html#7fb04da37cccf8c99b1f9102d9074f9a">acquire</a>( <a class="code" href="a00278.html">recursive_mutex</a>& <a class="code" href="a00258.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="a00278.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="a00279.html#36bfc3e93e3ef6340abef4901444d340">00113</a> <span class="keywordtype">bool</span> <a class="code" href="a00279.html#36bfc3e93e3ef6340abef4901444d340">try_acquire</a>( <a class="code" href="a00278.html">recursive_mutex</a>& <a class="code" href="a00258.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="a00278.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="a00279.html#ac480ea0e9d5ea0345a67d57008b6263">00125</a> <span class="keywordtype">void</span> <a class="code" href="a00279.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="a00278.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="a00278.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="a00278.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="a00278.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="a00278.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="a00278.html#4c342c69d47f4bb0b393535dee4015d6">00158</a> <span class="keywordtype">void</span> <a class="code" href="a00278.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="a00215.html">aligned_space<scoped_lock,1></a> tmp;
-<a name="l00161"></a>00161 <span class="keyword">new</span>(tmp.<a class="code" href="a00215.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>()) <a class="code" href="a00279.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="a00278.html#86e719b0afee25704af11ab97694d240">00173</a> <span class="keywordtype">bool</span> <a class="code" href="a00278.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="a00215.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="a00215.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>()) <a class="code" href="a00279.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="a00278.html#f0a96e26b7f074588dc31e32524856ae">00187</a> <span class="keywordtype">void</span> <a class="code" href="a00278.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="a00215.html">aligned_space<scoped_lock,1></a> tmp;
-<a name="l00190"></a>00190 <a class="code" href="a00279.html">scoped_lock</a>& s = *tmp.<a class="code" href="a00215.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>();
-<a name="l00191"></a>00191 s.<a class="code" href="a00279.html#3efd10a49e2435ea5215b49907f93ba2">my_mutex</a> = <span class="keyword">this</span>;
-<a name="l00192"></a>00192 s.<a class="code" href="a00279.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="a00278.html#889fa8cc32dd707eef7c0f52dda09c0d">00204</a> <span class="preprocessor"></span> <span class="keyword">typedef</span> LPCRITICAL_SECTION <a class="code" href="a00278.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="a00278.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="a00278.html#889fa8cc32dd707eef7c0f52dda09c0d">native_handle_type</a> native_handle() { <span class="keywordflow">return</span> (<a class="code" href="a00278.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-2011 Intel Corporation. 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/a00564.html b/doc/html/a00564.html
deleted file mode 100644
index 2401ba2..0000000
--- a/doc/html/a00564.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>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="a00344.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-2011 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
-<a name="l00027"></a>00027 <span class="preprocessor">#if !defined(__cplusplus) && __ICC==1100</span>
-<a name="l00028"></a>00028 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (push)</span>
-<a name="l00029"></a>00029 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (disable: 991)</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">#ifdef __cplusplus</span>
-<a name="l00033"></a>00033 <span class="preprocessor"></span><span class="keyword">extern</span> <span class="stringliteral">"C"</span> {
-<a name="l00034"></a>00034 <span class="preprocessor">#endif </span><span class="comment">/* __cplusplus */</span>
-<a name="l00035"></a>00035
-<a name="l00036"></a>00036 <span class="preprocessor">#if _MSC_VER >= 1400</span>
-<a name="l00037"></a>00037 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_EXPORTED_FUNC __cdecl</span>
-<a name="l00038"></a>00038 <span class="preprocessor"></span><span class="preprocessor">#else</span>
-<a name="l00039"></a>00039 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_EXPORTED_FUNC</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="l00044"></a>00044 <span class="keywordtype">void</span> * __TBB_EXPORTED_FUNC <a class="code" href="a00373.html#gc25b8e6c76db0b346a8249796a7a2475">scalable_malloc</a> (size_t size);
-<a name="l00045"></a>00045
-<a name="l00048"></a>00048 <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC <a class="code" href="a00373.html#gca3579c21244dba9f0c351e5984d4565">scalable_free</a> (<span class="keywordtype">void</span>* ptr);
-<a name="l00049"></a>00049
-<a name="l00052"></a>00052 <span class="keywordtype">void</span> * __TBB_EXPORTED_FUNC <a class="code" href="a00373.html#g951bbbbd2d041acb59ba5fa910b52543">scalable_realloc</a> (<span class="keywordtype">void</span>* ptr, size_t size);
-<a name="l00053"></a>00053
-<a name="l00056"></a>00056 <span class="keywordtype">void</span> * __TBB_EXPORTED_FUNC <a class="code" href="a00373.html#g3f5a2fde0bcaa3eda35be32c8658f444">scalable_calloc</a> (size_t nobj, size_t size);
-<a name="l00057"></a>00057
-<a name="l00060"></a>00060 <span class="keywordtype">int</span> __TBB_EXPORTED_FUNC <a class="code" href="a00373.html#g05dcec987480bb2c82ecdead6a085899">scalable_posix_memalign</a> (<span class="keywordtype">void</span>** memptr, size_t alignment, size_t size);
-<a name="l00061"></a>00061
-<a name="l00064"></a>00064 <span class="keywordtype">void</span> * __TBB_EXPORTED_FUNC <a class="code" href="a00373.html#gc1c7aaa1fe85c17ba5a3a96f7e8d89e7">scalable_aligned_malloc</a> (size_t size, size_t alignment);
-<a name="l00065"></a>00065
-<a name="l00068"></a>00068 <span class="keywordtype">void</span> * __TBB_EXPORTED_FUNC <a class="code" href="a00373.html#gbaea91376be80dfabd7c93eaffd9abaa">scalable_aligned_realloc</a> (<span class="keywordtype">void</span>* ptr, size_t size, size_t alignment);
-<a name="l00069"></a>00069
-<a name="l00072"></a>00072 <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC <a class="code" href="a00373.html#g65a20e812012f15ec7442d5b45d0cba5">scalable_aligned_free</a> (<span class="keywordtype">void</span>* ptr);
-<a name="l00073"></a>00073
-<a name="l00078"></a>00078 size_t __TBB_EXPORTED_FUNC <a class="code" href="a00373.html#g0965ce1b4b7835f92869c7fd867265f7">scalable_msize</a> (<span class="keywordtype">void</span>* ptr);
-<a name="l00079"></a>00079
-<a name="l00080"></a>00080 <span class="preprocessor">#ifdef __cplusplus</span>
-<a name="l00081"></a>00081 <span class="preprocessor"></span>} <span class="comment">/* extern "C" */</span>
-<a name="l00082"></a>00082 <span class="preprocessor">#endif </span><span class="comment">/* __cplusplus */</span>
-<a name="l00083"></a>00083
-<a name="l00084"></a>00084 <span class="preprocessor">#ifdef __cplusplus</span>
-<a name="l00085"></a>00085 <span class="preprocessor"></span>
-<a name="l00086"></a>00086 <span class="preprocessor">#include <new></span> <span class="comment">/* To use new with the placement argument */</span>
-<a name="l00087"></a>00087
-<a name="l00088"></a>00088 <span class="comment">/* Ensure that including this header does not cause implicit linkage with TBB */</span>
-<a name="l00089"></a>00089 <span class="preprocessor">#ifndef __TBB_NO_IMPLICIT_LINKAGE</span>
-<a name="l00090"></a>00090 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_NO_IMPLICIT_LINKAGE 1</span>
-<a name="l00091"></a>00091 <span class="preprocessor"></span><span class="preprocessor"> #include "tbb_stddef.h"</span>
-<a name="l00092"></a>00092 <span class="preprocessor"> #undef __TBB_NO_IMPLICIT_LINKAGE</span>
-<a name="l00093"></a>00093 <span class="preprocessor"></span><span class="preprocessor">#else</span>
-<a name="l00094"></a>00094 <span class="preprocessor"></span><span class="preprocessor"> #include "tbb_stddef.h"</span>
-<a name="l00095"></a>00095 <span class="preprocessor">#endif</span>
-<a name="l00096"></a>00096 <span class="preprocessor"></span>
-<a name="l00097"></a>00097
-<a name="l00098"></a>00098 <span class="keyword">namespace </span>tbb {
-<a name="l00099"></a>00099
-<a name="l00100"></a>00100 <span class="preprocessor">#if _MSC_VER && !defined(__INTEL_COMPILER)</span>
-<a name="l00101"></a>00101 <span class="preprocessor"></span> <span class="comment">// Workaround for erroneous "unreferenced parameter" warning in method destroy.</span>
-<a name="l00102"></a>00102 <span class="preprocessor"> #pragma warning (push)</span>
-<a name="l00103"></a>00103 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (disable: 4100)</span>
-<a name="l00104"></a>00104 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00105"></a>00105 <span class="preprocessor"></span>
-<a name="l00107"></a>00107
-<a name="l00110"></a>00110 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00111"></a><a class="code" href="a00280.html">00111</a> <span class="keyword">class </span><a class="code" href="a00280.html">scalable_allocator</a> {
-<a name="l00112"></a>00112 <span class="keyword">public</span>:
-<a name="l00113"></a>00113 <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::allocator_type<T>::value_type value_type;
-<a name="l00114"></a>00114 <span class="keyword">typedef</span> value_type* pointer;
-<a name="l00115"></a>00115 <span class="keyword">typedef</span> <span class="keyword">const</span> value_type* const_pointer;
-<a name="l00116"></a>00116 <span class="keyword">typedef</span> value_type& reference;
-<a name="l00117"></a>00117 <span class="keyword">typedef</span> <span class="keyword">const</span> value_type& const_reference;
-<a name="l00118"></a>00118 <span class="keyword">typedef</span> size_t size_type;
-<a name="l00119"></a>00119 <span class="keyword">typedef</span> ptrdiff_t difference_type;
-<a name="l00120"></a>00120 <span class="keyword">template</span><<span class="keyword">class</span> U> <span class="keyword">struct </span>rebind {
-<a name="l00121"></a>00121 <span class="keyword">typedef</span> <a class="code" href="a00280.html">scalable_allocator<U></a> other;
-<a name="l00122"></a>00122 };
-<a name="l00123"></a>00123
-<a name="l00124"></a>00124 <a class="code" href="a00280.html">scalable_allocator</a>() <span class="keywordflow">throw</span>() {}
-<a name="l00125"></a>00125 <a class="code" href="a00280.html">scalable_allocator</a>( <span class="keyword">const</span> <a class="code" href="a00280.html">scalable_allocator</a>& ) <span class="keywordflow">throw</span>() {}
-<a name="l00126"></a>00126 <span class="keyword">template</span><<span class="keyword">typename</span> U> <a class="code" href="a00280.html">scalable_allocator</a>(<span class="keyword">const</span> <a class="code" href="a00280.html">scalable_allocator<U></a>&) <span class="keywordflow">throw</span>() {}
-<a name="l00127"></a>00127
-<a name="l00128"></a>00128 pointer address(reference x)<span class="keyword"> const </span>{<span class="keywordflow">return</span> &x;}
-<a name="l00129"></a>00129 const_pointer address(const_reference x)<span class="keyword"> const </span>{<span class="keywordflow">return</span> &x;}
-<a name="l00130"></a>00130
-<a name="l00132"></a><a class="code" href="a00280.html#726b1586d05d44665a36e1c7b2699bfd">00132</a> pointer <a class="code" href="a00280.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="l00133"></a>00133 <span class="keywordflow">return</span> static_cast<pointer>( <a class="code" href="a00373.html#gc25b8e6c76db0b346a8249796a7a2475">scalable_malloc</a>( n * <span class="keyword">sizeof</span>(value_type) ) );
-<a name="l00134"></a>00134 }
-<a name="l00135"></a>00135
-<a name="l00137"></a><a class="code" href="a00280.html#f806a238c18cbcfb531e1e0a0d2ec59d">00137</a> <span class="keywordtype">void</span> <a class="code" href="a00280.html#f806a238c18cbcfb531e1e0a0d2ec59d">deallocate</a>( pointer p, size_type ) {
-<a name="l00138"></a>00138 <a class="code" href="a00373.html#gca3579c21244dba9f0c351e5984d4565">scalable_free</a>( p );
-<a name="l00139"></a>00139 }
-<a name="l00140"></a>00140
-<a name="l00142"></a><a class="code" href="a00280.html#880e766f1d913988c21973dbdd874fd5">00142</a> size_type <a class="code" href="a00280.html#880e766f1d913988c21973dbdd874fd5">max_size</a>() const throw() {
-<a name="l00143"></a>00143 size_type absolutemax = static_cast<size_type>(-1) / <span class="keyword">sizeof</span> (value_type);
-<a name="l00144"></a>00144 <span class="keywordflow">return</span> (absolutemax > 0 ? absolutemax : 1);
-<a name="l00145"></a>00145 }
-<a name="l00146"></a>00146 <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="l00147"></a>00147 <span class="keywordtype">void</span> destroy( pointer p ) {p->~value_type();}
-<a name="l00148"></a>00148 };
-<a name="l00149"></a>00149
-<a name="l00150"></a>00150 <span class="preprocessor">#if _MSC_VER && !defined(__INTEL_COMPILER)</span>
-<a name="l00151"></a>00151 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (pop)</span>
-<a name="l00152"></a>00152 <span class="preprocessor"></span><span class="preprocessor">#endif // warning 4100 is back</span>
-<a name="l00153"></a>00153 <span class="preprocessor"></span>
-<a name="l00155"></a>00155
-<a name="l00156"></a>00156 <span class="keyword">template</span><>
-<a name="l00157"></a><a class="code" href="a00281.html">00157</a> <span class="keyword">class </span><a class="code" href="a00280.html">scalable_allocator</a><void> {
-<a name="l00158"></a>00158 <span class="keyword">public</span>:
-<a name="l00159"></a>00159 <span class="keyword">typedef</span> <span class="keywordtype">void</span>* pointer;
-<a name="l00160"></a>00160 <span class="keyword">typedef</span> <span class="keyword">const</span> <span class="keywordtype">void</span>* const_pointer;
-<a name="l00161"></a>00161 <span class="keyword">typedef</span> <span class="keywordtype">void</span> value_type;
-<a name="l00162"></a>00162 <span class="keyword">template</span><<span class="keyword">class</span> U> <span class="keyword">struct </span>rebind {
-<a name="l00163"></a>00163 <span class="keyword">typedef</span> <a class="code" href="a00280.html">scalable_allocator<U></a> other;
-<a name="l00164"></a>00164 };
-<a name="l00165"></a>00165 };
-<a name="l00166"></a>00166
-<a name="l00167"></a>00167 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00168"></a>00168 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> <a class="code" href="a00280.html">scalable_allocator<T></a>&, <span class="keyword">const</span> <a class="code" href="a00280.html">scalable_allocator<U></a>& ) {<span class="keywordflow">return</span> <span class="keyword">true</span>;}
-<a name="l00169"></a>00169
-<a name="l00170"></a>00170 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00171"></a>00171 <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="l00172"></a>00172
-<a name="l00173"></a>00173 } <span class="comment">// namespace tbb</span>
-<a name="l00174"></a>00174
-<a name="l00175"></a>00175 <span class="preprocessor">#if _MSC_VER</span>
-<a name="l00176"></a>00176 <span class="preprocessor"></span><span class="preprocessor"> #if __TBB_BUILD && !defined(__TBBMALLOC_NO_IMPLICIT_LINKAGE)</span>
-<a name="l00177"></a>00177 <span class="preprocessor"></span><span class="preprocessor"> #define __TBBMALLOC_NO_IMPLICIT_LINKAGE 1</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="l00180"></a>00180 <span class="preprocessor"> #if !__TBBMALLOC_NO_IMPLICIT_LINKAGE</span>
-<a name="l00181"></a>00181 <span class="preprocessor"></span><span class="preprocessor"> #ifdef _DEBUG</span>
-<a name="l00182"></a>00182 <span class="preprocessor"></span><span class="preprocessor"> #pragma comment(lib, "tbbmalloc_debug.lib")</span>
-<a name="l00183"></a>00183 <span class="preprocessor"></span><span class="preprocessor"> #else</span>
-<a name="l00184"></a>00184 <span class="preprocessor"></span><span class="preprocessor"> #pragma comment(lib, "tbbmalloc.lib")</span>
-<a name="l00185"></a>00185 <span class="preprocessor"></span><span class="preprocessor"> #endif</span>
-<a name="l00186"></a>00186 <span class="preprocessor"></span><span class="preprocessor"> #endif</span>
-<a name="l00187"></a>00187 <span class="preprocessor"></span>
-<a name="l00188"></a>00188
-<a name="l00189"></a>00189 <span class="preprocessor">#endif</span>
-<a name="l00190"></a>00190 <span class="preprocessor"></span>
-<a name="l00191"></a>00191 <span class="preprocessor">#endif </span><span class="comment">/* __cplusplus */</span>
-<a name="l00192"></a>00192
-<a name="l00193"></a>00193 <span class="preprocessor">#if !defined(__cplusplus) && __ICC==1100</span>
-<a name="l00194"></a>00194 <span class="preprocessor"></span><span class="preprocessor"> #pragma warning (pop)</span>
-<a name="l00195"></a>00195 <span class="preprocessor"></span><span class="preprocessor">#endif // ICC 11.0 warning 991 is back</span>
-<a name="l00196"></a>00196 <span class="preprocessor"></span>
-<a name="l00197"></a>00197 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_scalable_allocator_H */</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2011 Intel Corporation. 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/a00565.html b/doc/html/a00565.html
index c26624c..a0ae60b 100644
--- a/doc/html/a00565.html
+++ b/doc/html/a00565.html
@@ -52,59 +52,59 @@
<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="a00286.html">00039</a> <span class="keyword">class </span><a class="code" href="a00286.html">spin_mutex</a> {
-<a name="l00041"></a>00041 __TBB_Byte flag;
+<a name="l00039"></a><a class="code" href="a00305.html">00039</a> <span class="keyword">class </span><a class="code" href="a00305.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="a00286.html#3d8fb44644fd8d41ada1fbeba7409be3">00046</a> <a class="code" href="a00286.html#3d8fb44644fd8d41ada1fbeba7409be3">spin_mutex</a>() : flag(0) {
+<a name="l00046"></a><a class="code" href="a00305.html#3d8fb44644fd8d41ada1fbeba7409be3">00046</a> <a class="code" href="a00305.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="a00287.html">00053</a> <span class="keyword">class </span><a class="code" href="a00287.html">scoped_lock</a> : internal::no_copy {
+<a name="l00053"></a><a class="code" href="a00306.html">00053</a> <span class="keyword">class </span><a class="code" href="a00306.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="a00286.html">spin_mutex</a>* my_mutex;
+<a name="l00056"></a>00056 <a class="code" href="a00305.html">spin_mutex</a>* my_mutex;
<a name="l00057"></a>00057
-<a name="l00059"></a>00059 uintptr_t my_unlock_value;
+<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="a00286.html">spin_mutex</a>& m );
+<a name="l00062"></a>00062 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_acquire( <a class="code" href="a00305.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="a00286.html">spin_mutex</a>& m );
+<a name="l00065"></a>00065 <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD internal_try_acquire( <a class="code" href="a00305.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="a00286.html">spin_mutex</a>;
+<a name="l00070"></a>00070 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00305.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="a00287.html#29ae680ae7f5e685c2e15535b9c855b3">00074</a> <a class="code" href="a00287.html#29ae680ae7f5e685c2e15535b9c855b3">scoped_lock</a>() : my_mutex(NULL), my_unlock_value(0) {}
+<a name="l00074"></a><a class="code" href="a00306.html#29ae680ae7f5e685c2e15535b9c855b3">00074</a> <a class="code" href="a00306.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="a00287.html#5ce6807050a9e8f87bcb4a65dccb12ef">00077</a> <a class="code" href="a00287.html#29ae680ae7f5e685c2e15535b9c855b3">scoped_lock</a>( <a class="code" href="a00286.html">spin_mutex</a>& m ) {
+<a name="l00077"></a><a class="code" href="a00306.html#5ce6807050a9e8f87bcb4a65dccb12ef">00077</a> <a class="code" href="a00306.html#29ae680ae7f5e685c2e15535b9c855b3">scoped_lock</a>( <a class="code" href="a00305.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="a00286.html#6e46896ee0f1e342d5505deece72af66">flag</a>);
+<a name="l00082"></a>00082 <span class="preprocessor"></span> my_unlock_value = __TBB_LockByte(m.<a class="code" href="a00305.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="a00287.html#3ee3c338732b1f64b0b32a757807a30d">00088</a> <span class="keywordtype">void</span> <a class="code" href="a00287.html#3ee3c338732b1f64b0b32a757807a30d">acquire</a>( <a class="code" href="a00286.html">spin_mutex</a>& m ) {
+<a name="l00088"></a><a class="code" href="a00306.html#3ee3c338732b1f64b0b32a757807a30d">00088</a> <span class="keywordtype">void</span> <a class="code" href="a00306.html#3ee3c338732b1f64b0b32a757807a30d">acquire</a>( <a class="code" href="a00305.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="a00286.html#6e46896ee0f1e342d5505deece72af66">flag</a>);
+<a name="l00092"></a>00092 <span class="preprocessor"></span> my_unlock_value = __TBB_LockByte(m.<a class="code" href="a00305.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="a00287.html#9297ec188534b45dc0ca48f2f39a0501">00099</a> <span class="keywordtype">bool</span> <a class="code" href="a00287.html#9297ec188534b45dc0ca48f2f39a0501">try_acquire</a>( <a class="code" href="a00286.html">spin_mutex</a>& m ) {
+<a name="l00099"></a><a class="code" href="a00306.html#9297ec188534b45dc0ca48f2f39a0501">00099</a> <span class="keywordtype">bool</span> <a class="code" href="a00306.html#9297ec188534b45dc0ca48f2f39a0501">try_acquire</a>( <a class="code" href="a00305.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="a00286.html#6e46896ee0f1e342d5505deece72af66">flag</a>);
+<a name="l00103"></a>00103 <span class="preprocessor"></span> <span class="keywordtype">bool</span> result = __TBB_TryLockByte(m.<a class="code" href="a00305.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;
@@ -113,21 +113,21 @@
<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="a00287.html#eeb615e68e963e6bf8d9c11402d0ce8e">00113</a> <span class="keywordtype">void</span> <a class="code" href="a00287.html#eeb615e68e963e6bf8d9c11402d0ce8e">release</a>() {
+<a name="l00113"></a><a class="code" href="a00306.html#eeb615e68e963e6bf8d9c11402d0ce8e">00113</a> <span class="keywordtype">void</span> <a class="code" href="a00306.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="a00286.html#6e46896ee0f1e342d5505deece72af66">flag</a>, static_cast<__TBB_Byte>(my_unlock_value));
+<a name="l00117"></a>00117 <span class="preprocessor"></span> __TBB_UnlockByte(my_mutex-><a class="code" href="a00305.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="a00287.html#ac6fa425d1f06c56d8b70abc51aac844">00123</a> <a class="code" href="a00287.html#ac6fa425d1f06c56d8b70abc51aac844">~scoped_lock</a>() {
+<a name="l00123"></a><a class="code" href="a00306.html#ac6fa425d1f06c56d8b70abc51aac844">00123</a> <a class="code" href="a00306.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="a00286.html#6e46896ee0f1e342d5505deece72af66">flag</a>, static_cast<__TBB_Byte>(my_unlock_value));
+<a name="l00128"></a>00128 <span class="preprocessor"></span> __TBB_UnlockByte(my_mutex-><a class="code" href="a00305.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 }
@@ -142,32 +142,32 @@
<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="a00286.html#4f748989e19b6045e3a2d2ee73626a28">00144</a> <span class="keywordtype">void</span> <a class="code" href="a00286.html#4f748989e19b6045e3a2d2ee73626a28">lock</a>() {
+<a name="l00144"></a><a class="code" href="a00305.html#4f748989e19b6045e3a2d2ee73626a28">00144</a> <span class="keywordtype">void</span> <a class="code" href="a00305.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="a00215.html">aligned_space<scoped_lock,1></a> tmp;
-<a name="l00147"></a>00147 <span class="keyword">new</span>(tmp.<a class="code" href="a00215.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>()) <a class="code" href="a00287.html">scoped_lock</a>(*<span class="keyword">this</span>);
+<a name="l00146"></a>00146 <span class="preprocessor"></span> <a class="code" href="a00227.html">aligned_space<scoped_lock,1></a> tmp;
+<a name="l00147"></a>00147 <span class="keyword">new</span>(tmp.<a class="code" href="a00227.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>()) <a class="code" href="a00306.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="a00286.html#8f9a58fb56a2b4c5efe1a7f7c1ae2074">00155</a> <span class="keywordtype">bool</span> <a class="code" href="a00286.html#8f9a58fb56a2b4c5efe1a7f7c1ae2074">try_lock</a>() {
+<a name="l00155"></a><a class="code" href="a00305.html#8f9a58fb56a2b4c5efe1a7f7c1ae2074">00155</a> <span class="keywordtype">bool</span> <a class="code" href="a00305.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="a00215.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="a00215.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>()) <a class="code" href="a00287.html">scoped_lock</a>)->internal_try_acquire(*<span class="keyword">this</span>);
+<a name="l00157"></a>00157 <span class="preprocessor"></span> <a class="code" href="a00227.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="a00227.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>()) <a class="code" href="a00306.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="a00286.html#0e843ee6265f57f27d228ba91e7308ef">00165</a> <span class="keywordtype">void</span> <a class="code" href="a00286.html#0e843ee6265f57f27d228ba91e7308ef">unlock</a>() {
+<a name="l00165"></a><a class="code" href="a00305.html#0e843ee6265f57f27d228ba91e7308ef">00165</a> <span class="keywordtype">void</span> <a class="code" href="a00305.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="a00215.html">aligned_space<scoped_lock,1></a> tmp;
-<a name="l00168"></a>00168 <a class="code" href="a00287.html">scoped_lock</a>& s = *tmp.<a class="code" href="a00215.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>();
-<a name="l00169"></a>00169 s.<a class="code" href="a00287.html#d968921bed018503214f36e09007ee7b">my_mutex</a> = <span class="keyword">this</span>;
-<a name="l00170"></a>00170 s.<a class="code" href="a00287.html#43a6f8977cd1ed2752f417f3ad9fc4af">my_unlock_value</a> = 0;
-<a name="l00171"></a>00171 s.<a class="code" href="a00287.html#8f4d19aa2d6d112034d281eed0dab5fa">internal_release</a>();
+<a name="l00167"></a>00167 <span class="preprocessor"></span> <a class="code" href="a00227.html">aligned_space<scoped_lock,1></a> tmp;
+<a name="l00168"></a>00168 <a class="code" href="a00306.html">scoped_lock</a>& s = *tmp.<a class="code" href="a00227.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>();
+<a name="l00169"></a>00169 s.<a class="code" href="a00306.html#d968921bed018503214f36e09007ee7b">my_mutex</a> = <span class="keyword">this</span>;
+<a name="l00170"></a>00170 s.<a class="code" href="a00306.html#96af1c1af58988d527102379c3d4c831">my_unlock_value</a> = 0;
+<a name="l00171"></a>00171 s.<a class="code" href="a00306.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>
diff --git a/doc/html/a00566.html b/doc/html/a00566.html
index f3fe59d..347145e 100644
--- a/doc/html/a00566.html
+++ b/doc/html/a00566.html
@@ -52,7 +52,7 @@
<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="a00288.html">00035</a> <span class="keyword">class </span><a class="code" href="a00288.html">spin_rw_mutex_v3</a> {
+<a name="l00035"></a><a class="code" href="a00307.html">00035</a> <span class="keyword">class </span><a class="code" href="a00307.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
@@ -73,90 +73,90 @@
<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="a00288.html#61332b2756de89f3f5f69310cbb6e70c">00067</a> <a class="code" href="a00288.html#61332b2756de89f3f5f69310cbb6e70c">spin_rw_mutex_v3</a>() : state(0) {
+<a name="l00067"></a><a class="code" href="a00307.html#61332b2756de89f3f5f69310cbb6e70c">00067</a> <a class="code" href="a00307.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="a00288.html#9a815fb2759e55072ed413f1b6970cf3">00075</a> <span class="preprocessor"> ~spin_rw_mutex_v3() {</span>
+<a name="l00075"></a><a class="code" href="a00307.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="a00289.html">00083</a> <span class="keyword">class </span><a class="code" href="a00289.html">scoped_lock</a> : internal::no_copy {
+<a name="l00083"></a><a class="code" href="a00308.html">00083</a> <span class="keyword">class </span><a class="code" href="a00308.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="a00289.html#d6ea60dee5563f702379bf5e51aa8806">00087</a> <a class="code" href="a00289.html">scoped_lock</a>() : <a class="code" href="a00258.html">mutex</a>(NULL), is_writer(false) {}
+<a name="l00087"></a><a class="code" href="a00308.html#d6ea60dee5563f702379bf5e51aa8806">00087</a> <a class="code" href="a00308.html">scoped_lock</a>() : <a class="code" href="a00275.html">mutex</a>(NULL), is_writer(false) {}
<a name="l00088"></a>00088
-<a name="l00090"></a><a class="code" href="a00289.html#42a92d4f8fdde425b111cfa8a9228071">00090</a> <a class="code" href="a00289.html">scoped_lock</a>( <a class="code" href="a00288.html">spin_rw_mutex</a>& m, <span class="keywordtype">bool</span> write = <span class="keyword">true</span> ) : <a class="code" href="a00258.html">mutex</a>(NULL) {
-<a name="l00091"></a>00091 <a class="code" href="a00362.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>(m, write);
+<a name="l00090"></a><a class="code" href="a00308.html#42a92d4f8fdde425b111cfa8a9228071">00090</a> <a class="code" href="a00308.html">scoped_lock</a>( <a class="code" href="a00307.html">spin_rw_mutex</a>& m, <span class="keywordtype">bool</span> write = <span class="keyword">true</span> ) : <a class="code" href="a00275.html">mutex</a>(NULL) {
+<a name="l00091"></a>00091 <a class="code" href="a00383.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>(m, write);
<a name="l00092"></a>00092 }
<a name="l00093"></a>00093
-<a name="l00095"></a><a class="code" href="a00289.html#d7eaaa3f2e2c5dc11e7005811b1bdd04">00095</a> <a class="code" href="a00275.html#70246e0260493625ff956fa5926fc71f">~scoped_lock</a>() {
-<a name="l00096"></a>00096 <span class="keywordflow">if</span>( <a class="code" href="a00258.html">mutex</a> ) <a class="code" href="a00362.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">release</a>();
+<a name="l00095"></a><a class="code" href="a00308.html#d7eaaa3f2e2c5dc11e7005811b1bdd04">00095</a> <a class="code" href="a00293.html#70246e0260493625ff956fa5926fc71f">~scoped_lock</a>() {
+<a name="l00096"></a>00096 <span class="keywordflow">if</span>( <a class="code" href="a00275.html">mutex</a> ) <a class="code" href="a00383.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">release</a>();
<a name="l00097"></a>00097 }
<a name="l00098"></a>00098
-<a name="l00100"></a><a class="code" href="a00289.html#b0b646ec5be02a127d159bbb7ca65353">00100</a> <span class="keywordtype">void</span> <a class="code" href="a00362.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>( <a class="code" href="a00288.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="a00258.html">mutex</a>, <span class="stringliteral">"holding mutex already"</span> );
+<a name="l00100"></a><a class="code" href="a00308.html#b0b646ec5be02a127d159bbb7ca65353">00100</a> <span class="keywordtype">void</span> <a class="code" href="a00383.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>( <a class="code" href="a00307.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="a00275.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="a00258.html">mutex</a> = &m;
-<a name="l00104"></a>00104 <span class="keywordflow">if</span>( write ) <a class="code" href="a00258.html">mutex</a>->internal_acquire_writer();
-<a name="l00105"></a>00105 <span class="keywordflow">else</span> <a class="code" href="a00258.html">mutex</a>->internal_acquire_reader();
+<a name="l00103"></a>00103 <a class="code" href="a00275.html">mutex</a> = &m;
+<a name="l00104"></a>00104 <span class="keywordflow">if</span>( write ) <a class="code" href="a00275.html">mutex</a>->internal_acquire_writer();
+<a name="l00105"></a>00105 <span class="keywordflow">else</span> <a class="code" href="a00275.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="a00289.html#3f0b1e3f2efab63336400348bd070226">00110</a> <span class="keywordtype">bool</span> upgrade_to_writer() {
-<a name="l00111"></a>00111 __TBB_ASSERT( <a class="code" href="a00258.html">mutex</a>, <span class="stringliteral">"lock is not acquired"</span> );
+<a name="l00110"></a><a class="code" href="a00308.html#3f0b1e3f2efab63336400348bd070226">00110</a> <span class="keywordtype">bool</span> upgrade_to_writer() {
+<a name="l00111"></a>00111 __TBB_ASSERT( <a class="code" href="a00275.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="a00258.html">mutex</a>->internal_upgrade();
+<a name="l00114"></a>00114 <span class="keywordflow">return</span> <a class="code" href="a00275.html">mutex</a>->internal_upgrade();
<a name="l00115"></a>00115 }
<a name="l00116"></a>00116
-<a name="l00118"></a><a class="code" href="a00289.html#61b14d00a78185c9b2d206ebfc379124">00118</a> <span class="keywordtype">void</span> <a class="code" href="a00362.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">release</a>() {
-<a name="l00119"></a>00119 __TBB_ASSERT( <a class="code" href="a00258.html">mutex</a>, <span class="stringliteral">"lock is not acquired"</span> );
-<a name="l00120"></a>00120 <a class="code" href="a00288.html">spin_rw_mutex</a> *m = <a class="code" href="a00258.html">mutex</a>;
-<a name="l00121"></a>00121 <a class="code" href="a00258.html">mutex</a> = NULL;
+<a name="l00118"></a><a class="code" href="a00308.html#61b14d00a78185c9b2d206ebfc379124">00118</a> <span class="keywordtype">void</span> <a class="code" href="a00383.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">release</a>() {
+<a name="l00119"></a>00119 __TBB_ASSERT( <a class="code" href="a00275.html">mutex</a>, <span class="stringliteral">"lock is not acquired"</span> );
+<a name="l00120"></a>00120 <a class="code" href="a00307.html">spin_rw_mutex</a> *m = <a class="code" href="a00275.html">mutex</a>;
+<a name="l00121"></a>00121 <a class="code" href="a00275.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="a00288.html#621b900d5fef23d2e401aabcbb777c76">state</a>, READERS );
-<a name="l00127"></a>00127 <span class="keywordflow">else</span> __TBB_FetchAndAddWrelease( &m-><a class="code" href="a00288.html#621b900d5fef23d2e401aabcbb777c76">state</a>, -(intptr_t)ONE_READER);
+<a name="l00126"></a>00126 <span class="preprocessor"></span> <span class="keywordflow">if</span>( is_writer ) __TBB_AtomicAND( &m-><a class="code" href="a00307.html#621b900d5fef23d2e401aabcbb777c76">state</a>, READERS );
+<a name="l00127"></a>00127 <span class="keywordflow">else</span> __TBB_FetchAndAddWrelease( &m-><a class="code" href="a00307.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="a00289.html#c2c2c38a08cb9080e87099fac3e5bc94">00132</a> <span class="keywordtype">bool</span> downgrade_to_reader() {
+<a name="l00132"></a><a class="code" href="a00308.html#c2c2c38a08cb9080e87099fac3e5bc94">00132</a> <span class="keywordtype">bool</span> downgrade_to_reader() {
<a name="l00133"></a>00133 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT</span>
-<a name="l00134"></a>00134 <span class="preprocessor"></span> __TBB_ASSERT( <a class="code" href="a00258.html">mutex</a>, <span class="stringliteral">"lock is not acquired"</span> );
+<a name="l00134"></a>00134 <span class="preprocessor"></span> __TBB_ASSERT( <a class="code" href="a00275.html">mutex</a>, <span class="stringliteral">"lock is not acquired"</span> );
<a name="l00135"></a>00135 __TBB_ASSERT( is_writer, <span class="stringliteral">"not a writer"</span> );
-<a name="l00136"></a>00136 <a class="code" href="a00258.html">mutex</a>->internal_downgrade();
+<a name="l00136"></a>00136 <a class="code" href="a00275.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="a00258.html">mutex</a>->state, ((intptr_t)ONE_READER-WRITER));
+<a name="l00138"></a>00138 <span class="preprocessor"></span> __TBB_FetchAndAddW( &<a class="code" href="a00275.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
<a name="l00142"></a>00142 <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l00143"></a>00143 }
<a name="l00144"></a>00144
-<a name="l00146"></a><a class="code" href="a00289.html#9879626968d9b9a04cd2ec0fb2e84ae1">00146</a> <span class="keywordtype">bool</span> try_acquire( <a class="code" href="a00288.html">spin_rw_mutex</a>& m, <span class="keywordtype">bool</span> write = <span class="keyword">true</span> ) {
-<a name="l00147"></a>00147 __TBB_ASSERT( !<a class="code" href="a00258.html">mutex</a>, <span class="stringliteral">"holding mutex already"</span> );
+<a name="l00146"></a><a class="code" href="a00308.html#9879626968d9b9a04cd2ec0fb2e84ae1">00146</a> <span class="keywordtype">bool</span> try_acquire( <a class="code" href="a00307.html">spin_rw_mutex</a>& m, <span class="keywordtype">bool</span> write = <span class="keyword">true</span> ) {
+<a name="l00147"></a>00147 __TBB_ASSERT( !<a class="code" href="a00275.html">mutex</a>, <span class="stringliteral">"holding mutex already"</span> );
<a name="l00148"></a>00148 <span class="keywordtype">bool</span> result;
<a name="l00149"></a>00149 is_writer = write;
<a name="l00150"></a>00150 result = write? m.internal_try_acquire_writer()
<a name="l00151"></a>00151 : m.internal_try_acquire_reader();
<a name="l00152"></a>00152 <span class="keywordflow">if</span>( result )
-<a name="l00153"></a>00153 <a class="code" href="a00258.html">mutex</a> = &m;
+<a name="l00153"></a>00153 <a class="code" href="a00275.html">mutex</a> = &m;
<a name="l00154"></a>00154 <span class="keywordflow">return</span> result;
<a name="l00155"></a>00155 }
<a name="l00156"></a>00156
<a name="l00157"></a>00157 <span class="keyword">protected</span>:
-<a name="l00159"></a><a class="code" href="a00289.html#d96d1a1fcc3d79ef3e5c06a53b8ffeaa">00159</a> <a class="code" href="a00288.html">spin_rw_mutex</a>* <a class="code" href="a00258.html">mutex</a>;
+<a name="l00159"></a><a class="code" href="a00308.html#d96d1a1fcc3d79ef3e5c06a53b8ffeaa">00159</a> <a class="code" href="a00307.html">spin_rw_mutex</a>* <a class="code" href="a00275.html">mutex</a>;
<a name="l00160"></a>00160
<a name="l00162"></a>00162
-<a name="l00163"></a><a class="code" href="a00289.html#6b5a7c3c67a36b05c4df8410d32627d8">00163</a> <span class="keywordtype">bool</span> is_writer;
+<a name="l00163"></a><a class="code" href="a00308.html#6b5a7c3c67a36b05c4df8410d32627d8">00163</a> <span class="keywordtype">bool</span> is_writer;
<a name="l00164"></a>00164 };
<a name="l00165"></a>00165
<a name="l00166"></a>00166 <span class="comment">// Mutex traits</span>
@@ -166,12 +166,12 @@
<a name="l00170"></a>00170
<a name="l00171"></a>00171 <span class="comment">// ISO C++0x compatibility methods</span>
<a name="l00172"></a>00172
-<a name="l00174"></a><a class="code" href="a00288.html#4007d6e1523dbc3c2bb7f889ab789a8a">00174</a> <span class="keywordtype">void</span> lock() {internal_acquire_writer();}
+<a name="l00174"></a><a class="code" href="a00307.html#4007d6e1523dbc3c2bb7f889ab789a8a">00174</a> <span class="keywordtype">void</span> lock() {internal_acquire_writer();}
<a name="l00175"></a>00175
<a name="l00177"></a>00177
-<a name="l00178"></a><a class="code" href="a00288.html#088bb256be794cc47d3b83791632fdfc">00178</a> <span class="keywordtype">bool</span> try_lock() {<span class="keywordflow">return</span> internal_try_acquire_writer();}
+<a name="l00178"></a><a class="code" href="a00307.html#088bb256be794cc47d3b83791632fdfc">00178</a> <span class="keywordtype">bool</span> try_lock() {<span class="keywordflow">return</span> internal_try_acquire_writer();}
<a name="l00179"></a>00179
-<a name="l00181"></a><a class="code" href="a00288.html#f9f52ead2098eb5fb12da59d5ae53b55">00181</a> <span class="keywordtype">void</span> unlock() {
+<a name="l00181"></a><a class="code" href="a00307.html#f9f52ead2098eb5fb12da59d5ae53b55">00181</a> <span class="keywordtype">void</span> unlock() {
<a name="l00182"></a>00182 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT</span>
<a name="l00183"></a>00183 <span class="preprocessor"></span> <span class="keywordflow">if</span>( state&WRITER ) internal_release_writer();
<a name="l00184"></a>00184 <span class="keywordflow">else</span> internal_release_reader();
@@ -183,10 +183,10 @@
<a name="l00190"></a>00190
<a name="l00191"></a>00191 <span class="comment">// Methods for reader locks that resemble ISO C++0x compatibility methods.</span>
<a name="l00192"></a>00192
-<a name="l00194"></a><a class="code" href="a00288.html#13f799708ac4ca437a16be202e263e18">00194</a> <span class="keywordtype">void</span> lock_read() {internal_acquire_reader();}
+<a name="l00194"></a><a class="code" href="a00307.html#13f799708ac4ca437a16be202e263e18">00194</a> <span class="keywordtype">void</span> lock_read() {internal_acquire_reader();}
<a name="l00195"></a>00195
<a name="l00197"></a>00197
-<a name="l00198"></a><a class="code" href="a00288.html#b8667415869013f840d976aa406d385a">00198</a> <span class="keywordtype">bool</span> try_lock_read() {<span class="keywordflow">return</span> internal_try_acquire_reader();}
+<a name="l00198"></a><a class="code" href="a00307.html#b8667415869013f840d976aa406d385a">00198</a> <span class="keywordtype">bool</span> try_lock_read() {<span class="keywordflow">return</span> internal_try_acquire_reader();}
<a name="l00199"></a>00199
<a name="l00200"></a>00200 <span class="keyword">private</span>:
<a name="l00201"></a>00201 <span class="keyword">typedef</span> intptr_t state_t;
diff --git a/doc/html/a00567.html b/doc/html/a00567.html
index d15aefb..50cc5ff 100644
--- a/doc/html/a00567.html
+++ b/doc/html/a00567.html
@@ -57,7 +57,7 @@
<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="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>
@@ -81,22 +81,22 @@
<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="a00292.html">00069</a> <span class="keyword">class </span><a class="code" href="a00292.html">task_base</a>: tbb::internal::no_copy {
+<a name="l00069"></a><a class="code" href="a00312.html">00069</a> <span class="keyword">class </span><a class="code" href="a00312.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="a00291.html">tbb::task</a>;
+<a name="l00071"></a>00071 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00311.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="a00291.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="a00294.html">task_list</a>& list );
+<a name="l00074"></a>00074 <span class="keyword">static</span> <span class="keywordtype">void</span> spawn( <a class="code" href="a00311.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="a00315.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="a00291.html">task</a>& t ) {
+<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="a00311.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="a00291.html#dfaacf92685e5f86393bf657b2853bf8">destroy</a>( <a class="code" href="a00291.html">task</a>& victim );
-<a name="l00092"></a>00092 };
+<a name="l00091"></a>00091 <span class="keyword">static</span> <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC <a class="code" href="a00311.html#dfaacf92685e5f86393bf657b2853bf8">destroy</a>( <a class="code" href="a00311.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
@@ -104,16 +104,16 @@
<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="a00291.html">task</a>& first, <a class="code" href="a00291.html">task</a>*& next ) = 0;
+<a name="l00102"></a>00102 <span class="keyword">virtual</span> <span class="keywordtype">void</span> spawn( <a class="code" href="a00311.html">task</a>& first, <a class="code" href="a00311.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="a00291.html">task</a>& parent, <a class="code" href="a00291.html">task</a>* child ) = 0;
+<a name="l00105"></a>00105 <span class="keyword">virtual</span> <span class="keywordtype">void</span> wait_for_all( <a class="code" href="a00311.html">task</a>& parent, <a class="code" href="a00311.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="a00291.html">task</a>& first, <a class="code" href="a00291.html">task</a>*& next ) = 0;
+<a name="l00108"></a>00108 <span class="keyword">virtual</span> <span class="keywordtype">void</span> spawn_root_and_wait( <a class="code" href="a00311.html">task</a>& first, <a class="code" href="a00311.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="a00291.html">task</a>& t, <span class="keywordtype">void</span>* reserved ) = 0;
+<a name="l00115"></a>00115 <span class="keyword">virtual</span> <span class="keywordtype">void</span> enqueue( <a class="code" href="a00311.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
@@ -157,564 +157,571 @@
<a name="l00158"></a>00158 };
<a name="l00159"></a>00159
<a name="l00161"></a>00161
-<a name="l00166"></a>00166 <span class="keyword">class </span>task_prefix {
-<a name="l00167"></a>00167 <span class="keyword">private</span>:
-<a name="l00168"></a>00168 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00291.html">tbb::task</a>;
-<a name="l00169"></a>00169 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00292.html">tbb::interface5::internal::task_base</a>;
-<a name="l00170"></a>00170 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00294.html">tbb::task_list</a>;
-<a name="l00171"></a>00171 <span class="keyword">friend</span> <span class="keyword">class </span>internal::scheduler;
-<a name="l00172"></a>00172 <span class="keyword">friend</span> <span class="keyword">class </span>internal::allocate_root_proxy;
-<a name="l00173"></a>00173 <span class="keyword">friend</span> <span class="keyword">class </span>internal::allocate_child_proxy;
-<a name="l00174"></a>00174 <span class="keyword">friend</span> <span class="keyword">class </span>internal::allocate_continuation_proxy;
-<a name="l00175"></a>00175 <span class="keyword">friend</span> <span class="keyword">class </span>internal::allocate_additional_child_of_proxy;
-<a name="l00176"></a>00176
-<a name="l00177"></a>00177 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00179"></a>00179 <span class="preprocessor"></span>
-<a name="l00182"></a>00182 <span class="preprocessor"> task_group_context *context;</span>
-<a name="l00183"></a>00183 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
-<a name="l00184"></a>00184
-<a name="l00186"></a>00186
-<a name="l00191"></a>00191 scheduler* origin;
+<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="a00311.html">tbb::task</a>;
+<a name="l00175"></a>00175 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00312.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="a00315.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="l00193"></a>00193 <span class="preprocessor">#if TBB_PREVIEW_TASK_PRIORITY</span>
-<a name="l00194"></a>00194 <span class="preprocessor"></span> <span class="keyword">union </span>{
-<a name="l00195"></a>00195 <span class="preprocessor">#endif </span><span class="comment">/* TBB_PREVIEW_TASK_PRIORITY */</span>
-<a name="l00197"></a>00197
-<a name="l00199"></a>00199 scheduler* owner;
-<a name="l00200"></a>00200
-<a name="l00201"></a>00201 <span class="preprocessor">#if TBB_PREVIEW_TASK_PRIORITY</span>
-<a name="l00203"></a>00203 <span class="preprocessor"></span>
-<a name="l00204"></a>00204 <span class="preprocessor"> task* next_offloaded;</span>
-<a name="l00205"></a>00205 <span class="preprocessor"></span> };
-<a name="l00206"></a>00206 <span class="preprocessor">#endif </span><span class="comment">/* TBB_PREVIEW_TASK_PRIORITY */</span>
-<a name="l00207"></a>00207
-<a name="l00209"></a>00209
-<a name="l00212"></a>00212 <a class="code" href="a00291.html">tbb::task</a>* parent;
+<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="l00219"></a>00219 reference_count ref_count;
-<a name="l00220"></a>00220
-<a name="l00222"></a>00222
-<a name="l00224"></a>00224 <span class="keywordtype">int</span> depth;
-<a name="l00225"></a>00225
-<a name="l00227"></a>00227
-<a name="l00228"></a>00228 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> state;
-<a name="l00229"></a>00229
+<a name="l00218"></a>00218 <a class="code" href="a00311.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="l00236"></a>00236 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> extra_state;
+<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="l00238"></a>00238 affinity_id affinity;
-<a name="l00239"></a>00239
-<a name="l00241"></a>00241 <a class="code" href="a00291.html">tbb::task</a>* next;
-<a name="l00242"></a>00242
-<a name="l00244"></a>00244 <a class="code" href="a00291.html">tbb::task</a>& task() {<span class="keywordflow">return</span> *reinterpret_cast<tbb::task*>(<span class="keyword">this</span>+1);}
-<a name="l00245"></a>00245 };
-<a name="l00246"></a>00246
-<a name="l00247"></a>00247 } <span class="comment">// namespace internal</span>
-<a name="l00249"></a>00249 <span class="comment"></span>
-<a name="l00250"></a>00250 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00251"></a>00251 <span class="preprocessor"></span>
-<a name="l00252"></a>00252 <span class="preprocessor">#if TBB_PREVIEW_TASK_PRIORITY</span>
-<a name="l00253"></a>00253 <span class="preprocessor"></span><span class="keyword">namespace </span>internal {
-<a name="l00254"></a>00254 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">int</span> priority_stride_v4 = INT_MAX / 4;
-<a name="l00255"></a>00255 }
-<a name="l00256"></a>00256
-<a name="l00257"></a>00257 <span class="keyword">enum</span> priority_t {
-<a name="l00258"></a>00258 priority_normal = internal::priority_stride_v4 * 2,
-<a name="l00259"></a>00259 priority_low = priority_normal - internal::priority_stride_v4,
-<a name="l00260"></a>00260 priority_high = priority_normal + internal::priority_stride_v4
-<a name="l00261"></a>00261 };
+<a name="l00242"></a>00242 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> extra_state;
+<a name="l00243"></a>00243
+<a name="l00244"></a>00244 affinity_id affinity;
+<a name="l00245"></a>00245
+<a name="l00247"></a>00247 <a class="code" href="a00311.html">tbb::task</a>* next;
+<a name="l00248"></a>00248
+<a name="l00250"></a>00250 <a class="code" href="a00311.html">tbb::task</a>& task() {<span class="keywordflow">return</span> *reinterpret_cast<tbb::task*>(<span class="keyword">this</span>+1);}
+<a name="l00251"></a>00251 };
+<a name="l00252"></a>00252
+<a name="l00253"></a>00253 } <span class="comment">// namespace internal</span>
+<a name="l00255"></a>00255 <span class="comment"></span>
+<a name="l00256"></a>00256 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
+<a name="l00257"></a>00257 <span class="preprocessor"></span>
+<a name="l00258"></a>00258 <span class="preprocessor">#if __TBB_TASK_PRIORITY</span>
+<a name="l00259"></a>00259 <span class="preprocessor"></span><span class="keyword">namespace </span>internal {
+<a name="l00260"></a>00260 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">int</span> priority_stride_v4 = INT_MAX / 4;
+<a name="l00261"></a>00261 }
<a name="l00262"></a>00262
-<a name="l00263"></a>00263 <span class="preprocessor">#endif </span><span class="comment">/* TBB_PREVIEW_TASK_PRIORITY */</span>
-<a name="l00264"></a>00264
-<a name="l00265"></a>00265 <span class="preprocessor">#if TBB_USE_CAPTURED_EXCEPTION</span>
-<a name="l00266"></a>00266 <span class="preprocessor"></span> <span class="keyword">class </span>tbb_exception;
-<a name="l00267"></a>00267 <span class="preprocessor">#else</span>
-<a name="l00268"></a>00268 <span class="preprocessor"></span> <span class="keyword">namespace </span>internal {
-<a name="l00269"></a>00269 <span class="keyword">class </span>tbb_exception_ptr;
-<a name="l00270"></a>00270 }
-<a name="l00271"></a>00271 <span class="preprocessor">#endif </span><span class="comment">/* !TBB_USE_CAPTURED_EXCEPTION */</span>
-<a name="l00272"></a>00272
-<a name="l00273"></a>00273 <span class="keyword">class </span>task_scheduler_init;
-<a name="l00274"></a>00274
-<a name="l00276"></a>00276
-<a name="l00296"></a><a class="code" href="a00293.html">00296</a> <span class="keyword">class </span><a class="code" href="a00293.html">task_group_context</a> : internal::no_copy {
-<a name="l00297"></a>00297 <span class="keyword">private</span>:
-<a name="l00298"></a>00298 <span class="keyword">friend</span> <span class="keyword">class </span>internal::generic_scheduler;
-<a name="l00299"></a>00299 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00295.html">task_scheduler_init</a>;
-<a name="l00300"></a>00300
-<a name="l00301"></a>00301 <span class="preprocessor">#if TBB_USE_CAPTURED_EXCEPTION</span>
-<a name="l00302"></a>00302 <span class="preprocessor"></span> <span class="keyword">typedef</span> <a class="code" href="a00298.html">tbb_exception</a> <a class="code" href="a00298.html">exception_container_type</a>;
-<a name="l00303"></a>00303 <span class="preprocessor">#else</span>
-<a name="l00304"></a>00304 <span class="preprocessor"></span> <span class="keyword">typedef</span> <a class="code" href="a00299.html">internal::tbb_exception_ptr</a> <a class="code" href="a00298.html">exception_container_type</a>;
-<a name="l00305"></a>00305 <span class="preprocessor">#endif</span>
-<a name="l00306"></a>00306 <span class="preprocessor"></span>
-<a name="l00307"></a>00307 <span class="keyword">enum</span> version_traits_word_layout {
-<a name="l00308"></a>00308 traits_offset = 16,
-<a name="l00309"></a>00309 version_mask = 0xFFFF,
-<a name="l00310"></a>00310 traits_mask = 0xFFFFul << traits_offset
-<a name="l00311"></a>00311 };
-<a name="l00312"></a>00312
-<a name="l00313"></a>00313 <span class="keyword">public</span>:
-<a name="l00314"></a>00314 <span class="keyword">enum</span> kind_type {
-<a name="l00315"></a>00315 isolated,
-<a name="l00316"></a>00316 bound
+<a name="l00263"></a>00263 <span class="keyword">enum</span> priority_t {
+<a name="l00264"></a>00264 priority_normal = internal::priority_stride_v4 * 2,
+<a name="l00265"></a>00265 priority_low = priority_normal - internal::priority_stride_v4,
+<a name="l00266"></a>00266 priority_high = priority_normal + internal::priority_stride_v4
+<a name="l00267"></a>00267 };
+<a name="l00268"></a>00268
+<a name="l00269"></a>00269 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_PRIORITY */</span>
+<a name="l00270"></a>00270
+<a name="l00271"></a>00271 <span class="preprocessor">#if TBB_USE_CAPTURED_EXCEPTION</span>
+<a name="l00272"></a>00272 <span class="preprocessor"></span> <span class="keyword">class </span>tbb_exception;
+<a name="l00273"></a>00273 <span class="preprocessor">#else</span>
+<a name="l00274"></a>00274 <span class="preprocessor"></span> <span class="keyword">namespace </span>internal {
+<a name="l00275"></a>00275 <span class="keyword">class </span>tbb_exception_ptr;
+<a name="l00276"></a>00276 }
+<a name="l00277"></a>00277 <span class="preprocessor">#endif </span><span class="comment">/* !TBB_USE_CAPTURED_EXCEPTION */</span>
+<a name="l00278"></a>00278
+<a name="l00279"></a>00279 <span class="keyword">class </span>task_scheduler_init;
+<a name="l00280"></a>00280
+<a name="l00282"></a>00282
+<a name="l00302"></a><a class="code" href="a00313.html">00302</a> <span class="keyword">class </span><a class="code" href="a00314.html">task_group_context</a> : internal::no_copy {
+<a name="l00303"></a>00303 <span class="keyword">private</span>:
+<a name="l00304"></a>00304 <span class="keyword">friend</span> <span class="keyword">class </span>internal::generic_scheduler;
+<a name="l00305"></a>00305 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00316.html">task_scheduler_init</a>;
+<a name="l00306"></a>00306
+<a name="l00307"></a>00307 <span class="preprocessor">#if TBB_USE_CAPTURED_EXCEPTION</span>
+<a name="l00308"></a>00308 <span class="preprocessor"></span> <span class="keyword">typedef</span> <a class="code" href="a00319.html">tbb_exception</a> <a class="code" href="a00319.html">exception_container_type</a>;
+<a name="l00309"></a>00309 <span class="preprocessor">#else</span>
+<a name="l00310"></a>00310 <span class="preprocessor"></span> <span class="keyword">typedef</span> <a class="code" href="a00320.html">internal::tbb_exception_ptr</a> <a class="code" href="a00319.html">exception_container_type</a>;
+<a name="l00311"></a>00311 <span class="preprocessor">#endif</span>
+<a name="l00312"></a>00312 <span class="preprocessor"></span>
+<a name="l00313"></a>00313 <span class="keyword">enum</span> version_traits_word_layout {
+<a name="l00314"></a>00314 traits_offset = 16,
+<a name="l00315"></a>00315 version_mask = 0xFFFF,
+<a name="l00316"></a>00316 traits_mask = 0xFFFFul << traits_offset
<a name="l00317"></a>00317 };
<a name="l00318"></a>00318
-<a name="l00319"></a>00319 <span class="keyword">enum</span> traits_type {
-<a name="l00320"></a>00320 exact_exception = 0x0001ul << traits_offset,
-<a name="l00321"></a>00321 concurrent_wait = 0x0004ul << traits_offset,
-<a name="l00322"></a>00322 <span class="preprocessor">#if TBB_USE_CAPTURED_EXCEPTION</span>
-<a name="l00323"></a>00323 <span class="preprocessor"></span> default_traits = 0
-<a name="l00324"></a>00324 <span class="preprocessor">#else</span>
-<a name="l00325"></a>00325 <span class="preprocessor"></span> default_traits = exact_exception
-<a name="l00326"></a>00326 <span class="preprocessor">#endif </span><span class="comment">/* !TBB_USE_CAPTURED_EXCEPTION */</span>
-<a name="l00327"></a>00327 };
-<a name="l00328"></a>00328
-<a name="l00329"></a>00329 <span class="keyword">private</span>:
-<a name="l00330"></a>00330 <span class="keyword">enum</span> state {
-<a name="l00331"></a>00331 may_have_children = 1
-<a name="l00332"></a>00332 };
-<a name="l00333"></a>00333
-<a name="l00334"></a>00334 <span class="keyword">union </span>{
-<a name="l00336"></a>00336 kind_type my_kind;
-<a name="l00337"></a>00337 uintptr_t _my_kind_aligner;
+<a name="l00319"></a>00319 <span class="keyword">public</span>:
+<a name="l00320"></a>00320 <span class="keyword">enum</span> kind_type {
+<a name="l00321"></a>00321 isolated,
+<a name="l00322"></a>00322 bound
+<a name="l00323"></a>00323 };
+<a name="l00324"></a>00324
+<a name="l00325"></a>00325 <span class="keyword">enum</span> traits_type {
+<a name="l00326"></a>00326 exact_exception = 0x0001ul << traits_offset,
+<a name="l00327"></a>00327 concurrent_wait = 0x0004ul << traits_offset,
+<a name="l00328"></a>00328 <span class="preprocessor">#if TBB_USE_CAPTURED_EXCEPTION</span>
+<a name="l00329"></a>00329 <span class="preprocessor"></span> default_traits = 0
+<a name="l00330"></a>00330 <span class="preprocessor">#else</span>
+<a name="l00331"></a>00331 <span class="preprocessor"></span> default_traits = exact_exception
+<a name="l00332"></a>00332 <span class="preprocessor">#endif </span><span class="comment">/* !TBB_USE_CAPTURED_EXCEPTION */</span>
+<a name="l00333"></a>00333 };
+<a name="l00334"></a>00334
+<a name="l00335"></a>00335 <span class="keyword">private</span>:
+<a name="l00336"></a>00336 <span class="keyword">enum</span> state {
+<a name="l00337"></a>00337 may_have_children = 1
<a name="l00338"></a>00338 };
<a name="l00339"></a>00339
-<a name="l00341"></a>00341 <a class="code" href="a00293.html">task_group_context</a> *my_parent;
-<a name="l00342"></a>00342
-<a name="l00344"></a>00344
-<a name="l00346"></a>00346 internal::context_list_node_t my_node;
-<a name="l00347"></a>00347
-<a name="l00349"></a>00349 __itt_caller itt_caller;
+<a name="l00340"></a>00340 <span class="keyword">union </span>{
+<a name="l00342"></a>00342 kind_type my_kind;
+<a name="l00343"></a>00343 uintptr_t _my_kind_aligner;
+<a name="l00344"></a>00344 };
+<a name="l00345"></a>00345
+<a name="l00347"></a>00347 <a class="code" href="a00314.html">task_group_context</a> *my_parent;
+<a name="l00348"></a>00348
<a name="l00350"></a>00350
-<a name="l00352"></a>00352
-<a name="l00355"></a>00355 <span class="keywordtype">char</span> _leading_padding[internal::NFS_MaxLineSize
-<a name="l00356"></a>00356 - 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="l00357"></a>00357 - <span class="keyword">sizeof</span>(__itt_caller)];
-<a name="l00358"></a>00358
-<a name="l00360"></a>00360 uintptr_t my_cancellation_requested;
-<a name="l00361"></a>00361
-<a name="l00363"></a>00363
-<a name="l00366"></a>00366 uintptr_t my_version_and_traits;
+<a name="l00352"></a>00352 internal::context_list_node_t my_node;
+<a name="l00353"></a>00353
+<a name="l00355"></a>00355 __itt_caller itt_caller;
+<a name="l00356"></a>00356
+<a name="l00358"></a>00358
+<a name="l00361"></a>00361 <span class="keywordtype">char</span> _leading_padding[internal::NFS_MaxLineSize
+<a name="l00362"></a>00362 - 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="l00363"></a>00363 - <span class="keyword">sizeof</span>(__itt_caller)];
+<a name="l00364"></a>00364
+<a name="l00366"></a>00366 uintptr_t my_cancellation_requested;
<a name="l00367"></a>00367
-<a name="l00369"></a>00369 <a class="code" href="a00298.html">exception_container_type</a> *my_exception;
-<a name="l00370"></a>00370
-<a name="l00372"></a>00372 internal::generic_scheduler *my_owner;
+<a name="l00369"></a>00369
+<a name="l00372"></a>00372 uintptr_t my_version_and_traits;
<a name="l00373"></a>00373
-<a name="l00375"></a>00375 uintptr_t my_state;
+<a name="l00375"></a>00375 <a class="code" href="a00319.html">exception_container_type</a> *my_exception;
<a name="l00376"></a>00376
-<a name="l00377"></a>00377 <span class="preprocessor">#if TBB_PREVIEW_TASK_PRIORITY</span>
-<a name="l00379"></a>00379 <span class="preprocessor"> intptr_t my_priority;</span>
-<a name="l00380"></a>00380 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* TBB_PREVIEW_TASK_PRIORITY */</span>
-<a name="l00381"></a>00381
-<a name="l00383"></a>00383
-<a name="l00384"></a>00384 <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="l00385"></a>00385 <span class="preprocessor">#if TBB_PREVIEW_TASK_PRIORITY</span>
-<a name="l00386"></a>00386 <span class="preprocessor"></span> - <span class="keyword">sizeof</span>(intptr_t)
-<a name="l00387"></a>00387 #endif <span class="comment">/* TBB_PREVIEW_TASK_PRIORITY */</span>
-<a name="l00388"></a>00388 ];
+<a name="l00378"></a>00378 internal::generic_scheduler *my_owner;
+<a name="l00379"></a>00379
+<a name="l00381"></a>00381 uintptr_t my_state;
+<a name="l00382"></a>00382
+<a name="l00383"></a>00383 <span class="preprocessor">#if __TBB_TASK_PRIORITY</span>
+<a name="l00385"></a>00385 <span class="preprocessor"> intptr_t my_priority;</span>
+<a name="l00386"></a>00386 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_PRIORITY */</span>
+<a name="l00387"></a>00387
<a name="l00389"></a>00389
-<a name="l00390"></a>00390 <span class="keyword">public</span>:
-<a name="l00392"></a>00392
-<a name="l00420"></a><a class="code" href="a00293.html#19fee08fb8ac98adccfe69c1aa63c491">00420</a> <a class="code" href="a00293.html">task_group_context</a> ( kind_type relation_with_parent = bound,
-<a name="l00421"></a>00421 uintptr_t traits = default_traits )
-<a name="l00422"></a>00422 : my_kind(relation_with_parent)
-<a name="l00423"></a>00423 , my_version_and_traits(1 | traits)
-<a name="l00424"></a>00424 {
-<a name="l00425"></a>00425 init();
-<a name="l00426"></a>00426 }
-<a name="l00427"></a>00427
-<a name="l00428"></a>00428 __TBB_EXPORTED_METHOD ~<a class="code" href="a00293.html">task_group_context</a> ();
-<a name="l00429"></a>00429
-<a name="l00431"></a>00431
-<a name="l00438"></a>00438 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD reset ();
-<a name="l00439"></a>00439
-<a name="l00441"></a>00441
-<a name="l00448"></a>00448 <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD cancel_group_execution ();
-<a name="l00449"></a>00449
-<a name="l00451"></a>00451 <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD is_group_execution_cancelled () <span class="keyword">const</span>;
-<a name="l00452"></a>00452
-<a name="l00454"></a>00454
-<a name="l00460"></a>00460 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD register_pending_exception ();
-<a name="l00461"></a>00461
-<a name="l00462"></a>00462 <span class="preprocessor">#if TBB_PREVIEW_TASK_PRIORITY</span>
-<a name="l00464"></a>00464 <span class="preprocessor"> void set_priority ( priority_t );</span>
-<a name="l00465"></a>00465 <span class="preprocessor"></span>
-<a name="l00467"></a>00467 priority_t priority () <span class="keyword">const</span>;
-<a name="l00468"></a>00468 <span class="preprocessor">#endif </span><span class="comment">/* TBB_PREVIEW_TASK_PRIORITY */</span>
-<a name="l00469"></a>00469
-<a name="l00470"></a>00470 <span class="keyword">protected</span>:
-<a name="l00472"></a>00472
-<a name="l00473"></a>00473 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD init ();
-<a name="l00474"></a>00474
-<a name="l00475"></a>00475 <span class="keyword">private</span>:
-<a name="l00476"></a>00476 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00291.html">task</a>;
-<a name="l00477"></a>00477 <span class="keyword">friend</span> <span class="keyword">class </span>internal::allocate_root_with_context_proxy;
+<a name="l00390"></a>00390 <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="l00391"></a>00391 <span class="preprocessor">#if __TBB_TASK_PRIORITY</span>
+<a name="l00392"></a>00392 <span class="preprocessor"></span> - <span class="keyword">sizeof</span>(intptr_t)
+<a name="l00393"></a>00393 #endif <span class="comment">/* __TBB_TASK_PRIORITY */</span>
+<a name="l00394"></a>00394 ];
+<a name="l00395"></a>00395
+<a name="l00396"></a>00396 <span class="keyword">public</span>:
+<a name="l00398"></a>00398
+<a name="l00426"></a><a class="code" href="a00313.html#19fee08fb8ac98adccfe69c1aa63c491">00426</a> <a class="code" href="a00314.html">task_group_context</a> ( kind_type relation_with_parent = bound,
+<a name="l00427"></a>00427 uintptr_t traits = default_traits )
+<a name="l00428"></a>00428 : my_kind(relation_with_parent)
+<a name="l00429"></a>00429 , my_version_and_traits(1 | traits)
+<a name="l00430"></a>00430 {
+<a name="l00431"></a>00431 init();
+<a name="l00432"></a>00432 }
+<a name="l00433"></a>00433
+<a name="l00434"></a>00434 __TBB_EXPORTED_METHOD ~<a class="code" href="a00314.html">task_group_context</a> ();
+<a name="l00435"></a>00435
+<a name="l00437"></a>00437
+<a name="l00444"></a>00444 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD reset ();
+<a name="l00445"></a>00445
+<a name="l00447"></a>00447
+<a name="l00454"></a>00454 <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD cancel_group_execution ();
+<a name="l00455"></a>00455
+<a name="l00457"></a>00457 <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD is_group_execution_cancelled () <span class="keyword">const</span>;
+<a name="l00458"></a>00458
+<a name="l00460"></a>00460
+<a name="l00466"></a>00466 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD register_pending_exception ();
+<a name="l00467"></a>00467
+<a name="l00468"></a>00468 <span class="preprocessor">#if __TBB_TASK_PRIORITY</span>
+<a name="l00470"></a>00470 <span class="preprocessor"> void set_priority ( priority_t );</span>
+<a name="l00471"></a>00471 <span class="preprocessor"></span>
+<a name="l00473"></a>00473 priority_t priority () <span class="keyword">const</span>;
+<a name="l00474"></a>00474 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_PRIORITY */</span>
+<a name="l00475"></a>00475
+<a name="l00476"></a>00476 <span class="keyword">protected</span>:
<a name="l00478"></a>00478
-<a name="l00479"></a>00479 <span class="keyword">static</span> <span class="keyword">const</span> kind_type binding_required = bound;
-<a name="l00480"></a>00480 <span class="keyword">static</span> <span class="keyword">const</span> kind_type binding_completed = kind_type(bound+1);
-<a name="l00481"></a>00481 <span class="keyword">static</span> <span class="keyword">const</span> kind_type detached = kind_type(binding_completed+1);
-<a name="l00482"></a>00482 <span class="keyword">static</span> <span class="keyword">const</span> kind_type dying = kind_type(detached+1);
-<a name="l00483"></a>00483
-<a name="l00485"></a>00485
-<a name="l00487"></a>00487 <span class="keyword">template</span> <<span class="keyword">typename</span> T>
-<a name="l00488"></a>00488 <span class="keywordtype">void</span> propagate_state_from_ancestors ( T <a class="code" href="a00293.html">task_group_context</a>::*mptr_state, T new_state );
+<a name="l00479"></a>00479 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD init ();
+<a name="l00480"></a>00480
+<a name="l00481"></a>00481 <span class="keyword">private</span>:
+<a name="l00482"></a>00482 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00311.html">task</a>;
+<a name="l00483"></a>00483 <span class="keyword">friend</span> <span class="keyword">class </span>internal::allocate_root_with_context_proxy;
+<a name="l00484"></a>00484
+<a name="l00485"></a>00485 <span class="keyword">static</span> <span class="keyword">const</span> kind_type binding_required = bound;
+<a name="l00486"></a>00486 <span class="keyword">static</span> <span class="keyword">const</span> kind_type binding_completed = kind_type(bound+1);
+<a name="l00487"></a>00487 <span class="keyword">static</span> <span class="keyword">const</span> kind_type detached = kind_type(binding_completed+1);
+<a name="l00488"></a>00488 <span class="keyword">static</span> <span class="keyword">const</span> kind_type dying = kind_type(detached+1);
<a name="l00489"></a>00489
-<a name="l00491"></a>00491 <span class="keyword">inline</span> <span class="keywordtype">void</span> finish_initialization ( internal::generic_scheduler *local_sched );
-<a name="l00492"></a>00492
-<a name="l00494"></a>00494 <span class="keywordtype">void</span> bind_to ( internal::generic_scheduler *local_sched );
+<a name="l00491"></a>00491
+<a name="l00493"></a>00493 <span class="keyword">template</span> <<span class="keyword">typename</span> T>
+<a name="l00494"></a>00494 <span class="keywordtype">void</span> propagate_state_from_ancestors ( T <a class="code" href="a00314.html">task_group_context</a>::*mptr_state, T new_state );
<a name="l00495"></a>00495
-<a name="l00497"></a>00497 <span class="keywordtype">void</span> register_with ( internal::generic_scheduler *local_sched );
+<a name="l00497"></a>00497 <span class="keyword">inline</span> <span class="keywordtype">void</span> finish_initialization ( internal::generic_scheduler *local_sched );
<a name="l00498"></a>00498
-<a name="l00499"></a>00499 }; <span class="comment">// class task_group_context</span>
-<a name="l00500"></a>00500
-<a name="l00501"></a>00501 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
-<a name="l00502"></a>00502
+<a name="l00500"></a>00500 <span class="keywordtype">void</span> bind_to ( internal::generic_scheduler *local_sched );
+<a name="l00501"></a>00501
+<a name="l00503"></a>00503 <span class="keywordtype">void</span> register_with ( internal::generic_scheduler *local_sched );
<a name="l00504"></a>00504
-<a name="l00505"></a><a class="code" href="a00291.html">00505</a> <span class="keyword">class </span><a class="code" href="a00291.html">task</a>: __TBB_TASK_BASE_ACCESS interface5::internal::task_base {
+<a name="l00505"></a>00505 }; <span class="comment">// class task_group_context</span>
<a name="l00506"></a>00506
-<a name="l00508"></a>00508 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_set_ref_count( <span class="keywordtype">int</span> count );
-<a name="l00509"></a>00509
-<a name="l00511"></a>00511 internal::reference_count __TBB_EXPORTED_METHOD internal_decrement_ref_count();
+<a name="l00507"></a>00507 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
+<a name="l00508"></a>00508
+<a name="l00510"></a>00510
+<a name="l00511"></a><a class="code" href="a00311.html">00511</a> <span class="keyword">class </span><a class="code" href="a00311.html">task</a>: __TBB_TASK_BASE_ACCESS interface5::internal::task_base {
<a name="l00512"></a>00512
-<a name="l00513"></a>00513 <span class="keyword">protected</span>:
-<a name="l00515"></a><a class="code" href="a00291.html#2bce8ec6e44706e70128f5cf91b76e67">00515</a> <a class="code" href="a00291.html">task</a>() {prefix().extra_state=1;}
-<a name="l00516"></a>00516
-<a name="l00517"></a>00517 <span class="keyword">public</span>:
-<a name="l00519"></a><a class="code" href="a00291.html#98245ee0473f84cb19dbbf8c81134908">00519</a> <span class="keyword">virtual</span> ~<a class="code" href="a00291.html">task</a>() {}
-<a name="l00520"></a>00520
-<a name="l00522"></a>00522 <span class="keyword">virtual</span> <a class="code" href="a00291.html">task</a>* execute() = 0;
-<a name="l00523"></a>00523
-<a name="l00525"></a><a class="code" href="a00291.html#4a3c415562d17905390ea5b49d12293e">00525</a> <span class="keyword">enum</span> <a class="code" href="a00291.html#4a3c415562d17905390ea5b49d12293e">state_type</a> {
-<a name="l00527"></a>00527 executing,
-<a name="l00529"></a>00529 reexecute,
-<a name="l00531"></a>00531 ready,
-<a name="l00533"></a>00533 allocated,
-<a name="l00535"></a>00535 freed,
-<a name="l00537"></a>00537 recycle
-<a name="l00538"></a>00538 };
-<a name="l00539"></a>00539
-<a name="l00540"></a>00540 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00541"></a>00541 <span class="comment">// Allocating tasks</span>
-<a name="l00542"></a>00542 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00543"></a>00543
-<a name="l00545"></a><a class="code" href="a00291.html#23acb0da0afd690da797f9f882027d34">00545</a> <span class="keyword">static</span> internal::allocate_root_proxy allocate_root() {
-<a name="l00546"></a>00546 <span class="keywordflow">return</span> internal::allocate_root_proxy();
-<a name="l00547"></a>00547 }
-<a name="l00548"></a>00548
-<a name="l00549"></a>00549 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00551"></a><a class="code" href="a00291.html#8ccc518caf31075a3e073996d2d240a4">00551</a> <span class="preprocessor"> static internal::allocate_root_with_context_proxy allocate_root( task_group_context& ctx ) {</span>
-<a name="l00552"></a>00552 <span class="preprocessor"></span> <span class="keywordflow">return</span> internal::allocate_root_with_context_proxy(ctx);
+<a name="l00514"></a>00514 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_set_ref_count( <span class="keywordtype">int</span> count );
+<a name="l00515"></a>00515
+<a name="l00517"></a>00517 internal::reference_count __TBB_EXPORTED_METHOD internal_decrement_ref_count();
+<a name="l00518"></a>00518
+<a name="l00519"></a>00519 <span class="keyword">protected</span>:
+<a name="l00521"></a><a class="code" href="a00311.html#2bce8ec6e44706e70128f5cf91b76e67">00521</a> <a class="code" href="a00311.html">task</a>() {prefix().extra_state=1;}
+<a name="l00522"></a>00522
+<a name="l00523"></a>00523 <span class="keyword">public</span>:
+<a name="l00525"></a><a class="code" href="a00311.html#98245ee0473f84cb19dbbf8c81134908">00525</a> <span class="keyword">virtual</span> ~<a class="code" href="a00311.html">task</a>() {}
+<a name="l00526"></a>00526
+<a name="l00528"></a>00528 <span class="keyword">virtual</span> <a class="code" href="a00311.html">task</a>* execute() = 0;
+<a name="l00529"></a>00529
+<a name="l00531"></a><a class="code" href="a00311.html#4a3c415562d17905390ea5b49d12293e">00531</a> <span class="keyword">enum</span> <a class="code" href="a00311.html#4a3c415562d17905390ea5b49d12293e">state_type</a> {
+<a name="l00533"></a>00533 executing,
+<a name="l00535"></a>00535 reexecute,
+<a name="l00537"></a>00537 ready,
+<a name="l00539"></a>00539 allocated,
+<a name="l00541"></a>00541 freed,
+<a name="l00543"></a>00543 recycle
+<a name="l00544"></a>00544 };
+<a name="l00545"></a>00545
+<a name="l00546"></a>00546 <span class="comment">//------------------------------------------------------------------------</span>
+<a name="l00547"></a>00547 <span class="comment">// Allocating tasks</span>
+<a name="l00548"></a>00548 <span class="comment">//------------------------------------------------------------------------</span>
+<a name="l00549"></a>00549
+<a name="l00551"></a><a class="code" href="a00311.html#23acb0da0afd690da797f9f882027d34">00551</a> <span class="keyword">static</span> internal::allocate_root_proxy allocate_root() {
+<a name="l00552"></a>00552 <span class="keywordflow">return</span> internal::allocate_root_proxy();
<a name="l00553"></a>00553 }
-<a name="l00554"></a>00554 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
-<a name="l00555"></a>00555
-<a name="l00557"></a>00557
-<a name="l00558"></a><a class="code" href="a00291.html#1434c79a5138993269d034008bff7329">00558</a> internal::allocate_continuation_proxy& allocate_continuation() {
-<a name="l00559"></a>00559 <span class="keywordflow">return</span> *reinterpret_cast<internal::allocate_continuation_proxy*>(<span class="keyword">this</span>);
-<a name="l00560"></a>00560 }
+<a name="l00554"></a>00554
+<a name="l00555"></a>00555 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
+<a name="l00557"></a><a class="code" href="a00311.html#8ccc518caf31075a3e073996d2d240a4">00557</a> <span class="preprocessor"> static internal::allocate_root_with_context_proxy allocate_root( task_group_context& ctx ) {</span>
+<a name="l00558"></a>00558 <span class="preprocessor"></span> <span class="keywordflow">return</span> internal::allocate_root_with_context_proxy(ctx);
+<a name="l00559"></a>00559 }
+<a name="l00560"></a>00560 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
<a name="l00561"></a>00561
-<a name="l00563"></a><a class="code" href="a00291.html#1ff794f7053cd9148d5f280fbf07377f">00563</a> internal::allocate_child_proxy& allocate_child() {
-<a name="l00564"></a>00564 <span class="keywordflow">return</span> *reinterpret_cast<internal::allocate_child_proxy*>(<span class="keyword">this</span>);
-<a name="l00565"></a>00565 }
-<a name="l00566"></a>00566
-<a name="l00568"></a>00568 <span class="keyword">using</span> task_base::allocate_additional_child_of;
-<a name="l00569"></a>00569
-<a name="l00570"></a>00570 <span class="preprocessor">#if __TBB_DEPRECATED_TASK_INTERFACE</span>
-<a name="l00572"></a>00572 <span class="preprocessor"></span>
-<a name="l00576"></a>00576 <span class="preprocessor"> void __TBB_EXPORTED_METHOD destroy( task& t );</span>
-<a name="l00577"></a>00577 <span class="preprocessor"></span><span class="preprocessor">#else </span><span class="comment">/* !__TBB_DEPRECATED_TASK_INTERFACE */</span>
-<a name="l00579"></a>00579 using task_base::destroy;
-<a name="l00580"></a>00580 <span class="preprocessor">#endif </span><span class="comment">/* !__TBB_DEPRECATED_TASK_INTERFACE */</span>
-<a name="l00581"></a>00581
-<a name="l00582"></a>00582 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00583"></a>00583 <span class="comment">// Recycling of tasks</span>
-<a name="l00584"></a>00584 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00585"></a>00585
+<a name="l00563"></a>00563
+<a name="l00564"></a><a class="code" href="a00311.html#1434c79a5138993269d034008bff7329">00564</a> internal::allocate_continuation_proxy& allocate_continuation() {
+<a name="l00565"></a>00565 <span class="keywordflow">return</span> *reinterpret_cast<internal::allocate_continuation_proxy*>(<span class="keyword">this</span>);
+<a name="l00566"></a>00566 }
+<a name="l00567"></a>00567
+<a name="l00569"></a><a class="code" href="a00311.html#1ff794f7053cd9148d5f280fbf07377f">00569</a> internal::allocate_child_proxy& allocate_child() {
+<a name="l00570"></a>00570 <span class="keywordflow">return</span> *reinterpret_cast<internal::allocate_child_proxy*>(<span class="keyword">this</span>);
+<a name="l00571"></a>00571 }
+<a name="l00572"></a>00572
+<a name="l00574"></a>00574 <span class="keyword">using</span> task_base::allocate_additional_child_of;
+<a name="l00575"></a>00575
+<a name="l00576"></a>00576 <span class="preprocessor">#if __TBB_DEPRECATED_TASK_INTERFACE</span>
+<a name="l00578"></a>00578 <span class="preprocessor"></span>
+<a name="l00582"></a>00582 <span class="preprocessor"> void __TBB_EXPORTED_METHOD destroy( task& t );</span>
+<a name="l00583"></a>00583 <span class="preprocessor"></span><span class="preprocessor">#else </span><span class="comment">/* !__TBB_DEPRECATED_TASK_INTERFACE */</span>
+<a name="l00585"></a>00585 using task_base::destroy;
+<a name="l00586"></a>00586 <span class="preprocessor">#endif </span><span class="comment">/* !__TBB_DEPRECATED_TASK_INTERFACE */</span>
<a name="l00587"></a>00587
-<a name="l00593"></a><a class="code" href="a00291.html#a67a79e18f62b43a623a00cfbd76db4c">00593</a> <span class="keywordtype">void</span> recycle_as_continuation() {
-<a name="l00594"></a>00594 __TBB_ASSERT( prefix().state==executing, <span class="stringliteral">"execute not running?"</span> );
-<a name="l00595"></a>00595 prefix().state = allocated;
-<a name="l00596"></a>00596 }
-<a name="l00597"></a>00597
-<a name="l00599"></a>00599
-<a name="l00601"></a><a class="code" href="a00291.html#3b290d14109704e2b69dc1ac980a7a76">00601</a> <span class="keywordtype">void</span> recycle_as_safe_continuation() {
-<a name="l00602"></a>00602 __TBB_ASSERT( prefix().state==executing, <span class="stringliteral">"execute not running?"</span> );
-<a name="l00603"></a>00603 prefix().state = recycle;
-<a name="l00604"></a>00604 }
+<a name="l00588"></a>00588 <span class="comment">//------------------------------------------------------------------------</span>
+<a name="l00589"></a>00589 <span class="comment">// Recycling of tasks</span>
+<a name="l00590"></a>00590 <span class="comment">//------------------------------------------------------------------------</span>
+<a name="l00591"></a>00591
+<a name="l00593"></a>00593
+<a name="l00599"></a><a class="code" href="a00311.html#a67a79e18f62b43a623a00cfbd76db4c">00599</a> <span class="keywordtype">void</span> recycle_as_continuation() {
+<a name="l00600"></a>00600 __TBB_ASSERT( prefix().state==executing, <span class="stringliteral">"execute not running?"</span> );
+<a name="l00601"></a>00601 prefix().state = allocated;
+<a name="l00602"></a>00602 }
+<a name="l00603"></a>00603
<a name="l00605"></a>00605
-<a name="l00607"></a><a class="code" href="a00291.html#db399855177438bbc9cc61d508dae8d2">00607</a> <span class="keywordtype">void</span> recycle_as_child_of( <a class="code" href="a00291.html">task</a>& new_parent ) {
-<a name="l00608"></a>00608 internal::task_prefix& p = prefix();
-<a name="l00609"></a>00609 __TBB_ASSERT( prefix().state==executing||prefix().state==allocated, <span class="stringliteral">"execute not running, or already recycled"</span> );
-<a name="l00610"></a>00610 __TBB_ASSERT( prefix().ref_count==0, <span class="stringliteral">"no child tasks allowed when recycled as a child"</span> );
-<a name="l00611"></a>00611 __TBB_ASSERT( p.parent==NULL, <span class="stringliteral">"parent must be null"</span> );
-<a name="l00612"></a>00612 __TBB_ASSERT( new_parent.<a class="code" href="a00291.html#ac578940848e9dc8b4f1f2bcf17b627d">prefix</a>().state<=recycle, <span class="stringliteral">"corrupt parent's state"</span> );
-<a name="l00613"></a>00613 __TBB_ASSERT( new_parent.<a class="code" href="a00291.html#ac578940848e9dc8b4f1f2bcf17b627d">prefix</a>().state!=freed, <span class="stringliteral">"parent already freed"</span> );
-<a name="l00614"></a>00614 p.state = allocated;
-<a name="l00615"></a>00615 p.parent = &new_parent;
-<a name="l00616"></a>00616 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00617"></a>00617 <span class="preprocessor"></span> p.<a class="code" href="a00291.html#d8c36a93f3972590fbb65ff1cef3173b">context</a> = new_parent.<a class="code" href="a00291.html#ac578940848e9dc8b4f1f2bcf17b627d">prefix</a>().context;
-<a name="l00618"></a>00618 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
-<a name="l00619"></a>00619 }
-<a name="l00620"></a>00620
-<a name="l00622"></a>00622
-<a name="l00623"></a><a class="code" href="a00291.html#4f1be9bbcdb487830dbe298b68d85144">00623</a> <span class="keywordtype">void</span> recycle_to_reexecute() {
-<a name="l00624"></a>00624 __TBB_ASSERT( prefix().state==executing, <span class="stringliteral">"execute not running, or already recycled"</span> );
-<a name="l00625"></a>00625 __TBB_ASSERT( prefix().ref_count==0, <span class="stringliteral">"no child tasks allowed when recycled for reexecution"</span> );
-<a name="l00626"></a>00626 prefix().state = reexecute;
-<a name="l00627"></a>00627 }
+<a name="l00607"></a><a class="code" href="a00311.html#3b290d14109704e2b69dc1ac980a7a76">00607</a> <span class="keywordtype">void</span> recycle_as_safe_continuation() {
+<a name="l00608"></a>00608 __TBB_ASSERT( prefix().state==executing, <span class="stringliteral">"execute not running?"</span> );
+<a name="l00609"></a>00609 prefix().state = recycle;
+<a name="l00610"></a>00610 }
+<a name="l00611"></a>00611
+<a name="l00613"></a><a class="code" href="a00311.html#db399855177438bbc9cc61d508dae8d2">00613</a> <span class="keywordtype">void</span> recycle_as_child_of( <a class="code" href="a00311.html">task</a>& new_parent ) {
+<a name="l00614"></a>00614 internal::task_prefix& p = prefix();
+<a name="l00615"></a>00615 __TBB_ASSERT( prefix().state==executing||prefix().state==allocated, <span class="stringliteral">"execute not running, or already recycled"</span> );
+<a name="l00616"></a>00616 __TBB_ASSERT( prefix().ref_count==0, <span class="stringliteral">"no child tasks allowed when recycled as a child"</span> );
+<a name="l00617"></a>00617 __TBB_ASSERT( p.parent==NULL, <span class="stringliteral">"parent must be null"</span> );
+<a name="l00618"></a>00618 __TBB_ASSERT( new_parent.<a class="code" href="a00311.html#ac578940848e9dc8b4f1f2bcf17b627d">prefix</a>().state<=recycle, <span class="stringliteral">"corrupt parent's state"</span> );
+<a name="l00619"></a>00619 __TBB_ASSERT( new_parent.<a class="code" href="a00311.html#ac578940848e9dc8b4f1f2bcf17b627d">prefix</a>().state!=freed, <span class="stringliteral">"parent already freed"</span> );
+<a name="l00620"></a>00620 p.state = allocated;
+<a name="l00621"></a>00621 p.parent = &new_parent;
+<a name="l00622"></a>00622 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
+<a name="l00623"></a>00623 <span class="preprocessor"></span> p.<a class="code" href="a00311.html#d8c36a93f3972590fbb65ff1cef3173b">context</a> = new_parent.<a class="code" href="a00311.html#ac578940848e9dc8b4f1f2bcf17b627d">prefix</a>().context;
+<a name="l00624"></a>00624 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
+<a name="l00625"></a>00625 }
+<a name="l00626"></a>00626
<a name="l00628"></a>00628
-<a name="l00629"></a>00629 <span class="comment">// All depth-related methods are obsolete, and are retained for the sake </span>
-<a name="l00630"></a>00630 <span class="comment">// of backward source compatibility only</span>
-<a name="l00631"></a>00631 intptr_t depth()<span class="keyword"> const </span>{<span class="keywordflow">return</span> 0;}
-<a name="l00632"></a>00632 <span class="keywordtype">void</span> set_depth( intptr_t ) {}
-<a name="l00633"></a>00633 <span class="keywordtype">void</span> add_to_depth( <span class="keywordtype">int</span> ) {}
+<a name="l00629"></a><a class="code" href="a00311.html#4f1be9bbcdb487830dbe298b68d85144">00629</a> <span class="keywordtype">void</span> recycle_to_reexecute() {
+<a name="l00630"></a>00630 __TBB_ASSERT( prefix().state==executing, <span class="stringliteral">"execute not running, or already recycled"</span> );
+<a name="l00631"></a>00631 __TBB_ASSERT( prefix().ref_count==0, <span class="stringliteral">"no child tasks allowed when recycled for reexecution"</span> );
+<a name="l00632"></a>00632 prefix().state = reexecute;
+<a name="l00633"></a>00633 }
<a name="l00634"></a>00634
-<a name="l00635"></a>00635
-<a name="l00636"></a>00636 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00637"></a>00637 <span class="comment">// Spawning and blocking</span>
-<a name="l00638"></a>00638 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00639"></a>00639
-<a name="l00641"></a><a class="code" href="a00291.html#06a4206a57e8e12a439b14d6d41cfd92">00641</a> <span class="keywordtype">void</span> set_ref_count( <span class="keywordtype">int</span> count ) {
-<a name="l00642"></a>00642 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT</span>
-<a name="l00643"></a>00643 <span class="preprocessor"></span> internal_set_ref_count(count);
-<a name="l00644"></a>00644 <span class="preprocessor">#else</span>
-<a name="l00645"></a>00645 <span class="preprocessor"></span> prefix().ref_count = count;
-<a name="l00646"></a>00646 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT */</span>
-<a name="l00647"></a>00647 }
-<a name="l00648"></a>00648
-<a name="l00650"></a>00650
-<a name="l00651"></a><a class="code" href="a00291.html#f5fb43c7ad0de5a4b95703cebc39e345">00651</a> <span class="keywordtype">void</span> increment_ref_count() {
-<a name="l00652"></a>00652 __TBB_FetchAndIncrementWacquire( &prefix().ref_count );
+<a name="l00635"></a>00635 <span class="comment">// All depth-related methods are obsolete, and are retained for the sake</span>
+<a name="l00636"></a>00636 <span class="comment">// of backward source compatibility only</span>
+<a name="l00637"></a>00637 intptr_t depth()<span class="keyword"> const </span>{<span class="keywordflow">return</span> 0;}
+<a name="l00638"></a>00638 <span class="keywordtype">void</span> set_depth( intptr_t ) {}
+<a name="l00639"></a>00639 <span class="keywordtype">void</span> add_to_depth( <span class="keywordtype">int</span> ) {}
+<a name="l00640"></a>00640
+<a name="l00641"></a>00641
+<a name="l00642"></a>00642 <span class="comment">//------------------------------------------------------------------------</span>
+<a name="l00643"></a>00643 <span class="comment">// Spawning and blocking</span>
+<a name="l00644"></a>00644 <span class="comment">//------------------------------------------------------------------------</span>
+<a name="l00645"></a>00645
+<a name="l00647"></a><a class="code" href="a00311.html#06a4206a57e8e12a439b14d6d41cfd92">00647</a> <span class="keywordtype">void</span> set_ref_count( <span class="keywordtype">int</span> count ) {
+<a name="l00648"></a>00648 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT</span>
+<a name="l00649"></a>00649 <span class="preprocessor"></span> internal_set_ref_count(count);
+<a name="l00650"></a>00650 <span class="preprocessor">#else</span>
+<a name="l00651"></a>00651 <span class="preprocessor"></span> prefix().ref_count = count;
+<a name="l00652"></a>00652 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT */</span>
<a name="l00653"></a>00653 }
<a name="l00654"></a>00654
<a name="l00656"></a>00656
-<a name="l00657"></a><a class="code" href="a00291.html#ef4680f5c148020c5e7e43ddef44cd5d">00657</a> <span class="keywordtype">int</span> decrement_ref_count() {
-<a name="l00658"></a>00658 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT</span>
-<a name="l00659"></a>00659 <span class="preprocessor"></span> <span class="keywordflow">return</span> int(internal_decrement_ref_count());
-<a name="l00660"></a>00660 <span class="preprocessor">#else</span>
-<a name="l00661"></a>00661 <span class="preprocessor"></span> <span class="keywordflow">return</span> int(__TBB_FetchAndDecrementWrelease( &prefix().ref_count ))-1;
-<a name="l00662"></a>00662 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT */</span>
-<a name="l00663"></a>00663 }
-<a name="l00664"></a>00664
-<a name="l00666"></a>00666 <span class="keyword">using</span> task_base::spawn;
-<a name="l00667"></a>00667
-<a name="l00669"></a><a class="code" href="a00291.html#3ce28ca9baa771cfc37ecd72e69c4f3c">00669</a> <span class="keywordtype">void</span> spawn_and_wait_for_all( <a class="code" href="a00291.html">task</a>& child ) {
-<a name="l00670"></a>00670 prefix().owner->wait_for_all( *<span class="keyword">this</span>, &child );
-<a name="l00671"></a>00671 }
-<a name="l00672"></a>00672
-<a name="l00674"></a>00674 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD spawn_and_wait_for_all( <a class="code" href="a00294.html">task_list</a>& list );
-<a name="l00675"></a>00675
-<a name="l00677"></a><a class="code" href="a00291.html#ce8ce689c26a4ddf343829bc3c73290a">00677</a> <span class="keyword">static</span> <span class="keywordtype">void</span> spawn_root_and_wait( <a class="code" href="a00291.html">task</a>& root ) {
-<a name="l00678"></a>00678 root.<a class="code" href="a00291.html#ac578940848e9dc8b4f1f2bcf17b627d">prefix</a>().owner->spawn_root_and_wait( root, root.<a class="code" href="a00291.html#ac578940848e9dc8b4f1f2bcf17b627d">prefix</a>().next );
-<a name="l00679"></a>00679 }
-<a name="l00680"></a>00680
-<a name="l00682"></a>00682
-<a name="l00684"></a>00684 <span class="keyword">static</span> <span class="keywordtype">void</span> spawn_root_and_wait( <a class="code" href="a00294.html">task_list</a>& root_list );
-<a name="l00685"></a>00685
-<a name="l00687"></a>00687
-<a name="l00688"></a><a class="code" href="a00291.html#53d2615ad9c38859b4c8080936600283">00688</a> <span class="keywordtype">void</span> wait_for_all() {
-<a name="l00689"></a>00689 prefix().owner->wait_for_all( *<span class="keyword">this</span>, NULL );
-<a name="l00690"></a>00690 }
+<a name="l00657"></a><a class="code" href="a00311.html#f5fb43c7ad0de5a4b95703cebc39e345">00657</a> <span class="keywordtype">void</span> increment_ref_count() {
+<a name="l00658"></a>00658 __TBB_FetchAndIncrementWacquire( &prefix().ref_count );
+<a name="l00659"></a>00659 }
+<a name="l00660"></a>00660
+<a name="l00662"></a>00662
+<a name="l00663"></a><a class="code" href="a00311.html#ef4680f5c148020c5e7e43ddef44cd5d">00663</a> <span class="keywordtype">int</span> decrement_ref_count() {
+<a name="l00664"></a>00664 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT</span>
+<a name="l00665"></a>00665 <span class="preprocessor"></span> <span class="keywordflow">return</span> int(internal_decrement_ref_count());
+<a name="l00666"></a>00666 <span class="preprocessor">#else</span>
+<a name="l00667"></a>00667 <span class="preprocessor"></span> <span class="keywordflow">return</span> int(__TBB_FetchAndDecrementWrelease( &prefix().ref_count ))-1;
+<a name="l00668"></a>00668 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT */</span>
+<a name="l00669"></a>00669 }
+<a name="l00670"></a>00670
+<a name="l00672"></a>00672 <span class="keyword">using</span> task_base::spawn;
+<a name="l00673"></a>00673
+<a name="l00675"></a><a class="code" href="a00311.html#3ce28ca9baa771cfc37ecd72e69c4f3c">00675</a> <span class="keywordtype">void</span> spawn_and_wait_for_all( <a class="code" href="a00311.html">task</a>& child ) {
+<a name="l00676"></a>00676 prefix().owner->wait_for_all( *<span class="keyword">this</span>, &child );
+<a name="l00677"></a>00677 }
+<a name="l00678"></a>00678
+<a name="l00680"></a>00680 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD spawn_and_wait_for_all( <a class="code" href="a00315.html">task_list</a>& list );
+<a name="l00681"></a>00681
+<a name="l00683"></a><a class="code" href="a00311.html#ce8ce689c26a4ddf343829bc3c73290a">00683</a> <span class="keyword">static</span> <span class="keywordtype">void</span> spawn_root_and_wait( <a class="code" href="a00311.html">task</a>& root ) {
+<a name="l00684"></a>00684 root.<a class="code" href="a00311.html#ac578940848e9dc8b4f1f2bcf17b627d">prefix</a>().owner->spawn_root_and_wait( root, root.<a class="code" href="a00311.html#ac578940848e9dc8b4f1f2bcf17b627d">prefix</a>().next );
+<a name="l00685"></a>00685 }
+<a name="l00686"></a>00686
+<a name="l00688"></a>00688
+<a name="l00690"></a>00690 <span class="keyword">static</span> <span class="keywordtype">void</span> spawn_root_and_wait( <a class="code" href="a00315.html">task_list</a>& root_list );
<a name="l00691"></a>00691
-<a name="l00693"></a>00693 <span class="preprocessor">#if TBB_PREVIEW_TASK_PRIORITY</span>
-<a name="l00694"></a>00694 <span class="preprocessor"></span>
-<a name="l00704"></a>00704 <span class="preprocessor">#endif </span><span class="comment">/* TBB_PREVIEW_TASK_PRIORITY */</span>
-<a name="l00705"></a><a class="code" href="a00291.html#8365d063c0cc9d7bd616bca47256b93c">00705</a> <span class="keyword">static</span> <span class="keywordtype">void</span> enqueue( <a class="code" href="a00291.html">task</a>& t ) {
-<a name="l00706"></a>00706 t.<a class="code" href="a00291.html#ac578940848e9dc8b4f1f2bcf17b627d">prefix</a>().owner->enqueue( t, NULL );
-<a name="l00707"></a>00707 }
-<a name="l00708"></a>00708
-<a name="l00709"></a>00709 <span class="preprocessor">#if TBB_PREVIEW_TASK_PRIORITY</span>
-<a name="l00711"></a><a class="code" href="a00291.html#fe6bf6aaf84e664134fabb6c4f409ea9">00711</a> <span class="preprocessor"> static void enqueue( task& t, priority_t p ) {</span>
-<a name="l00712"></a>00712 <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="l00713"></a>00713 t.prefix().owner->enqueue( t, (<span class="keywordtype">void</span>*)p );
-<a name="l00714"></a>00714 }
-<a name="l00715"></a>00715 <span class="preprocessor">#endif </span><span class="comment">/* TBB_PREVIEW_TASK_PRIORITY */</span>
-<a name="l00716"></a>00716
-<a name="l00718"></a>00718 <span class="keyword">static</span> <a class="code" href="a00291.html">task</a>& __TBB_EXPORTED_FUNC <span class="keyword">self</span>();
-<a name="l00719"></a>00719
-<a name="l00721"></a><a class="code" href="a00291.html#314e98ee4347ccec83efcb9ee22e8596">00721</a> <a class="code" href="a00291.html">task</a>* parent()<span class="keyword"> const </span>{<span class="keywordflow">return</span> prefix().parent;}
+<a name="l00693"></a>00693
+<a name="l00694"></a><a class="code" href="a00311.html#53d2615ad9c38859b4c8080936600283">00694</a> <span class="keywordtype">void</span> wait_for_all() {
+<a name="l00695"></a>00695 prefix().owner->wait_for_all( *<span class="keyword">this</span>, NULL );
+<a name="l00696"></a>00696 }
+<a name="l00697"></a>00697
+<a name="l00699"></a>00699 <span class="preprocessor">#if __TBB_TASK_PRIORITY</span>
+<a name="l00700"></a>00700 <span class="preprocessor"></span>
+<a name="l00710"></a>00710 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_PRIORITY */</span>
+<a name="l00711"></a><a class="code" href="a00311.html#8365d063c0cc9d7bd616bca47256b93c">00711</a> <span class="keyword">static</span> <span class="keywordtype">void</span> enqueue( <a class="code" href="a00311.html">task</a>& t ) {
+<a name="l00712"></a>00712 t.<a class="code" href="a00311.html#ac578940848e9dc8b4f1f2bcf17b627d">prefix</a>().owner->enqueue( t, NULL );
+<a name="l00713"></a>00713 }
+<a name="l00714"></a>00714
+<a name="l00715"></a>00715 <span class="preprocessor">#if __TBB_TASK_PRIORITY</span>
+<a name="l00717"></a><a class="code" href="a00311.html#fe6bf6aaf84e664134fabb6c4f409ea9">00717</a> <span class="preprocessor"> static void enqueue( task& t, priority_t p ) {</span>
+<a name="l00718"></a>00718 <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="l00719"></a>00719 t.prefix().owner->enqueue( t, (<span class="keywordtype">void</span>*)p );
+<a name="l00720"></a>00720 }
+<a name="l00721"></a>00721 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_PRIORITY */</span>
<a name="l00722"></a>00722
-<a name="l00723"></a>00723 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00725"></a>00725 <span class="preprocessor"></span>
-<a name="l00726"></a><a class="code" href="a00291.html#d8c36a93f3972590fbb65ff1cef3173b">00726</a> <span class="preprocessor"> task_group_context* context() {return prefix().context;}</span>
-<a name="l00727"></a>00727 <span class="preprocessor"></span>
-<a name="l00729"></a><a class="code" href="a00291.html#5987123486afca36ddebb9e2a8b7779a">00729</a> <a class="code" href="a00293.html">task_group_context</a>* group () { <span class="keywordflow">return</span> prefix().context; }
-<a name="l00730"></a>00730 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
-<a name="l00731"></a>00731
-<a name="l00733"></a><a class="code" href="a00291.html#f9169402702f56bf519448aaf34450aa">00733</a> <span class="keywordtype">bool</span> is_stolen_task()<span class="keyword"> const </span>{
-<a name="l00734"></a>00734 <span class="keywordflow">return</span> (prefix().extra_state & 0x80)!=0;
+<a name="l00724"></a>00724 <span class="keyword">static</span> <a class="code" href="a00311.html">task</a>& __TBB_EXPORTED_FUNC <span class="keyword">self</span>();
+<a name="l00725"></a>00725
+<a name="l00727"></a><a class="code" href="a00311.html#314e98ee4347ccec83efcb9ee22e8596">00727</a> <a class="code" href="a00311.html">task</a>* parent()<span class="keyword"> const </span>{<span class="keywordflow">return</span> prefix().parent;}
+<a name="l00728"></a>00728
+<a name="l00730"></a><a class="code" href="a00311.html#d2eaf79fcaa3ae473e3bd3f44bd8a464">00730</a> <span class="keywordtype">void</span> set_parent(<a class="code" href="a00311.html">task</a>* p) {
+<a name="l00731"></a>00731 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
+<a name="l00732"></a>00732 <span class="preprocessor"></span> __TBB_ASSERT(prefix().context == p-><a class="code" href="a00311.html#ac578940848e9dc8b4f1f2bcf17b627d">prefix</a>().context, <span class="stringliteral">"The tasks must be in the same context"</span>);
+<a name="l00733"></a>00733 <span class="preprocessor">#endif</span>
+<a name="l00734"></a>00734 <span class="preprocessor"></span> prefix().parent = p;
<a name="l00735"></a>00735 }
<a name="l00736"></a>00736
-<a name="l00737"></a>00737 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00738"></a>00738 <span class="comment">// Debugging</span>
-<a name="l00739"></a>00739 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00740"></a>00740
-<a name="l00742"></a><a class="code" href="a00291.html#0af7b2d7e6e8b4333b2accfce3dfb374">00742</a> <a class="code" href="a00291.html#4a3c415562d17905390ea5b49d12293e">state_type</a> state()<span class="keyword"> const </span>{<span class="keywordflow">return</span> <a class="code" href="a00291.html#4a3c415562d17905390ea5b49d12293e">state_type</a>(prefix().state);}
-<a name="l00743"></a>00743
-<a name="l00745"></a><a class="code" href="a00291.html#ad774f55eaec008ae02b236423209ced">00745</a> <span class="keywordtype">int</span> ref_count()<span class="keyword"> const </span>{
-<a name="l00746"></a>00746 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00747"></a>00747 <span class="preprocessor"></span> internal::reference_count ref_count_ = prefix().ref_count;
-<a name="l00748"></a>00748 __TBB_ASSERT( ref_count_==<span class="keywordtype">int</span>(ref_count_), <span class="stringliteral">"integer overflow error"</span>);
-<a name="l00749"></a>00749 <span class="preprocessor">#endif</span>
-<a name="l00750"></a>00750 <span class="preprocessor"></span> <span class="keywordflow">return</span> int(prefix().ref_count);
-<a name="l00751"></a>00751 }
-<a name="l00752"></a>00752
-<a name="l00754"></a>00754 <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD is_owned_by_current_thread() <span class="keyword">const</span>;
-<a name="l00755"></a>00755
-<a name="l00756"></a>00756 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00757"></a>00757 <span class="comment">// Affinity</span>
-<a name="l00758"></a>00758 <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00759"></a>00759
-<a name="l00761"></a>00761
-<a name="l00762"></a><a class="code" href="a00291.html#d61bb32389d3857bf7511d69beaafb76">00762</a> <span class="keyword">typedef</span> internal::affinity_id affinity_id;
-<a name="l00763"></a>00763
-<a name="l00765"></a><a class="code" href="a00291.html#dca19d7a45487a7d67a0db517e2b57c9">00765</a> <span class="keywordtype">void</span> set_affinity( affinity_id <span class="keywordtype">id</span> ) {prefix().affinity = id;}
+<a name="l00737"></a>00737 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
+<a name="l00739"></a>00739 <span class="preprocessor"></span>
+<a name="l00740"></a><a class="code" href="a00311.html#d8c36a93f3972590fbb65ff1cef3173b">00740</a> <span class="preprocessor"> task_group_context* context() {return prefix().context;}</span>
+<a name="l00741"></a>00741 <span class="preprocessor"></span>
+<a name="l00743"></a><a class="code" href="a00311.html#5987123486afca36ddebb9e2a8b7779a">00743</a> <a class="code" href="a00314.html">task_group_context</a>* group () { <span class="keywordflow">return</span> prefix().<a class="code" href="a00311.html#d8c36a93f3972590fbb65ff1cef3173b">context</a>; }
+<a name="l00744"></a>00744 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
+<a name="l00745"></a>00745
+<a name="l00747"></a><a class="code" href="a00311.html#f9169402702f56bf519448aaf34450aa">00747</a> <span class="keywordtype">bool</span> is_stolen_task()<span class="keyword"> const </span>{
+<a name="l00748"></a>00748 <span class="keywordflow">return</span> (prefix().extra_state & 0x80)!=0;
+<a name="l00749"></a>00749 }
+<a name="l00750"></a>00750
+<a name="l00751"></a>00751 <span class="comment">//------------------------------------------------------------------------</span>
+<a name="l00752"></a>00752 <span class="comment">// Debugging</span>
+<a name="l00753"></a>00753 <span class="comment">//------------------------------------------------------------------------</span>
+<a name="l00754"></a>00754
+<a name="l00756"></a><a class="code" href="a00311.html#0af7b2d7e6e8b4333b2accfce3dfb374">00756</a> <a class="code" href="a00311.html#4a3c415562d17905390ea5b49d12293e">state_type</a> state()<span class="keyword"> const </span>{<span class="keywordflow">return</span> <a class="code" href="a00311.html#4a3c415562d17905390ea5b49d12293e">state_type</a>(prefix().state);}
+<a name="l00757"></a>00757
+<a name="l00759"></a><a class="code" href="a00311.html#ad774f55eaec008ae02b236423209ced">00759</a> <span class="keywordtype">int</span> ref_count()<span class="keyword"> const </span>{
+<a name="l00760"></a>00760 <span class="preprocessor">#if TBB_USE_ASSERT</span>
+<a name="l00761"></a>00761 <span class="preprocessor"></span> internal::reference_count ref_count_ = prefix().ref_count;
+<a name="l00762"></a>00762 __TBB_ASSERT( ref_count_==<span class="keywordtype">int</span>(ref_count_), <span class="stringliteral">"integer overflow error"</span>);
+<a name="l00763"></a>00763 <span class="preprocessor">#endif</span>
+<a name="l00764"></a>00764 <span class="preprocessor"></span> <span class="keywordflow">return</span> int(prefix().ref_count);
+<a name="l00765"></a>00765 }
<a name="l00766"></a>00766
-<a name="l00768"></a><a class="code" href="a00291.html#3a920a56b0bcf2801518fb45b2c9d2be">00768</a> affinity_id affinity()<span class="keyword"> const </span>{<span class="keywordflow">return</span> prefix().affinity;}
+<a name="l00768"></a>00768 <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD is_owned_by_current_thread() <span class="keyword">const</span>;
<a name="l00769"></a>00769
-<a name="l00771"></a>00771
-<a name="l00775"></a>00775 <span class="keyword">virtual</span> <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD note_affinity( affinity_id <span class="keywordtype">id</span> );
-<a name="l00776"></a>00776
-<a name="l00777"></a>00777 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00779"></a>00779 <span class="preprocessor"></span>
-<a name="l00789"></a>00789 <span class="preprocessor"> void __TBB_EXPORTED_METHOD change_group ( task_group_context& ctx );</span>
-<a name="l00790"></a>00790 <span class="preprocessor"></span>
-<a name="l00792"></a>00792
-<a name="l00793"></a><a class="code" href="a00291.html#0f3fb4aac549ab642022450a4bd13326">00793</a> <span class="keywordtype">bool</span> cancel_group_execution () { <span class="keywordflow">return</span> prefix().context->cancel_group_execution(); }
-<a name="l00794"></a>00794
-<a name="l00796"></a><a class="code" href="a00291.html#025f18118c057c4c8db87ff2ce8df975">00796</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="l00797"></a>00797 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
-<a name="l00798"></a>00798
-<a name="l00799"></a>00799 <span class="preprocessor">#if TBB_PREVIEW_TASK_PRIORITY</span>
-<a name="l00801"></a><a class="code" href="a00291.html#9ac8d1542d67d9d80121ff986801ac26">00801</a> <span class="preprocessor"> void set_group_priority ( priority_t p ) { prefix().context->set_priority(p); }</span>
-<a name="l00802"></a>00802 <span class="preprocessor"></span>
-<a name="l00804"></a><a class="code" href="a00291.html#e1d969a1ccab6796e3b8b2c1a5be33d2">00804</a> priority_t group_priority ()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> prefix().context->priority(); }
-<a name="l00805"></a>00805
-<a name="l00806"></a>00806 <span class="preprocessor">#endif </span><span class="comment">/* TBB_PREVIEW_TASK_PRIORITY */</span>
-<a name="l00807"></a>00807
-<a name="l00808"></a>00808 <span class="keyword">private</span>:
-<a name="l00809"></a>00809 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00292.html">interface5::internal::task_base</a>;
-<a name="l00810"></a>00810 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00294.html">task_list</a>;
-<a name="l00811"></a>00811 <span class="keyword">friend</span> <span class="keyword">class </span>internal::scheduler;
-<a name="l00812"></a>00812 <span class="keyword">friend</span> <span class="keyword">class </span>internal::allocate_root_proxy;
-<a name="l00813"></a>00813 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00814"></a>00814 <span class="preprocessor"></span> <span class="keyword">friend</span> <span class="keyword">class </span>internal::allocate_root_with_context_proxy;
-<a name="l00815"></a>00815 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
-<a name="l00816"></a>00816 <span class="keyword">friend</span> <span class="keyword">class </span>internal::allocate_continuation_proxy;
-<a name="l00817"></a>00817 <span class="keyword">friend</span> <span class="keyword">class </span>internal::allocate_child_proxy;
-<a name="l00818"></a>00818 <span class="keyword">friend</span> <span class="keyword">class </span>internal::allocate_additional_child_of_proxy;
-<a name="l00819"></a>00819
+<a name="l00770"></a>00770 <span class="comment">//------------------------------------------------------------------------</span>
+<a name="l00771"></a>00771 <span class="comment">// Affinity</span>
+<a name="l00772"></a>00772 <span class="comment">//------------------------------------------------------------------------</span>
+<a name="l00773"></a>00773
+<a name="l00775"></a>00775
+<a name="l00776"></a><a class="code" href="a00311.html#d61bb32389d3857bf7511d69beaafb76">00776</a> <span class="keyword">typedef</span> internal::affinity_id affinity_id;
+<a name="l00777"></a>00777
+<a name="l00779"></a><a class="code" href="a00311.html#dca19d7a45487a7d67a0db517e2b57c9">00779</a> <span class="keywordtype">void</span> set_affinity( affinity_id <span class="keywordtype">id</span> ) {prefix().affinity = id;}
+<a name="l00780"></a>00780
+<a name="l00782"></a><a class="code" href="a00311.html#3a920a56b0bcf2801518fb45b2c9d2be">00782</a> affinity_id affinity()<span class="keyword"> const </span>{<span class="keywordflow">return</span> prefix().affinity;}
+<a name="l00783"></a>00783
+<a name="l00785"></a>00785
+<a name="l00789"></a>00789 <span class="keyword">virtual</span> <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD note_affinity( affinity_id <span class="keywordtype">id</span> );
+<a name="l00790"></a>00790
+<a name="l00791"></a>00791 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
+<a name="l00793"></a>00793 <span class="preprocessor"></span>
+<a name="l00803"></a>00803 <span class="preprocessor"> void __TBB_EXPORTED_METHOD change_group ( task_group_context& ctx );</span>
+<a name="l00804"></a>00804 <span class="preprocessor"></span>
+<a name="l00806"></a>00806
+<a name="l00807"></a><a class="code" href="a00311.html#0f3fb4aac549ab642022450a4bd13326">00807</a> <span class="keywordtype">bool</span> cancel_group_execution () { <span class="keywordflow">return</span> prefix().context->cancel_group_execution(); }
+<a name="l00808"></a>00808
+<a name="l00810"></a><a class="code" href="a00311.html#025f18118c057c4c8db87ff2ce8df975">00810</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="l00811"></a>00811 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
+<a name="l00812"></a>00812
+<a name="l00813"></a>00813 <span class="preprocessor">#if __TBB_TASK_PRIORITY</span>
+<a name="l00815"></a><a class="code" href="a00311.html#9ac8d1542d67d9d80121ff986801ac26">00815</a> <span class="preprocessor"> void set_group_priority ( priority_t p ) { prefix().context->set_priority(p); }</span>
+<a name="l00816"></a>00816 <span class="preprocessor"></span>
+<a name="l00818"></a><a class="code" href="a00311.html#e1d969a1ccab6796e3b8b2c1a5be33d2">00818</a> priority_t group_priority ()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> prefix().context->priority(); }
+<a name="l00819"></a>00819
+<a name="l00820"></a>00820 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_PRIORITY */</span>
<a name="l00821"></a>00821
-<a name="l00822"></a>00822 internal::task_prefix& prefix( internal::version_tag* = NULL )<span class="keyword"> const </span>{
-<a name="l00823"></a>00823 <span class="keywordflow">return</span> reinterpret_cast<internal::task_prefix*>(const_cast<task*>(<span class="keyword">this</span>))[-1];
-<a name="l00824"></a>00824 }
-<a name="l00825"></a>00825 }; <span class="comment">// class task</span>
-<a name="l00826"></a>00826
-<a name="l00828"></a>00828
-<a name="l00829"></a><a class="code" href="a00242.html">00829</a> <span class="keyword">class </span><a class="code" href="a00242.html">empty_task</a>: <span class="keyword">public</span> <a class="code" href="a00291.html">task</a> {
-<a name="l00830"></a>00830 <span class="comment">/*override*/</span> <a class="code" href="a00291.html">task</a>* execute() {
-<a name="l00831"></a>00831 <span class="keywordflow">return</span> NULL;
-<a name="l00832"></a>00832 }
-<a name="l00833"></a>00833 };
-<a name="l00834"></a>00834
-<a name="l00836"></a>00836
-<a name="l00838"></a><a class="code" href="a00294.html">00838</a> <span class="keyword">class </span><a class="code" href="a00294.html">task_list</a>: internal::no_copy {
-<a name="l00839"></a>00839 <span class="keyword">private</span>:
-<a name="l00840"></a>00840 <a class="code" href="a00291.html">task</a>* first;
-<a name="l00841"></a>00841 <a class="code" href="a00291.html">task</a>** next_ptr;
-<a name="l00842"></a>00842 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00291.html">task</a>;
-<a name="l00843"></a>00843 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00292.html">interface5::internal::task_base</a>;
-<a name="l00844"></a>00844 <span class="keyword">public</span>:
-<a name="l00846"></a><a class="code" href="a00294.html#416341c2047eaef50417b41eaf7e9de6">00846</a> <a class="code" href="a00294.html#416341c2047eaef50417b41eaf7e9de6">task_list</a>() : first(NULL), next_ptr(&first) {}
-<a name="l00847"></a>00847
-<a name="l00849"></a><a class="code" href="a00294.html#6d438f1499a02db1e59c24ab6043e5ba">00849</a> <a class="code" href="a00294.html#6d438f1499a02db1e59c24ab6043e5ba">~task_list</a>() {}
+<a name="l00822"></a>00822 <span class="keyword">private</span>:
+<a name="l00823"></a>00823 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00312.html">interface5::internal::task_base</a>;
+<a name="l00824"></a>00824 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00315.html">task_list</a>;
+<a name="l00825"></a>00825 <span class="keyword">friend</span> <span class="keyword">class </span>internal::scheduler;
+<a name="l00826"></a>00826 <span class="keyword">friend</span> <span class="keyword">class </span>internal::allocate_root_proxy;
+<a name="l00827"></a>00827 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
+<a name="l00828"></a>00828 <span class="preprocessor"></span> <span class="keyword">friend</span> <span class="keyword">class </span>internal::allocate_root_with_context_proxy;
+<a name="l00829"></a>00829 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
+<a name="l00830"></a>00830 <span class="keyword">friend</span> <span class="keyword">class </span>internal::allocate_continuation_proxy;
+<a name="l00831"></a>00831 <span class="keyword">friend</span> <span class="keyword">class </span>internal::allocate_child_proxy;
+<a name="l00832"></a>00832 <span class="keyword">friend</span> <span class="keyword">class </span>internal::allocate_additional_child_of_proxy;
+<a name="l00833"></a>00833
+<a name="l00835"></a>00835
+<a name="l00836"></a>00836 internal::task_prefix& prefix( internal::version_tag* = NULL )<span class="keyword"> const </span>{
+<a name="l00837"></a>00837 <span class="keywordflow">return</span> reinterpret_cast<internal::task_prefix*>(const_cast<task*>(<span class="keyword">this</span>))[-1];
+<a name="l00838"></a>00838 }
+<a name="l00839"></a>00839 }; <span class="comment">// class task</span>
+<a name="l00840"></a>00840
+<a name="l00842"></a>00842
+<a name="l00843"></a><a class="code" href="a00254.html">00843</a> <span class="keyword">class </span><a class="code" href="a00254.html">empty_task</a>: <span class="keyword">public</span> <a class="code" href="a00311.html">task</a> {
+<a name="l00844"></a>00844 <span class="comment">/*override*/</span> <a class="code" href="a00311.html">task</a>* execute() {
+<a name="l00845"></a>00845 <span class="keywordflow">return</span> NULL;
+<a name="l00846"></a>00846 }
+<a name="l00847"></a>00847 };
+<a name="l00848"></a>00848
<a name="l00850"></a>00850
-<a name="l00852"></a><a class="code" href="a00294.html#f3ac31e092814b90929f81bb30441959">00852</a> <span class="keywordtype">bool</span> <a class="code" href="a00294.html#f3ac31e092814b90929f81bb30441959">empty</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> !first;}
-<a name="l00853"></a>00853
-<a name="l00855"></a><a class="code" href="a00294.html#4cd34756bc4763dafb8c84838a0124ff">00855</a> <span class="keywordtype">void</span> <a class="code" href="a00294.html#4cd34756bc4763dafb8c84838a0124ff">push_back</a>( <a class="code" href="a00291.html">task</a>& <a class="code" href="a00291.html">task</a> ) {
-<a name="l00856"></a>00856 task.<a class="code" href="a00291.html#ac578940848e9dc8b4f1f2bcf17b627d">prefix</a>().next = NULL;
-<a name="l00857"></a>00857 *next_ptr = &task;
-<a name="l00858"></a>00858 next_ptr = &task.<a class="code" href="a00291.html#ac578940848e9dc8b4f1f2bcf17b627d">prefix</a>().next;
-<a name="l00859"></a>00859 }
-<a name="l00860"></a>00860
-<a name="l00862"></a><a class="code" href="a00294.html#5fe85df5ed524418389d34051750347d">00862</a> <a class="code" href="a00291.html">task</a>& <a class="code" href="a00294.html#5fe85df5ed524418389d34051750347d">pop_front</a>() {
-<a name="l00863"></a>00863 __TBB_ASSERT( !<a class="code" href="a00294.html#f3ac31e092814b90929f81bb30441959">empty</a>(), <span class="stringliteral">"attempt to pop item from empty task_list"</span> );
-<a name="l00864"></a>00864 <a class="code" href="a00291.html">task</a>* result = first;
-<a name="l00865"></a>00865 first = result-><a class="code" href="a00291.html#ac578940848e9dc8b4f1f2bcf17b627d">prefix</a>().next;
-<a name="l00866"></a>00866 <span class="keywordflow">if</span>( !first ) next_ptr = &first;
-<a name="l00867"></a>00867 <span class="keywordflow">return</span> *result;
-<a name="l00868"></a>00868 }
-<a name="l00869"></a>00869
-<a name="l00871"></a><a class="code" href="a00294.html#fce446ee13e025969945328f3ff59b95">00871</a> <span class="keywordtype">void</span> <a class="code" href="a00294.html#fce446ee13e025969945328f3ff59b95">clear</a>() {
-<a name="l00872"></a>00872 first=NULL;
-<a name="l00873"></a>00873 next_ptr=&first;
-<a name="l00874"></a>00874 }
-<a name="l00875"></a>00875 };
-<a name="l00876"></a>00876
-<a name="l00877"></a>00877 <span class="keyword">inline</span> <span class="keywordtype">void</span> interface5::internal::task_base::spawn( task& t ) {
-<a name="l00878"></a>00878 t.<a class="code" href="a00291.html#ac578940848e9dc8b4f1f2bcf17b627d">prefix</a>().owner->spawn( t, t.prefix().next );
-<a name="l00879"></a>00879 }
-<a name="l00880"></a>00880
-<a name="l00881"></a>00881 <span class="keyword">inline</span> <span class="keywordtype">void</span> interface5::internal::task_base::spawn( task_list& list ) {
-<a name="l00882"></a>00882 <span class="keywordflow">if</span>( task* t = list.first ) {
-<a name="l00883"></a>00883 t->prefix().owner->spawn( *t, *list.next_ptr );
-<a name="l00884"></a>00884 list.clear();
-<a name="l00885"></a>00885 }
-<a name="l00886"></a>00886 }
-<a name="l00887"></a>00887
-<a name="l00888"></a><a class="code" href="a00291.html#c33c7edbaec67aa8a56f48986a9dc69f">00888</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="a00291.html#ce8ce689c26a4ddf343829bc3c73290a">task::spawn_root_and_wait</a>( <a class="code" href="a00294.html">task_list</a>& root_list ) {
-<a name="l00889"></a>00889 <span class="keywordflow">if</span>( <a class="code" href="a00291.html">task</a>* t = root_list.<a class="code" href="a00294.html#78fcc389819ee34427d510f7d8cb8b1e">first</a> ) {
-<a name="l00890"></a>00890 t->prefix().owner->spawn_root_and_wait( *t, *root_list.<a class="code" href="a00294.html#21553a32bcd08f980aa28f61254307da">next_ptr</a> );
-<a name="l00891"></a>00891 root_list.<a class="code" href="a00294.html#fce446ee13e025969945328f3ff59b95">clear</a>();
-<a name="l00892"></a>00892 }
+<a name="l00852"></a><a class="code" href="a00315.html">00852</a> <span class="keyword">class </span><a class="code" href="a00315.html">task_list</a>: internal::no_copy {
+<a name="l00853"></a>00853 <span class="keyword">private</span>:
+<a name="l00854"></a>00854 <a class="code" href="a00311.html">task</a>* first;
+<a name="l00855"></a>00855 <a class="code" href="a00311.html">task</a>** next_ptr;
+<a name="l00856"></a>00856 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00311.html">task</a>;
+<a name="l00857"></a>00857 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00312.html">interface5::internal::task_base</a>;
+<a name="l00858"></a>00858 <span class="keyword">public</span>:
+<a name="l00860"></a><a class="code" href="a00315.html#416341c2047eaef50417b41eaf7e9de6">00860</a> <a class="code" href="a00315.html#416341c2047eaef50417b41eaf7e9de6">task_list</a>() : first(NULL), next_ptr(&first) {}
+<a name="l00861"></a>00861
+<a name="l00863"></a><a class="code" href="a00315.html#6d438f1499a02db1e59c24ab6043e5ba">00863</a> <a class="code" href="a00315.html#6d438f1499a02db1e59c24ab6043e5ba">~task_list</a>() {}
+<a name="l00864"></a>00864
+<a name="l00866"></a><a class="code" href="a00315.html#f3ac31e092814b90929f81bb30441959">00866</a> <span class="keywordtype">bool</span> <a class="code" href="a00315.html#f3ac31e092814b90929f81bb30441959">empty</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> !first;}
+<a name="l00867"></a>00867
+<a name="l00869"></a><a class="code" href="a00315.html#4cd34756bc4763dafb8c84838a0124ff">00869</a> <span class="keywordtype">void</span> <a class="code" href="a00315.html#4cd34756bc4763dafb8c84838a0124ff">push_back</a>( <a class="code" href="a00311.html">task</a>& <a class="code" href="a00311.html">task</a> ) {
+<a name="l00870"></a>00870 task.<a class="code" href="a00311.html#ac578940848e9dc8b4f1f2bcf17b627d">prefix</a>().next = NULL;
+<a name="l00871"></a>00871 *next_ptr = &task;
+<a name="l00872"></a>00872 next_ptr = &task.<a class="code" href="a00311.html#ac578940848e9dc8b4f1f2bcf17b627d">prefix</a>().next;
+<a name="l00873"></a>00873 }
+<a name="l00874"></a>00874
+<a name="l00876"></a><a class="code" href="a00315.html#5fe85df5ed524418389d34051750347d">00876</a> <a class="code" href="a00311.html">task</a>& <a class="code" href="a00315.html#5fe85df5ed524418389d34051750347d">pop_front</a>() {
+<a name="l00877"></a>00877 __TBB_ASSERT( !<a class="code" href="a00315.html#f3ac31e092814b90929f81bb30441959">empty</a>(), <span class="stringliteral">"attempt to pop item from empty task_list"</span> );
+<a name="l00878"></a>00878 <a class="code" href="a00311.html">task</a>* result = first;
+<a name="l00879"></a>00879 first = result-><a class="code" href="a00311.html#ac578940848e9dc8b4f1f2bcf17b627d">prefix</a>().next;
+<a name="l00880"></a>00880 <span class="keywordflow">if</span>( !first ) next_ptr = &first;
+<a name="l00881"></a>00881 <span class="keywordflow">return</span> *result;
+<a name="l00882"></a>00882 }
+<a name="l00883"></a>00883
+<a name="l00885"></a><a class="code" href="a00315.html#fce446ee13e025969945328f3ff59b95">00885</a> <span class="keywordtype">void</span> <a class="code" href="a00315.html#fce446ee13e025969945328f3ff59b95">clear</a>() {
+<a name="l00886"></a>00886 first=NULL;
+<a name="l00887"></a>00887 next_ptr=&first;
+<a name="l00888"></a>00888 }
+<a name="l00889"></a>00889 };
+<a name="l00890"></a>00890
+<a name="l00891"></a>00891 <span class="keyword">inline</span> <span class="keywordtype">void</span> interface5::internal::task_base::spawn( task& t ) {
+<a name="l00892"></a>00892 t.<a class="code" href="a00311.html#ac578940848e9dc8b4f1f2bcf17b627d">prefix</a>().owner->spawn( t, t.prefix().next );
<a name="l00893"></a>00893 }
<a name="l00894"></a>00894
-<a name="l00895"></a>00895 } <span class="comment">// namespace tbb</span>
-<a name="l00896"></a>00896
-<a name="l00897"></a>00897 <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="l00898"></a>00898 <span class="keywordflow">return</span> &tbb::internal::allocate_root_proxy::allocate(bytes);
-<a name="l00899"></a>00899 }
-<a name="l00900"></a>00900
-<a name="l00901"></a>00901 <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="l00902"></a>00902 tbb::internal::allocate_root_proxy::free( *static_cast<tbb::task*>(task) );
-<a name="l00903"></a>00903 }
-<a name="l00904"></a>00904
-<a name="l00905"></a>00905 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00906"></a>00906 <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="l00907"></a>00907 <span class="keywordflow">return</span> &p.allocate(bytes);
-<a name="l00908"></a>00908 }
-<a name="l00909"></a>00909
-<a name="l00910"></a>00910 <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="l00911"></a>00911 p.free( *static_cast<tbb::task*>(task) );
-<a name="l00912"></a>00912 }
-<a name="l00913"></a>00913 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
+<a name="l00895"></a>00895 <span class="keyword">inline</span> <span class="keywordtype">void</span> interface5::internal::task_base::spawn( task_list& list ) {
+<a name="l00896"></a>00896 <span class="keywordflow">if</span>( task* t = list.first ) {
+<a name="l00897"></a>00897 t->prefix().owner->spawn( *t, *list.next_ptr );
+<a name="l00898"></a>00898 list.clear();
+<a name="l00899"></a>00899 }
+<a name="l00900"></a>00900 }
+<a name="l00901"></a>00901
+<a name="l00902"></a><a class="code" href="a00311.html#c33c7edbaec67aa8a56f48986a9dc69f">00902</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="a00311.html#ce8ce689c26a4ddf343829bc3c73290a">task::spawn_root_and_wait</a>( <a class="code" href="a00315.html">task_list</a>& root_list ) {
+<a name="l00903"></a>00903 <span class="keywordflow">if</span>( <a class="code" href="a00311.html">task</a>* t = root_list.<a class="code" href="a00315.html#78fcc389819ee34427d510f7d8cb8b1e">first</a> ) {
+<a name="l00904"></a>00904 t->prefix().owner->spawn_root_and_wait( *t, *root_list.<a class="code" href="a00315.html#21553a32bcd08f980aa28f61254307da">next_ptr</a> );
+<a name="l00905"></a>00905 root_list.<a class="code" href="a00315.html#fce446ee13e025969945328f3ff59b95">clear</a>();
+<a name="l00906"></a>00906 }
+<a name="l00907"></a>00907 }
+<a name="l00908"></a>00908
+<a name="l00909"></a>00909 } <span class="comment">// namespace tbb</span>
+<a name="l00910"></a>00910
+<a name="l00911"></a>00911 <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="l00912"></a>00912 <span class="keywordflow">return</span> &tbb::internal::allocate_root_proxy::allocate(bytes);
+<a name="l00913"></a>00913 }
<a name="l00914"></a>00914
-<a name="l00915"></a>00915 <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="l00916"></a>00916 <span class="keywordflow">return</span> &p.allocate(bytes);
+<a name="l00915"></a>00915 <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="l00916"></a>00916 tbb::internal::allocate_root_proxy::free( *static_cast<tbb::task*>(task) );
<a name="l00917"></a>00917 }
<a name="l00918"></a>00918
-<a name="l00919"></a>00919 <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="l00920"></a>00920 p.free( *static_cast<tbb::task*>(task) );
-<a name="l00921"></a>00921 }
-<a name="l00922"></a>00922
-<a name="l00923"></a>00923 <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="l00924"></a>00924 <span class="keywordflow">return</span> &p.allocate(bytes);
-<a name="l00925"></a>00925 }
-<a name="l00926"></a>00926
-<a name="l00927"></a>00927 <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="l00928"></a>00928 p.free( *static_cast<tbb::task*>(task) );
-<a name="l00929"></a>00929 }
-<a name="l00930"></a>00930
-<a name="l00931"></a>00931 <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="l00932"></a>00932 <span class="keywordflow">return</span> &p.allocate(bytes);
-<a name="l00933"></a>00933 }
-<a name="l00934"></a>00934
-<a name="l00935"></a>00935 <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="l00936"></a>00936 p.free( *static_cast<tbb::task*>(task) );
-<a name="l00937"></a>00937 }
-<a name="l00938"></a>00938
-<a name="l00939"></a>00939 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_task_H */</span>
+<a name="l00919"></a>00919 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
+<a name="l00920"></a>00920 <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="l00921"></a>00921 <span class="keywordflow">return</span> &p.allocate(bytes);
+<a name="l00922"></a>00922 }
+<a name="l00923"></a>00923
+<a name="l00924"></a>00924 <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="l00925"></a>00925 p.free( *static_cast<tbb::task*>(task) );
+<a name="l00926"></a>00926 }
+<a name="l00927"></a>00927 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
+<a name="l00928"></a>00928
+<a name="l00929"></a>00929 <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="l00930"></a>00930 <span class="keywordflow">return</span> &p.allocate(bytes);
+<a name="l00931"></a>00931 }
+<a name="l00932"></a>00932
+<a name="l00933"></a>00933 <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="l00934"></a>00934 p.free( *static_cast<tbb::task*>(task) );
+<a name="l00935"></a>00935 }
+<a name="l00936"></a>00936
+<a name="l00937"></a>00937 <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="l00938"></a>00938 <span class="keywordflow">return</span> &p.allocate(bytes);
+<a name="l00939"></a>00939 }
+<a name="l00940"></a>00940
+<a name="l00941"></a>00941 <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="l00942"></a>00942 p.free( *static_cast<tbb::task*>(task) );
+<a name="l00943"></a>00943 }
+<a name="l00944"></a>00944
+<a name="l00945"></a>00945 <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="l00946"></a>00946 <span class="keywordflow">return</span> &p.allocate(bytes);
+<a name="l00947"></a>00947 }
+<a name="l00948"></a>00948
+<a name="l00949"></a>00949 <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="l00950"></a>00950 p.free( *static_cast<tbb::task*>(task) );
+<a name="l00951"></a>00951 }
+<a name="l00952"></a>00952
+<a name="l00953"></a>00953 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_task_H */</span>
</pre></div><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00577.html b/doc/html/a00577.html
index 8dbaf6a..ce437ea 100644
--- a/doc/html/a00577.html
+++ b/doc/html/a00577.html
@@ -45,220 +45,224 @@
<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="keyword">namespace </span>tbb {
-<a name="l00028"></a>00028
-<a name="l00029"></a>00029 <span class="keyword">namespace </span>internal {
-<a name="l00030"></a>00030 <span class="keyword">template</span><<span class="keyword">typename</span> F> <span class="keyword">class </span>task_handle_task;
-<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> F>
-<a name="l00034"></a>00034 <span class="keyword">class </span>task_handle : internal::no_assign {
-<a name="l00035"></a>00035 <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="l00036"></a>00036
-<a name="l00037"></a>00037 <span class="keyword">static</span> <span class="keyword">const</span> intptr_t scheduled = 0x1;
+<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 F my_func;
-<a name="l00040"></a>00040 intptr_t my_state;
-<a name="l00041"></a>00041
-<a name="l00042"></a>00042 <span class="keywordtype">void</span> mark_scheduled () {
-<a name="l00043"></a>00043 <span class="comment">// The check here is intentionally lax to avoid the impact of interlocked operation</span>
-<a name="l00044"></a>00044 <span class="keywordflow">if</span> ( my_state & scheduled )
-<a name="l00045"></a>00045 internal::throw_exception( internal::eid_invalid_multiple_scheduling );
-<a name="l00046"></a>00046 my_state |= scheduled;
-<a name="l00047"></a>00047 }
-<a name="l00048"></a>00048 <span class="keyword">public</span>:
-<a name="l00049"></a>00049 task_handle( <span class="keyword">const</span> F& f ) : my_func(f), my_state(0) {}
-<a name="l00050"></a>00050
-<a name="l00051"></a>00051 <span class="keywordtype">void</span> operator() ()<span class="keyword"> const </span>{ my_func(); }
-<a name="l00052"></a>00052 };
-<a name="l00053"></a>00053
-<a name="l00054"></a>00054 <span class="keyword">enum</span> task_group_status {
-<a name="l00055"></a>00055 not_complete,
-<a name="l00056"></a>00056 complete,
-<a name="l00057"></a>00057 canceled
-<a name="l00058"></a>00058 };
-<a name="l00059"></a>00059
-<a name="l00060"></a>00060 <span class="keyword">namespace </span>internal {
+<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="comment">// Suppress gratuitous warnings from icc 11.0 when lambda expressions are used in instances of function_task.</span>
-<a name="l00063"></a>00063 <span class="comment">//#pragma warning(disable: 588)</span>
-<a name="l00064"></a>00064
-<a name="l00065"></a>00065 <span class="keyword">template</span><<span class="keyword">typename</span> F>
-<a name="l00066"></a>00066 <span class="keyword">class </span>function_task : <span class="keyword">public</span> task {
-<a name="l00067"></a>00067 F my_func;
-<a name="l00068"></a>00068 <span class="comment">/*override*/</span> <a class="code" href="a00291.html#2bce8ec6e44706e70128f5cf91b76e67">task</a>* execute() {
-<a name="l00069"></a>00069 my_func();
-<a name="l00070"></a>00070 <span class="keywordflow">return</span> NULL;
-<a name="l00071"></a>00071 }
-<a name="l00072"></a>00072 <span class="keyword">public</span>:
-<a name="l00073"></a>00073 function_task( <span class="keyword">const</span> F& f ) : my_func(f) {}
-<a name="l00074"></a>00074 };
-<a name="l00075"></a>00075
-<a name="l00076"></a>00076 <span class="keyword">template</span><<span class="keyword">typename</span> F>
-<a name="l00077"></a>00077 <span class="keyword">class </span>task_handle_task : <span class="keyword">public</span> task {
-<a name="l00078"></a>00078 task_handle<F>& my_handle;
-<a name="l00079"></a>00079 <span class="comment">/*override*/</span> <a class="code" href="a00291.html#2bce8ec6e44706e70128f5cf91b76e67">task</a>* execute() {
-<a name="l00080"></a>00080 my_handle();
-<a name="l00081"></a>00081 <span class="keywordflow">return</span> NULL;
-<a name="l00082"></a>00082 }
-<a name="l00083"></a>00083 <span class="keyword">public</span>:
-<a name="l00084"></a>00084 task_handle_task( task_handle<F>& h ) : my_handle(h) { h.mark_scheduled(); }
-<a name="l00085"></a>00085 };
-<a name="l00086"></a>00086
-<a name="l00087"></a>00087 <span class="keyword">class </span>task_group_base : internal::no_copy {
-<a name="l00088"></a>00088 <span class="keyword">protected</span>:
-<a name="l00089"></a>00089 empty_task* my_root;
-<a name="l00090"></a>00090 task_group_context my_context;
-<a name="l00091"></a>00091
-<a name="l00092"></a>00092 task& owner () { <span class="keywordflow">return</span> *my_root; }
+<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="a00311.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="a00311.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 <span class="keyword">template</span><<span class="keyword">typename</span> F>
-<a name="l00095"></a>00095 task_group_status internal_run_and_wait( F& f ) {
-<a name="l00096"></a>00096 __TBB_TRY {
-<a name="l00097"></a>00097 <span class="keywordflow">if</span> ( !my_context.is_group_execution_cancelled() )
-<a name="l00098"></a>00098 f();
-<a name="l00099"></a>00099 } __TBB_CATCH( ... ) {
-<a name="l00100"></a>00100 my_context.register_pending_exception();
-<a name="l00101"></a>00101 }
-<a name="l00102"></a>00102 <span class="keywordflow">return</span> wait();
-<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> F, <span class="keyword">typename</span> Task>
-<a name="l00106"></a>00106 <span class="keywordtype">void</span> internal_run( F& f ) {
-<a name="l00107"></a>00107 owner().spawn( *<span class="keyword">new</span>( owner().allocate_additional_child_of(*my_root) ) Task(f) );
-<a name="l00108"></a>00108 }
-<a name="l00109"></a>00109
-<a name="l00110"></a>00110 <span class="keyword">public</span>:
-<a name="l00111"></a>00111 task_group_base( uintptr_t traits = 0 )
-<a name="l00112"></a>00112 : my_context(task_group_context::bound, task_group_context::default_traits | traits)
-<a name="l00113"></a>00113 {
-<a name="l00114"></a>00114 my_root = <span class="keyword">new</span>( <a class="code" href="a00291.html#23acb0da0afd690da797f9f882027d34">task::allocate_root</a>(my_context) ) empty_task;
-<a name="l00115"></a>00115 my_root->set_ref_count(1);
-<a name="l00116"></a>00116 }
-<a name="l00117"></a>00117
-<a name="l00118"></a>00118 ~task_group_base() {
-<a name="l00119"></a>00119 <span class="keywordflow">if</span>( my_root->ref_count() > 1 ) {
-<a name="l00120"></a>00120 <span class="keywordtype">bool</span> stack_unwinding_in_progress = std::uncaught_exception();
-<a name="l00121"></a>00121 <span class="comment">// Always attempt to do proper cleanup to avoid inevitable memory corruption </span>
-<a name="l00122"></a>00122 <span class="comment">// in case of missing wait (for the sake of better testability & debuggability)</span>
-<a name="l00123"></a>00123 <span class="keywordflow">if</span> ( !is_canceling() )
-<a name="l00124"></a>00124 cancel();
-<a name="l00125"></a>00125 __TBB_TRY {
-<a name="l00126"></a>00126 my_root->wait_for_all();
-<a name="l00127"></a>00127 } __TBB_CATCH (...) {
-<a name="l00128"></a>00128 <a class="code" href="a00291.html#dfaacf92685e5f86393bf657b2853bf8">task::destroy</a>(*my_root);
-<a name="l00129"></a>00129 __TBB_RETHROW();
-<a name="l00130"></a>00130 }
-<a name="l00131"></a>00131 <a class="code" href="a00291.html#dfaacf92685e5f86393bf657b2853bf8">task::destroy</a>(*my_root);
-<a name="l00132"></a>00132 <span class="keywordflow">if</span> ( !stack_unwinding_in_progress )
-<a name="l00133"></a>00133 internal::throw_exception( internal::eid_missing_wait );
-<a name="l00134"></a>00134 }
-<a name="l00135"></a>00135 <span class="keywordflow">else</span> {
-<a name="l00136"></a>00136 <a class="code" href="a00291.html#dfaacf92685e5f86393bf657b2853bf8">task::destroy</a>(*my_root);
-<a name="l00137"></a>00137 }
-<a name="l00138"></a>00138 }
-<a name="l00139"></a>00139
-<a name="l00140"></a>00140 <span class="keyword">template</span><<span class="keyword">typename</span> F>
-<a name="l00141"></a>00141 <span class="keywordtype">void</span> run( task_handle<F>& h ) {
-<a name="l00142"></a>00142 internal_run< task_handle<F>, internal::task_handle_task<F> >( h );
-<a name="l00143"></a>00143 }
-<a name="l00144"></a>00144
-<a name="l00145"></a>00145 task_group_status wait() {
-<a name="l00146"></a>00146 __TBB_TRY {
-<a name="l00147"></a>00147 my_root->wait_for_all();
-<a name="l00148"></a>00148 } __TBB_CATCH( ... ) {
-<a name="l00149"></a>00149 my_context.reset();
-<a name="l00150"></a>00150 __TBB_RETHROW();
-<a name="l00151"></a>00151 }
-<a name="l00152"></a>00152 <span class="keywordflow">if</span> ( my_context.is_group_execution_cancelled() ) {
-<a name="l00153"></a>00153 my_context.reset();
-<a name="l00154"></a>00154 <span class="keywordflow">return</span> canceled;
-<a name="l00155"></a>00155 }
-<a name="l00156"></a>00156 <span class="keywordflow">return</span> complete;
-<a name="l00157"></a>00157 }
-<a name="l00158"></a>00158
-<a name="l00159"></a>00159 <span class="keywordtype">bool</span> is_canceling() {
-<a name="l00160"></a>00160 <span class="keywordflow">return</span> my_context.is_group_execution_cancelled();
-<a name="l00161"></a>00161 }
-<a name="l00162"></a>00162
-<a name="l00163"></a>00163 <span class="keywordtype">void</span> cancel() {
-<a name="l00164"></a>00164 my_context.cancel_group_execution();
-<a name="l00165"></a>00165 }
-<a name="l00166"></a>00166 }; <span class="comment">// class task_group_base</span>
-<a name="l00167"></a>00167
-<a name="l00168"></a>00168 } <span class="comment">// namespace internal</span>
+<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="a00311.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="a00311.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="a00311.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="a00311.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="keyword">class </span>task_group : <span class="keyword">public</span> internal::task_group_base {
-<a name="l00171"></a>00171 <span class="keyword">public</span>:
-<a name="l00172"></a>00172 task_group () : task_group_base( task_group_context::concurrent_wait ) {}
-<a name="l00173"></a>00173
-<a name="l00174"></a>00174 <span class="preprocessor">#if TBB_DEPRECATED</span>
-<a name="l00175"></a>00175 <span class="preprocessor"></span> ~task_group() __TBB_TRY {
-<a name="l00176"></a>00176 __TBB_ASSERT( my_root->ref_count() != 0, NULL );
-<a name="l00177"></a>00177 <span class="keywordflow">if</span>( my_root->ref_count() > 1 )
-<a name="l00178"></a>00178 my_root->wait_for_all();
-<a name="l00179"></a>00179 }
-<a name="l00180"></a>00180 <span class="preprocessor">#if TBB_USE_EXCEPTIONS</span>
-<a name="l00181"></a>00181 <span class="preprocessor"></span> <span class="keywordflow">catch</span> (...) {
-<a name="l00182"></a>00182 <span class="comment">// Have to destroy my_root here as the base class destructor won't be called</span>
-<a name="l00183"></a>00183 <a class="code" href="a00291.html#dfaacf92685e5f86393bf657b2853bf8">task::destroy</a>(*my_root);
-<a name="l00184"></a>00184 <span class="keywordflow">throw</span>;
-<a name="l00185"></a>00185 }
-<a name="l00186"></a>00186 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_EXCEPTIONS */</span>
-<a name="l00187"></a>00187 <span class="preprocessor">#endif </span><span class="comment">/* TBB_DEPRECATED */</span>
-<a name="l00188"></a>00188
-<a name="l00189"></a>00189 <span class="preprocessor">#if __SUNPRO_CC</span>
-<a name="l00190"></a>00190 <span class="preprocessor"></span> <span class="keyword">template</span><<span class="keyword">typename</span> F>
-<a name="l00191"></a>00191 <span class="keywordtype">void</span> run( task_handle<F>& h ) {
-<a name="l00192"></a>00192 internal_run< task_handle<F>, internal::task_handle_task<F> >( h );
-<a name="l00193"></a>00193 }
-<a name="l00194"></a>00194 <span class="preprocessor">#else</span>
-<a name="l00195"></a>00195 <span class="preprocessor"></span> <span class="keyword">using</span> task_group_base::run;
-<a name="l00196"></a>00196 <span class="preprocessor">#endif</span>
-<a name="l00197"></a>00197 <span class="preprocessor"></span>
-<a name="l00198"></a>00198 <span class="keyword">template</span><<span class="keyword">typename</span> F>
-<a name="l00199"></a>00199 <span class="keywordtype">void</span> run( <span class="keyword">const</span> F& f ) {
-<a name="l00200"></a>00200 internal_run< const F, internal::function_task<F> >( f );
-<a name="l00201"></a>00201 }
-<a name="l00202"></a>00202
-<a name="l00203"></a>00203 <span class="keyword">template</span><<span class="keyword">typename</span> F>
-<a name="l00204"></a>00204 task_group_status run_and_wait( <span class="keyword">const</span> F& f ) {
-<a name="l00205"></a>00205 <span class="keywordflow">return</span> internal_run_and_wait<const F>( f );
-<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> F>
-<a name="l00209"></a>00209 task_group_status run_and_wait( task_handle<F>& h ) {
-<a name="l00210"></a>00210 <span class="keywordflow">return</span> internal_run_and_wait< task_handle<F> >( h );
-<a name="l00211"></a>00211 }
-<a name="l00212"></a>00212 }; <span class="comment">// class task_group</span>
-<a name="l00213"></a>00213
-<a name="l00214"></a>00214 <span class="keyword">class </span>structured_task_group : <span class="keyword">public</span> internal::task_group_base {
-<a name="l00215"></a>00215 <span class="keyword">public</span>:
-<a name="l00216"></a>00216 <span class="keyword">template</span><<span class="keyword">typename</span> F>
-<a name="l00217"></a>00217 task_group_status run_and_wait ( task_handle<F>& h ) {
-<a name="l00218"></a>00218 <span class="keywordflow">return</span> internal_run_and_wait< task_handle<F> >( h );
-<a name="l00219"></a>00219 }
-<a name="l00220"></a>00220
-<a name="l00221"></a>00221 task_group_status wait() {
-<a name="l00222"></a>00222 task_group_status res = task_group_base::wait();
-<a name="l00223"></a>00223 my_root->set_ref_count(1);
-<a name="l00224"></a>00224 <span class="keywordflow">return</span> res;
-<a name="l00225"></a>00225 }
-<a name="l00226"></a>00226 }; <span class="comment">// class structured_task_group</span>
-<a name="l00227"></a>00227
-<a name="l00228"></a>00228 <span class="keyword">inline</span>
-<a name="l00229"></a>00229 <span class="keywordtype">bool</span> is_current_task_group_canceling() {
-<a name="l00230"></a>00230 <span class="keywordflow">return</span> <a class="code" href="a00291.html#bd43e8d6249738efafd12d6a4c72c5e3">task::self</a>().<a class="code" href="a00291.html#025f18118c057c4c8db87ff2ce8df975">is_cancelled</a>();
-<a name="l00231"></a>00231 }
-<a name="l00232"></a>00232
-<a name="l00233"></a>00233 <span class="keyword">template</span><<span class="keyword">class</span> F>
-<a name="l00234"></a>00234 task_handle<F> make_task( <span class="keyword">const</span> F& f ) {
-<a name="l00235"></a>00235 <span class="keywordflow">return</span> task_handle<F>( f );
-<a name="l00236"></a>00236 }
-<a name="l00237"></a>00237
-<a name="l00238"></a>00238 } <span class="comment">// namespace tbb</span>
+<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="a00311.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="a00311.html#bd43e8d6249738efafd12d6a4c72c5e3">task::self</a>().<a class="code" href="a00311.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="preprocessor">#endif </span><span class="comment">/* __TBB_task_group_H */</span>
+<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-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00584.html b/doc/html/a00584.html
index 71e56af..b62f3ed 100644
--- a/doc/html/a00584.html
+++ b/doc/html/a00584.html
@@ -55,59 +55,57 @@
<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="a00295.html">00053</a> <span class="keyword">class </span><a class="code" href="a00295.html">task_scheduler_init</a>: internal::no_copy {
-<a name="l00054"></a>00054 <span class="preprocessor">#if TBB_USE_EXCEPTIONS</span>
-<a name="l00055"></a>00055 <span class="preprocessor"></span> <span class="keyword">enum</span> ExceptionPropagationMode {
-<a name="l00056"></a>00056 propagation_mode_exact = 1u,
-<a name="l00057"></a>00057 propagation_mode_captured = 2u,
-<a name="l00058"></a>00058 propagation_mode_mask = propagation_mode_exact | propagation_mode_captured
-<a name="l00059"></a>00059 };
-<a name="l00060"></a>00060 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_EXCEPTIONS */</span>
-<a name="l00061"></a>00061
-<a name="l00063"></a>00063 internal::scheduler* my_scheduler;
-<a name="l00064"></a>00064 <span class="keyword">public</span>:
-<a name="l00065"></a>00065
-<a name="l00067"></a><a class="code" href="a00295.html#8f5988e2b0fbb2d533fcbb7f2583743f">00067</a> <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">int</span> <a class="code" href="a00295.html#8f5988e2b0fbb2d533fcbb7f2583743f">automatic</a> = -1;
-<a name="l00068"></a>00068
-<a name="l00070"></a><a class="code" href="a00295.html#e6c860f1e559026ff3ef4599c0d6c514">00070</a> <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">int</span> <a class="code" href="a00295.html#e6c860f1e559026ff3ef4599c0d6c514">deferred</a> = -2;
+<a name="l00053"></a><a class="code" href="a00316.html">00053</a> <span class="keyword">class </span><a class="code" href="a00316.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="a00316.html#8f5988e2b0fbb2d533fcbb7f2583743f">00065</a> <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">int</span> <a class="code" href="a00316.html#8f5988e2b0fbb2d533fcbb7f2583743f">automatic</a> = -1;
+<a name="l00066"></a>00066
+<a name="l00068"></a><a class="code" href="a00316.html#e6c860f1e559026ff3ef4599c0d6c514">00068</a> <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">int</span> <a class="code" href="a00316.html#e6c860f1e559026ff3ef4599c0d6c514">deferred</a> = -2;
+<a name="l00069"></a>00069
<a name="l00071"></a>00071
-<a name="l00073"></a>00073
-<a name="l00084"></a>00084 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00295.html#d476053cc712e572554823492a5229ce">initialize</a>( <span class="keywordtype">int</span> number_of_threads=<a class="code" href="a00295.html#8f5988e2b0fbb2d533fcbb7f2583743f">automatic</a> );
+<a name="l00082"></a>00082 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00316.html#d476053cc712e572554823492a5229ce">initialize</a>( <span class="keywordtype">int</span> number_of_threads=<a class="code" href="a00316.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="a00316.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="l00088"></a>00088 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00295.html#d476053cc712e572554823492a5229ce">initialize</a>( <span class="keywordtype">int</span> number_of_threads, stack_size_type thread_stack_size );
-<a name="l00089"></a>00089
-<a name="l00091"></a>00091 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00295.html#f73257e04cb7fb9bd5be2b635d9016f1">terminate</a>();
-<a name="l00092"></a>00092
-<a name="l00094"></a><a class="code" href="a00295.html#421600bf9bf9338bcf937063f2ff0e90">00094</a> <a class="code" href="a00295.html#421600bf9bf9338bcf937063f2ff0e90">task_scheduler_init</a>( <span class="keywordtype">int</span> number_of_threads=<a class="code" href="a00295.html#8f5988e2b0fbb2d533fcbb7f2583743f">automatic</a>, stack_size_type thread_stack_size=0 ) : my_scheduler(NULL) {
-<a name="l00095"></a>00095 <span class="preprocessor">#if TBB_USE_EXCEPTIONS</span>
-<a name="l00096"></a>00096 <span class="preprocessor"></span> <span class="comment">// Take two lowest order bits of the stack size argument to communicate</span>
-<a name="l00097"></a>00097 <span class="comment">// default exception propagation mode of the client to be used when the</span>
-<a name="l00098"></a>00098 <span class="comment">// client manually creates tasks in the master thread and does not use</span>
-<a name="l00099"></a>00099 <span class="comment">// explicit task group context object. This is necessary because newer </span>
-<a name="l00100"></a>00100 <span class="comment">// TBB binaries with exact propagation enabled by default may be used </span>
-<a name="l00101"></a>00101 <span class="comment">// by older clients that expect tbb::captured_exception wrapper.</span>
-<a name="l00102"></a>00102 <span class="comment">// All zeros mean old client - no preference. </span>
-<a name="l00103"></a>00103 __TBB_ASSERT( !(thread_stack_size & propagation_mode_mask), <span class="stringliteral">"Requested stack size is not aligned"</span> );
-<a name="l00104"></a>00104 thread_stack_size |= TBB_USE_CAPTURED_EXCEPTION ? propagation_mode_captured : propagation_mode_exact;
-<a name="l00105"></a>00105 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_EXCEPTIONS */</span>
-<a name="l00106"></a>00106 <a class="code" href="a00295.html#d476053cc712e572554823492a5229ce">initialize</a>( number_of_threads, thread_stack_size );
-<a name="l00107"></a>00107 }
-<a name="l00108"></a>00108
-<a name="l00110"></a><a class="code" href="a00295.html#4da6c86292d80c703a66c1f6f5299488">00110</a> <a class="code" href="a00295.html#4da6c86292d80c703a66c1f6f5299488">~task_scheduler_init</a>() {
-<a name="l00111"></a>00111 <span class="keywordflow">if</span>( my_scheduler )
-<a name="l00112"></a>00112 <a class="code" href="a00295.html#f73257e04cb7fb9bd5be2b635d9016f1">terminate</a>();
-<a name="l00113"></a>00113 internal::poison_pointer( my_scheduler );
-<a name="l00114"></a>00114 }
-<a name="l00116"></a>00116
-<a name="l00133"></a>00133 <span class="keyword">static</span> <span class="keywordtype">int</span> __TBB_EXPORTED_FUNC <a class="code" href="a00295.html#ba00714c33a41a3c2216f48613971cab">default_num_threads</a> ();
-<a name="l00134"></a>00134
-<a name="l00136"></a><a class="code" href="a00295.html#12752282977029f23416642bc03e8b74">00136</a> <span class="keywordtype">bool</span> <a class="code" href="a00295.html#12752282977029f23416642bc03e8b74">is_active</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> my_scheduler != NULL; }
-<a name="l00137"></a>00137 };
+<a name="l00089"></a>00089 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00316.html#f73257e04cb7fb9bd5be2b635d9016f1">terminate</a>();
+<a name="l00090"></a>00090
+<a name="l00092"></a><a class="code" href="a00316.html#421600bf9bf9338bcf937063f2ff0e90">00092</a> <a class="code" href="a00316.html#421600bf9bf9338bcf937063f2ff0e90">task_scheduler_init</a>( <span class="keywordtype">int</span> number_of_threads=<a class="code" href="a00316.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="a00316.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="a00316.html#4da6c86292d80c703a66c1f6f5299488">00108</a> <a class="code" href="a00316.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="a00316.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="a00316.html#ba00714c33a41a3c2216f48613971cab">default_num_threads</a> ();
+<a name="l00132"></a>00132
+<a name="l00134"></a><a class="code" href="a00316.html#12752282977029f23416642bc03e8b74">00134</a> <span class="keywordtype">bool</span> <a class="code" href="a00316.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="comment">// namespace tbb</span>
-<a name="l00140"></a>00140
-<a name="l00141"></a>00141 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_task_scheduler_init_H */</span>
+<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-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00588.html b/doc/html/a00588.html
index 305ea1b..ee303d1 100644
--- a/doc/html/a00588.html
+++ b/doc/html/a00588.html
@@ -78,7 +78,7 @@
<a name="l00062"></a>00062 <span class="preprocessor"></span>
<a name="l00064"></a>00064
<a name="l00069"></a>00069 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00070"></a><a class="code" href="a00296.html">00070</a> <span class="keyword">class </span><a class="code" href="a00296.html">tbb_allocator</a> {
+<a name="l00070"></a><a class="code" href="a00317.html">00070</a> <span class="keyword">class </span><a class="code" href="a00317.html">tbb_allocator</a> {
<a name="l00071"></a>00071 <span class="keyword">public</span>:
<a name="l00072"></a>00072 <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::allocator_type<T>::value_type value_type;
<a name="l00073"></a>00073 <span class="keyword">typedef</span> value_type* pointer;
@@ -88,39 +88,39 @@
<a name="l00077"></a>00077 <span class="keyword">typedef</span> size_t size_type;
<a name="l00078"></a>00078 <span class="keyword">typedef</span> ptrdiff_t difference_type;
<a name="l00079"></a>00079 <span class="keyword">template</span><<span class="keyword">typename</span> U> <span class="keyword">struct </span>rebind {
-<a name="l00080"></a>00080 <span class="keyword">typedef</span> <a class="code" href="a00296.html">tbb_allocator<U></a> other;
+<a name="l00080"></a>00080 <span class="keyword">typedef</span> <a class="code" href="a00317.html">tbb_allocator<U></a> other;
<a name="l00081"></a>00081 };
<a name="l00082"></a>00082
-<a name="l00084"></a><a class="code" href="a00296.html#09a7f81fb2c3055aaecf058b11538544">00084</a> <span class="keyword">enum</span> <a class="code" href="a00296.html#09a7f81fb2c3055aaecf058b11538544">malloc_type</a> {
+<a name="l00084"></a><a class="code" href="a00317.html#09a7f81fb2c3055aaecf058b11538544">00084</a> <span class="keyword">enum</span> <a class="code" href="a00317.html#09a7f81fb2c3055aaecf058b11538544">malloc_type</a> {
<a name="l00085"></a>00085 scalable,
<a name="l00086"></a>00086 standard
<a name="l00087"></a>00087 };
<a name="l00088"></a>00088
-<a name="l00089"></a>00089 <a class="code" href="a00296.html">tbb_allocator</a>() throw() {}
+<a name="l00089"></a>00089 <a class="code" href="a00317.html">tbb_allocator</a>() throw() {}
<a name="l00090"></a>00090 tbb_allocator( <span class="keyword">const</span> tbb_allocator& ) throw() {}
<a name="l00091"></a>00091 <span class="keyword">template</span><<span class="keyword">typename</span> U> tbb_allocator(<span class="keyword">const</span> tbb_allocator<U>&) throw() {}
<a name="l00092"></a>00092
<a name="l00093"></a>00093 pointer address(reference x)<span class="keyword"> const </span>{<span class="keywordflow">return</span> &x;}
<a name="l00094"></a>00094 const_pointer address(const_reference x)<span class="keyword"> const </span>{<span class="keywordflow">return</span> &x;}
<a name="l00095"></a>00095
-<a name="l00097"></a><a class="code" href="a00296.html#f6cb487b1bdce0b581f265a77dca6d53">00097</a> pointer <a class="code" href="a00296.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="l00097"></a><a class="code" href="a00317.html#f6cb487b1bdce0b581f265a77dca6d53">00097</a> pointer <a class="code" href="a00317.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="l00098"></a>00098 <span class="keywordflow">return</span> pointer(internal::allocate_via_handler_v3( n * <span class="keyword">sizeof</span>(value_type) ));
<a name="l00099"></a>00099 }
<a name="l00100"></a>00100
-<a name="l00102"></a><a class="code" href="a00296.html#fdd011fdf2f9ad07006dc7c0a7ec1da2">00102</a> <span class="keywordtype">void</span> <a class="code" href="a00296.html#fdd011fdf2f9ad07006dc7c0a7ec1da2">deallocate</a>( pointer p, size_type ) {
+<a name="l00102"></a><a class="code" href="a00317.html#fdd011fdf2f9ad07006dc7c0a7ec1da2">00102</a> <span class="keywordtype">void</span> <a class="code" href="a00317.html#fdd011fdf2f9ad07006dc7c0a7ec1da2">deallocate</a>( pointer p, size_type ) {
<a name="l00103"></a>00103 internal::deallocate_via_handler_v3(p);
<a name="l00104"></a>00104 }
<a name="l00105"></a>00105
-<a name="l00107"></a><a class="code" href="a00296.html#f059ca2c96243024f0d562ee3a87a3a5">00107</a> size_type <a class="code" href="a00296.html#f059ca2c96243024f0d562ee3a87a3a5">max_size</a>() const throw() {
+<a name="l00107"></a><a class="code" href="a00317.html#f059ca2c96243024f0d562ee3a87a3a5">00107</a> size_type <a class="code" href="a00317.html#f059ca2c96243024f0d562ee3a87a3a5">max_size</a>() const throw() {
<a name="l00108"></a>00108 size_type max = static_cast<size_type>(-1) / <span class="keyword">sizeof</span> (value_type);
<a name="l00109"></a>00109 <span class="keywordflow">return</span> (max > 0 ? max : 1);
<a name="l00110"></a>00110 }
<a name="l00111"></a>00111
-<a name="l00113"></a><a class="code" href="a00296.html#ab228ab9e324ed041c2226e1d717df5f">00113</a> <span class="keywordtype">void</span> <a class="code" href="a00296.html#ab228ab9e324ed041c2226e1d717df5f">construct</a>( pointer p, <span class="keyword">const</span> value_type& value ) {::new((<span class="keywordtype">void</span>*)(p)) value_type(value);}
+<a name="l00113"></a><a class="code" href="a00317.html#ab228ab9e324ed041c2226e1d717df5f">00113</a> <span class="keywordtype">void</span> <a class="code" href="a00317.html#ab228ab9e324ed041c2226e1d717df5f">construct</a>( pointer p, <span class="keyword">const</span> value_type& value ) {::new((<span class="keywordtype">void</span>*)(p)) value_type(value);}
<a name="l00114"></a>00114
-<a name="l00116"></a><a class="code" href="a00296.html#ef133522bf55f05a605bee0763208281">00116</a> <span class="keywordtype">void</span> <a class="code" href="a00296.html#ef133522bf55f05a605bee0763208281">destroy</a>( pointer p ) {p->~value_type();}
+<a name="l00116"></a><a class="code" href="a00317.html#ef133522bf55f05a605bee0763208281">00116</a> <span class="keywordtype">void</span> <a class="code" href="a00317.html#ef133522bf55f05a605bee0763208281">destroy</a>( pointer p ) {p->~value_type();}
<a name="l00117"></a>00117
-<a name="l00119"></a><a class="code" href="a00296.html#78701e7454ef8e1a25b5acd364367080">00119</a> <span class="keyword">static</span> <a class="code" href="a00296.html#09a7f81fb2c3055aaecf058b11538544">malloc_type</a> <a class="code" href="a00296.html#78701e7454ef8e1a25b5acd364367080">allocator_type</a>() {
+<a name="l00119"></a><a class="code" href="a00317.html#78701e7454ef8e1a25b5acd364367080">00119</a> <span class="keyword">static</span> <a class="code" href="a00317.html#09a7f81fb2c3055aaecf058b11538544">malloc_type</a> <a class="code" href="a00317.html#78701e7454ef8e1a25b5acd364367080">allocator_type</a>() {
<a name="l00120"></a>00120 <span class="keywordflow">return</span> internal::is_malloc_used_v3() ? standard : scalable;
<a name="l00121"></a>00121 }
<a name="l00122"></a>00122 };
@@ -131,25 +131,25 @@
<a name="l00127"></a>00127 <span class="preprocessor"></span>
<a name="l00129"></a>00129
<a name="l00130"></a>00130 <span class="keyword">template</span><>
-<a name="l00131"></a><a class="code" href="a00297.html">00131</a> <span class="keyword">class </span><a class="code" href="a00296.html">tbb_allocator</a><void> {
+<a name="l00131"></a><a class="code" href="a00318.html">00131</a> <span class="keyword">class </span><a class="code" href="a00317.html">tbb_allocator</a><void> {
<a name="l00132"></a>00132 <span class="keyword">public</span>:
<a name="l00133"></a>00133 <span class="keyword">typedef</span> <span class="keywordtype">void</span>* pointer;
<a name="l00134"></a>00134 <span class="keyword">typedef</span> <span class="keyword">const</span> <span class="keywordtype">void</span>* const_pointer;
<a name="l00135"></a>00135 <span class="keyword">typedef</span> <span class="keywordtype">void</span> value_type;
<a name="l00136"></a>00136 <span class="keyword">template</span><<span class="keyword">typename</span> U> <span class="keyword">struct </span>rebind {
-<a name="l00137"></a>00137 <span class="keyword">typedef</span> <a class="code" href="a00296.html">tbb_allocator<U></a> other;
+<a name="l00137"></a>00137 <span class="keyword">typedef</span> <a class="code" href="a00317.html">tbb_allocator<U></a> other;
<a name="l00138"></a>00138 };
<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">typename</span> U>
-<a name="l00142"></a>00142 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> <a class="code" href="a00296.html">tbb_allocator<T></a>&, <span class="keyword">const</span> <a class="code" href="a00296.html">tbb_allocator<U></a>& ) {<span class="keywordflow">return</span> <span class="keyword">true</span>;}
+<a name="l00142"></a>00142 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> <a class="code" href="a00317.html">tbb_allocator<T></a>&, <span class="keyword">const</span> <a class="code" href="a00317.html">tbb_allocator<U></a>& ) {<span class="keywordflow">return</span> <span class="keyword">true</span>;}
<a name="l00143"></a>00143
<a name="l00144"></a>00144 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
<a name="l00145"></a>00145 <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="l00146"></a>00146
<a name="l00148"></a>00148
<a name="l00153"></a>00153 <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="l00154"></a><a class="code" href="a00306.html">00154</a> <span class="keyword">class </span><a class="code" href="a00306.html">zero_allocator</a> : <span class="keyword">public</span> Allocator<T>
+<a name="l00154"></a><a class="code" href="a00326.html">00154</a> <span class="keyword">class </span><a class="code" href="a00326.html">zero_allocator</a> : <span class="keyword">public</span> Allocator<T>
<a name="l00155"></a>00155 {
<a name="l00156"></a>00156 <span class="keyword">public</span>:
<a name="l00157"></a>00157 <span class="keyword">typedef</span> Allocator<T> base_allocator_type;
@@ -161,13 +161,13 @@
<a name="l00163"></a>00163 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_allocator_type::size_type size_type;
<a name="l00164"></a>00164 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_allocator_type::difference_type difference_type;
<a name="l00165"></a>00165 <span class="keyword">template</span><<span class="keyword">typename</span> U> <span class="keyword">struct </span>rebind {
-<a name="l00166"></a>00166 <span class="keyword">typedef</span> <a class="code" href="a00306.html">zero_allocator<U, Allocator></a> other;
+<a name="l00166"></a>00166 <span class="keyword">typedef</span> <a class="code" href="a00326.html">zero_allocator<U, Allocator></a> other;
<a name="l00167"></a>00167 };
<a name="l00168"></a>00168
-<a name="l00169"></a>00169 <a class="code" href="a00306.html">zero_allocator</a>() <span class="keywordflow">throw</span>() { }
-<a name="l00170"></a>00170 <a class="code" href="a00306.html">zero_allocator</a>(<span class="keyword">const</span> <a class="code" href="a00306.html">zero_allocator</a> &a) <span class="keywordflow">throw</span>() : base_allocator_type( a ) { }
+<a name="l00169"></a>00169 <a class="code" href="a00326.html">zero_allocator</a>() <span class="keywordflow">throw</span>() { }
+<a name="l00170"></a>00170 <a class="code" href="a00326.html">zero_allocator</a>(<span class="keyword">const</span> <a class="code" href="a00326.html">zero_allocator</a> &a) <span class="keywordflow">throw</span>() : base_allocator_type( a ) { }
<a name="l00171"></a>00171 <span class="keyword">template</span><<span class="keyword">typename</span> U>
-<a name="l00172"></a>00172 <a class="code" href="a00306.html">zero_allocator</a>(<span class="keyword">const</span> <a class="code" href="a00306.html">zero_allocator<U></a> &a) <span class="keywordflow">throw</span>() : base_allocator_type( Allocator<U>( a ) ) { }
+<a name="l00172"></a>00172 <a class="code" href="a00326.html">zero_allocator</a>(<span class="keyword">const</span> <a class="code" href="a00326.html">zero_allocator<U></a> &a) <span class="keywordflow">throw</span>() : base_allocator_type( Allocator<U>( a ) ) { }
<a name="l00173"></a>00173
<a name="l00174"></a>00174 pointer allocate(<span class="keyword">const</span> size_type n, <span class="keyword">const</span> <span class="keywordtype">void</span> *hint = 0 ) {
<a name="l00175"></a>00175 pointer ptr = base_allocator_type::allocate( n, hint );
@@ -178,19 +178,19 @@
<a name="l00180"></a>00180
<a name="l00182"></a>00182
<a name="l00183"></a>00183 <span class="keyword">template</span><<span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">class </span>Allocator>
-<a name="l00184"></a><a class="code" href="a00307.html">00184</a> <span class="keyword">class </span><a class="code" href="a00306.html">zero_allocator</a><void, Allocator> : <span class="keyword">public</span> Allocator<void> {
+<a name="l00184"></a><a class="code" href="a00327.html">00184</a> <span class="keyword">class </span><a class="code" href="a00326.html">zero_allocator</a><void, Allocator> : <span class="keyword">public</span> Allocator<void> {
<a name="l00185"></a>00185 <span class="keyword">public</span>:
<a name="l00186"></a>00186 <span class="keyword">typedef</span> Allocator<void> base_allocator_type;
<a name="l00187"></a>00187 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_allocator_type::value_type value_type;
<a name="l00188"></a>00188 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_allocator_type::pointer pointer;
<a name="l00189"></a>00189 <span class="keyword">typedef</span> <span class="keyword">typename</span> base_allocator_type::const_pointer const_pointer;
<a name="l00190"></a>00190 <span class="keyword">template</span><<span class="keyword">typename</span> U> <span class="keyword">struct </span>rebind {
-<a name="l00191"></a>00191 <span class="keyword">typedef</span> <a class="code" href="a00306.html">zero_allocator<U, Allocator></a> other;
+<a name="l00191"></a>00191 <span class="keyword">typedef</span> <a class="code" href="a00326.html">zero_allocator<U, Allocator></a> other;
<a name="l00192"></a>00192 };
<a name="l00193"></a>00193 };
<a name="l00194"></a>00194
<a name="l00195"></a>00195 <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="l00196"></a>00196 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> <a class="code" href="a00306.html">zero_allocator<T1,B1></a> &a, <span class="keyword">const</span> <a class="code" href="a00306.html">zero_allocator<T2,B2></a> &b) {
+<a name="l00196"></a>00196 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> <a class="code" href="a00326.html">zero_allocator<T1,B1></a> &a, <span class="keyword">const</span> <a class="code" href="a00326.html">zero_allocator<T2,B2></a> &b) {
<a name="l00197"></a>00197 <span class="keywordflow">return</span> static_cast< B1<T1> >(a) == <span class="keyword">static_cast</span>< B2<T2> >(b);
<a name="l00198"></a>00198 }
<a name="l00199"></a>00199 <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>
diff --git a/doc/html/a00592.html b/doc/html/a00592.html
index 5b4c18f..77b4a3d 100644
--- a/doc/html/a00592.html
+++ b/doc/html/a00592.html
@@ -42,190 +42,206 @@
<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="l00033"></a>00033 <span class="preprocessor">#ifndef TBB_USE_DEBUG</span>
-<a name="l00034"></a>00034 <span class="preprocessor"></span><span class="preprocessor">#ifdef TBB_DO_ASSERT</span>
-<a name="l00035"></a>00035 <span class="preprocessor"></span><span class="preprocessor">#define TBB_USE_DEBUG TBB_DO_ASSERT</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">#define TBB_USE_DEBUG 0</span>
-<a name="l00038"></a>00038 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* TBB_DO_ASSERT */</span>
-<a name="l00039"></a>00039 <span class="preprocessor">#else</span>
-<a name="l00040"></a>00040 <span class="preprocessor"></span><span class="preprocessor">#define TBB_DO_ASSERT TBB_USE_DEBUG</span>
-<a name="l00041"></a>00041 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_DEBUG */</span>
-<a name="l00042"></a>00042
-<a name="l00043"></a>00043 <span class="preprocessor">#ifndef TBB_USE_ASSERT</span>
-<a name="l00044"></a>00044 <span class="preprocessor"></span><span class="preprocessor">#ifdef TBB_DO_ASSERT</span>
-<a name="l00045"></a>00045 <span class="preprocessor"></span><span class="preprocessor">#define TBB_USE_ASSERT TBB_DO_ASSERT</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">#define TBB_USE_ASSERT TBB_USE_DEBUG</span>
-<a name="l00048"></a>00048 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* TBB_DO_ASSERT */</span>
-<a name="l00049"></a>00049 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
-<a name="l00050"></a>00050
-<a name="l00051"></a>00051 <span class="preprocessor">#ifndef TBB_USE_THREADING_TOOLS</span>
-<a name="l00052"></a>00052 <span class="preprocessor"></span><span class="preprocessor">#ifdef TBB_DO_THREADING_TOOLS</span>
-<a name="l00053"></a>00053 <span class="preprocessor"></span><span class="preprocessor">#define TBB_USE_THREADING_TOOLS TBB_DO_THREADING_TOOLS</span>
-<a name="l00054"></a>00054 <span class="preprocessor"></span><span class="preprocessor">#else </span>
-<a name="l00055"></a>00055 <span class="preprocessor"></span><span class="preprocessor">#define TBB_USE_THREADING_TOOLS TBB_USE_DEBUG</span>
-<a name="l00056"></a>00056 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* TBB_DO_THREADING_TOOLS */</span>
-<a name="l00057"></a>00057 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_THREADING_TOOLS */</span>
-<a name="l00058"></a>00058
-<a name="l00059"></a>00059 <span class="preprocessor">#ifndef TBB_USE_PERFORMANCE_WARNINGS</span>
-<a name="l00060"></a>00060 <span class="preprocessor"></span><span class="preprocessor">#ifdef TBB_PERFORMANCE_WARNINGS</span>
-<a name="l00061"></a>00061 <span class="preprocessor"></span><span class="preprocessor">#define TBB_USE_PERFORMANCE_WARNINGS TBB_PERFORMANCE_WARNINGS</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">#define TBB_USE_PERFORMANCE_WARNINGS TBB_USE_DEBUG</span>
-<a name="l00064"></a>00064 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* TBB_PEFORMANCE_WARNINGS */</span>
-<a name="l00065"></a>00065 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_PERFORMANCE_WARNINGS */</span>
-<a name="l00066"></a>00066
-<a name="l00067"></a>00067 <span class="preprocessor">#if !defined(__EXCEPTIONS) && !defined(_CPPUNWIND) && !defined(__SUNPRO_CC) || defined(_XBOX)</span>
-<a name="l00068"></a>00068 <span class="preprocessor"></span><span class="preprocessor"> #if TBB_USE_EXCEPTIONS</span>
-<a name="l00069"></a>00069 <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="l00070"></a>00070 <span class="preprocessor"></span><span class="preprocessor"> #elif !defined(TBB_USE_EXCEPTIONS)</span>
-<a name="l00071"></a>00071 <span class="preprocessor"></span><span class="preprocessor"> #define TBB_USE_EXCEPTIONS 0</span>
-<a name="l00072"></a>00072 <span class="preprocessor"></span><span class="preprocessor"> #endif</span>
-<a name="l00073"></a>00073 <span class="preprocessor"></span><span class="preprocessor">#elif !defined(TBB_USE_EXCEPTIONS)</span>
-<a name="l00074"></a>00074 <span class="preprocessor"></span><span class="preprocessor"> #define TBB_USE_EXCEPTIONS 1</span>
-<a name="l00075"></a>00075 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00076"></a>00076 <span class="preprocessor"></span>
-<a name="l00077"></a>00077 <span class="preprocessor">#ifndef TBB_IMPLEMENT_CPP0X</span>
-<a name="l00078"></a>00078 <span class="preprocessor"></span>
-<a name="l00079"></a>00079 <span class="preprocessor"> #if __GNUC__==4 && __GNUC_MINOR__>=4 && __GXX_EXPERIMENTAL_CXX0X__</span>
-<a name="l00080"></a>00080 <span class="preprocessor"></span><span class="preprocessor"> #define TBB_IMPLEMENT_CPP0X 0</span>
-<a name="l00081"></a>00081 <span class="preprocessor"></span><span class="preprocessor"> #else</span>
-<a name="l00082"></a>00082 <span class="preprocessor"></span><span class="preprocessor"> #define TBB_IMPLEMENT_CPP0X 1</span>
-<a name="l00083"></a>00083 <span class="preprocessor"></span><span class="preprocessor"> #endif</span>
-<a name="l00084"></a>00084 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* TBB_IMPLEMENT_CPP0X */</span>
-<a name="l00085"></a>00085
-<a name="l00086"></a>00086 <span class="preprocessor">#ifndef __TBB_DYNAMIC_LOAD_ENABLED</span>
-<a name="l00087"></a>00087 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_DYNAMIC_LOAD_ENABLED !__TBB_TASK_CPP_DIRECTLY_INCLUDED</span>
-<a name="l00088"></a>00088 <span class="preprocessor"></span><span class="preprocessor">#elif !__TBB_DYNAMIC_LOAD_ENABLED</span>
-<a name="l00089"></a>00089 <span class="preprocessor"></span><span class="preprocessor"> #if _WIN32||_WIN64</span>
-<a name="l00090"></a>00090 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_NO_IMPLICIT_LINKAGE 1</span>
-<a name="l00091"></a>00091 <span class="preprocessor"></span><span class="preprocessor"> #define __TBBMALLOC_NO_IMPLICIT_LINKAGE 1</span>
-<a name="l00092"></a>00092 <span class="preprocessor"></span><span class="preprocessor"> #else</span>
-<a name="l00093"></a>00093 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_WEAK_SYMBOLS 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><span class="preprocessor">#endif</span>
-<a name="l00096"></a>00096 <span class="preprocessor"></span>
-<a name="l00099"></a>00099 <span class="preprocessor">#ifndef __TBB_COUNT_TASK_NODES</span>
-<a name="l00100"></a>00100 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_COUNT_TASK_NODES TBB_USE_ASSERT</span>
-<a name="l00101"></a>00101 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00102"></a>00102 <span class="preprocessor"></span>
-<a name="l00103"></a>00103 <span class="preprocessor">#ifndef __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00104"></a>00104 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_TASK_GROUP_CONTEXT 1</span>
-<a name="l00105"></a>00105 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
-<a name="l00106"></a>00106
-<a name="l00107"></a>00107 <span class="preprocessor">#ifndef __TBB_SCHEDULER_OBSERVER</span>
-<a name="l00108"></a>00108 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_SCHEDULER_OBSERVER 1</span>
-<a name="l00109"></a>00109 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* __TBB_SCHEDULER_OBSERVER */</span>
-<a name="l00110"></a>00110
-<a name="l00111"></a>00111 <span class="preprocessor">#ifndef __TBB_TASK_PRIORITY</span>
-<a name="l00112"></a>00112 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_TASK_PRIORITY __TBB_CPF_BUILD</span>
-<a name="l00113"></a>00113 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_PRIORITY */</span>
-<a name="l00114"></a>00114
-<a name="l00115"></a>00115 <span class="preprocessor">#if __TBB_TASK_PRIORITY && !__TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00116"></a>00116 <span class="preprocessor"></span><span class="preprocessor"> #error __TBB_TASK_PRIORITY requires __TBB_TASK_GROUP_CONTEXT to be enabled</span>
-<a name="l00117"></a>00117 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00118"></a>00118 <span class="preprocessor"></span>
-<a name="l00119"></a>00119 <span class="preprocessor">#ifdef TBB_PREVIEW_TASK_PRIORITY</span>
-<a name="l00120"></a>00120 <span class="preprocessor"></span><span class="preprocessor"> #if TBB_PREVIEW_TASK_PRIORITY</span>
-<a name="l00121"></a>00121 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_NO_IMPLICIT_LINKAGE 1</span>
-<a name="l00122"></a>00122 <span class="preprocessor"></span><span class="preprocessor"> #if __TBB_BUILD && !__TBB_TASK_PRIORITY</span>
-<a name="l00123"></a>00123 <span class="preprocessor"></span><span class="preprocessor"> #error TBB_PREVIEW_TASK_PRIORITY requires __TBB_TASK_PRIORITY to be enabled during TBB build</span>
-<a name="l00124"></a>00124 <span class="preprocessor"></span><span class="preprocessor"> #elif !__TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00125"></a>00125 <span class="preprocessor"></span><span class="preprocessor"> #error TBB_PREVIEW_TASK_PRIORITY requires __TBB_TASK_GROUP_CONTEXT to be enabled</span>
-<a name="l00126"></a>00126 <span class="preprocessor"></span><span class="preprocessor"> #endif</span>
-<a name="l00127"></a>00127 <span class="preprocessor"></span><span class="preprocessor"> #endif</span>
-<a name="l00128"></a>00128 <span class="preprocessor"></span><span class="preprocessor">#else</span>
-<a name="l00129"></a>00129 <span class="preprocessor"></span><span class="preprocessor"> #if __TBB_BUILD</span>
-<a name="l00130"></a>00130 <span class="preprocessor"></span><span class="preprocessor"> #define TBB_PREVIEW_TASK_PRIORITY __TBB_TASK_PRIORITY</span>
-<a name="l00131"></a>00131 <span class="preprocessor"></span><span class="preprocessor"> #endif</span>
-<a name="l00132"></a>00132 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* TBB_PREVIEW_TASK_PRIORITY */</span>
-<a name="l00133"></a>00133
-<a name="l00134"></a>00134 <span class="preprocessor">#if !defined(__TBB_SURVIVE_THREAD_SWITCH) && (_WIN32 || _WIN64 || __linux__)</span>
-<a name="l00135"></a>00135 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_SURVIVE_THREAD_SWITCH 1</span>
-<a name="l00136"></a>00136 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* __TBB_SURVIVE_THREAD_SWITCH */</span>
-<a name="l00137"></a>00137
-<a name="l00138"></a>00138
-<a name="l00139"></a>00139 <span class="comment">/* TODO: The following condition should be extended as soon as new compilers/runtimes </span>
-<a name="l00140"></a>00140 <span class="comment"> with std::exception_ptr support appear. */</span>
-<a name="l00141"></a>00141 <span class="preprocessor">#define __TBB_EXCEPTION_PTR_PRESENT (_MSC_VER >= 1600 || __GXX_EXPERIMENTAL_CXX0X__ && (__GNUC__==4 && __GNUC_MINOR__>=4))</span>
-<a name="l00142"></a>00142 <span class="preprocessor"></span>
-<a name="l00143"></a>00143
-<a name="l00144"></a>00144 <span class="preprocessor">#ifndef TBB_USE_CAPTURED_EXCEPTION</span>
-<a name="l00145"></a>00145 <span class="preprocessor"></span><span class="preprocessor"> #if __TBB_EXCEPTION_PTR_PRESENT</span>
-<a name="l00146"></a>00146 <span class="preprocessor"></span><span class="preprocessor"> #define TBB_USE_CAPTURED_EXCEPTION 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_CAPTURED_EXCEPTION 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">#else </span><span class="comment">/* defined TBB_USE_CAPTURED_EXCEPTION */</span>
-<a name="l00151"></a>00151 <span class="preprocessor"> #if !TBB_USE_CAPTURED_EXCEPTION && !__TBB_EXCEPTION_PTR_PRESENT</span>
-<a name="l00152"></a>00152 <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="l00153"></a>00153 <span class="preprocessor"></span><span class="preprocessor"> #endif</span>
-<a name="l00154"></a>00154 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* defined TBB_USE_CAPTURED_EXCEPTION */</span>
-<a name="l00155"></a>00155
-<a name="l00156"></a>00156
-<a name="l00157"></a>00157 <span class="preprocessor">#ifndef __TBB_DEFAULT_PARTITIONER</span>
-<a name="l00158"></a>00158 <span class="preprocessor"></span><span class="preprocessor">#if TBB_DEPRECATED</span>
-<a name="l00159"></a>00159 <span class="preprocessor"></span>
-<a name="l00160"></a>00160 <span class="preprocessor">#define __TBB_DEFAULT_PARTITIONER tbb::simple_partitioner</span>
-<a name="l00161"></a>00161 <span class="preprocessor"></span><span class="preprocessor">#else</span>
-<a name="l00162"></a>00162 <span class="preprocessor"></span>
-<a name="l00163"></a>00163 <span class="preprocessor">#define __TBB_DEFAULT_PARTITIONER tbb::auto_partitioner</span>
-<a name="l00164"></a>00164 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* TBB_DEFAULT_PARTITIONER */</span>
-<a name="l00165"></a>00165 <span class="preprocessor">#endif </span><span class="comment">/* !defined(__TBB_DEFAULT_PARTITIONER */</span>
-<a name="l00166"></a>00166
-<a name="l00169"></a>00169 <span class="preprocessor">#if __GNUC__==4 && __GNUC_MINOR__>=4 && !defined(__INTEL_COMPILER)</span>
-<a name="l00170"></a>00170 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_GCC_WARNING_SUPPRESSION_ENABLED 1</span>
-<a name="l00171"></a>00171 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00172"></a>00172 <span class="preprocessor"></span>
-<a name="l00179"></a>00179 <span class="preprocessor">#if _MSC_VER && __INTEL_COMPILER && (__INTEL_COMPILER<1110 || __INTEL_COMPILER==1110 && __INTEL_COMPILER_BUILD_DATE < 20091012)</span>
-<a name="l00180"></a>00180 <span class="preprocessor"></span>
-<a name="l00183"></a>00183 <span class="preprocessor"> #define __TBB_DEFAULT_DTOR_THROW_SPEC_BROKEN 1</span>
-<a name="l00184"></a>00184 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00185"></a>00185 <span class="preprocessor"></span>
-<a name="l00186"></a>00186 <span class="preprocessor">#if defined(_MSC_VER) && _MSC_VER < 1500 && !defined(__INTEL_COMPILER)</span>
-<a name="l00187"></a>00187 <span class="preprocessor"></span>
-<a name="l00189"></a>00189 <span class="preprocessor"> #define __TBB_TEMPLATE_FRIENDS_BROKEN 1</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>
+<a name="l00036"></a>00036 <span class="preprocessor">#if (__TBB_GCC_VERSION >= 40400) && !defined(__INTEL_COMPILER)</span>
+<a name="l00037"></a>00037 <span class="preprocessor"></span>
+<a name="l00038"></a>00038 <span class="preprocessor"> #define __TBB_GCC_WARNING_SUPPRESSION_PRESENT 1</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="comment">/* TODO: The following condition should be extended when new compilers/runtimes </span>
+<a name="l00042"></a>00042 <span class="comment"> with std::exception_ptr support appear. */</span>
+<a name="l00043"></a>00043 <span class="preprocessor">#define __TBB_EXCEPTION_PTR_PRESENT ((_MSC_VER >= 1600 || (__GXX_EXPERIMENTAL_CXX0X__ && __GNUC__==4 && __GNUC_MINOR__>=4)) && !__INTEL_COMPILER)</span>
+<a name="l00044"></a>00044 <span class="preprocessor"></span>
+<a name="l00045"></a>00045 <span class="preprocessor">#if __GNUC__ || __SUNPRO_CC || __IBMCPP__</span>
+<a name="l00046"></a>00046 <span class="preprocessor"></span> <span class="comment">/* ICC defines __GNUC__ and so is covered */</span>
+<a name="l00047"></a>00047 <span class="preprocessor"> #define __TBB_ATTRIBUTE_ALIGNED_PRESENT 1</span>
+<a name="l00048"></a>00048 <span class="preprocessor"></span><span class="preprocessor">#elif _MSC_VER && (_MSC_VER >= 1300 || __INTEL_COMPILER)</span>
+<a name="l00049"></a>00049 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_DECLSPEC_ALIGN_PRESENT 1</span>
+<a name="l00050"></a>00050 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00051"></a>00051 <span class="preprocessor"></span>
+<a name="l00052"></a>00052 <span class="preprocessor">#if (__TBB_GCC_VERSION >= 40102) && !defined(__INTEL_COMPILER)</span>
+<a name="l00053"></a>00053 <span class="preprocessor"></span>
+<a name="l00054"></a>00054 <span class="preprocessor"> #define __TBB_GCC_BUILTIN_ATOMICS_PRESENT 1</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="l00059"></a>00059 <span class="preprocessor">#ifndef TBB_USE_DEBUG</span>
+<a name="l00060"></a>00060 <span class="preprocessor"></span><span class="preprocessor">#ifdef TBB_DO_ASSERT</span>
+<a name="l00061"></a>00061 <span class="preprocessor"></span><span class="preprocessor">#define TBB_USE_DEBUG TBB_DO_ASSERT</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">#ifdef _DEBUG</span>
+<a name="l00064"></a>00064 <span class="preprocessor"></span><span class="preprocessor">#define TBB_USE_DEBUG _DEBUG</span>
+<a name="l00065"></a>00065 <span class="preprocessor"></span><span class="preprocessor">#else</span>
+<a name="l00066"></a>00066 <span class="preprocessor"></span><span class="preprocessor">#define TBB_USE_DEBUG 0</span>
+<a name="l00067"></a>00067 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00068"></a>00068 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* TBB_DO_ASSERT */</span>
+<a name="l00069"></a>00069 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_DEBUG */</span>
+<a name="l00070"></a>00070
+<a name="l00071"></a>00071 <span class="preprocessor">#ifndef TBB_USE_ASSERT</span>
+<a name="l00072"></a>00072 <span class="preprocessor"></span><span class="preprocessor">#ifdef TBB_DO_ASSERT</span>
+<a name="l00073"></a>00073 <span class="preprocessor"></span><span class="preprocessor">#define TBB_USE_ASSERT TBB_DO_ASSERT</span>
+<a name="l00074"></a>00074 <span class="preprocessor"></span><span class="preprocessor">#else </span>
+<a name="l00075"></a>00075 <span class="preprocessor"></span><span class="preprocessor">#define TBB_USE_ASSERT TBB_USE_DEBUG</span>
+<a name="l00076"></a>00076 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* TBB_DO_ASSERT */</span>
+<a name="l00077"></a>00077 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
+<a name="l00078"></a>00078
+<a name="l00079"></a>00079 <span class="preprocessor">#ifndef TBB_USE_THREADING_TOOLS</span>
+<a name="l00080"></a>00080 <span class="preprocessor"></span><span class="preprocessor">#ifdef TBB_DO_THREADING_TOOLS</span>
+<a name="l00081"></a>00081 <span class="preprocessor"></span><span class="preprocessor">#define TBB_USE_THREADING_TOOLS TBB_DO_THREADING_TOOLS</span>
+<a name="l00082"></a>00082 <span class="preprocessor"></span><span class="preprocessor">#else </span>
+<a name="l00083"></a>00083 <span class="preprocessor"></span><span class="preprocessor">#define TBB_USE_THREADING_TOOLS TBB_USE_DEBUG</span>
+<a name="l00084"></a>00084 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* TBB_DO_THREADING_TOOLS */</span>
+<a name="l00085"></a>00085 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_THREADING_TOOLS */</span>
+<a name="l00086"></a>00086
+<a name="l00087"></a>00087 <span class="preprocessor">#ifndef TBB_USE_PERFORMANCE_WARNINGS</span>
+<a name="l00088"></a>00088 <span class="preprocessor"></span><span class="preprocessor">#ifdef TBB_PERFORMANCE_WARNINGS</span>
+<a name="l00089"></a>00089 <span class="preprocessor"></span><span class="preprocessor">#define TBB_USE_PERFORMANCE_WARNINGS TBB_PERFORMANCE_WARNINGS</span>
+<a name="l00090"></a>00090 <span class="preprocessor"></span><span class="preprocessor">#else </span>
+<a name="l00091"></a>00091 <span class="preprocessor"></span><span class="preprocessor">#define TBB_USE_PERFORMANCE_WARNINGS TBB_USE_DEBUG</span>
+<a name="l00092"></a>00092 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* TBB_PEFORMANCE_WARNINGS */</span>
+<a name="l00093"></a>00093 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_PERFORMANCE_WARNINGS */</span>
+<a name="l00094"></a>00094
+<a name="l00095"></a>00095 <span class="preprocessor">#if !defined(__EXCEPTIONS) && !defined(_CPPUNWIND) && !defined(__SUNPRO_CC) || defined(_XBOX)</span>
+<a name="l00096"></a>00096 <span class="preprocessor"></span><span class="preprocessor"> #if TBB_USE_EXCEPTIONS</span>
+<a name="l00097"></a>00097 <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="l00098"></a>00098 <span class="preprocessor"></span><span class="preprocessor"> #elif !defined(TBB_USE_EXCEPTIONS)</span>
+<a name="l00099"></a>00099 <span class="preprocessor"></span><span class="preprocessor"> #define TBB_USE_EXCEPTIONS 0</span>
+<a name="l00100"></a>00100 <span class="preprocessor"></span><span class="preprocessor"> #endif</span>
+<a name="l00101"></a>00101 <span class="preprocessor"></span><span class="preprocessor">#elif !defined(TBB_USE_EXCEPTIONS)</span>
+<a name="l00102"></a>00102 <span class="preprocessor"></span><span class="preprocessor"> #define TBB_USE_EXCEPTIONS 1</span>
+<a name="l00103"></a>00103 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00104"></a>00104 <span class="preprocessor"></span>
+<a name="l00105"></a>00105 <span class="preprocessor">#ifndef TBB_IMPLEMENT_CPP0X</span>
+<a name="l00106"></a>00106 <span class="preprocessor"></span>
+<a name="l00107"></a>00107 <span class="preprocessor"> #if __GNUC__==4 && __GNUC_MINOR__>=4 && __GXX_EXPERIMENTAL_CXX0X__</span>
+<a name="l00108"></a>00108 <span class="preprocessor"></span><span class="preprocessor"> #define TBB_IMPLEMENT_CPP0X 0</span>
+<a name="l00109"></a>00109 <span class="preprocessor"></span><span class="preprocessor"> #else</span>
+<a name="l00110"></a>00110 <span class="preprocessor"></span><span class="preprocessor"> #define TBB_IMPLEMENT_CPP0X 1</span>
+<a name="l00111"></a>00111 <span class="preprocessor"></span><span class="preprocessor"> #endif</span>
+<a name="l00112"></a>00112 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* TBB_IMPLEMENT_CPP0X */</span>
+<a name="l00113"></a>00113
+<a name="l00114"></a>00114 <span class="preprocessor">#ifndef TBB_USE_CAPTURED_EXCEPTION</span>
+<a name="l00115"></a>00115 <span class="preprocessor"></span><span class="preprocessor"> #if __TBB_EXCEPTION_PTR_PRESENT</span>
+<a name="l00116"></a>00116 <span class="preprocessor"></span><span class="preprocessor"> #define TBB_USE_CAPTURED_EXCEPTION 0</span>
+<a name="l00117"></a>00117 <span class="preprocessor"></span><span class="preprocessor"> #else</span>
+<a name="l00118"></a>00118 <span class="preprocessor"></span><span class="preprocessor"> #define TBB_USE_CAPTURED_EXCEPTION 1</span>
+<a name="l00119"></a>00119 <span class="preprocessor"></span><span class="preprocessor"> #endif</span>
+<a name="l00120"></a>00120 <span class="preprocessor"></span><span class="preprocessor">#else </span><span class="comment">/* defined TBB_USE_CAPTURED_EXCEPTION */</span>
+<a name="l00121"></a>00121 <span class="preprocessor"> #if !TBB_USE_CAPTURED_EXCEPTION && !__TBB_EXCEPTION_PTR_PRESENT</span>
+<a name="l00122"></a>00122 <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="l00123"></a>00123 <span class="preprocessor"></span><span class="preprocessor"> #endif</span>
+<a name="l00124"></a>00124 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* defined TBB_USE_CAPTURED_EXCEPTION */</span>
+<a name="l00125"></a>00125
+<a name="l00127"></a>00127 <span class="preprocessor">#if (TBB_USE_GCC_BUILTINS && !__TBB_GCC_BUILTIN_ATOMICS_PRESENT)</span>
+<a name="l00128"></a>00128 <span class="preprocessor"></span><span class="preprocessor"> #error "GCC atomic built-ins are not supported."</span>
+<a name="l00129"></a>00129 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00130"></a>00130 <span class="preprocessor"></span>
+<a name="l00133"></a>00133 <span class="preprocessor">#ifndef __TBB_DYNAMIC_LOAD_ENABLED</span>
+<a name="l00134"></a>00134 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_DYNAMIC_LOAD_ENABLED !__TBB_TASK_CPP_DIRECTLY_INCLUDED</span>
+<a name="l00135"></a>00135 <span class="preprocessor"></span><span class="preprocessor">#elif !__TBB_DYNAMIC_LOAD_ENABLED</span>
+<a name="l00136"></a>00136 <span class="preprocessor"></span><span class="preprocessor"> #if _WIN32||_WIN64</span>
+<a name="l00137"></a>00137 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_NO_IMPLICIT_LINKAGE 1</span>
+<a name="l00138"></a>00138 <span class="preprocessor"></span><span class="preprocessor"> #define __TBBMALLOC_NO_IMPLICIT_LINKAGE 1</span>
+<a name="l00139"></a>00139 <span class="preprocessor"></span><span class="preprocessor"> #else</span>
+<a name="l00140"></a>00140 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_WEAK_SYMBOLS 1</span>
+<a name="l00141"></a>00141 <span class="preprocessor"></span><span class="preprocessor"> #endif</span>
+<a name="l00142"></a>00142 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00143"></a>00143 <span class="preprocessor"></span>
+<a name="l00144"></a>00144 <span class="preprocessor">#ifndef __TBB_COUNT_TASK_NODES</span>
+<a name="l00145"></a>00145 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_COUNT_TASK_NODES TBB_USE_ASSERT</span>
+<a name="l00146"></a>00146 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00147"></a>00147 <span class="preprocessor"></span>
+<a name="l00148"></a>00148 <span class="preprocessor">#ifndef __TBB_TASK_GROUP_CONTEXT</span>
+<a name="l00149"></a>00149 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_TASK_GROUP_CONTEXT 1</span>
+<a name="l00150"></a>00150 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
+<a name="l00151"></a>00151
+<a name="l00152"></a>00152 <span class="preprocessor">#if TBB_USE_EXCEPTIONS && !__TBB_TASK_GROUP_CONTEXT</span>
+<a name="l00153"></a>00153 <span class="preprocessor"></span><span class="preprocessor"> #error TBB_USE_EXCEPTIONS requires __TBB_TASK_GROUP_CONTEXT to be enabled</span>
+<a name="l00154"></a>00154 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00155"></a>00155 <span class="preprocessor"></span>
+<a name="l00156"></a>00156 <span class="preprocessor">#ifndef __TBB_SCHEDULER_OBSERVER</span>
+<a name="l00157"></a>00157 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_SCHEDULER_OBSERVER 1</span>
+<a name="l00158"></a>00158 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* __TBB_SCHEDULER_OBSERVER */</span>
+<a name="l00159"></a>00159
+<a name="l00160"></a>00160 <span class="preprocessor">#ifndef __TBB_TASK_PRIORITY</span>
+<a name="l00161"></a>00161 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_TASK_PRIORITY __TBB_TASK_GROUP_CONTEXT</span>
+<a name="l00162"></a>00162 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_PRIORITY */</span>
+<a name="l00163"></a>00163
+<a name="l00164"></a>00164 <span class="preprocessor">#if __TBB_TASK_PRIORITY && !__TBB_TASK_GROUP_CONTEXT</span>
+<a name="l00165"></a>00165 <span class="preprocessor"></span><span class="preprocessor"> #error __TBB_TASK_PRIORITY requires __TBB_TASK_GROUP_CONTEXT to be enabled</span>
+<a name="l00166"></a>00166 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00167"></a>00167 <span class="preprocessor"></span>
+<a name="l00168"></a>00168 <span class="preprocessor">#if !defined(__TBB_SURVIVE_THREAD_SWITCH) && (_WIN32 || _WIN64 || __linux__)</span>
+<a name="l00169"></a>00169 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_SURVIVE_THREAD_SWITCH 1</span>
+<a name="l00170"></a>00170 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* __TBB_SURVIVE_THREAD_SWITCH */</span>
+<a name="l00171"></a>00171
+<a name="l00172"></a>00172 <span class="preprocessor">#ifndef __TBB_DEFAULT_PARTITIONER</span>
+<a name="l00173"></a>00173 <span class="preprocessor"></span><span class="preprocessor">#if TBB_DEPRECATED</span>
+<a name="l00174"></a>00174 <span class="preprocessor"></span>
+<a name="l00175"></a>00175 <span class="preprocessor">#define __TBB_DEFAULT_PARTITIONER tbb::simple_partitioner</span>
+<a name="l00176"></a>00176 <span class="preprocessor"></span><span class="preprocessor">#else</span>
+<a name="l00177"></a>00177 <span class="preprocessor"></span>
+<a name="l00178"></a>00178 <span class="preprocessor">#define __TBB_DEFAULT_PARTITIONER tbb::auto_partitioner</span>
+<a name="l00179"></a>00179 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* TBB_DEPRECATED */</span>
+<a name="l00180"></a>00180 <span class="preprocessor">#endif </span><span class="comment">/* !defined(__TBB_DEFAULT_PARTITIONER */</span>
+<a name="l00181"></a>00181
+<a name="l00188"></a>00188 <span class="preprocessor">#if __GNUC__ && __TBB_x86_64 && __INTEL_COMPILER == 1200</span>
+<a name="l00189"></a>00189 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_ICC_12_0_INL_ASM_FSTCW_BROKEN 1</span>
<a name="l00190"></a>00190 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
<a name="l00191"></a>00191 <span class="preprocessor"></span>
-<a name="l00192"></a>00192 <span class="preprocessor">#if __GLIBC__==2 && __GLIBC_MINOR__==3 || __MINGW32__</span>
-<a name="l00194"></a>00194 <span class="preprocessor"></span>
-<a name="l00195"></a>00195 <span class="preprocessor"> #define __TBB_THROW_ACROSS_MODULE_BOUNDARY_BROKEN 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">#if (_WIN32||_WIN64) && __INTEL_COMPILER == 1110</span>
-<a name="l00199"></a>00199 <span class="preprocessor"></span>
-<a name="l00200"></a>00200 <span class="preprocessor"> #define __TBB_ICL_11_1_CODE_GEN_BROKEN 1</span>
-<a name="l00201"></a>00201 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00202"></a>00202 <span class="preprocessor"></span>
-<a name="l00203"></a>00203 <span class="preprocessor">#if __GNUC__==3 && __GNUC_MINOR__==3 && !defined(__INTEL_COMPILER)</span>
+<a name="l00192"></a>00192 <span class="preprocessor">#if _MSC_VER && __INTEL_COMPILER && (__INTEL_COMPILER<1110 || __INTEL_COMPILER==1110 && __INTEL_COMPILER_BUILD_DATE < 20091012)</span>
+<a name="l00193"></a>00193 <span class="preprocessor"></span>
+<a name="l00196"></a>00196 <span class="preprocessor"> #define __TBB_DEFAULT_DTOR_THROW_SPEC_BROKEN 1</span>
+<a name="l00197"></a>00197 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00198"></a>00198 <span class="preprocessor"></span>
+<a name="l00199"></a>00199 <span class="preprocessor">#if defined(_MSC_VER) && _MSC_VER < 1500 && !defined(__INTEL_COMPILER)</span>
+<a name="l00200"></a>00200 <span class="preprocessor"></span>
+<a name="l00202"></a>00202 <span class="preprocessor"> #define __TBB_TEMPLATE_FRIENDS_BROKEN 1</span>
+<a name="l00203"></a>00203 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
<a name="l00204"></a>00204 <span class="preprocessor"></span>
-<a name="l00205"></a>00205 <span class="preprocessor"> #define __TBB_GCC_3_3_PROTECTED_BROKEN 1</span>
-<a name="l00206"></a>00206 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00205"></a>00205 <span class="preprocessor">#if __GLIBC__==2 && __GLIBC_MINOR__==3 || __MINGW32__ || (__APPLE__ && __INTEL_COMPILER==1200 && !TBB_USE_DEBUG)</span>
<a name="l00207"></a>00207 <span class="preprocessor"></span>
-<a name="l00208"></a>00208 <span class="preprocessor">#if __MINGW32__ && (__GNUC__<4 || __GNUC__==4 && __GNUC_MINOR__<2)</span>
-<a name="l00209"></a>00209 <span class="preprocessor"></span>
-<a name="l00211"></a>00211 <span class="preprocessor"> #define __TBB_SSE_STACK_ALIGNMENT_BROKEN 1</span>
-<a name="l00212"></a>00212 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00213"></a>00213 <span class="preprocessor"></span>
-<a name="l00214"></a>00214 <span class="preprocessor">#if __GNUC__==4 && __GNUC_MINOR__==3 && __GNUC_PATCHLEVEL__==0</span>
-<a name="l00215"></a>00215 <span class="preprocessor"></span> <span class="comment">// GCC of this version may rashly ignore control dependencies</span>
-<a name="l00216"></a>00216 <span class="preprocessor"> #define __TBB_GCC_OPTIMIZER_ORDERING_BROKEN 1</span>
-<a name="l00217"></a>00217 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00218"></a>00218 <span class="preprocessor"></span>
-<a name="l00219"></a>00219 <span class="preprocessor">#if __FreeBSD__</span>
+<a name="l00208"></a>00208 <span class="preprocessor"> #define __TBB_THROW_ACROSS_MODULE_BOUNDARY_BROKEN 1</span>
+<a name="l00209"></a>00209 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00210"></a>00210 <span class="preprocessor"></span>
+<a name="l00211"></a>00211 <span class="preprocessor">#if (_WIN32||_WIN64) && __INTEL_COMPILER == 1110</span>
+<a name="l00212"></a>00212 <span class="preprocessor"></span>
+<a name="l00213"></a>00213 <span class="preprocessor"> #define __TBB_ICL_11_1_CODE_GEN_BROKEN 1</span>
+<a name="l00214"></a>00214 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00215"></a>00215 <span class="preprocessor"></span>
+<a name="l00216"></a>00216 <span class="preprocessor">#if __GNUC__==3 && __GNUC_MINOR__==3 && !defined(__INTEL_COMPILER)</span>
+<a name="l00217"></a>00217 <span class="preprocessor"></span>
+<a name="l00218"></a>00218 <span class="preprocessor"> #define __TBB_GCC_3_3_PROTECTED_BROKEN 1</span>
+<a name="l00219"></a>00219 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
<a name="l00220"></a>00220 <span class="preprocessor"></span>
-<a name="l00222"></a>00222 <span class="preprocessor"> #define __TBB_PRIO_INHERIT_BROKEN 1</span>
-<a name="l00223"></a>00223 <span class="preprocessor"></span>
-<a name="l00226"></a>00226 <span class="preprocessor"> #define __TBB_PLACEMENT_NEW_EXCEPTION_SAFETY_BROKEN 1</span>
-<a name="l00227"></a>00227 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* __FreeBSD__ */</span>
-<a name="l00228"></a>00228
-<a name="l00229"></a>00229 <span class="preprocessor">#if (__linux__ || __APPLE__) && __i386__ && defined(__INTEL_COMPILER)</span>
-<a name="l00230"></a>00230 <span class="preprocessor"></span>
-<a name="l00232"></a>00232 <span class="preprocessor"> #define __TBB_ICC_ASM_VOLATILE_BROKEN 1</span>
-<a name="l00233"></a>00233 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00234"></a>00234 <span class="preprocessor"></span>
-<a name="l00235"></a>00235 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_tbb_config_H */</span>
+<a name="l00221"></a>00221 <span class="preprocessor">#if __MINGW32__ && (__GNUC__<4 || __GNUC__==4 && __GNUC_MINOR__<2)</span>
+<a name="l00222"></a>00222 <span class="preprocessor"></span>
+<a name="l00224"></a>00224 <span class="preprocessor"> #define __TBB_SSE_STACK_ALIGNMENT_BROKEN 1</span>
+<a name="l00225"></a>00225 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00226"></a>00226 <span class="preprocessor"></span>
+<a name="l00227"></a>00227 <span class="preprocessor">#if __GNUC__==4 && __GNUC_MINOR__==3 && __GNUC_PATCHLEVEL__==0</span>
+<a name="l00228"></a>00228 <span class="preprocessor"></span> <span class="comment">// GCC of this version may rashly ignore control dependencies</span>
+<a name="l00229"></a>00229 <span class="preprocessor"> #define __TBB_GCC_OPTIMIZER_ORDERING_BROKEN 1</span>
+<a name="l00230"></a>00230 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00231"></a>00231 <span class="preprocessor"></span>
+<a name="l00232"></a>00232 <span class="preprocessor">#if __FreeBSD__</span>
+<a name="l00233"></a>00233 <span class="preprocessor"></span>
+<a name="l00235"></a>00235 <span class="preprocessor"> #define __TBB_PRIO_INHERIT_BROKEN 1</span>
+<a name="l00236"></a>00236 <span class="preprocessor"></span>
+<a name="l00239"></a>00239 <span class="preprocessor"> #define __TBB_PLACEMENT_NEW_EXCEPTION_SAFETY_BROKEN 1</span>
+<a name="l00240"></a>00240 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* __FreeBSD__ */</span>
+<a name="l00241"></a>00241
+<a name="l00242"></a>00242 <span class="preprocessor">#if (__linux__ || __APPLE__) && __i386__ && defined(__INTEL_COMPILER)</span>
+<a name="l00243"></a>00243 <span class="preprocessor"></span>
+<a name="l00245"></a>00245 <span class="preprocessor"> #define __TBB_ICC_ASM_VOLATILE_BROKEN 1</span>
+<a name="l00246"></a>00246 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00247"></a>00247 <span class="preprocessor"></span>
+<a name="l00248"></a>00248 <span class="preprocessor">#if !__INTEL_COMPILER && (_MSC_VER || __GNUC__==3 && __GNUC_MINOR__<=2)</span>
+<a name="l00249"></a>00249 <span class="preprocessor"></span>
+<a name="l00251"></a>00251 <span class="preprocessor"> #define __TBB_ALIGNOF_NOT_INSTANTIATED_TYPES_BROKEN 1</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="l00254"></a>00254 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_tbb_config_H */</span>
</pre></div><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00593.html b/doc/html/a00593.html
index c03be4c..a928935 100644
--- a/doc/html/a00593.html
+++ b/doc/html/a00593.html
@@ -59,25 +59,25 @@
<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="a00220.html">00042</a> <span class="keyword">class </span><a class="code" href="a00220.html">bad_last_alloc</a> : <span class="keyword">public</span> std::bad_alloc {
+<a name="l00042"></a><a class="code" href="a00232.html">00042</a> <span class="keyword">class </span><a class="code" href="a00232.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="a00220.html">bad_last_alloc</a>() <span class="keywordflow">throw</span>() {}
+<a name="l00046"></a>00046 <span class="preprocessor"></span> <span class="comment">/*override*/</span> ~<a class="code" href="a00232.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="a00252.html">00051</a> <span class="keyword">class </span><a class="code" href="a00252.html">improper_lock</a> : <span class="keyword">public</span> std::exception {
+<a name="l00051"></a><a class="code" href="a00264.html">00051</a> <span class="keyword">class </span><a class="code" href="a00264.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="a00256.html">00057</a> <span class="keyword">class </span><a class="code" href="a00256.html">missing_wait</a> : <span class="keyword">public</span> std::exception {
+<a name="l00057"></a><a class="code" href="a00272.html">00057</a> <span class="keyword">class </span><a class="code" href="a00272.html">missing_wait</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="a00253.html">00063</a> <span class="keyword">class </span><a class="code" href="a00253.html">invalid_multiple_scheduling</a> : <span class="keyword">public</span> std::exception {
+<a name="l00063"></a><a class="code" href="a00265.html">00063</a> <span class="keyword">class </span><a class="code" href="a00265.html">invalid_multiple_scheduling</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 };
@@ -124,77 +124,77 @@
<a name="l00113"></a>00113 <span class="keyword">namespace </span>tbb {
<a name="l00114"></a>00114
<a name="l00116"></a>00116
-<a name="l00136"></a><a class="code" href="a00298.html">00136</a> <span class="keyword">class </span><a class="code" href="a00298.html">tbb_exception</a> : <span class="keyword">public</span> std::exception
+<a name="l00136"></a><a class="code" href="a00319.html">00136</a> <span class="keyword">class </span><a class="code" href="a00319.html">tbb_exception</a> : <span class="keyword">public</span> std::exception
<a name="l00137"></a>00137 {
<a name="l00141"></a>00141 <span class="keywordtype">void</span>* operator new ( size_t );
<a name="l00142"></a>00142
<a name="l00143"></a>00143 <span class="keyword">public</span>:
<a name="l00145"></a>00145
-<a name="l00146"></a>00146 <span class="keyword">virtual</span> <a class="code" href="a00298.html">tbb_exception</a>* <a class="code" href="a00298.html#3e3482bf264d4ca4dde046cd9c02c766">move</a> () <span class="keywordflow">throw</span>() = 0;
+<a name="l00146"></a>00146 <span class="keyword">virtual</span> <a class="code" href="a00319.html">tbb_exception</a>* <a class="code" href="a00319.html#3e3482bf264d4ca4dde046cd9c02c766">move</a> () <span class="keywordflow">throw</span>() = 0;
<a name="l00147"></a>00147
<a name="l00149"></a>00149
-<a name="l00151"></a>00151 <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="a00298.html#66c94938eca8bf88b76f3eccaaf215d8">destroy</a> () <span class="keywordflow">throw</span>() = 0;
+<a name="l00151"></a>00151 <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="a00319.html#66c94938eca8bf88b76f3eccaaf215d8">destroy</a> () <span class="keywordflow">throw</span>() = 0;
<a name="l00152"></a>00152
<a name="l00154"></a>00154
-<a name="l00158"></a>00158 <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="a00298.html#8588e07fa49692f4d734e4f2e4f048f4">throw_self</a> () = 0;
+<a name="l00158"></a>00158 <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="a00319.html#8588e07fa49692f4d734e4f2e4f048f4">throw_self</a> () = 0;
<a name="l00159"></a>00159
-<a name="l00161"></a>00161 <span class="keyword">virtual</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="a00298.html#d00f6497e552fee978a02bfcbebf46e2">name</a>() <span class="keyword">const</span> <span class="keywordflow">throw</span>() = 0;
+<a name="l00161"></a>00161 <span class="keyword">virtual</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="a00319.html#d00f6497e552fee978a02bfcbebf46e2">name</a>() <span class="keyword">const</span> <span class="keywordflow">throw</span>() = 0;
<a name="l00162"></a>00162
-<a name="l00164"></a>00164 <span class="keyword">virtual</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="a00298.html#e8157689ecb66bc6c72d3618bf3cc371">what</a>() <span class="keyword">const</span> <span class="keywordflow">throw</span>() = 0;
+<a name="l00164"></a>00164 <span class="keyword">virtual</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="a00319.html#e8157689ecb66bc6c72d3618bf3cc371">what</a>() <span class="keyword">const</span> <span class="keywordflow">throw</span>() = 0;
<a name="l00165"></a>00165
-<a name="l00172"></a><a class="code" href="a00298.html#3f2da7f3d8a6e4c1df522af1213afb5a">00172</a> <span class="keywordtype">void</span> <a class="code" href="a00298.html#3f2da7f3d8a6e4c1df522af1213afb5a">operator delete </a>( <span class="keywordtype">void</span>* p ) {
+<a name="l00172"></a><a class="code" href="a00319.html#3f2da7f3d8a6e4c1df522af1213afb5a">00172</a> <span class="keywordtype">void</span> <a class="code" href="a00319.html#3f2da7f3d8a6e4c1df522af1213afb5a">operator delete </a>( <span class="keywordtype">void</span>* p ) {
<a name="l00173"></a>00173 internal::deallocate_via_handler_v3(p);
<a name="l00174"></a>00174 }
<a name="l00175"></a>00175 };
<a name="l00176"></a>00176
<a name="l00178"></a>00178
-<a name="l00182"></a><a class="code" href="a00228.html">00182</a> <span class="keyword">class </span><a class="code" href="a00228.html">captured_exception</a> : <span class="keyword">public</span> <a class="code" href="a00298.html">tbb_exception</a>
+<a name="l00182"></a><a class="code" href="a00240.html">00182</a> <span class="keyword">class </span><a class="code" href="a00240.html">captured_exception</a> : <span class="keyword">public</span> <a class="code" href="a00319.html">tbb_exception</a>
<a name="l00183"></a>00183 {
<a name="l00184"></a>00184 <span class="keyword">public</span>:
-<a name="l00185"></a>00185 <a class="code" href="a00228.html">captured_exception</a> ( <span class="keyword">const</span> <a class="code" href="a00228.html">captured_exception</a>& src )
-<a name="l00186"></a>00186 : <a class="code" href="a00298.html">tbb_exception</a>(src), my_dynamic(<span class="keyword">false</span>)
+<a name="l00185"></a>00185 <a class="code" href="a00240.html">captured_exception</a> ( <span class="keyword">const</span> <a class="code" href="a00240.html">captured_exception</a>& src )
+<a name="l00186"></a>00186 : <a class="code" href="a00319.html">tbb_exception</a>(src), my_dynamic(<span class="keyword">false</span>)
<a name="l00187"></a>00187 {
-<a name="l00188"></a>00188 set(src.<a class="code" href="a00228.html#6a57f9aa0bce72392492d109b9e1d941">my_exception_name</a>, src.<a class="code" href="a00228.html#788adf4e55cdad7abc178a48a1d47e69">my_exception_info</a>);
+<a name="l00188"></a>00188 set(src.<a class="code" href="a00240.html#6a57f9aa0bce72392492d109b9e1d941">my_exception_name</a>, src.<a class="code" href="a00240.html#788adf4e55cdad7abc178a48a1d47e69">my_exception_info</a>);
<a name="l00189"></a>00189 }
<a name="l00190"></a>00190
-<a name="l00191"></a>00191 <a class="code" href="a00228.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="l00191"></a>00191 <a class="code" href="a00240.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="l00192"></a>00192 : my_dynamic(<span class="keyword">false</span>)
<a name="l00193"></a>00193 {
<a name="l00194"></a>00194 set(name_, info);
<a name="l00195"></a>00195 }
<a name="l00196"></a>00196
-<a name="l00197"></a>00197 __TBB_EXPORTED_METHOD ~<a class="code" href="a00228.html">captured_exception</a> () <span class="keywordflow">throw</span>();
+<a name="l00197"></a>00197 __TBB_EXPORTED_METHOD ~<a class="code" href="a00240.html">captured_exception</a> () <span class="keywordflow">throw</span>();
<a name="l00198"></a>00198
-<a name="l00199"></a>00199 <a class="code" href="a00228.html">captured_exception</a>& operator= ( <span class="keyword">const</span> <a class="code" href="a00228.html">captured_exception</a>& src ) {
+<a name="l00199"></a>00199 <a class="code" href="a00240.html">captured_exception</a>& operator= ( <span class="keyword">const</span> <a class="code" href="a00240.html">captured_exception</a>& src ) {
<a name="l00200"></a>00200 <span class="keywordflow">if</span> ( <span class="keyword">this</span> != &src ) {
<a name="l00201"></a>00201 clear();
-<a name="l00202"></a>00202 set(src.<a class="code" href="a00228.html#6a57f9aa0bce72392492d109b9e1d941">my_exception_name</a>, src.<a class="code" href="a00228.html#788adf4e55cdad7abc178a48a1d47e69">my_exception_info</a>);
+<a name="l00202"></a>00202 set(src.<a class="code" href="a00240.html#6a57f9aa0bce72392492d109b9e1d941">my_exception_name</a>, src.<a class="code" href="a00240.html#788adf4e55cdad7abc178a48a1d47e69">my_exception_info</a>);
<a name="l00203"></a>00203 }
<a name="l00204"></a>00204 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
<a name="l00205"></a>00205 }
<a name="l00206"></a>00206
<a name="l00207"></a>00207 <span class="comment">/*override*/</span>
-<a name="l00208"></a>00208 <a class="code" href="a00228.html">captured_exception</a>* __TBB_EXPORTED_METHOD <a class="code" href="a00228.html#837a50b8f6a800bda225c39d1699643f">move</a> () <span class="keywordflow">throw</span>();
+<a name="l00208"></a>00208 <a class="code" href="a00240.html">captured_exception</a>* __TBB_EXPORTED_METHOD <a class="code" href="a00240.html#837a50b8f6a800bda225c39d1699643f">move</a> () <span class="keywordflow">throw</span>();
<a name="l00209"></a>00209
<a name="l00210"></a>00210 <span class="comment">/*override*/</span>
-<a name="l00211"></a>00211 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00228.html#93d875d3555502ff6f18513525de204c">destroy</a> () <span class="keywordflow">throw</span>();
+<a name="l00211"></a>00211 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00240.html#93d875d3555502ff6f18513525de204c">destroy</a> () <span class="keywordflow">throw</span>();
<a name="l00212"></a>00212
<a name="l00213"></a>00213 <span class="comment">/*override*/</span>
-<a name="l00214"></a><a class="code" href="a00228.html#2dd1be66ab32fa27e0ddef5707fa67ef">00214</a> <span class="keywordtype">void</span> <a class="code" href="a00228.html#2dd1be66ab32fa27e0ddef5707fa67ef">throw_self</a> () { __TBB_THROW(*<span class="keyword">this</span>); }
+<a name="l00214"></a><a class="code" href="a00240.html#2dd1be66ab32fa27e0ddef5707fa67ef">00214</a> <span class="keywordtype">void</span> <a class="code" href="a00240.html#2dd1be66ab32fa27e0ddef5707fa67ef">throw_self</a> () { __TBB_THROW(*<span class="keyword">this</span>); }
<a name="l00215"></a>00215
<a name="l00216"></a>00216 <span class="comment">/*override*/</span>
-<a name="l00217"></a>00217 <span class="keyword">const</span> <span class="keywordtype">char</span>* __TBB_EXPORTED_METHOD <a class="code" href="a00228.html#5af82fd677449c5ca727fa1d7e16f9f5">name</a>() const throw();
+<a name="l00217"></a>00217 <span class="keyword">const</span> <span class="keywordtype">char</span>* __TBB_EXPORTED_METHOD <a class="code" href="a00240.html#5af82fd677449c5ca727fa1d7e16f9f5">name</a>() const throw();
<a name="l00218"></a>00218
<a name="l00219"></a>00219 <span class="comment">/*override*/</span>
-<a name="l00220"></a>00220 const <span class="keywordtype">char</span>* __TBB_EXPORTED_METHOD <a class="code" href="a00228.html#6b5988ef74a1fe2a58998d110b3633e0">what</a>() const throw();
+<a name="l00220"></a>00220 const <span class="keywordtype">char</span>* __TBB_EXPORTED_METHOD <a class="code" href="a00240.html#6b5988ef74a1fe2a58998d110b3633e0">what</a>() const throw();
<a name="l00221"></a>00221
-<a name="l00222"></a>00222 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD set ( const <span class="keywordtype">char</span>* <a class="code" href="a00228.html#5af82fd677449c5ca727fa1d7e16f9f5">name</a>, const <span class="keywordtype">char</span>* info ) throw();
+<a name="l00222"></a>00222 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD set ( const <span class="keywordtype">char</span>* <a class="code" href="a00240.html#5af82fd677449c5ca727fa1d7e16f9f5">name</a>, const <span class="keywordtype">char</span>* info ) throw();
<a name="l00223"></a>00223 <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD clear () throw();
<a name="l00224"></a>00224
<a name="l00225"></a>00225 private:
-<a name="l00227"></a>00227 <a class="code" href="a00228.html">captured_exception</a>() {}
+<a name="l00227"></a>00227 <a class="code" href="a00240.html">captured_exception</a>() {}
<a name="l00228"></a>00228
-<a name="l00230"></a>00230 <span class="keyword">static</span> captured_exception* allocate ( <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="a00228.html#5af82fd677449c5ca727fa1d7e16f9f5">name</a>, <span class="keyword">const</span> <span class="keywordtype">char</span>* info );
+<a name="l00230"></a>00230 <span class="keyword">static</span> captured_exception* allocate ( <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="a00240.html#5af82fd677449c5ca727fa1d7e16f9f5">name</a>, <span class="keyword">const</span> <span class="keywordtype">char</span>* info );
<a name="l00231"></a>00231
<a name="l00232"></a>00232 <span class="keywordtype">bool</span> my_dynamic;
<a name="l00233"></a>00233 <span class="keyword">const</span> <span class="keywordtype">char</span>* my_exception_name;
@@ -203,51 +203,51 @@
<a name="l00236"></a>00236
<a name="l00238"></a>00238
<a name="l00242"></a>00242 <span class="keyword">template</span><<span class="keyword">typename</span> ExceptionData>
-<a name="l00243"></a><a class="code" href="a00257.html">00243</a> <span class="keyword">class </span><a class="code" href="a00257.html">movable_exception</a> : <span class="keyword">public</span> <a class="code" href="a00298.html">tbb_exception</a>
+<a name="l00243"></a><a class="code" href="a00273.html">00243</a> <span class="keyword">class </span><a class="code" href="a00273.html">movable_exception</a> : <span class="keyword">public</span> <a class="code" href="a00319.html">tbb_exception</a>
<a name="l00244"></a>00244 {
-<a name="l00245"></a>00245 <span class="keyword">typedef</span> <a class="code" href="a00257.html">movable_exception<ExceptionData></a> <a class="code" href="a00257.html">self_type</a>;
+<a name="l00245"></a>00245 <span class="keyword">typedef</span> <a class="code" href="a00273.html">movable_exception<ExceptionData></a> <a class="code" href="a00273.html">self_type</a>;
<a name="l00246"></a>00246
<a name="l00247"></a>00247 <span class="keyword">public</span>:
-<a name="l00248"></a>00248 <a class="code" href="a00257.html">movable_exception</a> ( <span class="keyword">const</span> ExceptionData& data_ )
-<a name="l00249"></a>00249 : <a class="code" href="a00257.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a>(data_)
+<a name="l00248"></a>00248 <a class="code" href="a00273.html">movable_exception</a> ( <span class="keyword">const</span> ExceptionData& data_ )
+<a name="l00249"></a>00249 : <a class="code" href="a00273.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a>(data_)
<a name="l00250"></a>00250 , my_dynamic(<span class="keyword">false</span>)
<a name="l00251"></a>00251 , my_exception_name(
<a name="l00252"></a>00252 #<span class="keywordflow">if</span> TBB_USE_EXCEPTIONS
-<a name="l00253"></a>00253 <span class="keyword">typeid</span>(<a class="code" href="a00257.html">self_type</a>).<a class="code" href="a00257.html#bc5f5c4739b17ac5211ac58226c2f5a5">name</a>()
+<a name="l00253"></a>00253 <span class="keyword">typeid</span>(<a class="code" href="a00273.html">self_type</a>).<a class="code" href="a00273.html#bc5f5c4739b17ac5211ac58226c2f5a5">name</a>()
<a name="l00254"></a>00254 #<span class="keywordflow">else</span> <span class="comment">/* !TBB_USE_EXCEPTIONS */</span>
<a name="l00255"></a>00255 <span class="stringliteral">"movable_exception"</span>
<a name="l00256"></a>00256 #endif <span class="comment">/* !TBB_USE_EXCEPTIONS */</span>
<a name="l00257"></a>00257 )
<a name="l00258"></a>00258 {}
<a name="l00259"></a>00259
-<a name="l00260"></a>00260 <a class="code" href="a00257.html">movable_exception</a> ( <span class="keyword">const</span> <a class="code" href="a00257.html">movable_exception</a>& src ) <span class="keywordflow">throw</span> ()
-<a name="l00261"></a>00261 : <a class="code" href="a00298.html">tbb_exception</a>(src)
-<a name="l00262"></a>00262 , <a class="code" href="a00257.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a>(src.<a class="code" href="a00257.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a>)
+<a name="l00260"></a>00260 <a class="code" href="a00273.html">movable_exception</a> ( <span class="keyword">const</span> <a class="code" href="a00273.html">movable_exception</a>& src ) <span class="keywordflow">throw</span> ()
+<a name="l00261"></a>00261 : <a class="code" href="a00319.html">tbb_exception</a>(src)
+<a name="l00262"></a>00262 , <a class="code" href="a00273.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a>(src.<a class="code" href="a00273.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a>)
<a name="l00263"></a>00263 , my_dynamic(<span class="keyword">false</span>)
-<a name="l00264"></a>00264 , my_exception_name(src.<a class="code" href="a00257.html#5f5843b501829ff824c9c8d28c8283eb">my_exception_name</a>)
+<a name="l00264"></a>00264 , my_exception_name(src.<a class="code" href="a00273.html#5f5843b501829ff824c9c8d28c8283eb">my_exception_name</a>)
<a name="l00265"></a>00265 {}
<a name="l00266"></a>00266
-<a name="l00267"></a>00267 ~<a class="code" href="a00257.html">movable_exception</a> () <span class="keywordflow">throw</span>() {}
+<a name="l00267"></a>00267 ~<a class="code" href="a00273.html">movable_exception</a> () <span class="keywordflow">throw</span>() {}
<a name="l00268"></a>00268
-<a name="l00269"></a>00269 <span class="keyword">const</span> <a class="code" href="a00257.html">movable_exception</a>& operator= ( <span class="keyword">const</span> <a class="code" href="a00257.html">movable_exception</a>& src ) {
+<a name="l00269"></a>00269 <span class="keyword">const</span> <a class="code" href="a00273.html">movable_exception</a>& operator= ( <span class="keyword">const</span> <a class="code" href="a00273.html">movable_exception</a>& src ) {
<a name="l00270"></a>00270 <span class="keywordflow">if</span> ( <span class="keyword">this</span> != &src ) {
-<a name="l00271"></a>00271 <a class="code" href="a00257.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a> = src.<a class="code" href="a00257.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a>;
-<a name="l00272"></a>00272 my_exception_name = src.<a class="code" href="a00257.html#5f5843b501829ff824c9c8d28c8283eb">my_exception_name</a>;
+<a name="l00271"></a>00271 <a class="code" href="a00273.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a> = src.<a class="code" href="a00273.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a>;
+<a name="l00272"></a>00272 my_exception_name = src.<a class="code" href="a00273.html#5f5843b501829ff824c9c8d28c8283eb">my_exception_name</a>;
<a name="l00273"></a>00273 }
<a name="l00274"></a>00274 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
<a name="l00275"></a>00275 }
<a name="l00276"></a>00276
-<a name="l00277"></a>00277 ExceptionData& data () <span class="keywordflow">throw</span>() { <span class="keywordflow">return</span> <a class="code" href="a00257.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a>; }
+<a name="l00277"></a>00277 ExceptionData& data () <span class="keywordflow">throw</span>() { <span class="keywordflow">return</span> <a class="code" href="a00273.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a>; }
<a name="l00278"></a>00278
-<a name="l00279"></a>00279 <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="a00257.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a>; }
+<a name="l00279"></a>00279 <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="a00273.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a>; }
<a name="l00280"></a>00280
-<a name="l00281"></a><a class="code" href="a00257.html#bc5f5c4739b17ac5211ac58226c2f5a5">00281</a> <span class="comment">/*override*/</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="a00257.html#bc5f5c4739b17ac5211ac58226c2f5a5">name</a> () const throw() { <span class="keywordflow">return</span> my_exception_name; }
+<a name="l00281"></a><a class="code" href="a00273.html#bc5f5c4739b17ac5211ac58226c2f5a5">00281</a> <span class="comment">/*override*/</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="a00273.html#bc5f5c4739b17ac5211ac58226c2f5a5">name</a> () const throw() { <span class="keywordflow">return</span> my_exception_name; }
<a name="l00282"></a>00282
-<a name="l00283"></a><a class="code" href="a00257.html#b33a89bccf0c63106f1270c7bfaaf54f">00283</a> <span class="comment">/*override*/</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="a00257.html#b33a89bccf0c63106f1270c7bfaaf54f">what</a> () const throw() { <span class="keywordflow">return</span> <span class="stringliteral">"tbb::movable_exception"</span>; }
+<a name="l00283"></a><a class="code" href="a00273.html#b33a89bccf0c63106f1270c7bfaaf54f">00283</a> <span class="comment">/*override*/</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="a00273.html#b33a89bccf0c63106f1270c7bfaaf54f">what</a> () const throw() { <span class="keywordflow">return</span> <span class="stringliteral">"tbb::movable_exception"</span>; }
<a name="l00284"></a>00284
<a name="l00285"></a>00285 <span class="comment">/*override*/</span>
-<a name="l00286"></a><a class="code" href="a00257.html#1aea0ad179d6f0481fe7f3495f66adf9">00286</a> <a class="code" href="a00257.html">movable_exception</a>* <a class="code" href="a00257.html#1aea0ad179d6f0481fe7f3495f66adf9">move</a> () throw() {
-<a name="l00287"></a>00287 <span class="keywordtype">void</span>* e = internal::allocate_via_handler_v3(<span class="keyword">sizeof</span>(<a class="code" href="a00257.html">movable_exception</a>));
+<a name="l00286"></a><a class="code" href="a00273.html#1aea0ad179d6f0481fe7f3495f66adf9">00286</a> <a class="code" href="a00273.html">movable_exception</a>* <a class="code" href="a00273.html#1aea0ad179d6f0481fe7f3495f66adf9">move</a> () throw() {
+<a name="l00287"></a>00287 <span class="keywordtype">void</span>* e = internal::allocate_via_handler_v3(<span class="keyword">sizeof</span>(<a class="code" href="a00273.html">movable_exception</a>));
<a name="l00288"></a>00288 <span class="keywordflow">if</span> ( e ) {
<a name="l00289"></a>00289 ::new (e) movable_exception(*<span class="keyword">this</span>);
<a name="l00290"></a>00290 ((movable_exception*)e)->my_dynamic = <span class="keyword">true</span>;
@@ -255,18 +255,18 @@
<a name="l00292"></a>00292 <span class="keywordflow">return</span> (movable_exception*)e;
<a name="l00293"></a>00293 }
<a name="l00294"></a>00294 <span class="comment">/*override*/</span>
-<a name="l00295"></a><a class="code" href="a00257.html#7a46873119d9f85a7b0009c13e41a258">00295</a> <span class="keywordtype">void</span> <a class="code" href="a00257.html#7a46873119d9f85a7b0009c13e41a258">destroy</a> () throw() {
+<a name="l00295"></a><a class="code" href="a00273.html#7a46873119d9f85a7b0009c13e41a258">00295</a> <span class="keywordtype">void</span> <a class="code" href="a00273.html#7a46873119d9f85a7b0009c13e41a258">destroy</a> () throw() {
<a name="l00296"></a>00296 __TBB_ASSERT ( my_dynamic, <span class="stringliteral">"Method destroy can be called only on dynamically allocated movable_exceptions"</span> );
<a name="l00297"></a>00297 <span class="keywordflow">if</span> ( my_dynamic ) {
-<a name="l00298"></a>00298 this->~<a class="code" href="a00257.html">movable_exception</a>();
+<a name="l00298"></a>00298 this->~<a class="code" href="a00273.html">movable_exception</a>();
<a name="l00299"></a>00299 internal::deallocate_via_handler_v3(<span class="keyword">this</span>);
<a name="l00300"></a>00300 }
<a name="l00301"></a>00301 }
<a name="l00302"></a>00302 <span class="comment">/*override*/</span>
-<a name="l00303"></a><a class="code" href="a00257.html#17cffba35811c92b7e65d63506b69602">00303</a> <span class="keywordtype">void</span> <a class="code" href="a00257.html#17cffba35811c92b7e65d63506b69602">throw_self</a> () { __TBB_THROW( *<span class="keyword">this</span> ); }
+<a name="l00303"></a><a class="code" href="a00273.html#17cffba35811c92b7e65d63506b69602">00303</a> <span class="keywordtype">void</span> <a class="code" href="a00273.html#17cffba35811c92b7e65d63506b69602">throw_self</a> () { __TBB_THROW( *<span class="keyword">this</span> ); }
<a name="l00304"></a>00304
<a name="l00305"></a>00305 <span class="keyword">protected</span>:
-<a name="l00307"></a><a class="code" href="a00257.html#a8c0ae2089ae784b28907cf748b89416">00307</a> ExceptionData <a class="code" href="a00257.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a>;
+<a name="l00307"></a><a class="code" href="a00273.html#a8c0ae2089ae784b28907cf748b89416">00307</a> ExceptionData <a class="code" href="a00273.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a>;
<a name="l00308"></a>00308
<a name="l00309"></a>00309 <span class="keyword">private</span>:
<a name="l00311"></a>00311 <span class="keywordtype">bool</span> my_dynamic;
@@ -279,22 +279,22 @@
<a name="l00319"></a>00319 <span class="preprocessor"></span><span class="keyword">namespace </span>internal {
<a name="l00320"></a>00320
<a name="l00322"></a>00322
-<a name="l00324"></a><a class="code" href="a00299.html">00324</a> <span class="keyword">class </span><a class="code" href="a00299.html">tbb_exception_ptr</a> {
+<a name="l00324"></a><a class="code" href="a00320.html">00324</a> <span class="keyword">class </span><a class="code" href="a00320.html">tbb_exception_ptr</a> {
<a name="l00325"></a>00325 std::exception_ptr my_ptr;
<a name="l00326"></a>00326
<a name="l00327"></a>00327 <span class="keyword">public</span>:
-<a name="l00328"></a>00328 <span class="keyword">static</span> <a class="code" href="a00299.html">tbb_exception_ptr</a>* allocate ();
-<a name="l00329"></a>00329 <span class="keyword">static</span> <a class="code" href="a00299.html">tbb_exception_ptr</a>* allocate ( <span class="keyword">const</span> <a class="code" href="a00298.html">tbb_exception</a>& tag );
-<a name="l00331"></a>00331 <span class="keyword">static</span> <a class="code" href="a00299.html">tbb_exception_ptr</a>* allocate ( <a class="code" href="a00228.html">captured_exception</a>& src );
+<a name="l00328"></a>00328 <span class="keyword">static</span> <a class="code" href="a00320.html">tbb_exception_ptr</a>* allocate ();
+<a name="l00329"></a>00329 <span class="keyword">static</span> <a class="code" href="a00320.html">tbb_exception_ptr</a>* allocate ( <span class="keyword">const</span> <a class="code" href="a00319.html">tbb_exception</a>& tag );
+<a name="l00331"></a>00331 <span class="keyword">static</span> <a class="code" href="a00320.html">tbb_exception_ptr</a>* allocate ( <a class="code" href="a00240.html">captured_exception</a>& src );
<a name="l00332"></a>00332
<a name="l00334"></a>00334
-<a name="l00335"></a>00335 <span class="keywordtype">void</span> <a class="code" href="a00299.html#921875bbacd2c8a5f324c7da7a415262">destroy</a> () <span class="keywordflow">throw</span>();
+<a name="l00335"></a>00335 <span class="keywordtype">void</span> <a class="code" href="a00320.html#921875bbacd2c8a5f324c7da7a415262">destroy</a> () <span class="keywordflow">throw</span>();
<a name="l00336"></a>00336
-<a name="l00338"></a><a class="code" href="a00299.html#292832fd5c523e3d8081a22247840a1d">00338</a> <span class="keywordtype">void</span> <a class="code" href="a00299.html#292832fd5c523e3d8081a22247840a1d">throw_self</a> () { std::rethrow_exception(my_ptr); }
+<a name="l00338"></a><a class="code" href="a00320.html#292832fd5c523e3d8081a22247840a1d">00338</a> <span class="keywordtype">void</span> <a class="code" href="a00320.html#292832fd5c523e3d8081a22247840a1d">throw_self</a> () { std::rethrow_exception(my_ptr); }
<a name="l00339"></a>00339
<a name="l00340"></a>00340 <span class="keyword">private</span>:
-<a name="l00341"></a>00341 <a class="code" href="a00299.html">tbb_exception_ptr</a> ( <span class="keyword">const</span> std::exception_ptr& src ) : my_ptr(src) {}
-<a name="l00342"></a>00342 tbb_exception_ptr ( <span class="keyword">const</span> <a class="code" href="a00228.html">captured_exception</a>& src ) : my_ptr(std::copy_exception(src)) {}
+<a name="l00341"></a>00341 <a class="code" href="a00320.html">tbb_exception_ptr</a> ( <span class="keyword">const</span> std::exception_ptr& src ) : my_ptr(src) {}
+<a name="l00342"></a>00342 tbb_exception_ptr ( <span class="keyword">const</span> <a class="code" href="a00240.html">captured_exception</a>& src ) : my_ptr(std::copy_exception(src)) {}
<a name="l00343"></a>00343 }; <span class="comment">// class tbb::internal::tbb_exception_ptr</span>
<a name="l00344"></a>00344
<a name="l00345"></a>00345 } <span class="comment">// namespace internal</span>
diff --git a/doc/html/a00594.html b/doc/html/a00594.html
index 2905182..84e2f7c 100644
--- a/doc/html/a00594.html
+++ b/doc/html/a00594.html
@@ -42,662 +42,701 @@
<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="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>
-<a name="l00028"></a>00028 <span class="preprocessor">#ifdef _MANAGED</span>
-<a name="l00029"></a>00029 <span class="preprocessor"></span><span class="preprocessor">#pragma managed(push, off)</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">#if __MINGW64__</span>
-<a name="l00033"></a>00033 <span class="preprocessor"></span><span class="preprocessor">#include "machine/linux_intel64.h"</span>
-<a name="l00034"></a>00034 <span class="keyword">extern</span> <span class="stringliteral">"C"</span> __declspec(dllimport) int __stdcall SwitchToThread( <span class="keywordtype">void</span> );
-<a name="l00035"></a>00035 <span class="preprocessor">#define __TBB_Yield() SwitchToThread()</span>
-<a name="l00036"></a>00036 <span class="preprocessor"></span><span class="preprocessor">#elif __MINGW32__</span>
-<a name="l00037"></a>00037 <span class="preprocessor"></span><span class="preprocessor">#include "machine/linux_ia32.h"</span>
-<a name="l00038"></a>00038 <span class="keyword">extern</span> <span class="stringliteral">"C"</span> __declspec(dllimport) int __stdcall SwitchToThread( <span class="keywordtype">void</span> );
-<a name="l00039"></a>00039 <span class="preprocessor">#define __TBB_Yield() SwitchToThread()</span>
-<a name="l00040"></a>00040 <span class="preprocessor"></span><span class="preprocessor">#elif defined(_M_IX86)</span>
-<a name="l00041"></a>00041 <span class="preprocessor"></span><span class="preprocessor">#include "machine/windows_ia32.h"</span>
-<a name="l00042"></a>00042 <span class="preprocessor">#elif defined(_M_AMD64) </span>
-<a name="l00043"></a>00043 <span class="preprocessor"></span><span class="preprocessor">#include "machine/windows_intel64.h"</span>
-<a name="l00044"></a>00044 <span class="preprocessor">#elif _XBOX </span>
-<a name="l00045"></a>00045 <span class="preprocessor"></span><span class="preprocessor">#include "machine/xbox360_ppc.h"</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">#ifdef _MANAGED</span>
-<a name="l00049"></a>00049 <span class="preprocessor"></span><span class="preprocessor">#pragma managed(pop)</span>
-<a name="l00050"></a>00050 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00051"></a>00051 <span class="preprocessor"></span>
-<a name="l00052"></a>00052 <span class="preprocessor">#elif __linux__ || __FreeBSD__ || __NetBSD__</span>
-<a name="l00053"></a>00053 <span class="preprocessor"></span>
-<a name="l00054"></a>00054 <span class="preprocessor">#if __i386__</span>
-<a name="l00055"></a>00055 <span class="preprocessor"></span><span class="preprocessor">#include "machine/linux_ia32.h"</span>
-<a name="l00056"></a>00056 <span class="preprocessor">#elif __x86_64__</span>
-<a name="l00057"></a>00057 <span class="preprocessor"></span><span class="preprocessor">#include "machine/linux_intel64.h"</span>
-<a name="l00058"></a>00058 <span class="preprocessor">#elif __ia64__</span>
-<a name="l00059"></a>00059 <span class="preprocessor"></span><span class="preprocessor">#include "machine/linux_ia64.h"</span>
-<a name="l00060"></a>00060 <span class="preprocessor">#elif __powerpc__</span>
-<a name="l00061"></a>00061 <span class="preprocessor"></span><span class="preprocessor">#include "machine/mac_ppc.h"</span>
-<a name="l00062"></a>00062 <span class="preprocessor">#endif</span>
-<a name="l00063"></a>00063 <span class="preprocessor"></span><span class="preprocessor">#include "machine/linux_common.h"</span>
-<a name="l00064"></a>00064
-<a name="l00065"></a>00065 <span class="preprocessor">#elif __APPLE__</span>
-<a name="l00066"></a>00066 <span class="preprocessor"></span>
-<a name="l00067"></a>00067 <span class="preprocessor">#if __i386__</span>
-<a name="l00068"></a>00068 <span class="preprocessor"></span><span class="preprocessor">#include "machine/linux_ia32.h"</span>
-<a name="l00069"></a>00069 <span class="preprocessor">#elif __x86_64__</span>
-<a name="l00070"></a>00070 <span class="preprocessor"></span><span class="preprocessor">#include "machine/linux_intel64.h"</span>
-<a name="l00071"></a>00071 <span class="preprocessor">#elif __POWERPC__</span>
-<a name="l00072"></a>00072 <span class="preprocessor"></span><span class="preprocessor">#include "machine/mac_ppc.h"</span>
-<a name="l00073"></a>00073 <span class="preprocessor">#endif</span>
-<a name="l00074"></a>00074 <span class="preprocessor"></span><span class="preprocessor">#include "machine/macos_common.h"</span>
-<a name="l00075"></a>00075
-<a name="l00076"></a>00076 <span class="preprocessor">#elif _AIX</span>
-<a name="l00077"></a>00077 <span class="preprocessor"></span>
-<a name="l00078"></a>00078 <span class="preprocessor">#include "machine/ibm_aix51.h"</span>
-<a name="l00079"></a>00079
-<a name="l00080"></a>00080 <span class="preprocessor">#elif __sun || __SUNPRO_CC</span>
-<a name="l00081"></a>00081 <span class="preprocessor"></span>
-<a name="l00082"></a>00082 <span class="preprocessor">#define __asm__ asm </span>
-<a name="l00083"></a>00083 <span class="preprocessor"></span><span class="preprocessor">#define __volatile__ volatile</span>
-<a name="l00084"></a>00084 <span class="preprocessor"></span>
-<a name="l00085"></a>00085 <span class="preprocessor">#if __i386 || __i386__</span>
-<a name="l00086"></a>00086 <span class="preprocessor"></span><span class="preprocessor">#include "machine/linux_ia32.h"</span>
-<a name="l00087"></a>00087 <span class="preprocessor">#elif __x86_64__</span>
-<a name="l00088"></a>00088 <span class="preprocessor"></span><span class="preprocessor">#include "machine/linux_intel64.h"</span>
-<a name="l00089"></a>00089 <span class="preprocessor">#elif __sparc</span>
-<a name="l00090"></a>00090 <span class="preprocessor"></span><span class="preprocessor">#include "machine/sunos_sparc.h"</span>
-<a name="l00091"></a>00091 <span class="preprocessor">#endif</span>
-<a name="l00092"></a>00092 <span class="preprocessor"></span><span class="preprocessor">#include <sched.h></span>
-<a name="l00093"></a>00093
-<a name="l00094"></a>00094 <span class="preprocessor">#define __TBB_Yield() sched_yield()</span>
-<a name="l00095"></a>00095 <span class="preprocessor"></span>
-<a name="l00096"></a>00096 <span class="preprocessor">#endif </span><span class="comment">/* Sun */</span>
-<a name="l00097"></a>00097
-<a name="l00098"></a>00098 <span class="preprocessor">#ifndef __TBB_64BIT_ATOMICS</span>
-<a name="l00099"></a>00099 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_64BIT_ATOMICS 1</span>
-<a name="l00100"></a>00100 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00101"></a>00101 <span class="preprocessor"></span>
+<a name="l00099"></a>00099 <span class="preprocessor">#include "tbb_stddef.h"</span>
+<a name="l00100"></a>00100
+<a name="l00101"></a>00101 <span class="keyword">namespace </span>tbb {
+<a name="l00102"></a>00102 <span class="keyword">namespace </span>internal {
<a name="l00103"></a>00103
-<a name="l00115"></a>00115 <span class="preprocessor">#if !defined(__TBB_CompareAndSwap4) \</span>
-<a name="l00116"></a>00116 <span class="preprocessor"> || !defined(__TBB_CompareAndSwap8) && __TBB_64BIT_ATOMICS \</span>
-<a name="l00117"></a>00117 <span class="preprocessor"> || !defined(__TBB_Yield) \</span>
-<a name="l00118"></a>00118 <span class="preprocessor"> || !defined(__TBB_full_memory_fence) \</span>
-<a name="l00119"></a>00119 <span class="preprocessor"> || !defined(__TBB_release_consistency_helper)</span>
-<a name="l00120"></a>00120 <span class="preprocessor"></span><span class="preprocessor">#error Minimal requirements for tbb_machine.h not satisfied; platform is not supported.</span>
-<a name="l00121"></a>00121 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00122"></a>00122 <span class="preprocessor"></span>
-<a name="l00123"></a>00123 <span class="preprocessor">#ifndef __TBB_Pause</span>
-<a name="l00124"></a>00124 <span class="preprocessor"></span> <span class="keyword">inline</span> <span class="keywordtype">void</span> __TBB_Pause(int32_t) {
-<a name="l00125"></a>00125 __TBB_Yield();
-<a name="l00126"></a>00126 }
-<a name="l00127"></a>00127 <span class="preprocessor">#endif</span>
-<a name="l00128"></a>00128 <span class="preprocessor"></span>
-<a name="l00129"></a>00129 <span class="keyword">namespace </span>tbb {
-<a name="l00130"></a>00130
-<a name="l00132"></a><a class="code" href="a00362.html#250275615f10d5b5de6ad466ae2f54de">00132</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="a00362.html#250275615f10d5b5de6ad466ae2f54de">atomic_fence</a> () { __TBB_full_memory_fence(); }
+<a name="l00105"></a>00105 <span class="comment">// Overridable helpers declarations</span>
+<a name="l00106"></a>00106 <span class="comment">//</span>
+<a name="l00107"></a>00107 <span class="comment">// A machine/*.h file may choose to define these templates, otherwise it must</span>
+<a name="l00108"></a>00108 <span class="comment">// request default implementation by setting appropriate __TBB_USE_GENERIC_XXX macro(s).</span>
+<a name="l00109"></a>00109 <span class="comment">//</span>
+<a name="l00110"></a>00110 <span class="keyword">template</span> <<span class="keyword">typename</span> T, std::size_t S>
+<a name="l00111"></a>00111 <span class="keyword">struct </span>machine_load_store;
+<a name="l00112"></a>00112
+<a name="l00113"></a>00113 <span class="keyword">template</span> <<span class="keyword">typename</span> T, std::size_t S>
+<a name="l00114"></a>00114 <span class="keyword">struct </span>machine_load_store_relaxed;
+<a name="l00115"></a>00115
+<a name="l00116"></a>00116 <span class="keyword">template</span> <<span class="keyword">typename</span> T, std::size_t S>
+<a name="l00117"></a>00117 <span class="keyword">struct </span>machine_load_store_seq_cst;
+<a name="l00118"></a>00118 <span class="comment">//</span>
+<a name="l00119"></a>00119 <span class="comment">// End of overridable helpers declarations</span>
+<a name="l00121"></a>00121 <span class="comment"></span>
+<a name="l00122"></a>00122 <span class="keyword">template</span><size_t S> <span class="keyword">struct </span>atomic_selector;
+<a name="l00123"></a>00123
+<a name="l00124"></a>00124 <span class="keyword">template</span><> <span class="keyword">struct </span>atomic_selector<1> {
+<a name="l00125"></a>00125 <span class="keyword">typedef</span> int8_t word;
+<a name="l00126"></a>00126 <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="l00127"></a>00127 };
+<a name="l00128"></a>00128
+<a name="l00129"></a>00129 <span class="keyword">template</span><> <span class="keyword">struct </span>atomic_selector<2> {
+<a name="l00130"></a>00130 <span class="keyword">typedef</span> int16_t word;
+<a name="l00131"></a>00131 <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="l00132"></a>00132 };
<a name="l00133"></a>00133
-<a name="l00134"></a>00134 <span class="keyword">namespace </span>internal {
-<a name="l00135"></a>00135
-<a name="l00137"></a>00137
-<a name="l00138"></a><a class="code" href="a00218.html">00138</a> <span class="keyword">class </span><a class="code" href="a00218.html">atomic_backoff</a> : no_copy {
-<a name="l00140"></a>00140
-<a name="l00142"></a>00142 <span class="keyword">static</span> <span class="keyword">const</span> int32_t LOOPS_BEFORE_YIELD = 16;
-<a name="l00143"></a>00143 int32_t count;
-<a name="l00144"></a>00144 <span class="keyword">public</span>:
-<a name="l00145"></a>00145 <a class="code" href="a00218.html">atomic_backoff</a>() : count(1) {}
-<a name="l00146"></a>00146
-<a name="l00148"></a><a class="code" href="a00218.html#a174ea93e3bd3d5cce82389c2f28d037">00148</a> <span class="keywordtype">void</span> <a class="code" href="a00218.html#a174ea93e3bd3d5cce82389c2f28d037">pause</a>() {
-<a name="l00149"></a>00149 <span class="keywordflow">if</span>( count<=LOOPS_BEFORE_YIELD ) {
-<a name="l00150"></a>00150 __TBB_Pause(count);
-<a name="l00151"></a>00151 <span class="comment">// Pause twice as long the next time.</span>
-<a name="l00152"></a>00152 count*=2;
-<a name="l00153"></a>00153 } <span class="keywordflow">else</span> {
-<a name="l00154"></a>00154 <span class="comment">// Pause is so long that we might as well yield CPU to scheduler.</span>
-<a name="l00155"></a>00155 __TBB_Yield();
-<a name="l00156"></a>00156 }
-<a name="l00157"></a>00157 }
-<a name="l00158"></a>00158
-<a name="l00159"></a>00159 <span class="comment">// pause for a few times and then return false immediately.</span>
-<a name="l00160"></a>00160 <span class="keywordtype">bool</span> bounded_pause() {
-<a name="l00161"></a>00161 <span class="keywordflow">if</span>( count<=LOOPS_BEFORE_YIELD ) {
-<a name="l00162"></a>00162 __TBB_Pause(count);
-<a name="l00163"></a>00163 <span class="comment">// Pause twice as long the next time.</span>
-<a name="l00164"></a>00164 count*=2;
-<a name="l00165"></a>00165 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l00166"></a>00166 } <span class="keywordflow">else</span> {
-<a name="l00167"></a>00167 <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l00168"></a>00168 }
-<a name="l00169"></a>00169 }
-<a name="l00170"></a>00170
-<a name="l00171"></a>00171 <span class="keywordtype">void</span> reset() {
-<a name="l00172"></a>00172 count = 1;
-<a name="l00173"></a>00173 }
-<a name="l00174"></a>00174 };
-<a name="l00175"></a>00175
-<a name="l00177"></a>00177
-<a name="l00178"></a>00178 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00179"></a>00179 <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="l00180"></a>00180 atomic_backoff backoff;
-<a name="l00181"></a>00181 <span class="keywordflow">while</span>( location==value ) backoff.pause();
-<a name="l00182"></a>00182 }
-<a name="l00183"></a>00183
-<a name="l00185"></a>00185
-<a name="l00186"></a>00186 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00187"></a>00187 <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="l00188"></a>00188 atomic_backoff backoff;
-<a name="l00189"></a>00189 <span class="keywordflow">while</span>( location!=value ) backoff.pause();
-<a name="l00190"></a>00190 }
-<a name="l00191"></a>00191
-<a name="l00192"></a>00192 <span class="comment">// T should be unsigned, otherwise sign propagation will break correctness of bit manipulations.</span>
-<a name="l00193"></a>00193 <span class="comment">// S should be either 1 or 2, for the mask calculation to work correctly.</span>
-<a name="l00194"></a>00194 <span class="comment">// Together, these rules limit applicability of Masked CAS to unsigned char and unsigned short.</span>
-<a name="l00195"></a>00195 <span class="keyword">template</span><size_t S, <span class="keyword">typename</span> T>
-<a name="l00196"></a>00196 <span class="keyword">inline</span> T __TBB_MaskedCompareAndSwap (<span class="keyword">volatile</span> T *ptr, T value, T comparand ) {
-<a name="l00197"></a>00197 <span class="keyword">volatile</span> uint32_t * base = (uint32_t*)( (uintptr_t)ptr & ~(uintptr_t)0x3 );
-<a name="l00198"></a>00198 <span class="preprocessor">#if __TBB_BIG_ENDIAN</span>
-<a name="l00199"></a>00199 <span class="preprocessor"></span> <span class="keyword">const</span> uint8_t bitoffset = uint8_t( 8*( 4-S - (uintptr_t(ptr) & 0x3) ) );
-<a name="l00200"></a>00200 <span class="preprocessor">#else</span>
-<a name="l00201"></a>00201 <span class="preprocessor"></span> <span class="keyword">const</span> uint8_t bitoffset = uint8_t( 8*((uintptr_t)ptr & 0x3) );
-<a name="l00202"></a>00202 <span class="preprocessor">#endif</span>
-<a name="l00203"></a>00203 <span class="preprocessor"></span> <span class="keyword">const</span> uint32_t mask = ( (1<<(S*8)) - 1 )<<bitoffset;
-<a name="l00204"></a>00204 atomic_backoff b;
-<a name="l00205"></a>00205 uint32_t result;
-<a name="l00206"></a>00206 <span class="keywordflow">for</span>(;;) {
-<a name="l00207"></a>00207 result = *base; <span class="comment">// reload the base value which might change during the pause</span>
-<a name="l00208"></a>00208 uint32_t old_value = ( result & ~mask ) | ( comparand << bitoffset );
-<a name="l00209"></a>00209 uint32_t new_value = ( result & ~mask ) | ( value << bitoffset );
-<a name="l00210"></a>00210 <span class="comment">// __TBB_CompareAndSwap4 presumed to have full fence. </span>
-<a name="l00211"></a>00211 result = __TBB_CompareAndSwap4( base, new_value, old_value );
-<a name="l00212"></a>00212 <span class="keywordflow">if</span>( result==old_value <span class="comment">// CAS succeeded</span>
-<a name="l00213"></a>00213 || ((result^old_value)&mask)!=0 ) <span class="comment">// CAS failed and the bits of interest have changed</span>
-<a name="l00214"></a>00214 <span class="keywordflow">break</span>;
-<a name="l00215"></a>00215 <span class="keywordflow">else</span> <span class="comment">// CAS failed but the bits of interest left unchanged</span>
-<a name="l00216"></a>00216 b.pause();
-<a name="l00217"></a>00217 }
-<a name="l00218"></a>00218 <span class="keywordflow">return</span> T((result & mask) >> bitoffset);
-<a name="l00219"></a>00219 }
-<a name="l00220"></a>00220
-<a name="l00221"></a>00221 <span class="keyword">template</span><size_t S, <span class="keyword">typename</span> T>
-<a name="l00222"></a>00222 <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="l00223"></a>00223 <span class="keywordflow">return</span> __TBB_CompareAndSwapW((T *)ptr,value,comparand);
-<a name="l00224"></a>00224 }
-<a name="l00225"></a>00225
-<a name="l00226"></a>00226 <span class="keyword">template</span><>
-<a name="l00227"></a>00227 <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="l00228"></a>00228 #ifdef __TBB_CompareAndSwap1
-<a name="l00229"></a>00229 <span class="keywordflow">return</span> __TBB_CompareAndSwap1(ptr,value,comparand);
-<a name="l00230"></a>00230 <span class="preprocessor">#else</span>
-<a name="l00231"></a>00231 <span class="preprocessor"></span> <span class="keywordflow">return</span> __TBB_MaskedCompareAndSwap<1,uint8_t>((<span class="keyword">volatile</span> uint8_t *)ptr,value,comparand);
-<a name="l00232"></a>00232 <span class="preprocessor">#endif</span>
-<a name="l00233"></a>00233 <span class="preprocessor"></span>}
-<a name="l00234"></a>00234
-<a name="l00235"></a>00235 <span class="keyword">template</span><>
-<a name="l00236"></a>00236 <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="l00237"></a>00237 #ifdef __TBB_CompareAndSwap2
-<a name="l00238"></a>00238 <span class="keywordflow">return</span> __TBB_CompareAndSwap2(ptr,value,comparand);
-<a name="l00239"></a>00239 <span class="preprocessor">#else</span>
-<a name="l00240"></a>00240 <span class="preprocessor"></span> <span class="keywordflow">return</span> __TBB_MaskedCompareAndSwap<2,uint16_t>((<span class="keyword">volatile</span> uint16_t *)ptr,value,comparand);
-<a name="l00241"></a>00241 <span class="preprocessor">#endif</span>
-<a name="l00242"></a>00242 <span class="preprocessor"></span>}
-<a name="l00243"></a>00243
-<a name="l00244"></a>00244 <span class="keyword">template</span><>
-<a name="l00245"></a>00245 <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="l00246"></a>00246 <span class="keywordflow">return</span> __TBB_CompareAndSwap4(ptr,value,comparand);
-<a name="l00247"></a>00247 }
-<a name="l00248"></a>00248
-<a name="l00249"></a>00249 <span class="preprocessor">#if __TBB_64BIT_ATOMICS</span>
-<a name="l00250"></a>00250 <span class="preprocessor"></span><span class="keyword">template</span><>
-<a name="l00251"></a>00251 <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="l00252"></a>00252 <span class="keywordflow">return</span> __TBB_CompareAndSwap8(ptr,value,comparand);
-<a name="l00253"></a>00253 }
-<a name="l00254"></a>00254 <span class="preprocessor">#endif</span>
-<a name="l00255"></a>00255 <span class="preprocessor"></span>
-<a name="l00256"></a>00256 <span class="keyword">template</span><size_t S, <span class="keyword">typename</span> T>
-<a name="l00257"></a>00257 <span class="keyword">inline</span> T __TBB_FetchAndAddGeneric (<span class="keyword">volatile</span> <span class="keywordtype">void</span> *ptr, T addend) {
-<a name="l00258"></a>00258 atomic_backoff b;
-<a name="l00259"></a>00259 T result;
-<a name="l00260"></a>00260 <span class="keywordflow">for</span>(;;) {
-<a name="l00261"></a>00261 result = *reinterpret_cast<volatile T *>(ptr);
-<a name="l00262"></a>00262 <span class="comment">// __TBB_CompareAndSwapGeneric presumed to have full fence. </span>
-<a name="l00263"></a>00263 <span class="keywordflow">if</span>( __TBB_CompareAndSwapGeneric<S,T> ( ptr, result+addend, result )==result )
-<a name="l00264"></a>00264 <span class="keywordflow">break</span>;
-<a name="l00265"></a>00265 b.pause();
-<a name="l00266"></a>00266 }
-<a name="l00267"></a>00267 <span class="keywordflow">return</span> result;
-<a name="l00268"></a>00268 }
-<a name="l00269"></a>00269
-<a name="l00270"></a>00270 <span class="keyword">template</span><size_t S, <span class="keyword">typename</span> T>
-<a name="l00271"></a>00271 <span class="keyword">inline</span> T __TBB_FetchAndStoreGeneric (<span class="keyword">volatile</span> <span class="keywordtype">void</span> *ptr, T value) {
-<a name="l00272"></a>00272 atomic_backoff b;
-<a name="l00273"></a>00273 T result;
-<a name="l00274"></a>00274 <span class="keywordflow">for</span>(;;) {
-<a name="l00275"></a>00275 result = *reinterpret_cast<volatile T *>(ptr);
-<a name="l00276"></a>00276 <span class="comment">// __TBB_CompareAndSwapGeneric presumed to have full fence.</span>
-<a name="l00277"></a>00277 <span class="keywordflow">if</span>( __TBB_CompareAndSwapGeneric<S,T> ( ptr, value, result )==result )
-<a name="l00278"></a>00278 <span class="keywordflow">break</span>;
-<a name="l00279"></a>00279 b.pause();
-<a name="l00280"></a>00280 }
-<a name="l00281"></a>00281 <span class="keywordflow">return</span> result;
-<a name="l00282"></a>00282 }
+<a name="l00134"></a>00134 <span class="keyword">template</span><> <span class="keyword">struct </span>atomic_selector<4> {
+<a name="l00135"></a>00135 <span class="preprocessor">#if _MSC_VER && !_WIN64</span>
+<a name="l00136"></a>00136 <span class="preprocessor"></span> <span class="comment">// Work-around that avoids spurious /Wp64 warnings</span>
+<a name="l00137"></a>00137 <span class="keyword">typedef</span> intptr_t word;
+<a name="l00138"></a>00138 <span class="preprocessor">#else</span>
+<a name="l00139"></a>00139 <span class="preprocessor"></span> <span class="keyword">typedef</span> int32_t word;
+<a name="l00140"></a>00140 <span class="preprocessor">#endif</span>
+<a name="l00141"></a>00141 <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="l00142"></a>00142 };
+<a name="l00143"></a>00143
+<a name="l00144"></a>00144 <span class="keyword">template</span><> <span class="keyword">struct </span>atomic_selector<8> {
+<a name="l00145"></a>00145 <span class="keyword">typedef</span> int64_t word;
+<a name="l00146"></a>00146 <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="l00147"></a>00147 };
+<a name="l00148"></a>00148
+<a name="l00149"></a>00149 }} <span class="comment">// namespaces internal, tbb</span>
+<a name="l00150"></a>00150
+<a name="l00151"></a>00151 <span class="preprocessor">#if _WIN32||_WIN64</span>
+<a name="l00152"></a>00152 <span class="preprocessor"></span>
+<a name="l00153"></a>00153 <span class="preprocessor">#ifdef _MANAGED</span>
+<a name="l00154"></a>00154 <span class="preprocessor"></span><span class="preprocessor">#pragma managed(push, off)</span>
+<a name="l00155"></a>00155 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00156"></a>00156 <span class="preprocessor"></span>
+<a name="l00157"></a>00157 <span class="preprocessor"> #if __MINGW64__ || __MINGW32__</span>
+<a name="l00158"></a>00158 <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="l00159"></a>00159 <span class="preprocessor">#define __TBB_Yield() SwitchToThread()</span>
+<a name="l00160"></a>00160 <span class="preprocessor"></span><span class="preprocessor"> #if (TBB_USE_GCC_BUILTINS && __TBB_GCC_BUILTIN_ATOMICS_PRESENT)</span>
+<a name="l00161"></a>00161 <span class="preprocessor"></span><span class="preprocessor"> #include "machine/gcc_generic.h"</span>
+<a name="l00162"></a>00162 <span class="preprocessor"> #elif __MINGW64__</span>
+<a name="l00163"></a>00163 <span class="preprocessor"></span><span class="preprocessor"> #include "machine/linux_intel64.h"</span>
+<a name="l00164"></a>00164 <span class="preprocessor"> #elif __MINGW32__</span>
+<a name="l00165"></a>00165 <span class="preprocessor"></span><span class="preprocessor"> #include "machine/linux_ia32.h"</span>
+<a name="l00166"></a>00166 <span class="preprocessor"> #endif</span>
+<a name="l00167"></a>00167 <span class="preprocessor"></span><span class="preprocessor"> #elif defined(_M_IX86)</span>
+<a name="l00168"></a>00168 <span class="preprocessor"></span><span class="preprocessor"> #include "machine/windows_ia32.h"</span>
+<a name="l00169"></a>00169 <span class="preprocessor"> #elif defined(_M_X64) </span>
+<a name="l00170"></a>00170 <span class="preprocessor"></span><span class="preprocessor"> #include "machine/windows_intel64.h"</span>
+<a name="l00171"></a>00171 <span class="preprocessor"> #elif _XBOX</span>
+<a name="l00172"></a>00172 <span class="preprocessor"></span><span class="preprocessor"> #include "machine/xbox360_ppc.h"</span>
+<a name="l00173"></a>00173 <span class="preprocessor"> #endif</span>
+<a name="l00174"></a>00174 <span class="preprocessor"></span>
+<a name="l00175"></a>00175 <span class="preprocessor">#ifdef _MANAGED</span>
+<a name="l00176"></a>00176 <span class="preprocessor"></span><span class="preprocessor">#pragma managed(pop)</span>
+<a name="l00177"></a>00177 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00178"></a>00178 <span class="preprocessor"></span>
+<a name="l00179"></a>00179 <span class="preprocessor">#elif __linux__ || __FreeBSD__ || __NetBSD__</span>
+<a name="l00180"></a>00180 <span class="preprocessor"></span>
+<a name="l00181"></a>00181 <span class="preprocessor"> #if (TBB_USE_GCC_BUILTINS && __TBB_GCC_BUILTIN_ATOMICS_PRESENT)</span>
+<a name="l00182"></a>00182 <span class="preprocessor"></span><span class="preprocessor"> #include "machine/gcc_generic.h"</span>
+<a name="l00183"></a>00183 <span class="preprocessor"> #elif __i386__</span>
+<a name="l00184"></a>00184 <span class="preprocessor"></span><span class="preprocessor"> #include "machine/linux_ia32.h"</span>
+<a name="l00185"></a>00185 <span class="preprocessor"> #elif __x86_64__</span>
+<a name="l00186"></a>00186 <span class="preprocessor"></span><span class="preprocessor"> #include "machine/linux_intel64.h"</span>
+<a name="l00187"></a>00187 <span class="preprocessor"> #elif __ia64__</span>
+<a name="l00188"></a>00188 <span class="preprocessor"></span><span class="preprocessor"> #include "machine/linux_ia64.h"</span>
+<a name="l00189"></a>00189 <span class="preprocessor"> #elif __powerpc__</span>
+<a name="l00190"></a>00190 <span class="preprocessor"></span><span class="preprocessor"> #include "machine/mac_ppc.h"</span>
+<a name="l00191"></a>00191 <span class="preprocessor"> #elif __TBB_GCC_BUILTIN_ATOMICS_PRESENT</span>
+<a name="l00192"></a>00192 <span class="preprocessor"></span><span class="preprocessor"> #include "machine/gcc_generic.h"</span>
+<a name="l00193"></a>00193 <span class="preprocessor"> #endif</span>
+<a name="l00194"></a>00194 <span class="preprocessor"></span><span class="preprocessor"> #include "machine/linux_common.h"</span>
+<a name="l00195"></a>00195
+<a name="l00196"></a>00196 <span class="preprocessor">#elif __APPLE__</span>
+<a name="l00197"></a>00197 <span class="preprocessor"></span>
+<a name="l00198"></a>00198 <span class="preprocessor"> #if __i386__</span>
+<a name="l00199"></a>00199 <span class="preprocessor"></span><span class="preprocessor"> #include "machine/linux_ia32.h"</span>
+<a name="l00200"></a>00200 <span class="preprocessor"> #elif __x86_64__</span>
+<a name="l00201"></a>00201 <span class="preprocessor"></span><span class="preprocessor"> #include "machine/linux_intel64.h"</span>
+<a name="l00202"></a>00202 <span class="preprocessor"> #elif __POWERPC__</span>
+<a name="l00203"></a>00203 <span class="preprocessor"></span><span class="preprocessor"> #include "machine/mac_ppc.h"</span>
+<a name="l00204"></a>00204 <span class="preprocessor"> #endif</span>
+<a name="l00205"></a>00205 <span class="preprocessor"></span><span class="preprocessor"> #include "machine/macos_common.h"</span>
+<a name="l00206"></a>00206
+<a name="l00207"></a>00207 <span class="preprocessor">#elif _AIX</span>
+<a name="l00208"></a>00208 <span class="preprocessor"></span>
+<a name="l00209"></a>00209 <span class="preprocessor"> #include "machine/ibm_aix51.h"</span>
+<a name="l00210"></a>00210
+<a name="l00211"></a>00211 <span class="preprocessor">#elif __sun || __SUNPRO_CC</span>
+<a name="l00212"></a>00212 <span class="preprocessor"></span>
+<a name="l00213"></a>00213 <span class="preprocessor"> #define __asm__ asm</span>
+<a name="l00214"></a>00214 <span class="preprocessor"></span><span class="preprocessor"> #define __volatile__ volatile</span>
+<a name="l00215"></a>00215 <span class="preprocessor"></span>
+<a name="l00216"></a>00216 <span class="preprocessor"> #if __i386 || __i386__</span>
+<a name="l00217"></a>00217 <span class="preprocessor"></span><span class="preprocessor"> #include "machine/linux_ia32.h"</span>
+<a name="l00218"></a>00218 <span class="preprocessor"> #elif __x86_64__</span>
+<a name="l00219"></a>00219 <span class="preprocessor"></span><span class="preprocessor"> #include "machine/linux_intel64.h"</span>
+<a name="l00220"></a>00220 <span class="preprocessor"> #elif __sparc</span>
+<a name="l00221"></a>00221 <span class="preprocessor"></span><span class="preprocessor"> #include "machine/sunos_sparc.h"</span>
+<a name="l00222"></a>00222 <span class="preprocessor"> #endif</span>
+<a name="l00223"></a>00223 <span class="preprocessor"></span><span class="preprocessor"> #include <sched.h></span>
+<a name="l00224"></a>00224
+<a name="l00225"></a>00225 <span class="preprocessor"> #define __TBB_Yield() sched_yield()</span>
+<a name="l00226"></a>00226 <span class="preprocessor"></span>
+<a name="l00227"></a>00227 <span class="preprocessor">#endif </span><span class="comment">/* OS selection */</span>
+<a name="l00228"></a>00228
+<a name="l00229"></a>00229 <span class="preprocessor">#ifndef __TBB_64BIT_ATOMICS</span>
+<a name="l00230"></a>00230 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_64BIT_ATOMICS 1</span>
+<a name="l00231"></a>00231 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00232"></a>00232 <span class="preprocessor"></span>
+<a name="l00233"></a>00233 <span class="comment">// Special atomic functions</span>
+<a name="l00234"></a>00234 <span class="preprocessor">#if __TBB_USE_FENCED_ATOMICS</span>
+<a name="l00235"></a>00235 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_machine_cmpswp1 __TBB_machine_cmpswp1full_fence</span>
+<a name="l00236"></a>00236 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_machine_cmpswp2 __TBB_machine_cmpswp2full_fence</span>
+<a name="l00237"></a>00237 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_machine_cmpswp4 __TBB_machine_cmpswp4full_fence</span>
+<a name="l00238"></a>00238 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_machine_cmpswp8 __TBB_machine_cmpswp8full_fence</span>
+<a name="l00239"></a>00239 <span class="preprocessor"></span>
+<a name="l00240"></a>00240 <span class="preprocessor"> #if __TBB_WORDSIZE==8</span>
+<a name="l00241"></a>00241 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_machine_fetchadd8 __TBB_machine_fetchadd8full_fence</span>
+<a name="l00242"></a>00242 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_machine_fetchstore8 __TBB_machine_fetchstore8full_fence</span>
+<a name="l00243"></a>00243 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_FetchAndAddWrelease(P,V) __TBB_machine_fetchadd8release(P,V)</span>
+<a name="l00244"></a>00244 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_FetchAndIncrementWacquire(P) __TBB_machine_fetchadd8acquire(P,1)</span>
+<a name="l00245"></a>00245 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_FetchAndDecrementWrelease(P) __TBB_machine_fetchadd8release(P,(-1))</span>
+<a name="l00246"></a>00246 <span class="preprocessor"></span><span class="preprocessor"> #else</span>
+<a name="l00247"></a>00247 <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="l00248"></a>00248 <span class="preprocessor"></span><span class="preprocessor"> #endif </span><span class="comment">/* __TBB_WORDSIZE==4 */</span>
+<a name="l00249"></a>00249 <span class="preprocessor">#else </span><span class="comment">/* !__TBB_USE_FENCED_ATOMICS */</span>
+<a name="l00250"></a>00250 <span class="preprocessor"> #define __TBB_FetchAndAddWrelease(P,V) __TBB_FetchAndAddW(P,V)</span>
+<a name="l00251"></a>00251 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_FetchAndIncrementWacquire(P) __TBB_FetchAndAddW(P,1)</span>
+<a name="l00252"></a>00252 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_FetchAndDecrementWrelease(P) __TBB_FetchAndAddW(P,(-1))</span>
+<a name="l00253"></a>00253 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* !__TBB_USE_FENCED_ATOMICS */</span>
+<a name="l00254"></a>00254
+<a name="l00255"></a>00255 <span class="preprocessor">#if __TBB_WORDSIZE==4</span>
+<a name="l00256"></a>00256 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_CompareAndSwapW(P,V,C) __TBB_machine_cmpswp4(P,V,C)</span>
+<a name="l00257"></a>00257 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_FetchAndAddW(P,V) __TBB_machine_fetchadd4(P,V)</span>
+<a name="l00258"></a>00258 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_FetchAndStoreW(P,V) __TBB_machine_fetchstore4(P,V)</span>
+<a name="l00259"></a>00259 <span class="preprocessor"></span><span class="preprocessor">#elif __TBB_WORDSIZE==8</span>
+<a name="l00260"></a>00260 <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="l00261"></a>00261 <span class="preprocessor"></span><span class="preprocessor"> #error These macros should only be used on 32-bit platforms.</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 <span class="preprocessor"> #define __TBB_CompareAndSwapW(P,V,C) __TBB_machine_cmpswp8(P,V,C)</span>
+<a name="l00265"></a>00265 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_FetchAndAddW(P,V) __TBB_machine_fetchadd8(P,V)</span>
+<a name="l00266"></a>00266 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_FetchAndStoreW(P,V) __TBB_machine_fetchstore8(P,V)</span>
+<a name="l00267"></a>00267 <span class="preprocessor"></span><span class="preprocessor">#else </span><span class="comment">/* __TBB_WORDSIZE != 8 */</span>
+<a name="l00268"></a>00268 <span class="preprocessor"> #error Unsupported machine word size.</span>
+<a name="l00269"></a>00269 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* __TBB_WORDSIZE */</span>
+<a name="l00270"></a>00270
+<a name="l00271"></a>00271 <span class="preprocessor">#ifndef __TBB_Pause</span>
+<a name="l00272"></a>00272 <span class="preprocessor"></span> <span class="keyword">inline</span> <span class="keywordtype">void</span> __TBB_Pause(int32_t) {
+<a name="l00273"></a>00273 __TBB_Yield();
+<a name="l00274"></a>00274 }
+<a name="l00275"></a>00275 <span class="preprocessor">#endif</span>
+<a name="l00276"></a>00276 <span class="preprocessor"></span>
+<a name="l00277"></a>00277 <span class="keyword">namespace </span>tbb {
+<a name="l00278"></a>00278
+<a name="l00280"></a><a class="code" href="a00383.html#250275615f10d5b5de6ad466ae2f54de">00280</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="a00383.html#250275615f10d5b5de6ad466ae2f54de">atomic_fence</a> () { __TBB_full_memory_fence(); }
+<a name="l00281"></a>00281
+<a name="l00282"></a>00282 <span class="keyword">namespace </span>internal {
<a name="l00283"></a>00283
-<a name="l00284"></a>00284 <span class="comment">// Macro __TBB_TypeWithAlignmentAtLeastAsStrict(T) should be a type with alignment at least as </span>
-<a name="l00285"></a>00285 <span class="comment">// strict as type T. Type type should have a trivial default constructor and destructor, so that</span>
-<a name="l00286"></a>00286 <span class="comment">// arrays of that type can be declared without initializers. </span>
-<a name="l00287"></a>00287 <span class="comment">// It is correct (but perhaps a waste of space) if __TBB_TypeWithAlignmentAtLeastAsStrict(T) expands</span>
-<a name="l00288"></a>00288 <span class="comment">// to a type bigger than T.</span>
-<a name="l00289"></a>00289 <span class="comment">// The default definition here works on machines where integers are naturally aligned and the</span>
-<a name="l00290"></a>00290 <span class="comment">// strictest alignment is 16.</span>
-<a name="l00291"></a>00291 <span class="preprocessor">#ifndef __TBB_TypeWithAlignmentAtLeastAsStrict</span>
-<a name="l00292"></a>00292 <span class="preprocessor"></span>
-<a name="l00293"></a>00293 <span class="preprocessor">#if __GNUC__ || __SUNPRO_CC || __IBMCPP__</span>
-<a name="l00294"></a>00294 <span class="preprocessor"></span><span class="keyword">struct </span>__TBB_machine_type_with_strictest_alignment {
-<a name="l00295"></a>00295 <span class="keywordtype">int</span> member[4];
-<a name="l00296"></a>00296 } __attribute__((aligned(16)));
-<a name="l00297"></a>00297 <span class="preprocessor">#elif _MSC_VER</span>
-<a name="l00298"></a>00298 <span class="preprocessor"></span>__declspec(align(16)) struct __TBB_machine_type_with_strictest_alignment {
-<a name="l00299"></a>00299 <span class="keywordtype">int</span> member[4];
-<a name="l00300"></a>00300 };
-<a name="l00301"></a>00301 <span class="preprocessor">#else</span>
-<a name="l00302"></a>00302 <span class="preprocessor"></span><span class="preprocessor">#error Must define __TBB_TypeWithAlignmentAtLeastAsStrict(T) or __TBB_machine_type_with_strictest_alignment</span>
-<a name="l00303"></a>00303 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00304"></a>00304 <span class="preprocessor"></span>
-<a name="l00305"></a>00305 <span class="keyword">template</span><size_t N> <span class="keyword">struct </span>type_with_alignment {__TBB_machine_type_with_strictest_alignment member;};
-<a name="l00306"></a>00306 <span class="keyword">template</span><> <span class="keyword">struct </span>type_with_alignment<1> { <span class="keywordtype">char</span> member; };
-<a name="l00307"></a>00307 <span class="keyword">template</span><> <span class="keyword">struct </span>type_with_alignment<2> { uint16_t member; };
-<a name="l00308"></a>00308 <span class="keyword">template</span><> <span class="keyword">struct </span>type_with_alignment<4> { uint32_t member; };
-<a name="l00309"></a>00309 <span class="keyword">template</span><> <span class="keyword">struct </span>type_with_alignment<8> { uint64_t member; };
-<a name="l00310"></a>00310
-<a name="l00311"></a>00311 <span class="preprocessor">#if _MSC_VER||defined(__GNUC__)&&__GNUC__==3 && __GNUC_MINOR__<=2 </span>
-<a name="l00313"></a>00313 <span class="preprocessor"></span>
-<a name="l00315"></a>00315 <span class="preprocessor">template<size_t Size, typename T> </span>
-<a name="l00316"></a><a class="code" href="a00305.html">00316</a> <span class="preprocessor"></span><span class="keyword">struct </span><a class="code" href="a00305.html">work_around_alignment_bug</a> {
-<a name="l00317"></a>00317 <span class="preprocessor">#if _MSC_VER</span>
-<a name="l00318"></a>00318 <span class="preprocessor"></span> <span class="keyword">static</span> <span class="keyword">const</span> size_t alignment = __alignof(T);
-<a name="l00319"></a>00319 <span class="preprocessor">#else</span>
-<a name="l00320"></a>00320 <span class="preprocessor"></span> <span class="keyword">static</span> <span class="keyword">const</span> size_t alignment = __alignof__(T);
-<a name="l00321"></a>00321 <span class="preprocessor">#endif</span>
-<a name="l00322"></a>00322 <span class="preprocessor"></span>};
-<a name="l00323"></a>00323 <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="l00324"></a>00324 <span class="preprocessor"></span><span class="preprocessor">#elif __GNUC__ || __SUNPRO_CC || __IBMCPP__</span>
-<a name="l00325"></a>00325 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_TypeWithAlignmentAtLeastAsStrict(T) tbb::internal::type_with_alignment<__alignof__(T)></span>
-<a name="l00326"></a>00326 <span class="preprocessor"></span><span class="preprocessor">#else</span>
-<a name="l00327"></a>00327 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_TypeWithAlignmentAtLeastAsStrict(T) __TBB_machine_type_with_strictest_alignment</span>
-<a name="l00328"></a>00328 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00329"></a>00329 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* ____TBB_TypeWithAlignmentAtLeastAsStrict */</span>
-<a name="l00330"></a>00330
-<a name="l00331"></a>00331 <span class="comment">// Template class here is to avoid instantiation of the static data for modules that don't use it</span>
-<a name="l00332"></a>00332 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00333"></a>00333 <span class="keyword">struct </span>reverse {
-<a name="l00334"></a>00334 <span class="keyword">static</span> <span class="keyword">const</span> T byte_table[256];
-<a name="l00335"></a>00335 };
-<a name="l00336"></a>00336 <span class="comment">// An efficient implementation of the reverse function utilizes a 2^8 lookup table holding the bit-reversed</span>
-<a name="l00337"></a>00337 <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="l00338"></a>00338 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00339"></a>00339 <span class="keyword">const</span> T reverse<T>::byte_table[256] = {
-<a name="l00340"></a>00340 0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0, 0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0,
-<a name="l00341"></a>00341 0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8, 0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8,
-<a name="l00342"></a>00342 0x04, 0x84, 0x44, 0xC4, 0x24, 0xA4, 0x64, 0xE4, 0x14, 0x94, 0x54, 0xD4, 0x34, 0xB4, 0x74, 0xF4,
-<a name="l00343"></a>00343 0x0C, 0x8C, 0x4C, 0xCC, 0x2C, 0xAC, 0x6C, 0xEC, 0x1C, 0x9C, 0x5C, 0xDC, 0x3C, 0xBC, 0x7C, 0xFC,
-<a name="l00344"></a>00344 0x02, 0x82, 0x42, 0xC2, 0x22, 0xA2, 0x62, 0xE2, 0x12, 0x92, 0x52, 0xD2, 0x32, 0xB2, 0x72, 0xF2,
-<a name="l00345"></a>00345 0x0A, 0x8A, 0x4A, 0xCA, 0x2A, 0xAA, 0x6A, 0xEA, 0x1A, 0x9A, 0x5A, 0xDA, 0x3A, 0xBA, 0x7A, 0xFA,
-<a name="l00346"></a>00346 0x06, 0x86, 0x46, 0xC6, 0x26, 0xA6, 0x66, 0xE6, 0x16, 0x96, 0x56, 0xD6, 0x36, 0xB6, 0x76, 0xF6,
-<a name="l00347"></a>00347 0x0E, 0x8E, 0x4E, 0xCE, 0x2E, 0xAE, 0x6E, 0xEE, 0x1E, 0x9E, 0x5E, 0xDE, 0x3E, 0xBE, 0x7E, 0xFE,
-<a name="l00348"></a>00348 0x01, 0x81, 0x41, 0xC1, 0x21, 0xA1, 0x61, 0xE1, 0x11, 0x91, 0x51, 0xD1, 0x31, 0xB1, 0x71, 0xF1,
-<a name="l00349"></a>00349 0x09, 0x89, 0x49, 0xC9, 0x29, 0xA9, 0x69, 0xE9, 0x19, 0x99, 0x59, 0xD9, 0x39, 0xB9, 0x79, 0xF9,
-<a name="l00350"></a>00350 0x05, 0x85, 0x45, 0xC5, 0x25, 0xA5, 0x65, 0xE5, 0x15, 0x95, 0x55, 0xD5, 0x35, 0xB5, 0x75, 0xF5,
-<a name="l00351"></a>00351 0x0D, 0x8D, 0x4D, 0xCD, 0x2D, 0xAD, 0x6D, 0xED, 0x1D, 0x9D, 0x5D, 0xDD, 0x3D, 0xBD, 0x7D, 0xFD,
-<a name="l00352"></a>00352 0x03, 0x83, 0x43, 0xC3, 0x23, 0xA3, 0x63, 0xE3, 0x13, 0x93, 0x53, 0xD3, 0x33, 0xB3, 0x73, 0xF3,
-<a name="l00353"></a>00353 0x0B, 0x8B, 0x4B, 0xCB, 0x2B, 0xAB, 0x6B, 0xEB, 0x1B, 0x9B, 0x5B, 0xDB, 0x3B, 0xBB, 0x7B, 0xFB,
-<a name="l00354"></a>00354 0x07, 0x87, 0x47, 0xC7, 0x27, 0xA7, 0x67, 0xE7, 0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7,
-<a name="l00355"></a>00355 0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF, 0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF
-<a name="l00356"></a>00356 };
-<a name="l00357"></a>00357
-<a name="l00358"></a>00358 } <span class="comment">// namespace internal</span>
-<a name="l00359"></a>00359 } <span class="comment">// namespace tbb</span>
-<a name="l00360"></a>00360
-<a name="l00361"></a>00361 <span class="preprocessor">#ifndef __TBB_CompareAndSwap1</span>
-<a name="l00362"></a>00362 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap1 tbb::internal::__TBB_CompareAndSwapGeneric<1,uint8_t></span>
-<a name="l00363"></a>00363 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00364"></a>00364 <span class="preprocessor"></span>
-<a name="l00365"></a>00365 <span class="preprocessor">#ifndef __TBB_CompareAndSwap2 </span>
-<a name="l00366"></a>00366 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap2 tbb::internal::__TBB_CompareAndSwapGeneric<2,uint16_t></span>
-<a name="l00367"></a>00367 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00368"></a>00368 <span class="preprocessor"></span>
-<a name="l00369"></a>00369 <span class="preprocessor">#ifndef __TBB_CompareAndSwapW</span>
-<a name="l00370"></a>00370 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwapW tbb::internal::__TBB_CompareAndSwapGeneric<sizeof(ptrdiff_t),ptrdiff_t></span>
-<a name="l00371"></a>00371 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00372"></a>00372 <span class="preprocessor"></span>
-<a name="l00373"></a>00373 <span class="preprocessor">#ifndef __TBB_FetchAndAdd1</span>
-<a name="l00374"></a>00374 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd1 tbb::internal::__TBB_FetchAndAddGeneric<1,uint8_t></span>
-<a name="l00375"></a>00375 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00376"></a>00376 <span class="preprocessor"></span>
-<a name="l00377"></a>00377 <span class="preprocessor">#ifndef __TBB_FetchAndAdd2</span>
-<a name="l00378"></a>00378 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd2 tbb::internal::__TBB_FetchAndAddGeneric<2,uint16_t></span>
-<a name="l00379"></a>00379 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00380"></a>00380 <span class="preprocessor"></span>
-<a name="l00381"></a>00381 <span class="preprocessor">#ifndef __TBB_FetchAndAdd4</span>
-<a name="l00382"></a>00382 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd4 tbb::internal::__TBB_FetchAndAddGeneric<4,uint32_t></span>
-<a name="l00383"></a>00383 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00384"></a>00384 <span class="preprocessor"></span>
-<a name="l00385"></a>00385 <span class="preprocessor">#ifndef __TBB_FetchAndAdd8</span>
-<a name="l00386"></a>00386 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd8 tbb::internal::__TBB_FetchAndAddGeneric<8,uint64_t></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 <span class="preprocessor">#ifndef __TBB_FetchAndAddW</span>
-<a name="l00390"></a>00390 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAddW tbb::internal::__TBB_FetchAndAddGeneric<sizeof(ptrdiff_t),ptrdiff_t></span>
-<a name="l00391"></a>00391 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00392"></a>00392 <span class="preprocessor"></span>
-<a name="l00393"></a>00393 <span class="preprocessor">#ifndef __TBB_FetchAndStore1</span>
-<a name="l00394"></a>00394 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore1 tbb::internal::__TBB_FetchAndStoreGeneric<1,uint8_t></span>
-<a name="l00395"></a>00395 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00396"></a>00396 <span class="preprocessor"></span>
-<a name="l00397"></a>00397 <span class="preprocessor">#ifndef __TBB_FetchAndStore2</span>
-<a name="l00398"></a>00398 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore2 tbb::internal::__TBB_FetchAndStoreGeneric<2,uint16_t></span>
-<a name="l00399"></a>00399 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00400"></a>00400 <span class="preprocessor"></span>
-<a name="l00401"></a>00401 <span class="preprocessor">#ifndef __TBB_FetchAndStore4</span>
-<a name="l00402"></a>00402 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore4 tbb::internal::__TBB_FetchAndStoreGeneric<4,uint32_t></span>
-<a name="l00403"></a>00403 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00404"></a>00404 <span class="preprocessor"></span>
-<a name="l00405"></a>00405 <span class="preprocessor">#ifndef __TBB_FetchAndStore8</span>
-<a name="l00406"></a>00406 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore8 tbb::internal::__TBB_FetchAndStoreGeneric<8,uint64_t></span>
-<a name="l00407"></a>00407 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00408"></a>00408 <span class="preprocessor"></span>
-<a name="l00409"></a>00409 <span class="preprocessor">#ifndef __TBB_FetchAndStoreW</span>
-<a name="l00410"></a>00410 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStoreW tbb::internal::__TBB_FetchAndStoreGeneric<sizeof(ptrdiff_t),ptrdiff_t></span>
-<a name="l00411"></a>00411 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00412"></a>00412 <span class="preprocessor"></span>
-<a name="l00413"></a>00413 <span class="preprocessor">#if __TBB_DECL_FENCED_ATOMICS</span>
-<a name="l00414"></a>00414 <span class="preprocessor"></span>
-<a name="l00415"></a>00415 <span class="preprocessor">#ifndef __TBB_CompareAndSwap1__TBB_full_fence</span>
-<a name="l00416"></a>00416 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap1__TBB_full_fence __TBB_CompareAndSwap1</span>
-<a name="l00417"></a>00417 <span class="preprocessor"></span><span class="preprocessor">#endif </span>
-<a name="l00418"></a>00418 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_CompareAndSwap1acquire</span>
-<a name="l00419"></a>00419 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap1acquire __TBB_CompareAndSwap1__TBB_full_fence</span>
-<a name="l00420"></a>00420 <span class="preprocessor"></span><span class="preprocessor">#endif </span>
-<a name="l00421"></a>00421 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_CompareAndSwap1release</span>
-<a name="l00422"></a>00422 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap1release __TBB_CompareAndSwap1__TBB_full_fence</span>
-<a name="l00423"></a>00423 <span class="preprocessor"></span><span class="preprocessor">#endif </span>
-<a name="l00424"></a>00424 <span class="preprocessor"></span>
-<a name="l00425"></a>00425 <span class="preprocessor">#ifndef __TBB_CompareAndSwap2__TBB_full_fence</span>
-<a name="l00426"></a>00426 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap2__TBB_full_fence __TBB_CompareAndSwap2</span>
-<a name="l00427"></a>00427 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00428"></a>00428 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_CompareAndSwap2acquire</span>
-<a name="l00429"></a>00429 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap2acquire __TBB_CompareAndSwap2__TBB_full_fence</span>
-<a name="l00430"></a>00430 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00431"></a>00431 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_CompareAndSwap2release</span>
-<a name="l00432"></a>00432 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap2release __TBB_CompareAndSwap2__TBB_full_fence</span>
-<a name="l00433"></a>00433 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00434"></a>00434 <span class="preprocessor"></span>
-<a name="l00435"></a>00435 <span class="preprocessor">#ifndef __TBB_CompareAndSwap4__TBB_full_fence</span>
-<a name="l00436"></a>00436 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap4__TBB_full_fence __TBB_CompareAndSwap4</span>
-<a name="l00437"></a>00437 <span class="preprocessor"></span><span class="preprocessor">#endif </span>
-<a name="l00438"></a>00438 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_CompareAndSwap4acquire</span>
-<a name="l00439"></a>00439 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap4acquire __TBB_CompareAndSwap4__TBB_full_fence</span>
-<a name="l00440"></a>00440 <span class="preprocessor"></span><span class="preprocessor">#endif </span>
-<a name="l00441"></a>00441 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_CompareAndSwap4release</span>
-<a name="l00442"></a>00442 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap4release __TBB_CompareAndSwap4__TBB_full_fence</span>
-<a name="l00443"></a>00443 <span class="preprocessor"></span><span class="preprocessor">#endif </span>
-<a name="l00444"></a>00444 <span class="preprocessor"></span>
-<a name="l00445"></a>00445 <span class="preprocessor">#ifndef __TBB_CompareAndSwap8__TBB_full_fence</span>
-<a name="l00446"></a>00446 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap8__TBB_full_fence __TBB_CompareAndSwap8</span>
-<a name="l00447"></a>00447 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00448"></a>00448 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_CompareAndSwap8acquire</span>
-<a name="l00449"></a>00449 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap8acquire __TBB_CompareAndSwap8__TBB_full_fence</span>
-<a name="l00450"></a>00450 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00451"></a>00451 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_CompareAndSwap8release</span>
-<a name="l00452"></a>00452 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap8release __TBB_CompareAndSwap8__TBB_full_fence</span>
+<a name="l00285"></a>00285
+<a name="l00286"></a><a class="code" href="a00230.html">00286</a> <span class="keyword">class </span><a class="code" href="a00230.html">atomic_backoff</a> : no_copy {
+<a name="l00288"></a>00288
+<a name="l00290"></a>00290 <span class="keyword">static</span> <span class="keyword">const</span> int32_t LOOPS_BEFORE_YIELD = 16;
+<a name="l00291"></a>00291 int32_t count;
+<a name="l00292"></a>00292 <span class="keyword">public</span>:
+<a name="l00293"></a>00293 <a class="code" href="a00230.html">atomic_backoff</a>() : count(1) {}
+<a name="l00294"></a>00294
+<a name="l00296"></a><a class="code" href="a00230.html#a174ea93e3bd3d5cce82389c2f28d037">00296</a> <span class="keywordtype">void</span> <a class="code" href="a00230.html#a174ea93e3bd3d5cce82389c2f28d037">pause</a>() {
+<a name="l00297"></a>00297 <span class="keywordflow">if</span>( count<=LOOPS_BEFORE_YIELD ) {
+<a name="l00298"></a>00298 __TBB_Pause(count);
+<a name="l00299"></a>00299 <span class="comment">// Pause twice as long the next time.</span>
+<a name="l00300"></a>00300 count*=2;
+<a name="l00301"></a>00301 } <span class="keywordflow">else</span> {
+<a name="l00302"></a>00302 <span class="comment">// Pause is so long that we might as well yield CPU to scheduler.</span>
+<a name="l00303"></a>00303 __TBB_Yield();
+<a name="l00304"></a>00304 }
+<a name="l00305"></a>00305 }
+<a name="l00306"></a>00306
+<a name="l00307"></a>00307 <span class="comment">// pause for a few times and then return false immediately.</span>
+<a name="l00308"></a>00308 <span class="keywordtype">bool</span> bounded_pause() {
+<a name="l00309"></a>00309 <span class="keywordflow">if</span>( count<=LOOPS_BEFORE_YIELD ) {
+<a name="l00310"></a>00310 __TBB_Pause(count);
+<a name="l00311"></a>00311 <span class="comment">// Pause twice as long the next time.</span>
+<a name="l00312"></a>00312 count*=2;
+<a name="l00313"></a>00313 <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00314"></a>00314 } <span class="keywordflow">else</span> {
+<a name="l00315"></a>00315 <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00316"></a>00316 }
+<a name="l00317"></a>00317 }
+<a name="l00318"></a>00318
+<a name="l00319"></a>00319 <span class="keywordtype">void</span> reset() {
+<a name="l00320"></a>00320 count = 1;
+<a name="l00321"></a>00321 }
+<a name="l00322"></a>00322 };
+<a name="l00323"></a>00323
+<a name="l00325"></a>00325
+<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="keywordtype">void</span> spin_wait_while_eq( <span class="keyword">const</span> <span class="keyword">volatile</span> T& location, U value ) {
+<a name="l00328"></a>00328 atomic_backoff backoff;
+<a name="l00329"></a>00329 <span class="keywordflow">while</span>( location==value ) backoff.pause();
+<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> T, <span class="keyword">typename</span> U>
+<a name="l00335"></a>00335 <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="l00336"></a>00336 atomic_backoff backoff;
+<a name="l00337"></a>00337 <span class="keywordflow">while</span>( location!=value ) backoff.pause();
+<a name="l00338"></a>00338 }
+<a name="l00339"></a>00339
+<a name="l00340"></a>00340 <span class="comment">// T should be unsigned, otherwise sign propagation will break correctness of bit manipulations.</span>
+<a name="l00341"></a>00341 <span class="comment">// S should be either 1 or 2, for the mask calculation to work correctly.</span>
+<a name="l00342"></a>00342 <span class="comment">// Together, these rules limit applicability of Masked CAS to unsigned char and unsigned short.</span>
+<a name="l00343"></a>00343 <span class="keyword">template</span><size_t S, <span class="keyword">typename</span> T>
+<a name="l00344"></a>00344 <span class="keyword">inline</span> T __TBB_MaskedCompareAndSwap (<span class="keyword">volatile</span> T *ptr, T value, T comparand ) {
+<a name="l00345"></a>00345 <span class="keyword">volatile</span> uint32_t * base = (uint32_t*)( (uintptr_t)ptr & ~(uintptr_t)0x3 );
+<a name="l00346"></a>00346 <span class="preprocessor">#if __TBB_BIG_ENDIAN</span>
+<a name="l00347"></a>00347 <span class="preprocessor"></span> <span class="keyword">const</span> uint8_t bitoffset = uint8_t( 8*( 4-S - (uintptr_t(ptr) & 0x3) ) );
+<a name="l00348"></a>00348 <span class="preprocessor">#else</span>
+<a name="l00349"></a>00349 <span class="preprocessor"></span> <span class="keyword">const</span> uint8_t bitoffset = uint8_t( 8*((uintptr_t)ptr & 0x3) );
+<a name="l00350"></a>00350 <span class="preprocessor">#endif</span>
+<a name="l00351"></a>00351 <span class="preprocessor"></span> <span class="keyword">const</span> uint32_t mask = ( (1<<(S*8)) - 1 )<<bitoffset;
+<a name="l00352"></a>00352 atomic_backoff b;
+<a name="l00353"></a>00353 uint32_t result;
+<a name="l00354"></a>00354 <span class="keywordflow">for</span>(;;) {
+<a name="l00355"></a>00355 result = *base; <span class="comment">// reload the base value which might change during the pause</span>
+<a name="l00356"></a>00356 uint32_t old_value = ( result & ~mask ) | ( comparand << bitoffset );
+<a name="l00357"></a>00357 uint32_t new_value = ( result & ~mask ) | ( value << bitoffset );
+<a name="l00358"></a>00358 <span class="comment">// __TBB_CompareAndSwap4 presumed to have full fence.</span>
+<a name="l00359"></a>00359 <span class="comment">// Cast shuts up /Wp64 warning</span>
+<a name="l00360"></a>00360 result = (uint32_t)__TBB_machine_cmpswp4( base, new_value, old_value );
+<a name="l00361"></a>00361 <span class="keywordflow">if</span>( result==old_value <span class="comment">// CAS succeeded</span>
+<a name="l00362"></a>00362 || ((result^old_value)&mask)!=0 ) <span class="comment">// CAS failed and the bits of interest have changed</span>
+<a name="l00363"></a>00363 <span class="keywordflow">break</span>;
+<a name="l00364"></a>00364 <span class="keywordflow">else</span> <span class="comment">// CAS failed but the bits of interest left unchanged</span>
+<a name="l00365"></a>00365 b.pause();
+<a name="l00366"></a>00366 }
+<a name="l00367"></a>00367 <span class="keywordflow">return</span> T((result & mask) >> bitoffset);
+<a name="l00368"></a>00368 }
+<a name="l00369"></a>00369
+<a name="l00370"></a>00370 <span class="keyword">template</span><size_t S, <span class="keyword">typename</span> T>
+<a name="l00371"></a>00371 <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="l00372"></a>00372
+<a name="l00373"></a>00373 <span class="keyword">template</span><>
+<a name="l00374"></a>00374 <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="l00375"></a>00375 #<span class="keywordflow">if</span> __TBB_USE_GENERIC_PART_WORD_CAS
+<a name="l00376"></a>00376 <span class="keywordflow">return</span> __TBB_MaskedCompareAndSwap<1,uint8_t>((<span class="keyword">volatile</span> uint8_t *)ptr,value,comparand);
+<a name="l00377"></a>00377 <span class="preprocessor">#else</span>
+<a name="l00378"></a>00378 <span class="preprocessor"></span> <span class="keywordflow">return</span> __TBB_machine_cmpswp1(ptr,value,comparand);
+<a name="l00379"></a>00379 <span class="preprocessor">#endif</span>
+<a name="l00380"></a>00380 <span class="preprocessor"></span>}
+<a name="l00381"></a>00381
+<a name="l00382"></a>00382 <span class="keyword">template</span><>
+<a name="l00383"></a>00383 <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="l00384"></a>00384 #<span class="keywordflow">if</span> __TBB_USE_GENERIC_PART_WORD_CAS
+<a name="l00385"></a>00385 <span class="keywordflow">return</span> __TBB_MaskedCompareAndSwap<2,uint16_t>((<span class="keyword">volatile</span> uint16_t *)ptr,value,comparand);
+<a name="l00386"></a>00386 <span class="preprocessor">#else</span>
+<a name="l00387"></a>00387 <span class="preprocessor"></span> <span class="keywordflow">return</span> __TBB_machine_cmpswp2(ptr,value,comparand);
+<a name="l00388"></a>00388 <span class="preprocessor">#endif</span>
+<a name="l00389"></a>00389 <span class="preprocessor"></span>}
+<a name="l00390"></a>00390
+<a name="l00391"></a>00391 <span class="keyword">template</span><>
+<a name="l00392"></a>00392 <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="l00393"></a>00393 <span class="comment">// Cast shuts up /Wp64 warning</span>
+<a name="l00394"></a>00394 <span class="keywordflow">return</span> (uint32_t)__TBB_machine_cmpswp4(ptr,value,comparand);
+<a name="l00395"></a>00395 }
+<a name="l00396"></a>00396
+<a name="l00397"></a>00397 <span class="preprocessor">#if __TBB_64BIT_ATOMICS</span>
+<a name="l00398"></a>00398 <span class="preprocessor"></span><span class="keyword">template</span><>
+<a name="l00399"></a>00399 <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="l00400"></a>00400 <span class="keywordflow">return</span> __TBB_machine_cmpswp8(ptr,value,comparand);
+<a name="l00401"></a>00401 }
+<a name="l00402"></a>00402 <span class="preprocessor">#endif</span>
+<a name="l00403"></a>00403 <span class="preprocessor"></span>
+<a name="l00404"></a>00404 <span class="keyword">template</span><size_t S, <span class="keyword">typename</span> T>
+<a name="l00405"></a>00405 <span class="keyword">inline</span> T __TBB_FetchAndAddGeneric (<span class="keyword">volatile</span> <span class="keywordtype">void</span> *ptr, T addend) {
+<a name="l00406"></a>00406 atomic_backoff b;
+<a name="l00407"></a>00407 T result;
+<a name="l00408"></a>00408 <span class="keywordflow">for</span>(;;) {
+<a name="l00409"></a>00409 result = *reinterpret_cast<volatile T *>(ptr);
+<a name="l00410"></a>00410 <span class="comment">// __TBB_CompareAndSwapGeneric presumed to have full fence.</span>
+<a name="l00411"></a>00411 <span class="keywordflow">if</span>( __TBB_CompareAndSwapGeneric<S,T> ( ptr, result+addend, result )==result )
+<a name="l00412"></a>00412 <span class="keywordflow">break</span>;
+<a name="l00413"></a>00413 b.pause();
+<a name="l00414"></a>00414 }
+<a name="l00415"></a>00415 <span class="keywordflow">return</span> result;
+<a name="l00416"></a>00416 }
+<a name="l00417"></a>00417
+<a name="l00418"></a>00418 <span class="keyword">template</span><size_t S, <span class="keyword">typename</span> T>
+<a name="l00419"></a>00419 <span class="keyword">inline</span> T __TBB_FetchAndStoreGeneric (<span class="keyword">volatile</span> <span class="keywordtype">void</span> *ptr, T value) {
+<a name="l00420"></a>00420 atomic_backoff b;
+<a name="l00421"></a>00421 T result;
+<a name="l00422"></a>00422 <span class="keywordflow">for</span>(;;) {
+<a name="l00423"></a>00423 result = *reinterpret_cast<volatile T *>(ptr);
+<a name="l00424"></a>00424 <span class="comment">// __TBB_CompareAndSwapGeneric presumed to have full fence.</span>
+<a name="l00425"></a>00425 <span class="keywordflow">if</span>( __TBB_CompareAndSwapGeneric<S,T> ( ptr, value, result )==result )
+<a name="l00426"></a>00426 <span class="keywordflow">break</span>;
+<a name="l00427"></a>00427 b.pause();
+<a name="l00428"></a>00428 }
+<a name="l00429"></a>00429 <span class="keywordflow">return</span> result;
+<a name="l00430"></a>00430 }
+<a name="l00431"></a>00431
+<a name="l00432"></a>00432 <span class="preprocessor">#if __TBB_USE_GENERIC_PART_WORD_CAS</span>
+<a name="l00433"></a>00433 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_machine_cmpswp1 tbb::internal::__TBB_CompareAndSwapGeneric<1,uint8_t></span>
+<a name="l00434"></a>00434 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_machine_cmpswp2 tbb::internal::__TBB_CompareAndSwapGeneric<2,uint16_t></span>
+<a name="l00435"></a>00435 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00436"></a>00436 <span class="preprocessor"></span>
+<a name="l00437"></a>00437 <span class="preprocessor">#if __TBB_USE_GENERIC_FETCH_ADD || __TBB_USE_GENERIC_PART_WORD_FETCH_ADD</span>
+<a name="l00438"></a>00438 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_machine_fetchadd1 tbb::internal::__TBB_FetchAndAddGeneric<1,uint8_t></span>
+<a name="l00439"></a>00439 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_machine_fetchadd2 tbb::internal::__TBB_FetchAndAddGeneric<2,uint16_t></span>
+<a name="l00440"></a>00440 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00441"></a>00441 <span class="preprocessor"></span>
+<a name="l00442"></a>00442 <span class="preprocessor">#if __TBB_USE_GENERIC_FETCH_ADD </span>
+<a name="l00443"></a>00443 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_machine_fetchadd4 tbb::internal::__TBB_FetchAndAddGeneric<4,uint32_t></span>
+<a name="l00444"></a>00444 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00445"></a>00445 <span class="preprocessor"></span>
+<a name="l00446"></a>00446 <span class="preprocessor">#if __TBB_USE_GENERIC_FETCH_ADD || __TBB_USE_GENERIC_DWORD_FETCH_ADD</span>
+<a name="l00447"></a>00447 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_machine_fetchadd8 tbb::internal::__TBB_FetchAndAddGeneric<8,uint64_t></span>
+<a name="l00448"></a>00448 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00449"></a>00449 <span class="preprocessor"></span>
+<a name="l00450"></a>00450 <span class="preprocessor">#if __TBB_USE_GENERIC_FETCH_STORE || __TBB_USE_GENERIC_PART_WORD_FETCH_STORE</span>
+<a name="l00451"></a>00451 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_machine_fetchstore1 tbb::internal::__TBB_FetchAndStoreGeneric<1,uint8_t></span>
+<a name="l00452"></a>00452 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_machine_fetchstore2 tbb::internal::__TBB_FetchAndStoreGeneric<2,uint16_t></span>
<a name="l00453"></a>00453 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
<a name="l00454"></a>00454 <span class="preprocessor"></span>
-<a name="l00455"></a>00455 <span class="preprocessor">#ifndef __TBB_FetchAndAdd1__TBB_full_fence</span>
-<a name="l00456"></a>00456 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd1__TBB_full_fence __TBB_FetchAndAdd1</span>
+<a name="l00455"></a>00455 <span class="preprocessor">#if __TBB_USE_GENERIC_FETCH_STORE </span>
+<a name="l00456"></a>00456 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_machine_fetchstore4 tbb::internal::__TBB_FetchAndStoreGeneric<4,uint32_t></span>
<a name="l00457"></a>00457 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00458"></a>00458 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndAdd1acquire</span>
-<a name="l00459"></a>00459 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd1acquire __TBB_FetchAndAdd1__TBB_full_fence</span>
-<a name="l00460"></a>00460 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00461"></a>00461 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndAdd1release</span>
-<a name="l00462"></a>00462 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd1release __TBB_FetchAndAdd1__TBB_full_fence</span>
-<a name="l00463"></a>00463 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00464"></a>00464 <span class="preprocessor"></span>
-<a name="l00465"></a>00465 <span class="preprocessor">#ifndef __TBB_FetchAndAdd2__TBB_full_fence</span>
-<a name="l00466"></a>00466 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd2__TBB_full_fence __TBB_FetchAndAdd2</span>
-<a name="l00467"></a>00467 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00468"></a>00468 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndAdd2acquire</span>
-<a name="l00469"></a>00469 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd2acquire __TBB_FetchAndAdd2__TBB_full_fence</span>
-<a name="l00470"></a>00470 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00471"></a>00471 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndAdd2release</span>
-<a name="l00472"></a>00472 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd2release __TBB_FetchAndAdd2__TBB_full_fence</span>
-<a name="l00473"></a>00473 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00474"></a>00474 <span class="preprocessor"></span>
-<a name="l00475"></a>00475 <span class="preprocessor">#ifndef __TBB_FetchAndAdd4__TBB_full_fence</span>
-<a name="l00476"></a>00476 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd4__TBB_full_fence __TBB_FetchAndAdd4</span>
-<a name="l00477"></a>00477 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00478"></a>00478 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndAdd4acquire</span>
-<a name="l00479"></a>00479 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd4acquire __TBB_FetchAndAdd4__TBB_full_fence</span>
-<a name="l00480"></a>00480 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00481"></a>00481 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndAdd4release</span>
-<a name="l00482"></a>00482 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd4release __TBB_FetchAndAdd4__TBB_full_fence</span>
-<a name="l00483"></a>00483 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00484"></a>00484 <span class="preprocessor"></span>
-<a name="l00485"></a>00485 <span class="preprocessor">#ifndef __TBB_FetchAndAdd8__TBB_full_fence</span>
-<a name="l00486"></a>00486 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd8__TBB_full_fence __TBB_FetchAndAdd8</span>
-<a name="l00487"></a>00487 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00488"></a>00488 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndAdd8acquire</span>
-<a name="l00489"></a>00489 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd8acquire __TBB_FetchAndAdd8__TBB_full_fence</span>
-<a name="l00490"></a>00490 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00491"></a>00491 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndAdd8release</span>
-<a name="l00492"></a>00492 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd8release __TBB_FetchAndAdd8__TBB_full_fence</span>
-<a name="l00493"></a>00493 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00458"></a>00458 <span class="preprocessor"></span>
+<a name="l00459"></a>00459 <span class="preprocessor">#if __TBB_USE_GENERIC_FETCH_STORE || __TBB_USE_GENERIC_DWORD_FETCH_STORE</span>
+<a name="l00460"></a>00460 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_machine_fetchstore8 tbb::internal::__TBB_FetchAndStoreGeneric<8,uint64_t></span>
+<a name="l00461"></a>00461 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00462"></a>00462 <span class="preprocessor"></span>
+<a name="l00463"></a>00463 <span class="preprocessor">#if __TBB_USE_FETCHSTORE_AS_FULL_FENCED_STORE</span>
+<a name="l00464"></a>00464 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_MACHINE_DEFINE_ATOMIC_SELECTOR_FETCH_STORE(S) \</span>
+<a name="l00465"></a>00465 <span class="preprocessor"> atomic_selector<S>::word atomic_selector<S>::fetch_store ( volatile void* location, word value ) { \</span>
+<a name="l00466"></a>00466 <span class="preprocessor"> return __TBB_machine_fetchstore##S( location, value ); \</span>
+<a name="l00467"></a>00467 <span class="preprocessor"> }</span>
+<a name="l00468"></a>00468 <span class="preprocessor"></span>
+<a name="l00469"></a>00469 __TBB_MACHINE_DEFINE_ATOMIC_SELECTOR_FETCH_STORE(1)
+<a name="l00470"></a>00470 __TBB_MACHINE_DEFINE_ATOMIC_SELECTOR_FETCH_STORE(2)
+<a name="l00471"></a>00471 __TBB_MACHINE_DEFINE_ATOMIC_SELECTOR_FETCH_STORE(4)
+<a name="l00472"></a>00472 __TBB_MACHINE_DEFINE_ATOMIC_SELECTOR_FETCH_STORE(8)
+<a name="l00473"></a>00473
+<a name="l00474"></a>00474 <span class="preprocessor">#undef __TBB_MACHINE_DEFINE_ATOMIC_SELECTOR_FETCH_STORE</span>
+<a name="l00475"></a>00475 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* __TBB_USE_FETCHSTORE_AS_FULL_FENCED_STORE */</span>
+<a name="l00476"></a>00476
+<a name="l00477"></a>00477 <span class="preprocessor">#if __TBB_USE_GENERIC_DWORD_LOAD_STORE</span>
+<a name="l00478"></a>00478 <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="l00479"></a>00479 <span class="keywordflow">for</span>(;;) {
+<a name="l00480"></a>00480 int64_t result = *(int64_t *)ptr;
+<a name="l00481"></a>00481 <span class="keywordflow">if</span>( __TBB_machine_cmpswp8(ptr,value,result)==result ) <span class="keywordflow">break</span>;
+<a name="l00482"></a>00482 }
+<a name="l00483"></a>00483 }
+<a name="l00484"></a>00484
+<a name="l00485"></a>00485 <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="l00486"></a>00486 <span class="comment">// Comparand and new value may be anything, they only must be equal, and</span>
+<a name="l00487"></a>00487 <span class="comment">// the value should have a low probability to be actually found in 'location'.</span>
+<a name="l00488"></a>00488 <span class="keyword">const</span> int64_t anyvalue = 2305843009213693951;
+<a name="l00489"></a>00489 <span class="keywordflow">return</span> __TBB_machine_cmpswp8(const_cast<volatile void *>(ptr),anyvalue,anyvalue);
+<a name="l00490"></a>00490 }
+<a name="l00491"></a>00491 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_USE_GENERIC_DWORD_LOAD_STORE */</span>
+<a name="l00492"></a>00492
+<a name="l00493"></a>00493 <span class="preprocessor">#if __TBB_USE_GENERIC_HALF_FENCED_LOAD_STORE</span>
<a name="l00494"></a>00494 <span class="preprocessor"></span>
-<a name="l00495"></a>00495 <span class="preprocessor">#ifndef __TBB_FetchAndStore1__TBB_full_fence</span>
-<a name="l00496"></a>00496 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore1__TBB_full_fence __TBB_FetchAndStore1</span>
-<a name="l00497"></a>00497 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00498"></a>00498 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndStore1acquire</span>
-<a name="l00499"></a>00499 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore1acquire __TBB_FetchAndStore1__TBB_full_fence</span>
-<a name="l00500"></a>00500 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00501"></a>00501 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndStore1release</span>
-<a name="l00502"></a>00502 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore1release __TBB_FetchAndStore1__TBB_full_fence</span>
-<a name="l00503"></a>00503 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00504"></a>00504 <span class="preprocessor"></span>
-<a name="l00505"></a>00505 <span class="preprocessor">#ifndef __TBB_FetchAndStore2__TBB_full_fence</span>
-<a name="l00506"></a>00506 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore2__TBB_full_fence __TBB_FetchAndStore2</span>
-<a name="l00507"></a>00507 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00508"></a>00508 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndStore2acquire</span>
-<a name="l00509"></a>00509 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore2acquire __TBB_FetchAndStore2__TBB_full_fence</span>
-<a name="l00510"></a>00510 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00511"></a>00511 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndStore2release</span>
-<a name="l00512"></a>00512 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore2release __TBB_FetchAndStore2__TBB_full_fence</span>
-<a name="l00513"></a>00513 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00514"></a>00514 <span class="preprocessor"></span>
-<a name="l00515"></a>00515 <span class="preprocessor">#ifndef __TBB_FetchAndStore4__TBB_full_fence</span>
-<a name="l00516"></a>00516 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore4__TBB_full_fence __TBB_FetchAndStore4</span>
-<a name="l00517"></a>00517 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00518"></a>00518 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndStore4acquire</span>
-<a name="l00519"></a>00519 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore4acquire __TBB_FetchAndStore4__TBB_full_fence</span>
-<a name="l00520"></a>00520 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00521"></a>00521 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndStore4release</span>
-<a name="l00522"></a>00522 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore4release __TBB_FetchAndStore4__TBB_full_fence</span>
-<a name="l00523"></a>00523 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00524"></a>00524 <span class="preprocessor"></span>
-<a name="l00525"></a>00525 <span class="preprocessor">#ifndef __TBB_FetchAndStore8__TBB_full_fence</span>
-<a name="l00526"></a>00526 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore8__TBB_full_fence __TBB_FetchAndStore8</span>
-<a name="l00527"></a>00527 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00528"></a>00528 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndStore8acquire</span>
-<a name="l00529"></a>00529 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore8acquire __TBB_FetchAndStore8__TBB_full_fence</span>
-<a name="l00530"></a>00530 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00531"></a>00531 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndStore8release</span>
-<a name="l00532"></a>00532 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore8release __TBB_FetchAndStore8__TBB_full_fence</span>
-<a name="l00533"></a>00533 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00534"></a>00534 <span class="preprocessor"></span>
-<a name="l00535"></a>00535 <span class="preprocessor">#endif // __TBB_DECL_FENCED_ATOMICS</span>
-<a name="l00536"></a>00536 <span class="preprocessor"></span>
-<a name="l00537"></a>00537 <span class="comment">// Special atomic functions</span>
-<a name="l00538"></a>00538 <span class="preprocessor">#ifndef __TBB_FetchAndAddWrelease</span>
-<a name="l00539"></a>00539 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAddWrelease __TBB_FetchAndAddW</span>
-<a name="l00540"></a>00540 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00541"></a>00541 <span class="preprocessor"></span>
-<a name="l00542"></a>00542 <span class="preprocessor">#ifndef __TBB_FetchAndIncrementWacquire</span>
-<a name="l00543"></a>00543 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndIncrementWacquire(P) __TBB_FetchAndAddW(P,1)</span>
-<a name="l00544"></a>00544 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00500"></a>00500 <span class="keyword">template</span> <<span class="keyword">typename</span> T, size_t S>
+<a name="l00501"></a>00501 <span class="keyword">struct </span>machine_load_store {
+<a name="l00502"></a>00502 <span class="keyword">static</span> T load_with_acquire ( <span class="keyword">const</span> <span class="keyword">volatile</span> T& location ) {
+<a name="l00503"></a>00503 T to_return = location;
+<a name="l00504"></a>00504 __TBB_acquire_consistency_helper();
+<a name="l00505"></a>00505 <span class="keywordflow">return</span> to_return;
+<a name="l00506"></a>00506 }
+<a name="l00507"></a>00507 <span class="keyword">static</span> <span class="keywordtype">void</span> store_with_release ( <span class="keyword">volatile</span> T &location, T value ) {
+<a name="l00508"></a>00508 __TBB_release_consistency_helper();
+<a name="l00509"></a>00509 location = value;
+<a name="l00510"></a>00510 }
+<a name="l00511"></a>00511 };
+<a name="l00512"></a>00512
+<a name="l00513"></a>00513 <span class="preprocessor">#if __TBB_WORDSIZE==4 && __TBB_64BIT_ATOMICS</span>
+<a name="l00514"></a>00514 <span class="preprocessor"></span><span class="keyword">template</span> <<span class="keyword">typename</span> T>
+<a name="l00515"></a>00515 <span class="keyword">struct </span>machine_load_store<T,8> {
+<a name="l00516"></a>00516 <span class="keyword">static</span> T load_with_acquire ( <span class="keyword">const</span> <span class="keyword">volatile</span> T& location ) {
+<a name="l00517"></a>00517 <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="l00518"></a>00518 }
+<a name="l00519"></a>00519 <span class="keyword">static</span> <span class="keywordtype">void</span> store_with_release ( <span class="keyword">volatile</span> T& location, T value ) {
+<a name="l00520"></a>00520 __TBB_machine_store8( (<span class="keyword">volatile</span> <span class="keywordtype">void</span>*)&location, (int64_t)value );
+<a name="l00521"></a>00521 }
+<a name="l00522"></a>00522 };
+<a name="l00523"></a>00523 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_WORDSIZE==4 && __TBB_64BIT_ATOMICS */</span>
+<a name="l00524"></a>00524 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_USE_GENERIC_HALF_FENCED_LOAD_STORE */</span>
+<a name="l00525"></a>00525
+<a name="l00526"></a>00526 <span class="keyword">template</span> <<span class="keyword">typename</span> T, size_t S>
+<a name="l00527"></a>00527 <span class="keyword">struct </span>machine_load_store_seq_cst {
+<a name="l00528"></a>00528 <span class="keyword">static</span> T load ( <span class="keyword">const</span> <span class="keyword">volatile</span> T& location ) {
+<a name="l00529"></a>00529 __TBB_full_memory_fence();
+<a name="l00530"></a>00530 <span class="keywordflow">return</span> machine_load_store<T,S>::load_with_acquire( location );
+<a name="l00531"></a>00531 }
+<a name="l00532"></a>00532 <span class="preprocessor">#if __TBB_USE_FETCHSTORE_AS_FULL_FENCED_STORE</span>
+<a name="l00533"></a>00533 <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="l00534"></a>00534 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="l00535"></a>00535 }
+<a name="l00536"></a>00536 <span class="preprocessor">#else </span><span class="comment">/* !__TBB_USE_FETCHSTORE_AS_FULL_FENCED_STORE */</span>
+<a name="l00537"></a>00537 <span class="keyword">static</span> <span class="keywordtype">void</span> store ( <span class="keyword">volatile</span> T &location, T value ) {
+<a name="l00538"></a>00538 machine_load_store<T,S>::store_with_release( location, value );
+<a name="l00539"></a>00539 __TBB_full_memory_fence();
+<a name="l00540"></a>00540 }
+<a name="l00541"></a>00541 <span class="preprocessor">#endif </span><span class="comment">/* !__TBB_USE_FETCHSTORE_AS_FULL_FENCED_STORE */</span>
+<a name="l00542"></a>00542 };
+<a name="l00543"></a>00543
+<a name="l00544"></a>00544 <span class="preprocessor">#if __TBB_WORDSIZE==4 && __TBB_64BIT_ATOMICS</span>
<a name="l00545"></a>00545 <span class="preprocessor"></span>
-<a name="l00546"></a>00546 <span class="preprocessor">#ifndef __TBB_FetchAndDecrementWrelease</span>
-<a name="l00547"></a>00547 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndDecrementWrelease(P) __TBB_FetchAndAddW(P,(-1))</span>
-<a name="l00548"></a>00548 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00549"></a>00549 <span class="preprocessor"></span>
-<a name="l00550"></a>00550 <span class="keyword">template</span> <<span class="keyword">typename</span> T, size_t S>
-<a name="l00551"></a>00551 <span class="keyword">struct </span>__TBB_machine_load_store {
-<a name="l00552"></a>00552 <span class="keyword">static</span> <span class="keyword">inline</span> T load_with_acquire(<span class="keyword">const</span> <span class="keyword">volatile</span> T& location) {
-<a name="l00553"></a>00553 T to_return = location;
-<a name="l00554"></a>00554 __TBB_release_consistency_helper();
-<a name="l00555"></a>00555 <span class="keywordflow">return</span> to_return;
-<a name="l00556"></a>00556 }
-<a name="l00557"></a>00557
-<a name="l00558"></a>00558 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> store_with_release(<span class="keyword">volatile</span> T &location, T value) {
-<a name="l00559"></a>00559 __TBB_release_consistency_helper();
-<a name="l00560"></a>00560 location = value;
-<a name="l00561"></a>00561 }
-<a name="l00562"></a>00562 };
-<a name="l00563"></a>00563
-<a name="l00564"></a>00564 <span class="preprocessor">#if __TBB_WORDSIZE==4 && __TBB_64BIT_ATOMICS</span>
-<a name="l00565"></a>00565 <span class="preprocessor"></span><span class="preprocessor">#if _MSC_VER</span>
-<a name="l00566"></a>00566 <span class="preprocessor"></span><span class="keyword">using</span> tbb::internal::int64_t;
-<a name="l00567"></a>00567 <span class="preprocessor">#endif</span>
-<a name="l00568"></a>00568 <span class="preprocessor"></span><span class="comment">// On 32-bit platforms, there should be definition of __TBB_Store8 and __TBB_Load8</span>
-<a name="l00569"></a>00569 <span class="preprocessor">#ifndef __TBB_Store8</span>
-<a name="l00570"></a>00570 <span class="preprocessor"></span><span class="keyword">inline</span> <span class="keywordtype">void</span> __TBB_Store8 (<span class="keyword">volatile</span> <span class="keywordtype">void</span> *ptr, int64_t value) {
-<a name="l00571"></a>00571 <span class="keywordflow">for</span>(;;) {
-<a name="l00572"></a>00572 int64_t result = *(int64_t *)ptr;
-<a name="l00573"></a>00573 <span class="keywordflow">if</span>( __TBB_CompareAndSwap8(ptr,value,result)==result ) <span class="keywordflow">break</span>;
-<a name="l00574"></a>00574 }
-<a name="l00575"></a>00575 }
-<a name="l00576"></a>00576 <span class="preprocessor">#endif</span>
-<a name="l00577"></a>00577 <span class="preprocessor"></span>
-<a name="l00578"></a>00578 <span class="preprocessor">#ifndef __TBB_Load8</span>
-<a name="l00579"></a>00579 <span class="preprocessor"></span><span class="keyword">inline</span> int64_t __TBB_Load8 (<span class="keyword">const</span> <span class="keyword">volatile</span> <span class="keywordtype">void</span> *ptr) {
-<a name="l00580"></a>00580 <span class="keyword">const</span> int64_t anyvalue = 3264; <span class="comment">// Could be anything, just the same for comparand and new value</span>
-<a name="l00581"></a>00581 <span class="keywordflow">return</span> __TBB_CompareAndSwap8(const_cast<volatile void *>(ptr),anyvalue,anyvalue);
-<a name="l00582"></a>00582 }
-<a name="l00583"></a>00583 <span class="preprocessor">#endif</span>
-<a name="l00584"></a>00584 <span class="preprocessor"></span>
-<a name="l00585"></a>00585 <span class="keyword">template</span> <<span class="keyword">typename</span> T>
-<a name="l00586"></a>00586 <span class="keyword">struct </span>__TBB_machine_load_store<T,8> {
-<a name="l00587"></a>00587 <span class="keyword">static</span> <span class="keyword">inline</span> T load_with_acquire(<span class="keyword">const</span> <span class="keyword">volatile</span> T& location) {
-<a name="l00588"></a>00588 T to_return = (T)__TBB_Load8((<span class="keyword">const</span> <span class="keyword">volatile</span> <span class="keywordtype">void</span>*)&location);
-<a name="l00589"></a>00589 __TBB_release_consistency_helper();
-<a name="l00590"></a>00590 <span class="keywordflow">return</span> to_return;
-<a name="l00591"></a>00591 }
-<a name="l00592"></a>00592
-<a name="l00593"></a>00593 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> store_with_release(<span class="keyword">volatile</span> T& location, T value) {
-<a name="l00594"></a>00594 __TBB_release_consistency_helper();
-<a name="l00595"></a>00595 __TBB_Store8((<span class="keyword">volatile</span> <span class="keywordtype">void</span> *)&location,(int64_t)value);
-<a name="l00596"></a>00596 }
-<a name="l00597"></a>00597 };
-<a name="l00598"></a>00598 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_WORDSIZE==4 */</span>
-<a name="l00599"></a>00599
-<a name="l00600"></a>00600 <span class="preprocessor">#ifndef __TBB_load_with_acquire</span>
-<a name="l00601"></a>00601 <span class="preprocessor"></span><span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00602"></a>00602 <span class="keyword">inline</span> T __TBB_load_with_acquire(<span class="keyword">const</span> <span class="keyword">volatile</span> T &location) {
-<a name="l00603"></a>00603 <span class="keywordflow">return</span> __TBB_machine_load_store<T,sizeof(T)>::load_with_acquire(location);
-<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="l00607"></a>00607 <span class="preprocessor">#ifndef __TBB_store_with_release</span>
-<a name="l00608"></a>00608 <span class="preprocessor"></span><span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> V>
-<a name="l00609"></a>00609 <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="l00610"></a>00610 __TBB_machine_load_store<T,sizeof(T)>::store_with_release(location,T(value));
+<a name="l00547"></a>00547 <span class="keyword">template</span> <<span class="keyword">typename</span> T>
+<a name="l00548"></a><a class="code" href="a00268.html">00548</a> <span class="keyword">struct </span>machine_load_store_seq_cst<T,8> {
+<a name="l00549"></a>00549 <span class="keyword">static</span> T load ( <span class="keyword">const</span> <span class="keyword">volatile</span> T& location ) {
+<a name="l00550"></a>00550 <span class="comment">// Comparand and new value may be anything, they only must be equal, and</span>
+<a name="l00551"></a>00551 <span class="comment">// the value should have a low probability to be actually found in 'location'.</span>
+<a name="l00552"></a>00552 <span class="keyword">const</span> int64_t anyvalue = 2305843009213693951ll;
+<a name="l00553"></a>00553 <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="l00554"></a>00554 }
+<a name="l00555"></a>00555 <span class="keyword">static</span> <span class="keywordtype">void</span> store ( <span class="keyword">volatile</span> T &location, T value ) {
+<a name="l00556"></a>00556 int64_t result = (<span class="keyword">volatile</span> int64_t&)location;
+<a name="l00557"></a>00557 <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="l00558"></a>00558 result = (<span class="keyword">volatile</span> int64_t&)location;
+<a name="l00559"></a>00559 }
+<a name="l00560"></a>00560 };
+<a name="l00561"></a>00561 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_WORDSIZE==4 && __TBB_64BIT_ATOMICS */</span>
+<a name="l00562"></a>00562
+<a name="l00563"></a>00563 <span class="preprocessor">#if __TBB_USE_GENERIC_RELAXED_LOAD_STORE</span>
+<a name="l00564"></a>00564 <span class="preprocessor"></span><span class="comment">// Relaxed operations add volatile qualifier to prevent compiler from optimizing them out.</span>
+<a name="l00568"></a>00568 <span class="comment"></span><span class="keyword">template</span> <<span class="keyword">typename</span> T, size_t S>
+<a name="l00569"></a><a class="code" href="a00267.html">00569</a> <span class="keyword">struct </span><a class="code" href="a00267.html">machine_load_store_relaxed</a> {
+<a name="l00570"></a>00570 <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="l00571"></a>00571 <span class="keywordflow">return</span> location;
+<a name="l00572"></a>00572 }
+<a name="l00573"></a>00573 <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="l00574"></a>00574 location = value;
+<a name="l00575"></a>00575 }
+<a name="l00576"></a>00576 };
+<a name="l00577"></a>00577
+<a name="l00578"></a>00578 <span class="preprocessor">#if __TBB_WORDSIZE==4 && __TBB_64BIT_ATOMICS</span>
+<a name="l00579"></a>00579 <span class="preprocessor"></span><span class="keyword">template</span> <<span class="keyword">typename</span> T>
+<a name="l00580"></a>00580 <span class="keyword">struct </span><a class="code" href="a00267.html">machine_load_store_relaxed</a><T,8> {
+<a name="l00581"></a>00581 <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="l00582"></a>00582 <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="l00583"></a>00583 }
+<a name="l00584"></a>00584 <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="l00585"></a>00585 __TBB_machine_store8( (<span class="keyword">volatile</span> <span class="keywordtype">void</span>*)&location, (int64_t)value );
+<a name="l00586"></a>00586 }
+<a name="l00587"></a>00587 };
+<a name="l00588"></a>00588 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_WORDSIZE==4 && __TBB_64BIT_ATOMICS */</span>
+<a name="l00589"></a>00589 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_USE_GENERIC_RELAXED_LOAD_STORE */</span>
+<a name="l00590"></a>00590
+<a name="l00591"></a>00591 <span class="keyword">template</span><<span class="keyword">typename</span> T>
+<a name="l00592"></a>00592 <span class="keyword">inline</span> T __TBB_load_with_acquire(<span class="keyword">const</span> <span class="keyword">volatile</span> T &location) {
+<a name="l00593"></a>00593 <span class="keywordflow">return</span> machine_load_store<T,sizeof(T)>::load_with_acquire( location );
+<a name="l00594"></a>00594 }
+<a name="l00595"></a>00595 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> V>
+<a name="l00596"></a>00596 <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="l00597"></a>00597 machine_load_store<T,sizeof(T)>::store_with_release( location, T(value) );
+<a name="l00598"></a>00598 }
+<a name="l00600"></a>00600 <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="l00601"></a>00601 machine_load_store<size_t,sizeof(size_t)>::store_with_release( location, value );
+<a name="l00602"></a>00602 }
+<a name="l00603"></a>00603
+<a name="l00604"></a>00604 <span class="keyword">template</span><<span class="keyword">typename</span> T>
+<a name="l00605"></a>00605 <span class="keyword">inline</span> T __TBB_load_full_fence(<span class="keyword">const</span> <span class="keyword">volatile</span> T &location) {
+<a name="l00606"></a>00606 <span class="keywordflow">return</span> machine_load_store_seq_cst<T,sizeof(T)>::load( location );
+<a name="l00607"></a>00607 }
+<a name="l00608"></a>00608 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> V>
+<a name="l00609"></a>00609 <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="l00610"></a>00610 machine_load_store_seq_cst<T,sizeof(T)>::store( location, T(value) );
<a name="l00611"></a>00611 }
-<a name="l00613"></a>00613 <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="l00614"></a>00614 __TBB_machine_load_store<size_t,sizeof(size_t)>::store_with_release(location,value);
+<a name="l00613"></a>00613 <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="l00614"></a>00614 machine_load_store_seq_cst<size_t,sizeof(size_t)>::store( location, value );
<a name="l00615"></a>00615 }
-<a name="l00616"></a>00616 <span class="preprocessor">#endif</span>
-<a name="l00617"></a>00617 <span class="preprocessor"></span>
-<a name="l00618"></a>00618 <span class="preprocessor">#ifndef __TBB_Log2</span>
-<a name="l00619"></a>00619 <span class="preprocessor"></span><span class="keyword">inline</span> intptr_t __TBB_Log2( uintptr_t x ) {
-<a name="l00620"></a>00620 <span class="keywordflow">if</span>( x==0 ) <span class="keywordflow">return</span> -1;
-<a name="l00621"></a>00621 intptr_t result = 0;
-<a name="l00622"></a>00622 uintptr_t tmp;
-<a name="l00623"></a>00623 <span class="preprocessor">#if __TBB_WORDSIZE>=8</span>
-<a name="l00624"></a>00624 <span class="preprocessor"></span> <span class="keywordflow">if</span>( (tmp = x>>32) ) { x=tmp; result += 32; }
-<a name="l00625"></a>00625 <span class="preprocessor">#endif</span>
-<a name="l00626"></a>00626 <span class="preprocessor"></span> <span class="keywordflow">if</span>( (tmp = x>>16) ) { x=tmp; result += 16; }
-<a name="l00627"></a>00627 <span class="keywordflow">if</span>( (tmp = x>>8) ) { x=tmp; result += 8; }
-<a name="l00628"></a>00628 <span class="keywordflow">if</span>( (tmp = x>>4) ) { x=tmp; result += 4; }
-<a name="l00629"></a>00629 <span class="keywordflow">if</span>( (tmp = x>>2) ) { x=tmp; result += 2; }
-<a name="l00630"></a>00630 <span class="keywordflow">return</span> (x&2)? result+1: result;
-<a name="l00631"></a>00631 }
-<a name="l00632"></a>00632 <span class="preprocessor">#endif</span>
-<a name="l00633"></a>00633 <span class="preprocessor"></span>
-<a name="l00634"></a>00634 <span class="preprocessor">#ifndef __TBB_AtomicOR</span>
-<a name="l00635"></a>00635 <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="l00636"></a>00636 <a class="code" href="a00218.html">tbb::internal::atomic_backoff</a> b;
-<a name="l00637"></a>00637 <span class="keywordflow">for</span>(;;) {
-<a name="l00638"></a>00638 uintptr_t tmp = *(<span class="keyword">volatile</span> uintptr_t *)operand;
-<a name="l00639"></a>00639 uintptr_t result = __TBB_CompareAndSwapW(operand, tmp|addend, tmp);
-<a name="l00640"></a>00640 <span class="keywordflow">if</span>( result==tmp ) <span class="keywordflow">break</span>;
-<a name="l00641"></a>00641 b.<a class="code" href="a00218.html#a174ea93e3bd3d5cce82389c2f28d037">pause</a>();
-<a name="l00642"></a>00642 }
-<a name="l00643"></a>00643 }
-<a name="l00644"></a>00644 <span class="preprocessor">#endif</span>
-<a name="l00645"></a>00645 <span class="preprocessor"></span>
-<a name="l00646"></a>00646 <span class="preprocessor">#ifndef __TBB_AtomicAND</span>
-<a name="l00647"></a>00647 <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="l00648"></a>00648 <a class="code" href="a00218.html">tbb::internal::atomic_backoff</a> b;
-<a name="l00649"></a>00649 <span class="keywordflow">for</span>(;;) {
-<a name="l00650"></a>00650 uintptr_t tmp = *(<span class="keyword">volatile</span> uintptr_t *)operand;
-<a name="l00651"></a>00651 uintptr_t result = __TBB_CompareAndSwapW(operand, tmp&addend, tmp);
-<a name="l00652"></a>00652 <span class="keywordflow">if</span>( result==tmp ) <span class="keywordflow">break</span>;
-<a name="l00653"></a>00653 b.<a class="code" href="a00218.html#a174ea93e3bd3d5cce82389c2f28d037">pause</a>();
-<a name="l00654"></a>00654 }
-<a name="l00655"></a>00655 }
-<a name="l00656"></a>00656 <span class="preprocessor">#endif</span>
-<a name="l00657"></a>00657 <span class="preprocessor"></span>
-<a name="l00658"></a>00658 <span class="preprocessor">#ifndef __TBB_Byte</span>
-<a name="l00659"></a>00659 <span class="preprocessor"></span><span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> __TBB_Byte;
-<a name="l00660"></a>00660 <span class="preprocessor">#endif</span>
-<a name="l00661"></a>00661 <span class="preprocessor"></span>
-<a name="l00662"></a>00662 <span class="preprocessor">#ifndef __TBB_TryLockByte</span>
-<a name="l00663"></a>00663 <span class="preprocessor"></span><span class="keyword">inline</span> <span class="keywordtype">bool</span> __TBB_TryLockByte( __TBB_Byte &flag ) {
-<a name="l00664"></a>00664 <span class="keywordflow">return</span> __TBB_CompareAndSwap1(&flag,1,0)==0;
-<a name="l00665"></a>00665 }
-<a name="l00666"></a>00666 <span class="preprocessor">#endif</span>
-<a name="l00667"></a>00667 <span class="preprocessor"></span>
-<a name="l00668"></a>00668 <span class="preprocessor">#ifndef __TBB_LockByte</span>
-<a name="l00669"></a>00669 <span class="preprocessor"></span><span class="keyword">inline</span> uintptr_t __TBB_LockByte( __TBB_Byte& flag ) {
-<a name="l00670"></a>00670 <span class="keywordflow">if</span> ( !__TBB_TryLockByte(flag) ) {
-<a name="l00671"></a>00671 <a class="code" href="a00218.html">tbb::internal::atomic_backoff</a> b;
-<a name="l00672"></a>00672 <span class="keywordflow">do</span> {
-<a name="l00673"></a>00673 b.<a class="code" href="a00218.html#a174ea93e3bd3d5cce82389c2f28d037">pause</a>();
-<a name="l00674"></a>00674 } <span class="keywordflow">while</span> ( !__TBB_TryLockByte(flag) );
-<a name="l00675"></a>00675 }
-<a name="l00676"></a>00676 <span class="keywordflow">return</span> 0;
-<a name="l00677"></a>00677 }
-<a name="l00678"></a>00678 <span class="preprocessor">#endif</span>
-<a name="l00679"></a>00679 <span class="preprocessor"></span>
-<a name="l00680"></a>00680 <span class="preprocessor">#define __TBB_UnlockByte __TBB_store_with_release</span>
-<a name="l00681"></a>00681 <span class="preprocessor"></span>
-<a name="l00682"></a>00682 <span class="preprocessor">#ifndef __TBB_ReverseByte</span>
-<a name="l00683"></a>00683 <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="l00684"></a>00684 <span class="keywordflow">return</span> tbb::internal::reverse<unsigned char>::byte_table[src];
-<a name="l00685"></a>00685 }
-<a name="l00686"></a>00686 <span class="preprocessor">#endif</span>
-<a name="l00687"></a>00687 <span class="preprocessor"></span>
-<a name="l00688"></a>00688 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00689"></a>00689 T __TBB_ReverseBits(T src)
-<a name="l00690"></a>00690 {
-<a name="l00691"></a>00691 T dst;
-<a name="l00692"></a>00692 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *original = (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *) &src;
-<a name="l00693"></a>00693 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *reversed = (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *) &dst;
+<a name="l00616"></a>00616
+<a name="l00617"></a>00617 <span class="keyword">template</span><<span class="keyword">typename</span> T>
+<a name="l00618"></a>00618 <span class="keyword">inline</span> T __TBB_load_relaxed (<span class="keyword">const</span> <span class="keyword">volatile</span> T& location) {
+<a name="l00619"></a>00619 <span class="keywordflow">return</span> machine_load_store_relaxed<T,sizeof(T)>::load( const_cast<T&>(location) );
+<a name="l00620"></a>00620 }
+<a name="l00621"></a>00621 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> V>
+<a name="l00622"></a>00622 <span class="keyword">inline</span> <span class="keywordtype">void</span> __TBB_store_relaxed ( <span class="keyword">volatile</span> T& location, V value ) {
+<a name="l00623"></a>00623 machine_load_store_relaxed<T,sizeof(T)>::store( const_cast<T&>(location), T(value) );
+<a name="l00624"></a>00624 }
+<a name="l00626"></a>00626 <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="l00627"></a>00627 machine_load_store_relaxed<size_t,sizeof(size_t)>::store( const_cast<size_t&>(location), value );
+<a name="l00628"></a>00628 }
+<a name="l00629"></a>00629
+<a name="l00630"></a>00630 <span class="comment">// Macro __TBB_TypeWithAlignmentAtLeastAsStrict(T) should be a type with alignment at least as </span>
+<a name="l00631"></a>00631 <span class="comment">// strict as type T. The type should have a trivial default constructor and destructor, so that</span>
+<a name="l00632"></a>00632 <span class="comment">// arrays of that type can be declared without initializers.</span>
+<a name="l00633"></a>00633 <span class="comment">// It is correct (but perhaps a waste of space) if __TBB_TypeWithAlignmentAtLeastAsStrict(T) expands</span>
+<a name="l00634"></a>00634 <span class="comment">// to a type bigger than T.</span>
+<a name="l00635"></a>00635 <span class="comment">// The default definition here works on machines where integers are naturally aligned and the</span>
+<a name="l00636"></a>00636 <span class="comment">// strictest alignment is 64.</span>
+<a name="l00637"></a>00637 <span class="preprocessor">#ifndef __TBB_TypeWithAlignmentAtLeastAsStrict</span>
+<a name="l00638"></a>00638 <span class="preprocessor"></span>
+<a name="l00639"></a>00639 <span class="preprocessor">#if __TBB_ATTRIBUTE_ALIGNED_PRESENT</span>
+<a name="l00640"></a>00640 <span class="preprocessor"></span>
+<a name="l00641"></a>00641 <span class="preprocessor">#define __TBB_DefineTypeWithAlignment(PowerOf2) \</span>
+<a name="l00642"></a>00642 <span class="preprocessor">struct __TBB_machine_type_with_alignment_##PowerOf2 { \</span>
+<a name="l00643"></a>00643 <span class="preprocessor"> uint32_t member[PowerOf2/sizeof(uint32_t)]; \</span>
+<a name="l00644"></a>00644 <span class="preprocessor">} __attribute__((aligned(PowerOf2)));</span>
+<a name="l00645"></a>00645 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_alignof(T) __alignof__(T)</span>
+<a name="l00646"></a>00646 <span class="preprocessor"></span>
+<a name="l00647"></a>00647 <span class="preprocessor">#elif __TBB_DECLSPEC_ALIGN_PRESENT</span>
+<a name="l00648"></a>00648 <span class="preprocessor"></span>
+<a name="l00649"></a>00649 <span class="preprocessor">#define __TBB_DefineTypeWithAlignment(PowerOf2) \</span>
+<a name="l00650"></a>00650 <span class="preprocessor">__declspec(align(PowerOf2)) \</span>
+<a name="l00651"></a>00651 <span class="preprocessor">struct __TBB_machine_type_with_alignment_##PowerOf2 { \</span>
+<a name="l00652"></a>00652 <span class="preprocessor"> uint32_t member[PowerOf2/sizeof(uint32_t)]; \</span>
+<a name="l00653"></a>00653 <span class="preprocessor">};</span>
+<a name="l00654"></a>00654 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_alignof(T) __alignof(T)</span>
+<a name="l00655"></a>00655 <span class="preprocessor"></span>
+<a name="l00656"></a>00656 <span class="preprocessor">#else </span><span class="comment">/* A compiler with unknown syntax for data alignment */</span>
+<a name="l00657"></a>00657 <span class="preprocessor">#error Must define __TBB_TypeWithAlignmentAtLeastAsStrict(T)</span>
+<a name="l00658"></a>00658 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00659"></a>00659 <span class="preprocessor"></span>
+<a name="l00660"></a>00660 <span class="comment">/* Now declare types aligned to useful powers of two */</span>
+<a name="l00661"></a>00661 <span class="comment">// TODO: Is __TBB_DefineTypeWithAlignment(8) needed on 32 bit platforms?</span>
+<a name="l00662"></a>00662 __TBB_DefineTypeWithAlignment(16)
+<a name="l00663"></a>00663 __TBB_DefineTypeWithAlignment(32)
+<a name="l00664"></a>00664 __TBB_DefineTypeWithAlignment(64)
+<a name="l00665"></a>00665
+<a name="l00666"></a>00666 typedef __TBB_machine_type_with_alignment_64 __TBB_machine_type_with_strictest_alignment;
+<a name="l00667"></a>00667
+<a name="l00668"></a>00668 <span class="comment">// Primary template is a declaration of incomplete type so that it fails with unknown alignments</span>
+<a name="l00669"></a>00669 template<size_t N> struct type_with_alignment;
+<a name="l00670"></a>00670
+<a name="l00671"></a>00671 <span class="comment">// Specializations for allowed alignments</span>
+<a name="l00672"></a>00672 template<> struct type_with_alignment<1> { <span class="keywordtype">char</span> member; };
+<a name="l00673"></a>00673 <span class="keyword">template</span><> <span class="keyword">struct </span>type_with_alignment<2> { uint16_t member; };
+<a name="l00674"></a>00674 <span class="keyword">template</span><> <span class="keyword">struct </span>type_with_alignment<4> { uint32_t member; };
+<a name="l00675"></a>00675 <span class="keyword">template</span><> <span class="keyword">struct </span>type_with_alignment<8> { uint64_t member; };
+<a name="l00676"></a>00676 <span class="keyword">template</span><> <span class="keyword">struct </span>type_with_alignment<16> {__TBB_machine_type_with_alignment_16 member; };
+<a name="l00677"></a>00677 <span class="keyword">template</span><> <span class="keyword">struct </span>type_with_alignment<32> {__TBB_machine_type_with_alignment_32 member; };
+<a name="l00678"></a>00678 <span class="keyword">template</span><> <span class="keyword">struct </span>type_with_alignment<64> {__TBB_machine_type_with_alignment_64 member; };
+<a name="l00679"></a>00679
+<a name="l00680"></a>00680 <span class="preprocessor">#if __TBB_ALIGNOF_NOT_INSTANTIATED_TYPES_BROKEN </span>
+<a name="l00682"></a>00682 <span class="preprocessor"></span>
+<a name="l00684"></a>00684 <span class="preprocessor">template<size_t Size, typename T></span>
+<a name="l00685"></a><a class="code" href="a00325.html">00685</a> <span class="preprocessor"></span><span class="keyword">struct </span><a class="code" href="a00325.html">work_around_alignment_bug</a> {
+<a name="l00686"></a>00686 <span class="keyword">static</span> <span class="keyword">const</span> size_t alignment = __TBB_alignof(T);
+<a name="l00687"></a>00687 };
+<a name="l00688"></a>00688 <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="l00689"></a>00689 <span class="preprocessor"></span><span class="preprocessor">#else</span>
+<a name="l00690"></a>00690 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_TypeWithAlignmentAtLeastAsStrict(T) tbb::internal::type_with_alignment<__TBB_alignof(T)></span>
+<a name="l00691"></a>00691 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* __TBB_ALIGNOF_NOT_INSTANTIATED_TYPES_BROKEN */</span>
+<a name="l00692"></a>00692
+<a name="l00693"></a>00693 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TypeWithAlignmentAtLeastAsStrict */</span>
<a name="l00694"></a>00694
-<a name="l00695"></a>00695 <span class="keywordflow">for</span>( <span class="keywordtype">int</span> i = <span class="keyword">sizeof</span>(T)-1; i >= 0; i-- )
-<a name="l00696"></a>00696 reversed[i] = __TBB_ReverseByte( original[<span class="keyword">sizeof</span>(T)-i-1] );
-<a name="l00697"></a>00697
-<a name="l00698"></a>00698 <span class="keywordflow">return</span> dst;
-<a name="l00699"></a>00699 }
-<a name="l00700"></a>00700
-<a name="l00701"></a>00701 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_machine_H */</span>
+<a name="l00695"></a>00695 <span class="comment">// Template class here is to avoid instantiation of the static data for modules that don't use it</span>
+<a name="l00696"></a>00696 <span class="keyword">template</span><<span class="keyword">typename</span> T>
+<a name="l00697"></a>00697 <span class="keyword">struct </span>reverse {
+<a name="l00698"></a>00698 <span class="keyword">static</span> <span class="keyword">const</span> T byte_table[256];
+<a name="l00699"></a>00699 };
+<a name="l00700"></a>00700 <span class="comment">// An efficient implementation of the reverse function utilizes a 2^8 lookup table holding the bit-reversed</span>
+<a name="l00701"></a>00701 <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="l00702"></a>00702 <span class="keyword">template</span><<span class="keyword">typename</span> T>
+<a name="l00703"></a>00703 <span class="keyword">const</span> T reverse<T>::byte_table[256] = {
+<a name="l00704"></a>00704 0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0, 0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0,
+<a name="l00705"></a>00705 0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8, 0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8,
+<a name="l00706"></a>00706 0x04, 0x84, 0x44, 0xC4, 0x24, 0xA4, 0x64, 0xE4, 0x14, 0x94, 0x54, 0xD4, 0x34, 0xB4, 0x74, 0xF4,
+<a name="l00707"></a>00707 0x0C, 0x8C, 0x4C, 0xCC, 0x2C, 0xAC, 0x6C, 0xEC, 0x1C, 0x9C, 0x5C, 0xDC, 0x3C, 0xBC, 0x7C, 0xFC,
+<a name="l00708"></a>00708 0x02, 0x82, 0x42, 0xC2, 0x22, 0xA2, 0x62, 0xE2, 0x12, 0x92, 0x52, 0xD2, 0x32, 0xB2, 0x72, 0xF2,
+<a name="l00709"></a>00709 0x0A, 0x8A, 0x4A, 0xCA, 0x2A, 0xAA, 0x6A, 0xEA, 0x1A, 0x9A, 0x5A, 0xDA, 0x3A, 0xBA, 0x7A, 0xFA,
+<a name="l00710"></a>00710 0x06, 0x86, 0x46, 0xC6, 0x26, 0xA6, 0x66, 0xE6, 0x16, 0x96, 0x56, 0xD6, 0x36, 0xB6, 0x76, 0xF6,
+<a name="l00711"></a>00711 0x0E, 0x8E, 0x4E, 0xCE, 0x2E, 0xAE, 0x6E, 0xEE, 0x1E, 0x9E, 0x5E, 0xDE, 0x3E, 0xBE, 0x7E, 0xFE,
+<a name="l00712"></a>00712 0x01, 0x81, 0x41, 0xC1, 0x21, 0xA1, 0x61, 0xE1, 0x11, 0x91, 0x51, 0xD1, 0x31, 0xB1, 0x71, 0xF1,
+<a name="l00713"></a>00713 0x09, 0x89, 0x49, 0xC9, 0x29, 0xA9, 0x69, 0xE9, 0x19, 0x99, 0x59, 0xD9, 0x39, 0xB9, 0x79, 0xF9,
+<a name="l00714"></a>00714 0x05, 0x85, 0x45, 0xC5, 0x25, 0xA5, 0x65, 0xE5, 0x15, 0x95, 0x55, 0xD5, 0x35, 0xB5, 0x75, 0xF5,
+<a name="l00715"></a>00715 0x0D, 0x8D, 0x4D, 0xCD, 0x2D, 0xAD, 0x6D, 0xED, 0x1D, 0x9D, 0x5D, 0xDD, 0x3D, 0xBD, 0x7D, 0xFD,
+<a name="l00716"></a>00716 0x03, 0x83, 0x43, 0xC3, 0x23, 0xA3, 0x63, 0xE3, 0x13, 0x93, 0x53, 0xD3, 0x33, 0xB3, 0x73, 0xF3,
+<a name="l00717"></a>00717 0x0B, 0x8B, 0x4B, 0xCB, 0x2B, 0xAB, 0x6B, 0xEB, 0x1B, 0x9B, 0x5B, 0xDB, 0x3B, 0xBB, 0x7B, 0xFB,
+<a name="l00718"></a>00718 0x07, 0x87, 0x47, 0xC7, 0x27, 0xA7, 0x67, 0xE7, 0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7,
+<a name="l00719"></a>00719 0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF, 0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF
+<a name="l00720"></a>00720 };
+<a name="l00721"></a>00721
+<a name="l00722"></a>00722 } <span class="comment">// namespace internal</span>
+<a name="l00723"></a>00723 } <span class="comment">// namespace tbb</span>
+<a name="l00724"></a>00724
+<a name="l00725"></a>00725 <span class="comment">// Preserving access to legacy APIs</span>
+<a name="l00726"></a>00726 <span class="keyword">using</span> tbb::internal::__TBB_load_with_acquire;
+<a name="l00727"></a>00727 <span class="keyword">using</span> tbb::internal::__TBB_store_with_release;
+<a name="l00728"></a>00728
+<a name="l00729"></a>00729 <span class="comment">// Mapping historically used names to the ones expected by atomic_load_store_traits</span>
+<a name="l00730"></a>00730 <span class="preprocessor">#define __TBB_load_acquire __TBB_load_with_acquire</span>
+<a name="l00731"></a>00731 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_store_release __TBB_store_with_release</span>
+<a name="l00732"></a>00732 <span class="preprocessor"></span>
+<a name="l00733"></a>00733 <span class="preprocessor">#ifndef __TBB_Log2</span>
+<a name="l00734"></a>00734 <span class="preprocessor"></span><span class="keyword">inline</span> intptr_t __TBB_Log2( uintptr_t x ) {
+<a name="l00735"></a>00735 <span class="keywordflow">if</span>( x==0 ) <span class="keywordflow">return</span> -1;
+<a name="l00736"></a>00736 intptr_t result = 0;
+<a name="l00737"></a>00737 uintptr_t tmp;
+<a name="l00738"></a>00738 <span class="preprocessor">#if __TBB_WORDSIZE>=8</span>
+<a name="l00739"></a>00739 <span class="preprocessor"></span> <span class="keywordflow">if</span>( (tmp = x>>32) ) { x=tmp; result += 32; }
+<a name="l00740"></a>00740 <span class="preprocessor">#endif</span>
+<a name="l00741"></a>00741 <span class="preprocessor"></span> <span class="keywordflow">if</span>( (tmp = x>>16) ) { x=tmp; result += 16; }
+<a name="l00742"></a>00742 <span class="keywordflow">if</span>( (tmp = x>>8) ) { x=tmp; result += 8; }
+<a name="l00743"></a>00743 <span class="keywordflow">if</span>( (tmp = x>>4) ) { x=tmp; result += 4; }
+<a name="l00744"></a>00744 <span class="keywordflow">if</span>( (tmp = x>>2) ) { x=tmp; result += 2; }
+<a name="l00745"></a>00745 <span class="keywordflow">return</span> (x&2)? result+1: result;
+<a name="l00746"></a>00746 }
+<a name="l00747"></a>00747 <span class="preprocessor">#endif</span>
+<a name="l00748"></a>00748 <span class="preprocessor"></span>
+<a name="l00749"></a>00749 <span class="preprocessor">#ifndef __TBB_AtomicOR</span>
+<a name="l00750"></a>00750 <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="l00751"></a>00751 <a class="code" href="a00230.html">tbb::internal::atomic_backoff</a> b;
+<a name="l00752"></a>00752 <span class="keywordflow">for</span>(;;) {
+<a name="l00753"></a>00753 uintptr_t tmp = *(<span class="keyword">volatile</span> uintptr_t *)operand;
+<a name="l00754"></a>00754 uintptr_t result = __TBB_CompareAndSwapW(operand, tmp|addend, tmp);
+<a name="l00755"></a>00755 <span class="keywordflow">if</span>( result==tmp ) <span class="keywordflow">break</span>;
+<a name="l00756"></a>00756 b.<a class="code" href="a00230.html#a174ea93e3bd3d5cce82389c2f28d037">pause</a>();
+<a name="l00757"></a>00757 }
+<a name="l00758"></a>00758 }
+<a name="l00759"></a>00759 <span class="preprocessor">#endif</span>
+<a name="l00760"></a>00760 <span class="preprocessor"></span>
+<a name="l00761"></a>00761 <span class="preprocessor">#ifndef __TBB_AtomicAND</span>
+<a name="l00762"></a>00762 <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="l00763"></a>00763 <a class="code" href="a00230.html">tbb::internal::atomic_backoff</a> b;
+<a name="l00764"></a>00764 <span class="keywordflow">for</span>(;;) {
+<a name="l00765"></a>00765 uintptr_t tmp = *(<span class="keyword">volatile</span> uintptr_t *)operand;
+<a name="l00766"></a>00766 uintptr_t result = __TBB_CompareAndSwapW(operand, tmp&addend, tmp);
+<a name="l00767"></a>00767 <span class="keywordflow">if</span>( result==tmp ) <span class="keywordflow">break</span>;
+<a name="l00768"></a>00768 b.<a class="code" href="a00230.html#a174ea93e3bd3d5cce82389c2f28d037">pause</a>();
+<a name="l00769"></a>00769 }
+<a name="l00770"></a>00770 }
+<a name="l00771"></a>00771 <span class="preprocessor">#endif</span>
+<a name="l00772"></a>00772 <span class="preprocessor"></span>
+<a name="l00773"></a>00773 <span class="preprocessor">#ifndef __TBB_Flag</span>
+<a name="l00774"></a>00774 <span class="preprocessor"></span><span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> __TBB_Flag;
+<a name="l00775"></a>00775 <span class="preprocessor">#endif</span>
+<a name="l00776"></a>00776 <span class="preprocessor"></span><span class="keyword">typedef</span> __TBB_atomic __TBB_Flag __TBB_atomic_flag;
+<a name="l00777"></a>00777
+<a name="l00778"></a>00778 <span class="preprocessor">#ifndef __TBB_TryLockByte</span>
+<a name="l00779"></a>00779 <span class="preprocessor"></span><span class="keyword">inline</span> <span class="keywordtype">bool</span> __TBB_TryLockByte( __TBB_atomic_flag &flag ) {
+<a name="l00780"></a>00780 <span class="keywordflow">return</span> __TBB_machine_cmpswp1(&flag,1,0)==0;
+<a name="l00781"></a>00781 }
+<a name="l00782"></a>00782 <span class="preprocessor">#endif</span>
+<a name="l00783"></a>00783 <span class="preprocessor"></span>
+<a name="l00784"></a>00784 <span class="preprocessor">#ifndef __TBB_LockByte</span>
+<a name="l00785"></a>00785 <span class="preprocessor"></span><span class="keyword">inline</span> __TBB_Flag __TBB_LockByte( __TBB_atomic_flag& flag ) {
+<a name="l00786"></a>00786 <span class="keywordflow">if</span> ( !__TBB_TryLockByte(flag) ) {
+<a name="l00787"></a>00787 <a class="code" href="a00230.html">tbb::internal::atomic_backoff</a> b;
+<a name="l00788"></a>00788 <span class="keywordflow">do</span> {
+<a name="l00789"></a>00789 b.<a class="code" href="a00230.html#a174ea93e3bd3d5cce82389c2f28d037">pause</a>();
+<a name="l00790"></a>00790 } <span class="keywordflow">while</span> ( !__TBB_TryLockByte(flag) );
+<a name="l00791"></a>00791 }
+<a name="l00792"></a>00792 <span class="keywordflow">return</span> 0;
+<a name="l00793"></a>00793 }
+<a name="l00794"></a>00794 <span class="preprocessor">#endif</span>
+<a name="l00795"></a>00795 <span class="preprocessor"></span>
+<a name="l00796"></a>00796 <span class="preprocessor">#define __TBB_UnlockByte __TBB_store_with_release</span>
+<a name="l00797"></a>00797 <span class="preprocessor"></span>
+<a name="l00798"></a>00798 <span class="preprocessor">#ifndef __TBB_ReverseByte</span>
+<a name="l00799"></a>00799 <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="l00800"></a>00800 <span class="keywordflow">return</span> tbb::internal::reverse<unsigned char>::byte_table[src];
+<a name="l00801"></a>00801 }
+<a name="l00802"></a>00802 <span class="preprocessor">#endif</span>
+<a name="l00803"></a>00803 <span class="preprocessor"></span>
+<a name="l00804"></a>00804 <span class="keyword">template</span><<span class="keyword">typename</span> T>
+<a name="l00805"></a>00805 T __TBB_ReverseBits(T src) {
+<a name="l00806"></a>00806 T dst;
+<a name="l00807"></a>00807 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *original = (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *) &src;
+<a name="l00808"></a>00808 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *reversed = (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *) &dst;
+<a name="l00809"></a>00809
+<a name="l00810"></a>00810 <span class="keywordflow">for</span>( <span class="keywordtype">int</span> i = <span class="keyword">sizeof</span>(T)-1; i >= 0; i-- )
+<a name="l00811"></a>00811 reversed[i] = __TBB_ReverseByte( original[<span class="keyword">sizeof</span>(T)-i-1] );
+<a name="l00812"></a>00812
+<a name="l00813"></a>00813 <span class="keywordflow">return</span> dst;
+<a name="l00814"></a>00814 }
+<a name="l00815"></a>00815
+<a name="l00816"></a>00816 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_machine_H */</span>
</pre></div><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00599.html b/doc/html/a00599.html
deleted file mode 100644
index 486b1b7..0000000
--- a/doc/html/a00599.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-2011 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="a00216.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="a00216.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-2011 Intel Corporation. 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/a00600.html b/doc/html/a00600.html
index dea6fc7..e75183f 100644
--- a/doc/html/a00600.html
+++ b/doc/html/a00600.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_stddef.h Source File</title>
+<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>
@@ -19,7 +19,7 @@
<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>
+<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-2011 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>
@@ -39,217 +39,181 @@
<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="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">// Marketing-driven product version</span>
-<a name="l00025"></a>00025 <span class="preprocessor">#define TBB_VERSION_MAJOR 3</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 5006</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</span>
-<a name="l00122"></a>00122 <span class="preprocessor"></span><span class="comment">// define the parts of stdint.h that are needed, but put them inside tbb::internal</span>
-<a name="l00123"></a>00123 <span class="keyword">namespace </span>tbb {
-<a name="l00124"></a>00124 <span class="keyword">namespace </span>internal {
-<a name="l00125"></a>00125 <span class="keyword">typedef</span> __int8 int8_t;
-<a name="l00126"></a>00126 <span class="keyword">typedef</span> __int16 int16_t;
-<a name="l00127"></a>00127 <span class="keyword">typedef</span> __int32 int32_t;
-<a name="l00128"></a>00128 <span class="keyword">typedef</span> __int64 int64_t;
-<a name="l00129"></a>00129 <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> __int8 uint8_t;
-<a name="l00130"></a>00130 <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> __int16 uint16_t;
-<a name="l00131"></a>00131 <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> __int32 uint32_t;
-<a name="l00132"></a>00132 <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> __int64 uint64_t;
-<a name="l00133"></a>00133 } <span class="comment">// namespace internal</span>
-<a name="l00134"></a>00134 } <span class="comment">// namespace tbb</span>
-<a name="l00135"></a>00135 <span class="preprocessor">#else</span>
-<a name="l00136"></a>00136 <span class="preprocessor"></span><span class="preprocessor">#include <stdint.h></span>
-<a name="l00137"></a>00137 <span class="preprocessor">#endif </span><span class="comment">/* _MSC_VER */</span>
-<a name="l00138"></a>00138
-<a name="l00139"></a>00139 <span class="preprocessor">#if _MSC_VER >=1400</span>
-<a name="l00140"></a>00140 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_EXPORTED_FUNC __cdecl</span>
-<a name="l00141"></a>00141 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_EXPORTED_METHOD __thiscall</span>
-<a name="l00142"></a>00142 <span class="preprocessor"></span><span class="preprocessor">#else</span>
-<a name="l00143"></a>00143 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_EXPORTED_FUNC</span>
-<a name="l00144"></a>00144 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_EXPORTED_METHOD</span>
-<a name="l00145"></a>00145 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00146"></a>00146 <span class="preprocessor"></span>
-<a name="l00147"></a>00147 <span class="preprocessor">#include <cstddef></span> <span class="comment">/* Need size_t and ptrdiff_t */</span>
-<a name="l00148"></a>00148
-<a name="l00149"></a>00149 <span class="preprocessor">#if _MSC_VER</span>
-<a name="l00150"></a>00150 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_tbb_windef_H</span>
-<a name="l00151"></a>00151 <span class="preprocessor"></span><span class="preprocessor">#include "_tbb_windef.h"</span>
-<a name="l00152"></a>00152 <span class="preprocessor">#undef __TBB_tbb_windef_H</span>
-<a name="l00153"></a>00153 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00154"></a>00154 <span class="preprocessor"></span>
-<a name="l00156"></a>00156 <span class="keyword">namespace </span>tbb {
-<a name="l00157"></a>00157
-<a name="l00158"></a>00158 <span class="keyword">using</span> std::size_t; <span class="keyword">using</span> std::ptrdiff_t;
-<a name="l00159"></a>00159
-<a name="l00161"></a><a class="code" href="a00362.html#ed375248ff6019a70ca0f9da528e5d0b">00161</a> <span class="keyword">typedef</span> void(*<a class="code" href="a00362.html#ed375248ff6019a70ca0f9da528e5d0b">assertion_handler_type</a>)( <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> < [...]
-<a name="l00162"></a>00162
-<a name="l00163"></a>00163 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00164"></a>00164 <span class="preprocessor"></span>
-<a name="l00166"></a>00166
-<a name="l00169"></a>00169 <span class="preprocessor">#define __TBB_ASSERT(predicate,message) ((predicate)?((void)0):tbb::assertion_failure(__FILE__,__LINE__,#predicate,message))</span>
-<a name="l00170"></a>00170 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_ASSERT_EX __TBB_ASSERT</span>
-<a name="l00171"></a>00171 <span class="preprocessor"></span>
-<a name="l00173"></a>00173 <a class="code" href="a00362.html#ed375248ff6019a70ca0f9da528e5d0b">assertion_handler_type</a> __TBB_EXPORTED_FUNC <a class="code" href="a00362.html#823fa1c15dd829d1d9167157450ddcd9">set_assertion_handler</a>( <a class="code" href="a00362.html#ed375248ff6019a70ca0f9da528e5d0b">assertion_handler_type</a> new_handler );
+<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="a00228.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="a00228.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="l00176"></a>00176
-<a name="l00179"></a>00179 <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC <a class="code" href="a00362.html#3d1252787be39b4aef311f1cadaff9e8">assertion_failure</a>( <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="l00180"></a>00180
+<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>
-<a name="l00184"></a>00184 <span class="preprocessor">#define __TBB_ASSERT(predicate,comment) ((void)0)</span>
-<a name="l00186"></a>00186 <span class="preprocessor">#define __TBB_ASSERT_EX(predicate,comment) ((void)(1 && (predicate)))</span>
-<a name="l00187"></a>00187 <span class="preprocessor"></span>
-<a name="l00188"></a>00188 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
-<a name="l00189"></a>00189
-<a name="l00191"></a>00191
-<a name="l00195"></a>00195 <span class="keyword">extern</span> <span class="stringliteral">"C"</span> <span class="keywordtype">int</span> __TBB_EXPORTED_FUNC <a class="code" href="a00362.html#a6858b22e90041c9c4669674ff39b056">TBB_runtime_interface_version</a>();
+<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="l00198"></a>00198
-<a name="l00202"></a><a class="code" href="a00290.html">00202</a> <span class="keyword">class </span><a class="code" href="a00290.html">split</a> {
-<a name="l00203"></a>00203 };
-<a name="l00204"></a>00204
-<a name="l00209"></a>00209 <span class="keyword">namespace </span>internal {
-<a name="l00210"></a>00210
-<a name="l00212"></a>00212
-<a name="l00215"></a>00215 <span class="keyword">const</span> size_t NFS_MaxLineSize = 128;
-<a name="l00216"></a>00216
-<a name="l00217"></a>00217 <span class="keyword">template</span><<span class="keyword">class</span> T, <span class="keywordtype">int</span> S>
-<a name="l00218"></a>00218 <span class="keyword">struct </span>padded_base : T {
-<a name="l00219"></a>00219 <span class="keywordtype">char</span> pad[NFS_MaxLineSize - <span class="keyword">sizeof</span>(T) % NFS_MaxLineSize];
-<a name="l00220"></a>00220 };
-<a name="l00221"></a>00221 <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">struct </span>padded_base<T, 0> : T {};
-<a name="l00222"></a>00222
-<a name="l00224"></a>00224 <span class="keyword">template</span><<span class="keyword">class</span> T>
-<a name="l00225"></a>00225 <span class="keyword">struct </span>padded : padded_base<T, sizeof(T)> {};
-<a name="l00226"></a>00226
-<a name="l00228"></a>00228
-<a name="l00230"></a>00230 <span class="preprocessor">#define __TBB_offsetof(class_name, member_name) \</span>
-<a name="l00231"></a>00231 <span class="preprocessor"> ((ptrdiff_t)&(reinterpret_cast<class_name*>(0x1000)->member_name) - 0x1000)</span>
-<a name="l00232"></a>00232 <span class="preprocessor"></span>
-<a name="l00234"></a>00234 <span class="preprocessor">#define __TBB_get_object_ref(class_name, member_name, member_addr) \</span>
-<a name="l00235"></a>00235 <span class="preprocessor"> (*reinterpret_cast<class_name*>((char*)member_addr - __TBB_offsetof(class_name, member_name)))</span>
-<a name="l00236"></a>00236 <span class="preprocessor"></span>
-<a name="l00238"></a>00238 <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="l00239"></a>00239
-<a name="l00240"></a>00240 <span class="preprocessor">#if TBB_USE_EXCEPTIONS</span>
-<a name="l00241"></a>00241 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_TRY try</span>
-<a name="l00242"></a>00242 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_CATCH(e) catch(e)</span>
-<a name="l00243"></a>00243 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_THROW(e) throw e</span>
-<a name="l00244"></a>00244 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_RETHROW() throw</span>
-<a name="l00245"></a>00245 <span class="preprocessor"></span><span class="preprocessor">#else </span><span class="comment">/* !TBB_USE_EXCEPTIONS */</span>
-<a name="l00246"></a>00246 <span class="keyword">inline</span> <span class="keywordtype">bool</span> __TBB_false() { <span class="keywordflow">return</span> <span class="keyword">false</span>; }
-<a name="l00247"></a>00247 <span class="preprocessor"> #define __TBB_TRY</span>
-<a name="l00248"></a>00248 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_CATCH(e) if ( tbb::internal::__TBB_false() )</span>
-<a name="l00249"></a>00249 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_THROW(e) ((void)0)</span>
-<a name="l00250"></a>00250 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_RETHROW() ((void)0)</span>
-<a name="l00251"></a>00251 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* !TBB_USE_EXCEPTIONS */</span>
-<a name="l00252"></a>00252
-<a name="l00254"></a>00254 <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC runtime_warning( <span class="keyword">const</span> <span class="keywordtype">char</span>* format, ... );
-<a name="l00255"></a>00255
-<a name="l00256"></a>00256 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00257"></a>00257 <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="l00258"></a>00258
-<a name="l00260"></a>00260 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00261"></a>00261 <span class="keyword">inline</span> <span class="keywordtype">void</span> poison_pointer( T*& p ) { p = reinterpret_cast<T*>(poisoned_ptr); }
-<a name="l00262"></a>00262
-<a name="l00264"></a>00264 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00265"></a>00265 <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="l00266"></a>00266 <span class="preprocessor">#else</span>
-<a name="l00267"></a>00267 <span class="preprocessor"></span><span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00268"></a>00268 <span class="keyword">inline</span> <span class="keywordtype">void</span> poison_pointer( T* ) {<span class="comment">/*do nothing*/</span>}
-<a name="l00269"></a>00269 <span class="preprocessor">#endif </span><span class="comment">/* !TBB_USE_ASSERT */</span>
-<a name="l00270"></a>00270
-<a name="l00272"></a>00272
-<a name="l00274"></a>00274 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00275"></a>00275 <span class="keyword">inline</span> T punned_cast( U* ptr ) {
-<a name="l00276"></a>00276 uintptr_t x = reinterpret_cast<uintptr_t>(ptr);
-<a name="l00277"></a>00277 <span class="keywordflow">return</span> reinterpret_cast<T>(x);
-<a name="l00278"></a>00278 }
-<a name="l00279"></a>00279
-<a name="l00281"></a>00281 <span class="keyword">class </span>no_assign {
-<a name="l00282"></a>00282 <span class="comment">// Deny assignment</span>
-<a name="l00283"></a>00283 <span class="keywordtype">void</span> operator=( <span class="keyword">const</span> no_assign& );
-<a name="l00284"></a>00284 <span class="keyword">public</span>:
-<a name="l00285"></a>00285 <span class="preprocessor">#if __GNUC__</span>
-<a name="l00287"></a>00287 <span class="preprocessor"> no_assign() {}</span>
-<a name="l00288"></a>00288 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* __GNUC__ */</span>
-<a name="l00289"></a>00289 };
-<a name="l00290"></a>00290
-<a name="l00292"></a>00292 <span class="keyword">class </span>no_copy: no_assign {
-<a name="l00294"></a>00294 no_copy( <span class="keyword">const</span> no_copy& );
-<a name="l00295"></a>00295 <span class="keyword">public</span>:
-<a name="l00297"></a>00297 no_copy() {}
-<a name="l00298"></a>00298 };
-<a name="l00299"></a>00299
-<a name="l00301"></a>00301 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00302"></a>00302 <span class="keyword">struct </span>allocator_type {
-<a name="l00303"></a>00303 <span class="keyword">typedef</span> T value_type;
-<a name="l00304"></a>00304 };
-<a name="l00305"></a>00305
-<a name="l00306"></a>00306 <span class="preprocessor">#if _MSC_VER</span>
-<a name="l00308"></a>00308 <span class="preprocessor">template<typename T></span>
-<a name="l00309"></a>00309 <span class="preprocessor"></span><span class="keyword">struct </span>allocator_type<const T> {
-<a name="l00310"></a>00310 <span class="keyword">typedef</span> T value_type;
-<a name="l00311"></a>00311 };
-<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="comment">// Struct to be used as a version tag for inline functions.</span>
-<a name="l00317"></a>00317 <span class="comment"></span><span class="keyword">struct </span>version_tag_v3 {};
-<a name="l00318"></a>00318
-<a name="l00319"></a>00319 <span class="keyword">typedef</span> version_tag_v3 version_tag;
-<a name="l00320"></a>00320
-<a name="l00321"></a>00321 } <span class="comment">// internal</span>
-<a name="l00323"></a>00323 <span class="comment"></span>
-<a name="l00324"></a>00324 } <span class="comment">// tbb</span>
-<a name="l00325"></a>00325
-<a name="l00326"></a>00326 <span class="preprocessor">#endif </span><span class="comment">/* RC_INVOKED */</span>
-<a name="l00327"></a>00327 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_tbb_stddef_H */</span>
+<a name="l00197"></a>00197 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_profiling_H */</span>
</pre></div><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00600.html b/doc/html/a00601.html
similarity index 55%
copy from doc/html/a00600.html
copy to doc/html/a00601.html
index dea6fc7..70ad527 100644
--- a/doc/html/a00600.html
+++ b/doc/html/a00601.html
@@ -43,11 +43,11 @@
<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 3</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 5006</span>
+<a name="l00029"></a>00029 <span class="preprocessor">#define TBB_INTERFACE_VERSION 6000</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>
@@ -89,167 +89,178 @@
<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</span>
-<a name="l00122"></a>00122 <span class="preprocessor"></span><span class="comment">// define the parts of stdint.h that are needed, but put them inside tbb::internal</span>
-<a name="l00123"></a>00123 <span class="keyword">namespace </span>tbb {
-<a name="l00124"></a>00124 <span class="keyword">namespace </span>internal {
-<a name="l00125"></a>00125 <span class="keyword">typedef</span> __int8 int8_t;
-<a name="l00126"></a>00126 <span class="keyword">typedef</span> __int16 int16_t;
-<a name="l00127"></a>00127 <span class="keyword">typedef</span> __int32 int32_t;
-<a name="l00128"></a>00128 <span class="keyword">typedef</span> __int64 int64_t;
-<a name="l00129"></a>00129 <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> __int8 uint8_t;
-<a name="l00130"></a>00130 <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> __int16 uint16_t;
-<a name="l00131"></a>00131 <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> __int32 uint32_t;
-<a name="l00132"></a>00132 <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> __int64 uint64_t;
-<a name="l00133"></a>00133 } <span class="comment">// namespace internal</span>
-<a name="l00134"></a>00134 } <span class="comment">// namespace tbb</span>
-<a name="l00135"></a>00135 <span class="preprocessor">#else</span>
-<a name="l00136"></a>00136 <span class="preprocessor"></span><span class="preprocessor">#include <stdint.h></span>
-<a name="l00137"></a>00137 <span class="preprocessor">#endif </span><span class="comment">/* _MSC_VER */</span>
-<a name="l00138"></a>00138
-<a name="l00139"></a>00139 <span class="preprocessor">#if _MSC_VER >=1400</span>
-<a name="l00140"></a>00140 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_EXPORTED_FUNC __cdecl</span>
-<a name="l00141"></a>00141 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_EXPORTED_METHOD __thiscall</span>
-<a name="l00142"></a>00142 <span class="preprocessor"></span><span class="preprocessor">#else</span>
-<a name="l00143"></a>00143 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_EXPORTED_FUNC</span>
-<a name="l00144"></a>00144 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_EXPORTED_METHOD</span>
-<a name="l00145"></a>00145 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00146"></a>00146 <span class="preprocessor"></span>
-<a name="l00147"></a>00147 <span class="preprocessor">#include <cstddef></span> <span class="comment">/* Need size_t and ptrdiff_t */</span>
-<a name="l00148"></a>00148
-<a name="l00149"></a>00149 <span class="preprocessor">#if _MSC_VER</span>
-<a name="l00150"></a>00150 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_tbb_windef_H</span>
-<a name="l00151"></a>00151 <span class="preprocessor"></span><span class="preprocessor">#include "_tbb_windef.h"</span>
-<a name="l00152"></a>00152 <span class="preprocessor">#undef __TBB_tbb_windef_H</span>
-<a name="l00153"></a>00153 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00154"></a>00154 <span class="preprocessor"></span>
-<a name="l00156"></a>00156 <span class="keyword">namespace </span>tbb {
-<a name="l00157"></a>00157
-<a name="l00158"></a>00158 <span class="keyword">using</span> std::size_t; <span class="keyword">using</span> std::ptrdiff_t;
-<a name="l00159"></a>00159
-<a name="l00161"></a><a class="code" href="a00362.html#ed375248ff6019a70ca0f9da528e5d0b">00161</a> <span class="keyword">typedef</span> void(*<a class="code" href="a00362.html#ed375248ff6019a70ca0f9da528e5d0b">assertion_handler_type</a>)( <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> < [...]
-<a name="l00162"></a>00162
-<a name="l00163"></a>00163 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00164"></a>00164 <span class="preprocessor"></span>
-<a name="l00166"></a>00166
-<a name="l00169"></a>00169 <span class="preprocessor">#define __TBB_ASSERT(predicate,message) ((predicate)?((void)0):tbb::assertion_failure(__FILE__,__LINE__,#predicate,message))</span>
-<a name="l00170"></a>00170 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_ASSERT_EX __TBB_ASSERT</span>
-<a name="l00171"></a>00171 <span class="preprocessor"></span>
-<a name="l00173"></a>00173 <a class="code" href="a00362.html#ed375248ff6019a70ca0f9da528e5d0b">assertion_handler_type</a> __TBB_EXPORTED_FUNC <a class="code" href="a00362.html#823fa1c15dd829d1d9167157450ddcd9">set_assertion_handler</a>( <a class="code" href="a00362.html#ed375248ff6019a70ca0f9da528e5d0b">assertion_handler_type</a> new_handler );
-<a name="l00174"></a>00174
-<a name="l00176"></a>00176
-<a name="l00179"></a>00179 <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC <a class="code" href="a00362.html#3d1252787be39b4aef311f1cadaff9e8">assertion_failure</a>( <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="l00180"></a>00180
-<a name="l00181"></a>00181 <span class="preprocessor">#else</span>
-<a name="l00182"></a>00182 <span class="preprocessor"></span>
-<a name="l00184"></a>00184 <span class="preprocessor">#define __TBB_ASSERT(predicate,comment) ((void)0)</span>
-<a name="l00186"></a>00186 <span class="preprocessor">#define __TBB_ASSERT_EX(predicate,comment) ((void)(1 && (predicate)))</span>
-<a name="l00187"></a>00187 <span class="preprocessor"></span>
-<a name="l00188"></a>00188 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
+<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">#include <cstddef></span> <span class="comment">/* Need size_t and ptrdiff_t */</span>
+<a name="l00130"></a>00130
+<a name="l00131"></a>00131 <span class="preprocessor">#if _MSC_VER</span>
+<a name="l00132"></a>00132 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_tbb_windef_H</span>
+<a name="l00133"></a>00133 <span class="preprocessor"></span><span class="preprocessor"> #include "internal/_tbb_windef.h"</span>
+<a name="l00134"></a>00134 <span class="preprocessor"> #undef __TBB_tbb_windef_H</span>
+<a name="l00135"></a>00135 <span class="preprocessor"></span><span class="preprocessor">#else</span>
+<a name="l00136"></a>00136 <span class="preprocessor"></span><span class="preprocessor"> #include <stdint.h></span>
+<a name="l00137"></a>00137 <span class="preprocessor">#endif</span>
+<a name="l00138"></a>00138 <span class="preprocessor"></span>
+<a name="l00140"></a>00140 <span class="keyword">namespace </span>tbb {
+<a name="l00141"></a>00141
+<a name="l00142"></a>00142 <span class="preprocessor">#if _MSC_VER</span>
+<a name="l00143"></a>00143 <span class="preprocessor"></span> <span class="keyword">namespace </span>internal {
+<a name="l00144"></a>00144 <span class="keyword">typedef</span> __int8 int8_t;
+<a name="l00145"></a>00145 <span class="keyword">typedef</span> __int16 int16_t;
+<a name="l00146"></a>00146 <span class="keyword">typedef</span> __int32 int32_t;
+<a name="l00147"></a>00147 <span class="keyword">typedef</span> __int64 int64_t;
+<a name="l00148"></a>00148 <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> __int8 uint8_t;
+<a name="l00149"></a>00149 <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> __int16 uint16_t;
+<a name="l00150"></a>00150 <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> __int32 uint32_t;
+<a name="l00151"></a>00151 <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> __int64 uint64_t;
+<a name="l00152"></a>00152 } <span class="comment">// namespace internal</span>
+<a name="l00153"></a>00153 <span class="preprocessor">#else </span><span class="comment">/* Posix */</span>
+<a name="l00154"></a>00154 <span class="keyword">namespace </span>internal {
+<a name="l00155"></a>00155 using ::int8_t;
+<a name="l00156"></a>00156 using ::int16_t;
+<a name="l00157"></a>00157 using ::int32_t;
+<a name="l00158"></a>00158 using ::int64_t;
+<a name="l00159"></a>00159 using ::uint8_t;
+<a name="l00160"></a>00160 using ::uint16_t;
+<a name="l00161"></a>00161 using ::uint32_t;
+<a name="l00162"></a>00162 using ::uint64_t;
+<a name="l00163"></a>00163 } <span class="comment">// namespace internal</span>
+<a name="l00164"></a>00164 <span class="preprocessor">#endif </span><span class="comment">/* Posix */</span>
+<a name="l00165"></a>00165
+<a name="l00166"></a>00166 <span class="keyword">using</span> std::size_t;
+<a name="l00167"></a>00167 <span class="keyword">using</span> std::ptrdiff_t;
+<a name="l00168"></a>00168
+<a name="l00170"></a><a class="code" href="a00383.html#ed375248ff6019a70ca0f9da528e5d0b">00170</a> <span class="keyword">typedef</span> void(*<a class="code" href="a00383.html#ed375248ff6019a70ca0f9da528e5d0b">assertion_handler_type</a>)( <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> < [...]
+<a name="l00171"></a>00171
+<a name="l00172"></a>00172 <span class="preprocessor">#if TBB_USE_ASSERT</span>
+<a name="l00173"></a>00173 <span class="preprocessor"></span>
+<a name="l00175"></a>00175
+<a name="l00178"></a>00178 <span class="preprocessor"> #define __TBB_ASSERT(predicate,message) ((predicate)?((void)0):tbb::assertion_failure(__FILE__,__LINE__,#predicate,message))</span>
+<a name="l00179"></a>00179 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_ASSERT_EX __TBB_ASSERT</span>
+<a name="l00180"></a>00180 <span class="preprocessor"></span>
+<a name="l00182"></a>00182 <a class="code" href="a00383.html#ed375248ff6019a70ca0f9da528e5d0b">assertion_handler_type</a> __TBB_EXPORTED_FUNC <a class="code" href="a00383.html#823fa1c15dd829d1d9167157450ddcd9">set_assertion_handler</a>( <a class="code" href="a00383.html#ed375248ff6019a70ca0f9da528e5d0b">assertion_handler_type</a> new_handler );
+<a name="l00183"></a>00183
+<a name="l00185"></a>00185
+<a name="l00188"></a>00188 <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC <a class="code" href="a00383.html#3d1252787be39b4aef311f1cadaff9e8">assertion_failure</a>( <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="l00189"></a>00189
+<a name="l00190"></a>00190 <span class="preprocessor">#else </span><span class="comment">/* !TBB_USE_ASSERT */</span>
<a name="l00191"></a>00191
-<a name="l00195"></a>00195 <span class="keyword">extern</span> <span class="stringliteral">"C"</span> <span class="keywordtype">int</span> __TBB_EXPORTED_FUNC <a class="code" href="a00362.html#a6858b22e90041c9c4669674ff39b056">TBB_runtime_interface_version</a>();
-<a name="l00196"></a>00196
+<a name="l00193"></a>00193 <span class="preprocessor"> #define __TBB_ASSERT(predicate,comment) ((void)0)</span>
+<a name="l00195"></a>00195 <span class="preprocessor"> #define __TBB_ASSERT_EX(predicate,comment) ((void)(1 && (predicate)))</span>
+<a name="l00196"></a>00196 <span class="preprocessor"></span>
+<a name="l00197"></a>00197 <span class="preprocessor">#endif </span><span class="comment">/* !TBB_USE_ASSERT */</span>
<a name="l00198"></a>00198
-<a name="l00202"></a><a class="code" href="a00290.html">00202</a> <span class="keyword">class </span><a class="code" href="a00290.html">split</a> {
-<a name="l00203"></a>00203 };
-<a name="l00204"></a>00204
-<a name="l00209"></a>00209 <span class="keyword">namespace </span>internal {
-<a name="l00210"></a>00210
-<a name="l00212"></a>00212
-<a name="l00215"></a>00215 <span class="keyword">const</span> size_t NFS_MaxLineSize = 128;
-<a name="l00216"></a>00216
-<a name="l00217"></a>00217 <span class="keyword">template</span><<span class="keyword">class</span> T, <span class="keywordtype">int</span> S>
-<a name="l00218"></a>00218 <span class="keyword">struct </span>padded_base : T {
-<a name="l00219"></a>00219 <span class="keywordtype">char</span> pad[NFS_MaxLineSize - <span class="keyword">sizeof</span>(T) % NFS_MaxLineSize];
-<a name="l00220"></a>00220 };
-<a name="l00221"></a>00221 <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">struct </span>padded_base<T, 0> : T {};
-<a name="l00222"></a>00222
-<a name="l00224"></a>00224 <span class="keyword">template</span><<span class="keyword">class</span> T>
-<a name="l00225"></a>00225 <span class="keyword">struct </span>padded : padded_base<T, sizeof(T)> {};
-<a name="l00226"></a>00226
-<a name="l00228"></a>00228
-<a name="l00230"></a>00230 <span class="preprocessor">#define __TBB_offsetof(class_name, member_name) \</span>
-<a name="l00231"></a>00231 <span class="preprocessor"> ((ptrdiff_t)&(reinterpret_cast<class_name*>(0x1000)->member_name) - 0x1000)</span>
-<a name="l00232"></a>00232 <span class="preprocessor"></span>
-<a name="l00234"></a>00234 <span class="preprocessor">#define __TBB_get_object_ref(class_name, member_name, member_addr) \</span>
-<a name="l00235"></a>00235 <span class="preprocessor"> (*reinterpret_cast<class_name*>((char*)member_addr - __TBB_offsetof(class_name, member_name)))</span>
-<a name="l00236"></a>00236 <span class="preprocessor"></span>
-<a name="l00238"></a>00238 <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="l00239"></a>00239
-<a name="l00240"></a>00240 <span class="preprocessor">#if TBB_USE_EXCEPTIONS</span>
-<a name="l00241"></a>00241 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_TRY try</span>
-<a name="l00242"></a>00242 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_CATCH(e) catch(e)</span>
-<a name="l00243"></a>00243 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_THROW(e) throw e</span>
-<a name="l00244"></a>00244 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_RETHROW() throw</span>
-<a name="l00245"></a>00245 <span class="preprocessor"></span><span class="preprocessor">#else </span><span class="comment">/* !TBB_USE_EXCEPTIONS */</span>
-<a name="l00246"></a>00246 <span class="keyword">inline</span> <span class="keywordtype">bool</span> __TBB_false() { <span class="keywordflow">return</span> <span class="keyword">false</span>; }
-<a name="l00247"></a>00247 <span class="preprocessor"> #define __TBB_TRY</span>
-<a name="l00248"></a>00248 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_CATCH(e) if ( tbb::internal::__TBB_false() )</span>
-<a name="l00249"></a>00249 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_THROW(e) ((void)0)</span>
-<a name="l00250"></a>00250 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_RETHROW() ((void)0)</span>
-<a name="l00251"></a>00251 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* !TBB_USE_EXCEPTIONS */</span>
+<a name="l00200"></a>00200
+<a name="l00204"></a>00204 <span class="keyword">extern</span> <span class="stringliteral">"C"</span> <span class="keywordtype">int</span> __TBB_EXPORTED_FUNC <a class="code" href="a00383.html#a6858b22e90041c9c4669674ff39b056">TBB_runtime_interface_version</a>();
+<a name="l00205"></a>00205
+<a name="l00207"></a>00207
+<a name="l00211"></a><a class="code" href="a00309.html">00211</a> <span class="keyword">class </span><a class="code" href="a00309.html">split</a> {
+<a name="l00212"></a>00212 };
+<a name="l00213"></a>00213
+<a name="l00218"></a>00218 <span class="keyword">namespace </span>internal {
+<a name="l00219"></a>00219
+<a name="l00221"></a>00221
+<a name="l00224"></a>00224 <span class="keyword">const</span> size_t NFS_MaxLineSize = 128;
+<a name="l00225"></a>00225
+<a name="l00245"></a>00245 <span class="preprocessor">#define __TBB_atomic // intentionally empty, see above</span>
+<a name="l00246"></a>00246 <span class="preprocessor"></span>
+<a name="l00247"></a>00247 <span class="keyword">template</span><<span class="keyword">class</span> T, <span class="keywordtype">int</span> S>
+<a name="l00248"></a>00248 <span class="keyword">struct </span>padded_base : T {
+<a name="l00249"></a>00249 <span class="keywordtype">char</span> pad[NFS_MaxLineSize - <span class="keyword">sizeof</span>(T) % NFS_MaxLineSize];
+<a name="l00250"></a>00250 };
+<a name="l00251"></a>00251 <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">struct </span>padded_base<T, 0> : T {};
<a name="l00252"></a>00252
-<a name="l00254"></a>00254 <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC runtime_warning( <span class="keyword">const</span> <span class="keywordtype">char</span>* format, ... );
-<a name="l00255"></a>00255
-<a name="l00256"></a>00256 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00257"></a>00257 <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="l00254"></a>00254 <span class="keyword">template</span><<span class="keyword">class</span> T>
+<a name="l00255"></a>00255 <span class="keyword">struct </span>padded : padded_base<T, sizeof(T)> {};
+<a name="l00256"></a>00256
<a name="l00258"></a>00258
-<a name="l00260"></a>00260 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00261"></a>00261 <span class="keyword">inline</span> <span class="keywordtype">void</span> poison_pointer( T*& p ) { p = reinterpret_cast<T*>(poisoned_ptr); }
-<a name="l00262"></a>00262
-<a name="l00264"></a>00264 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00265"></a>00265 <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="l00266"></a>00266 <span class="preprocessor">#else</span>
-<a name="l00267"></a>00267 <span class="preprocessor"></span><span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00268"></a>00268 <span class="keyword">inline</span> <span class="keywordtype">void</span> poison_pointer( T* ) {<span class="comment">/*do nothing*/</span>}
-<a name="l00269"></a>00269 <span class="preprocessor">#endif </span><span class="comment">/* !TBB_USE_ASSERT */</span>
-<a name="l00270"></a>00270
-<a name="l00272"></a>00272
-<a name="l00274"></a>00274 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00275"></a>00275 <span class="keyword">inline</span> T punned_cast( U* ptr ) {
-<a name="l00276"></a>00276 uintptr_t x = reinterpret_cast<uintptr_t>(ptr);
-<a name="l00277"></a>00277 <span class="keywordflow">return</span> reinterpret_cast<T>(x);
-<a name="l00278"></a>00278 }
-<a name="l00279"></a>00279
-<a name="l00281"></a>00281 <span class="keyword">class </span>no_assign {
-<a name="l00282"></a>00282 <span class="comment">// Deny assignment</span>
-<a name="l00283"></a>00283 <span class="keywordtype">void</span> operator=( <span class="keyword">const</span> no_assign& );
-<a name="l00284"></a>00284 <span class="keyword">public</span>:
-<a name="l00285"></a>00285 <span class="preprocessor">#if __GNUC__</span>
-<a name="l00287"></a>00287 <span class="preprocessor"> no_assign() {}</span>
-<a name="l00288"></a>00288 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* __GNUC__ */</span>
-<a name="l00289"></a>00289 };
-<a name="l00290"></a>00290
-<a name="l00292"></a>00292 <span class="keyword">class </span>no_copy: no_assign {
-<a name="l00294"></a>00294 no_copy( <span class="keyword">const</span> no_copy& );
-<a name="l00295"></a>00295 <span class="keyword">public</span>:
-<a name="l00297"></a>00297 no_copy() {}
-<a name="l00298"></a>00298 };
-<a name="l00299"></a>00299
-<a name="l00301"></a>00301 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00302"></a>00302 <span class="keyword">struct </span>allocator_type {
-<a name="l00303"></a>00303 <span class="keyword">typedef</span> T value_type;
-<a name="l00304"></a>00304 };
-<a name="l00305"></a>00305
-<a name="l00306"></a>00306 <span class="preprocessor">#if _MSC_VER</span>
-<a name="l00308"></a>00308 <span class="preprocessor">template<typename T></span>
-<a name="l00309"></a>00309 <span class="preprocessor"></span><span class="keyword">struct </span>allocator_type<const T> {
-<a name="l00310"></a>00310 <span class="keyword">typedef</span> T value_type;
-<a name="l00311"></a>00311 };
-<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="comment">// Struct to be used as a version tag for inline functions.</span>
-<a name="l00317"></a>00317 <span class="comment"></span><span class="keyword">struct </span>version_tag_v3 {};
-<a name="l00318"></a>00318
-<a name="l00319"></a>00319 <span class="keyword">typedef</span> version_tag_v3 version_tag;
+<a name="l00260"></a>00260 <span class="preprocessor">#define __TBB_offsetof(class_name, member_name) \</span>
+<a name="l00261"></a>00261 <span class="preprocessor"> ((ptrdiff_t)&(reinterpret_cast<class_name*>(0x1000)->member_name) - 0x1000)</span>
+<a name="l00262"></a>00262 <span class="preprocessor"></span>
+<a name="l00264"></a>00264 <span class="preprocessor">#define __TBB_get_object_ref(class_name, member_name, member_addr) \</span>
+<a name="l00265"></a>00265 <span class="preprocessor"> (*reinterpret_cast<class_name*>((char*)member_addr - __TBB_offsetof(class_name, member_name)))</span>
+<a name="l00266"></a>00266 <span class="preprocessor"></span>
+<a name="l00268"></a>00268 <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="l00269"></a>00269
+<a name="l00270"></a>00270 <span class="preprocessor">#if TBB_USE_EXCEPTIONS</span>
+<a name="l00271"></a>00271 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_TRY try</span>
+<a name="l00272"></a>00272 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_CATCH(e) catch(e)</span>
+<a name="l00273"></a>00273 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_THROW(e) throw e</span>
+<a name="l00274"></a>00274 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_RETHROW() throw</span>
+<a name="l00275"></a>00275 <span class="preprocessor"></span><span class="preprocessor">#else </span><span class="comment">/* !TBB_USE_EXCEPTIONS */</span>
+<a name="l00276"></a>00276 <span class="keyword">inline</span> <span class="keywordtype">bool</span> __TBB_false() { <span class="keywordflow">return</span> <span class="keyword">false</span>; }
+<a name="l00277"></a>00277 <span class="preprocessor"> #define __TBB_TRY</span>
+<a name="l00278"></a>00278 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_CATCH(e) if ( tbb::internal::__TBB_false() )</span>
+<a name="l00279"></a>00279 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_THROW(e) ((void)0)</span>
+<a name="l00280"></a>00280 <span class="preprocessor"></span><span class="preprocessor"> #define __TBB_RETHROW() ((void)0)</span>
+<a name="l00281"></a>00281 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* !TBB_USE_EXCEPTIONS */</span>
+<a name="l00282"></a>00282
+<a name="l00284"></a>00284 <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC runtime_warning( <span class="keyword">const</span> <span class="keywordtype">char</span>* format, ... );
+<a name="l00285"></a>00285
+<a name="l00286"></a>00286 <span class="preprocessor">#if TBB_USE_ASSERT</span>
+<a name="l00287"></a>00287 <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="l00288"></a>00288
+<a name="l00290"></a>00290 <span class="keyword">template</span><<span class="keyword">typename</span> T>
+<a name="l00291"></a>00291 <span class="keyword">inline</span> <span class="keywordtype">void</span> poison_pointer( T*& p ) { p = reinterpret_cast<T*>(poisoned_ptr); }
+<a name="l00292"></a>00292
+<a name="l00294"></a>00294 <span class="keyword">template</span><<span class="keyword">typename</span> T>
+<a name="l00295"></a>00295 <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="l00296"></a>00296 <span class="preprocessor">#else</span>
+<a name="l00297"></a>00297 <span class="preprocessor"></span><span class="keyword">template</span><<span class="keyword">typename</span> T>
+<a name="l00298"></a>00298 <span class="keyword">inline</span> <span class="keywordtype">void</span> poison_pointer( T* ) {<span class="comment">/*do nothing*/</span>}
+<a name="l00299"></a>00299 <span class="preprocessor">#endif </span><span class="comment">/* !TBB_USE_ASSERT */</span>
+<a name="l00300"></a>00300
+<a name="l00302"></a>00302
+<a name="l00304"></a>00304 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
+<a name="l00305"></a>00305 <span class="keyword">inline</span> T punned_cast( U* ptr ) {
+<a name="l00306"></a>00306 uintptr_t x = reinterpret_cast<uintptr_t>(ptr);
+<a name="l00307"></a>00307 <span class="keywordflow">return</span> reinterpret_cast<T>(x);
+<a name="l00308"></a>00308 }
+<a name="l00309"></a>00309
+<a name="l00311"></a>00311 <span class="keyword">class </span>no_assign {
+<a name="l00312"></a>00312 <span class="comment">// Deny assignment</span>
+<a name="l00313"></a>00313 <span class="keywordtype">void</span> operator=( <span class="keyword">const</span> no_assign& );
+<a name="l00314"></a>00314 <span class="keyword">public</span>:
+<a name="l00315"></a>00315 <span class="preprocessor">#if __GNUC__</span>
+<a name="l00317"></a>00317 <span class="preprocessor"> no_assign() {}</span>
+<a name="l00318"></a>00318 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* __GNUC__ */</span>
+<a name="l00319"></a>00319 };
<a name="l00320"></a>00320
-<a name="l00321"></a>00321 } <span class="comment">// internal</span>
-<a name="l00323"></a>00323 <span class="comment"></span>
-<a name="l00324"></a>00324 } <span class="comment">// tbb</span>
-<a name="l00325"></a>00325
-<a name="l00326"></a>00326 <span class="preprocessor">#endif </span><span class="comment">/* RC_INVOKED */</span>
-<a name="l00327"></a>00327 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_tbb_stddef_H */</span>
+<a name="l00322"></a>00322 <span class="keyword">class </span>no_copy: no_assign {
+<a name="l00324"></a>00324 no_copy( <span class="keyword">const</span> no_copy& );
+<a name="l00325"></a>00325 <span class="keyword">public</span>:
+<a name="l00327"></a>00327 no_copy() {}
+<a name="l00328"></a>00328 };
+<a name="l00329"></a>00329
+<a name="l00331"></a>00331 <span class="keyword">template</span><<span class="keyword">typename</span> T>
+<a name="l00332"></a>00332 <span class="keyword">struct </span>allocator_type {
+<a name="l00333"></a>00333 <span class="keyword">typedef</span> T value_type;
+<a name="l00334"></a>00334 };
+<a name="l00335"></a>00335
+<a name="l00336"></a>00336 <span class="preprocessor">#if _MSC_VER</span>
+<a name="l00338"></a>00338 <span class="preprocessor">template<typename T></span>
+<a name="l00339"></a>00339 <span class="preprocessor"></span><span class="keyword">struct </span>allocator_type<const T> {
+<a name="l00340"></a>00340 <span class="keyword">typedef</span> T value_type;
+<a name="l00341"></a>00341 };
+<a name="l00342"></a>00342 <span class="preprocessor">#endif</span>
+<a name="l00343"></a>00343 <span class="preprocessor"></span>
+<a name="l00344"></a>00344 <span class="comment">// Struct to be used as a version tag for inline functions.</span>
+<a name="l00347"></a>00347 <span class="comment"></span><span class="keyword">struct </span>version_tag_v3 {};
+<a name="l00348"></a>00348
+<a name="l00349"></a>00349 <span class="keyword">typedef</span> version_tag_v3 version_tag;
+<a name="l00350"></a>00350
+<a name="l00351"></a>00351 } <span class="comment">// internal</span>
+<a name="l00353"></a>00353 <span class="comment"></span>
+<a name="l00354"></a>00354 } <span class="comment">// tbb</span>
+<a name="l00355"></a>00355
+<a name="l00356"></a>00356 <span class="preprocessor">#endif </span><span class="comment">/* RC_INVOKED */</span>
+<a name="l00357"></a>00357 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_tbb_stddef_H */</span>
</pre></div><hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00606.html b/doc/html/a00608.html
similarity index 99%
rename from doc/html/a00606.html
rename to doc/html/a00608.html
index 88571ef..48bded1 100644
--- a/doc/html/a00606.html
+++ b/doc/html/a00608.html
@@ -75,7 +75,7 @@
<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="keywordtype">void</span> swap( internal::tbb_thread_v3& t1, internal::tbb_thread_v3& t2 );
+<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
diff --git a/doc/html/a00614.html b/doc/html/a00614.html
deleted file mode 100644
index c83d1a6..0000000
--- a/doc/html/a00614.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-2011 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-2011 Intel Corporation. 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/a00616.html b/doc/html/a00616.html
index e01fd80..c83d1a6 100644
--- a/doc/html/a00616.html
+++ b/doc/html/a00616.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>tick_count.h Source File</title>
+<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>
@@ -19,7 +19,7 @@
<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>
+<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-2011 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>
@@ -39,120 +39,52 @@
<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="a00302.html">00038</a> <span class="keyword">class </span><a class="code" href="a00302.html">tick_count</a> {
-<a name="l00039"></a>00039 <span class="keyword">public</span>:
-<a name="l00041"></a><a class="code" href="a00303.html">00041</a> <span class="keyword">class </span><a class="code" href="a00303.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="a00303.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="a00303.html#75a9a0949f8a8a84d6758835f1b48dad">00046</a> <a class="code" href="a00303.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="a00303.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="a00303.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="a00302.html">tbb::tick_count</a>;
-<a name="l00055"></a>00055
-<a name="l00057"></a>00057 <span class="keyword">friend</span> <a class="code" href="a00303.html">interval_t</a> <a class="code" href="a00303.html#09dde78a4100800c11bb883d6204b586">operator-</a>( <span class="keyword">const</span> <a class="code" href="a00302.html">tick_count</a>& t1, <span class="keyword">const</span> <a class="code" href="a00302.html">tick_count</a>& t0 );
+<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="l00060"></a><a class="code" href="a00303.html#5871ead1ca230efbe52a5008470e6428">00060</a> <span class="keyword">friend</span> <a class="code" href="a00303.html">interval_t</a> <a class="code" href="a00303.html#5871ead1ca230efbe52a5008470e6428">operator+</a>( <span class="keyword">const</span> <a class="code" href="a00303.html">interval_t</a>& i, <span class="keyword">const</span> <a class="code" href="a00303.html">interval_t</a>& j ) {
-<a name="l00061"></a>00061 <span class="keywordflow">return</span> <a class="code" href="a00303.html#75a9a0949f8a8a84d6758835f1b48dad">interval_t</a>(i.<a class="code" href="a00303.html#beea71acda120af3e3e29f10e8cb5c10">value</a>+j.<a class="code" href="a00303.html#beea71acda120af3e3e29f10e8cb5c10">value</a>);
-<a name="l00062"></a>00062 }
+<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="l00065"></a><a class="code" href="a00303.html#fa509691e1d689830931e36edd274f76">00065</a> <span class="keyword">friend</span> <a class="code" href="a00303.html">interval_t</a> <a class="code" href="a00303.html#09dde78a4100800c11bb883d6204b586">operator-</a>( <span class="keyword">const</span> <a class="code" href="a00303.html">interval_t</a>& i, <span class="keyword">const</span> <a class="code" href="a00303.html">interval_t</a>& j ) {
-<a name="l00066"></a>00066 <span class="keywordflow">return</span> <a class="code" href="a00303.html#75a9a0949f8a8a84d6758835f1b48dad">interval_t</a>(i.<a class="code" href="a00303.html#beea71acda120af3e3e29f10e8cb5c10">value</a>-j.<a class="code" href="a00303.html#beea71acda120af3e3e29f10e8cb5c10">value</a>);
-<a name="l00067"></a>00067 }
-<a name="l00068"></a>00068
-<a name="l00070"></a><a class="code" href="a00303.html#cd9814947902e26463a69a111530f81b">00070</a> <a class="code" href="a00303.html">interval_t</a>& <a class="code" href="a00303.html#cd9814947902e26463a69a111530f81b">operator+=</a>( <span class="keyword">const</span> <a class="code" href="a00303.html">interval_t</a>& i ) {value += i.<a class="code" href="a00303.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="a00303.html#35ff7eaf7c2031b4a991402ac9ecb940">00073</a> <a class="code" href="a00303.html">interval_t</a>& <a class="code" href="a00303.html#35ff7eaf7c2031b4a991402ac9ecb940">operator-=</a>( <span class="keyword">const</span> <a class="code" href="a00303.html">interval_t</a>& i ) {value -= i.<a class="code" href="a00303.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="a00302.html#34593326ae4191e02a13c7cbdab9de4c">00077</a> <a class="code" href="a00302.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="a00302.html">tick_count</a> <a class="code" href="a00302.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="a00302.html#09dde78a4100800c11bb883d6204b586">operator-</a>( <span class="keyword">const</span> <a class="code" href="a00302.html">tick_count</a>& t1, <span class="keyword">const</span> <a class="code" href="a00302.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="a00302.html#fb7f78ca61cf28398645ace66e284473">00089</a> <span class="keyword">inline</span> <a class="code" href="a00302.html">tick_count</a> <a class="code" href="a00302.html#fb7f78ca61cf28398645ace66e284473">tick_count::now</a>() {
-<a name="l00090"></a>00090 <a class="code" href="a00302.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="a00302.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="a00302.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="a00302.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="a00303.html#1a21a428e00cced2e6a49e0f5f2258bf">00115</a> <span class="keyword">inline</span> <a class="code" href="a00303.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="a00302.html#09dde78a4100800c11bb883d6204b586">00128</a> <span class="keyword">inline</span> <a class="code" href="a00303.html">tick_count::interval_t</a> <a class="code" href="a00302.html#09dde78a4100800c11bb883d6204b586">operator-</a>( <span class="keyword">const</span> <a class="code" href="a00302.html">tick_count</a>& t1, <span class="keyword">const</span> <a class="code" href="a00302.html">tick_count</a>& t0 ) {
-<a name="l00129"></a>00129 <span class="keywordflow">return</span> <a class="code" href="a00303.html">tick_count::interval_t</a>( t1.<a class="code" href="a00302.html#1ba05ad46dc08bc1bf34bd6cc94e36ec">my_count</a>-t0.<a class="code" href="a00302.html#1ba05ad46dc08bc1bf34bd6cc94e36ec">my_count</a> );
-<a name="l00130"></a>00130 }
-<a name="l00131"></a>00131
-<a name="l00132"></a><a class="code" href="a00303.html#d5d8429c0bc59cf6131b2abc7929fa59">00132</a> <span class="keyword">inline</span> <span class="keywordtype">double</span> <a class="code" href="a00303.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
+<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-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/a00616.html b/doc/html/a00618.html
similarity index 76%
copy from doc/html/a00616.html
copy to doc/html/a00618.html
index e01fd80..6dbf540 100644
--- a/doc/html/a00616.html
+++ b/doc/html/a00618.html
@@ -55,51 +55,51 @@
<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="a00302.html">00038</a> <span class="keyword">class </span><a class="code" href="a00302.html">tick_count</a> {
+<a name="l00038"></a><a class="code" href="a00323.html">00038</a> <span class="keyword">class </span><a class="code" href="a00323.html">tick_count</a> {
<a name="l00039"></a>00039 <span class="keyword">public</span>:
-<a name="l00041"></a><a class="code" href="a00303.html">00041</a> <span class="keyword">class </span><a class="code" href="a00303.html">interval_t</a> {
+<a name="l00041"></a><a class="code" href="a00324.html">00041</a> <span class="keyword">class </span><a class="code" href="a00324.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="a00303.html#75a9a0949f8a8a84d6758835f1b48dad">interval_t</a>( <span class="keywordtype">long</span> <span class="keywordtype">long</span> value_ ) : value(value_) {}
+<a name="l00043"></a>00043 <span class="keyword">explicit</span> <a class="code" href="a00324.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="a00303.html#75a9a0949f8a8a84d6758835f1b48dad">00046</a> <a class="code" href="a00303.html#75a9a0949f8a8a84d6758835f1b48dad">interval_t</a>() : value(0) {};
+<a name="l00046"></a><a class="code" href="a00324.html#75a9a0949f8a8a84d6758835f1b48dad">00046</a> <a class="code" href="a00324.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="a00303.html#75a9a0949f8a8a84d6758835f1b48dad">interval_t</a>( <span class="keywordtype">double</span> sec );
+<a name="l00049"></a>00049 <span class="keyword">explicit</span> <a class="code" href="a00324.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="a00303.html#d5d8429c0bc59cf6131b2abc7929fa59">seconds</a>() <span class="keyword">const</span>;
+<a name="l00052"></a>00052 <span class="keywordtype">double</span> <a class="code" href="a00324.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="a00302.html">tbb::tick_count</a>;
+<a name="l00054"></a>00054 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00323.html">tbb::tick_count</a>;
<a name="l00055"></a>00055
-<a name="l00057"></a>00057 <span class="keyword">friend</span> <a class="code" href="a00303.html">interval_t</a> <a class="code" href="a00303.html#09dde78a4100800c11bb883d6204b586">operator-</a>( <span class="keyword">const</span> <a class="code" href="a00302.html">tick_count</a>& t1, <span class="keyword">const</span> <a class="code" href="a00302.html">tick_count</a>& t0 );
+<a name="l00057"></a>00057 <span class="keyword">friend</span> <a class="code" href="a00324.html">interval_t</a> <a class="code" href="a00324.html#09dde78a4100800c11bb883d6204b586">operator-</a>( <span class="keyword">const</span> <a class="code" href="a00323.html">tick_count</a>& t1, <span class="keyword">const</span> <a class="code" href="a00323.html">tick_count</a>& t0 );
<a name="l00058"></a>00058
-<a name="l00060"></a><a class="code" href="a00303.html#5871ead1ca230efbe52a5008470e6428">00060</a> <span class="keyword">friend</span> <a class="code" href="a00303.html">interval_t</a> <a class="code" href="a00303.html#5871ead1ca230efbe52a5008470e6428">operator+</a>( <span class="keyword">const</span> <a class="code" href="a00303.html">interval_t</a>& i, <span class="keyword">const</span> <a class="code" href="a00303.html">interval_t</a>& j ) {
-<a name="l00061"></a>00061 <span class="keywordflow">return</span> <a class="code" href="a00303.html#75a9a0949f8a8a84d6758835f1b48dad">interval_t</a>(i.<a class="code" href="a00303.html#beea71acda120af3e3e29f10e8cb5c10">value</a>+j.<a class="code" href="a00303.html#beea71acda120af3e3e29f10e8cb5c10">value</a>);
+<a name="l00060"></a><a class="code" href="a00324.html#5871ead1ca230efbe52a5008470e6428">00060</a> <span class="keyword">friend</span> <a class="code" href="a00324.html">interval_t</a> <a class="code" href="a00324.html#5871ead1ca230efbe52a5008470e6428">operator+</a>( <span class="keyword">const</span> <a class="code" href="a00324.html">interval_t</a>& i, <span class="keyword">const</span> <a class="code" href="a00324.html">interval_t</a>& j ) {
+<a name="l00061"></a>00061 <span class="keywordflow">return</span> <a class="code" href="a00324.html#75a9a0949f8a8a84d6758835f1b48dad">interval_t</a>(i.<a class="code" href="a00324.html#beea71acda120af3e3e29f10e8cb5c10">value</a>+j.<a class="code" href="a00324.html#beea71acda120af3e3e29f10e8cb5c10">value</a>);
<a name="l00062"></a>00062 }
<a name="l00063"></a>00063
-<a name="l00065"></a><a class="code" href="a00303.html#fa509691e1d689830931e36edd274f76">00065</a> <span class="keyword">friend</span> <a class="code" href="a00303.html">interval_t</a> <a class="code" href="a00303.html#09dde78a4100800c11bb883d6204b586">operator-</a>( <span class="keyword">const</span> <a class="code" href="a00303.html">interval_t</a>& i, <span class="keyword">const</span> <a class="code" href="a00303.html">interval_t</a>& j ) {
-<a name="l00066"></a>00066 <span class="keywordflow">return</span> <a class="code" href="a00303.html#75a9a0949f8a8a84d6758835f1b48dad">interval_t</a>(i.<a class="code" href="a00303.html#beea71acda120af3e3e29f10e8cb5c10">value</a>-j.<a class="code" href="a00303.html#beea71acda120af3e3e29f10e8cb5c10">value</a>);
+<a name="l00065"></a><a class="code" href="a00324.html#fa509691e1d689830931e36edd274f76">00065</a> <span class="keyword">friend</span> <a class="code" href="a00324.html">interval_t</a> <a class="code" href="a00324.html#09dde78a4100800c11bb883d6204b586">operator-</a>( <span class="keyword">const</span> <a class="code" href="a00324.html">interval_t</a>& i, <span class="keyword">const</span> <a class="code" href="a00324.html">interval_t</a>& j ) {
+<a name="l00066"></a>00066 <span class="keywordflow">return</span> <a class="code" href="a00324.html#75a9a0949f8a8a84d6758835f1b48dad">interval_t</a>(i.<a class="code" href="a00324.html#beea71acda120af3e3e29f10e8cb5c10">value</a>-j.<a class="code" href="a00324.html#beea71acda120af3e3e29f10e8cb5c10">value</a>);
<a name="l00067"></a>00067 }
<a name="l00068"></a>00068
-<a name="l00070"></a><a class="code" href="a00303.html#cd9814947902e26463a69a111530f81b">00070</a> <a class="code" href="a00303.html">interval_t</a>& <a class="code" href="a00303.html#cd9814947902e26463a69a111530f81b">operator+=</a>( <span class="keyword">const</span> <a class="code" href="a00303.html">interval_t</a>& i ) {value += i.<a class="code" href="a00303.html#beea71acda120af3e3e29f10e8cb5c10">value</a>; <span class="keywordflow">return</span> *<span class="keyword [...]
+<a name="l00070"></a><a class="code" href="a00324.html#cd9814947902e26463a69a111530f81b">00070</a> <a class="code" href="a00324.html">interval_t</a>& <a class="code" href="a00324.html#cd9814947902e26463a69a111530f81b">operator+=</a>( <span class="keyword">const</span> <a class="code" href="a00324.html">interval_t</a>& i ) {value += i.<a class="code" href="a00324.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="a00303.html#35ff7eaf7c2031b4a991402ac9ecb940">00073</a> <a class="code" href="a00303.html">interval_t</a>& <a class="code" href="a00303.html#35ff7eaf7c2031b4a991402ac9ecb940">operator-=</a>( <span class="keyword">const</span> <a class="code" href="a00303.html">interval_t</a>& i ) {value -= i.<a class="code" href="a00303.html#beea71acda120af3e3e29f10e8cb5c10">value</a>; <span class="keywordflow">return</span> *<span class="keyword [...]
+<a name="l00073"></a><a class="code" href="a00324.html#35ff7eaf7c2031b4a991402ac9ecb940">00073</a> <a class="code" href="a00324.html">interval_t</a>& <a class="code" href="a00324.html#35ff7eaf7c2031b4a991402ac9ecb940">operator-=</a>( <span class="keyword">const</span> <a class="code" href="a00324.html">interval_t</a>& i ) {value -= i.<a class="code" href="a00324.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="a00302.html#34593326ae4191e02a13c7cbdab9de4c">00077</a> <a class="code" href="a00302.html#34593326ae4191e02a13c7cbdab9de4c">tick_count</a>() : my_count(0) {};
+<a name="l00077"></a><a class="code" href="a00323.html#34593326ae4191e02a13c7cbdab9de4c">00077</a> <a class="code" href="a00323.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="a00302.html">tick_count</a> <a class="code" href="a00302.html#fb7f78ca61cf28398645ace66e284473">now</a>();
+<a name="l00080"></a>00080 <span class="keyword">static</span> <a class="code" href="a00323.html">tick_count</a> <a class="code" href="a00323.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="a00302.html#09dde78a4100800c11bb883d6204b586">operator-</a>( <span class="keyword">const</span> <a class="code" href="a00302.html">tick_count</a>& t1, <span class="keyword">const</span> <a class="code" href="a00302.html">tick_count</a>& t0 );
+<a name="l00083"></a>00083 <span class="keyword">friend</span> interval_t <a class="code" href="a00323.html#09dde78a4100800c11bb883d6204b586">operator-</a>( <span class="keyword">const</span> <a class="code" href="a00323.html">tick_count</a>& t1, <span class="keyword">const</span> <a class="code" href="a00323.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="a00302.html#fb7f78ca61cf28398645ace66e284473">00089</a> <span class="keyword">inline</span> <a class="code" href="a00302.html">tick_count</a> <a class="code" href="a00302.html#fb7f78ca61cf28398645ace66e284473">tick_count::now</a>() {
-<a name="l00090"></a>00090 <a class="code" href="a00302.html">tick_count</a> result;
+<a name="l00089"></a><a class="code" href="a00323.html#fb7f78ca61cf28398645ace66e284473">00089</a> <span class="keyword">inline</span> <a class="code" href="a00323.html">tick_count</a> <a class="code" href="a00323.html#fb7f78ca61cf28398645ace66e284473">tick_count::now</a>() {
+<a name="l00090"></a>00090 <a class="code" href="a00323.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="a00302.html#1ba05ad46dc08bc1bf34bd6cc94e36ec">my_count</a> = qpcnt.QuadPart;
+<a name="l00094"></a>00094 result.<a class="code" href="a00323.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>
@@ -107,7 +107,7 @@
<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="a00302.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="l00102"></a>00102 result.<a class="code" href="a00323.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>
@@ -115,12 +115,12 @@
<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="a00302.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="l00110"></a>00110 result.<a class="code" href="a00323.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="a00303.html#1a21a428e00cced2e6a49e0f5f2258bf">00115</a> <span class="keyword">inline</span> <a class="code" href="a00303.html#75a9a0949f8a8a84d6758835f1b48dad">tick_count::interval_t::interval_t</a>( <span class="keywordtype">double</span> sec )
+<a name="l00115"></a><a class="code" href="a00324.html#1a21a428e00cced2e6a49e0f5f2258bf">00115</a> <span class="keyword">inline</span> <a class="code" href="a00324.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;
@@ -133,11 +133,11 @@
<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="a00302.html#09dde78a4100800c11bb883d6204b586">00128</a> <span class="keyword">inline</span> <a class="code" href="a00303.html">tick_count::interval_t</a> <a class="code" href="a00302.html#09dde78a4100800c11bb883d6204b586">operator-</a>( <span class="keyword">const</span> <a class="code" href="a00302.html">tick_count</a>& t1, <span class="keyword">const</span> <a class="code" href="a00302.html">tick_count</a>& t0 ) {
-<a name="l00129"></a>00129 <span class="keywordflow">return</span> <a class="code" href="a00303.html">tick_count::interval_t</a>( t1.<a class="code" href="a00302.html#1ba05ad46dc08bc1bf34bd6cc94e36ec">my_count</a>-t0.<a class="code" href="a00302.html#1ba05ad46dc08bc1bf34bd6cc94e36ec">my_count</a> );
+<a name="l00128"></a><a class="code" href="a00323.html#09dde78a4100800c11bb883d6204b586">00128</a> <span class="keyword">inline</span> <a class="code" href="a00324.html">tick_count::interval_t</a> <a class="code" href="a00323.html#09dde78a4100800c11bb883d6204b586">operator-</a>( <span class="keyword">const</span> <a class="code" href="a00323.html">tick_count</a>& t1, <span class="keyword">const</span> <a class="code" href="a00323.html">tick_count</a>& t0 ) {
+<a name="l00129"></a>00129 <span class="keywordflow">return</span> <a class="code" href="a00324.html">tick_count::interval_t</a>( t1.<a class="code" href="a00323.html#1ba05ad46dc08bc1bf34bd6cc94e36ec">my_count</a>-t0.<a class="code" href="a00323.html#1ba05ad46dc08bc1bf34bd6cc94e36ec">my_count</a> );
<a name="l00130"></a>00130 }
<a name="l00131"></a>00131
-<a name="l00132"></a><a class="code" href="a00303.html#d5d8429c0bc59cf6131b2abc7929fa59">00132</a> <span class="keyword">inline</span> <span class="keywordtype">double</span> <a class="code" href="a00303.html#d5d8429c0bc59cf6131b2abc7929fa59">tick_count::interval_t::seconds</a>()<span class="keyword"> const </span>{
+<a name="l00132"></a><a class="code" href="a00324.html#d5d8429c0bc59cf6131b2abc7929fa59">00132</a> <span class="keyword">inline</span> <span class="keywordtype">double</span> <a class="code" href="a00324.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);
diff --git a/doc/html/annotated.html b/doc/html/annotated.html
index 8c497a2..0af9bd7 100644
--- a/doc/html/annotated.html
+++ b/doc/html/annotated.html
@@ -21,102 +21,109 @@
<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="a00212.html">tbb::affinity_partitioner</a></td><td class="indexvalue">An affinity partitioner </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00213.html">tbb::interface6::internal::aggregated_operation< Derived ></a></td><td class="indexvalue">Aggregated_operation base class </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00214.html">tbb::interface6::internal::aggregator< handler_type, operation_type ></a></td><td class="indexvalue">Aggregator base class </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00215.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="a00216.html">tbb::atomic< T ></a></td><td class="indexvalue">Primary template for atomic </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00217.html">tbb::atomic< void * ></a></td><td class="indexvalue">Specialization for <a class="el" href="a00217.html">atomic<void*></a>, for sake of not allowing arithmetic or operator-> </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00218.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="a00219.html">tbb::auto_partitioner</a></td><td class="indexvalue">An auto partitioner </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00220.html">tbb::bad_last_alloc</a></td><td class="indexvalue">Exception for concurrent containers </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00221.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="a00222.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="a00223.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="a00224.html">tbb::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="a00225.html">tbb::buffer_node< T ></a></td><td class="indexvalue">Forwards messages in arbitrary order </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00226.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="a00227.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="a00228.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="a00229.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="a00230.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="a00231.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="a00232.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="a00233.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="a00234.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="a00235.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="a00236.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="a00237.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="a00238.html">tbb::concurrent_vector< T, A ></a></td><td class="indexvalue">Concurrent vector container </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00239.html">tbb::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="a00240.html">tbb::continue_node</a></td><td class="indexvalue">Broadcasts completion message when it receives completion messages from all predecessors. Then resets </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00241.html">tbb::continue_receiver</a></td><td class="indexvalue">Base class for receivers of completion messages </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00242.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="a00243.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td class="indexvalue">The <a class="el" href="a00243.html">enumerable_thread_specific</a> container </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00244.html">tbb::executable_node< Output ></a></td><td class="indexvalue">Implements an executable node that supports <a class="el" href="a00239.html">continue_msg</a> -> Output </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00245.html">tbb::filter</a></td><td class="indexvalue">A stage in a pipeline </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00246.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="a00247.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="a00248.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="a00249.html">tbb::function_node< Input, Output ></a></td><td class="indexvalue">Implements a function node that supports Input -> Output </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00250.html">tbb::graph</a></td><td class="indexvalue">The graph class </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00251.html">tbb::graph_node</a></td><td class="indexvalue">The base of all graph nodes. Allows them to be stored in a collection for deletion </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00252.html">tbb::improper_lock</a></td><td class="indexvalue">Exception for PPL locks </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00253.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="a00254.html">tbb::internal::join_node_base< JP, InputTuple, OutputTuple ></a></td><td class="indexvalue">Join_node_base </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00255.html">tbb::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="a00256.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="a00257.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="a00258.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="a00259.html">tbb::mutex::scoped_lock</a></td><td class="indexvalue">The scoped locking pattern </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00260.html">tbb::null_mutex</a></td><td class="indexvalue">A mutex which does nothing </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00261.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="a00262.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="a00263.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="a00264.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="a00265.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="a00266.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="a00267.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="a00268.html">tbb::priority_queue_node< T, Compare ></a></td><td class="indexvalue">Forwards messages in priority order </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00269.html">tbb::queue_node< T ></a></td><td class="indexvalue">Forwards messages in FIFO order </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00270.html">tbb::queuing_mutex</a></td><td class="indexvalue">Queuing lock with local-only spinning </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00271.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="a00272.html">tbb::queuing_rw_mutex</a></td><td class="indexvalue">Reader-writer lock with local-only spinning </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00273.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="a00274.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="a00275.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="a00276.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="a00277.html">tbb::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="a00278.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="a00279.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="a00280.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="a00281.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="a00282.html">tbb::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="a00283.html">tbb::sequencer_node< T ></a></td><td class="indexvalue">Forwards messages in sequence order </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00284.html">tbb::simple_partitioner</a></td><td class="indexvalue">A simple partitioner </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00285.html">tbb::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="a00286.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="a00287.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="a00288.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="a00289.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="a00290.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="a00291.html">tbb::task</a></td><td class="indexvalue">Base class for user-defined tasks </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00292.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="a00293.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="a00294.html">tbb::task_list</a></td><td class="indexvalue">A list of children </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00295.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="a00296.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="a00297.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="a00298.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="a00299.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="a00300.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="a00301.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="a00302.html">tbb::tick_count</a></td><td class="indexvalue">Absolute timestamp </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00303.html">tbb::tick_count::interval_t</a></td><td class="indexvalue">Relative time interval </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00304.html">tbb::internal::two_phase_port< T ></a></td><td class="indexvalue">The two-phase join port </td></tr>
- <tr><td class="indexkey"><a class="el" href="a00305.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="a00306.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="a00307.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="a00225.html">tbb::affinity_partitioner</a></td><td class="indexvalue">An affinity partitioner </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00226.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="a00227.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="a00228.html">tbb::atomic< T ></a></td><td class="indexvalue">Primary template for atomic </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00229.html">tbb::atomic< void * ></a></td><td class="indexvalue">Specialization for <a class="el" href="a00229.html">atomic<void*></a>, for sake of not allowing arithmetic or operator-> </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00230.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="a00231.html">tbb::auto_partitioner</a></td><td class="indexvalue">An auto partitioner </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00232.html">tbb::bad_last_alloc</a></td><td class="indexvalue">Exception for concurrent containers </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00233.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="a00234.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="a00235.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="a00236.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="a00237.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="a00238.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="a00239.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="a00240.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="a00241.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="a00242.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="a00243.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="a00244.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="a00245.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="a00246.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="a00247.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="a00248.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="a00249.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="a00250.html">tbb::concurrent_vector< T, A ></a></td><td class="indexvalue">Concurrent vector container </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00251.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="a00252.html">tbb::flow::interface6::continue_node< Output ></a></td><td class="indexvalue">Implements an executable node that supports <a class="el" href="a00251.html">continue_msg</a> -> Output </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00253.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="a00254.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="a00255.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td class="indexvalue">The <a class="el" href="a00255.html">enumerable_thread_specific</a> container </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00256.html">tbb::filter</a></td><td class="indexvalue">A stage in a pipeline </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00257.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="a00258.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="a00259.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="a00260.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="a00261.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="a00262.html">tbb::flow::interface6::graph</a></td><td class="indexvalue">The graph class </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00263.html">tbb::flow::interface6::graph_node</a></td><td class="indexvalue">The base of all graph nodes. Allows them to be stored in a collection for deletion </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00264.html">tbb::improper_lock</a></td><td class="indexvalue">Exception for PPL locks </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00265.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="a00266.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="a00267.html">tbb::internal::machine_load_store_relaxed< T, S ></a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00268.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="a00269.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="a00270.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="a00271.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="a00272.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="a00273.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="a00274.html">tbb::flow::interface6::multioutput_function_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="a00275.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="a00276.html">tbb::mutex::scoped_lock</a></td><td class="indexvalue">The scoped locking pattern </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00277.html">tbb::null_mutex</a></td><td class="indexvalue">A mutex which does nothing </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00278.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="a00279.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="a00280.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="a00281.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="a00282.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="a00283.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="a00284.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="a00285.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="a00286.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="a00287.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="a00288.html">tbb::queuing_mutex</a></td><td class="indexvalue">Queuing lock with local-only spinning </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00289.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="a00290.html">tbb::queuing_rw_mutex</a></td><td class="indexvalue">Reader-writer lock with local-only spinning </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00291.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="a00292.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="a00293.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="a00294.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="a00295.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="a00296.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="a00297.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="a00298.html">tbb::interface6::runtime_loader</a></td><td class="indexvalue">Load TBB at runtime </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00299.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="a00300.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="a00301.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="a00302.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="a00303.html">tbb::simple_partitioner</a></td><td class="indexvalue">A simple partitioner </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00304.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="a00305.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="a00306.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="a00307.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="a00308.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="a00309.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="a00310.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="a00311.html">tbb::task</a></td><td class="indexvalue">Base class for user-defined tasks </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00312.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="a00313.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="a00314.html">tbb::task_group_context</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00315.html">tbb::task_list</a></td><td class="indexvalue">A list of children </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00316.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="a00317.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="a00318.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="a00319.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="a00320.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="a00321.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="a00322.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="a00323.html">tbb::tick_count</a></td><td class="indexvalue">Absolute timestamp </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00324.html">tbb::tick_count::interval_t</a></td><td class="indexvalue">Relative time interval </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00325.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="a00326.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="a00327.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>
diff --git a/doc/html/deprecated.html b/doc/html/deprecated.html
index 90d05f7..bd1303f 100644
--- a/doc/html/deprecated.html
+++ b/doc/html/deprecated.html
@@ -15,7 +15,7 @@
<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="a00237.html#48da3536245318af6cb5fd58bac78039">tbb::deprecated::concurrent_queue::pop_if_present</a> (T &destination) </dt>
+<dt>Member <a class="el" href="a00249.html#48da3536245318af6cb5fd58bac78039">tbb::deprecated::concurrent_queue::pop_if_present</a> (T &destination) </dt>
<dd>Use try_pop() </dd>
</dl>
<hr>
diff --git a/doc/html/files.html b/doc/html/files.html
index 5e565d1..9f603c7 100644
--- a/doc/html/files.html
+++ b/doc/html/files.html
@@ -20,43 +20,42 @@
<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_internal.h</b> <a href="a00377.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>_concurrent_queue_internal.h</b> <a href="a00381.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>_concurrent_unordered_internal.h</b> <a href="a00397.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>_tbb_windef.h</b> <a href="a00407.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>aligned_space.h</b> <a href="a00409.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>atomic.h</b> <a href="a00410.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>blocked_range.h</b> <a href="a00418.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>blocked_range2d.h</b> <a href="a00419.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>blocked_range3d.h</b> <a href="a00420.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>cache_aligned_allocator.h</b> <a href="a00421.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>combinable.h</b> <a href="a00423.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>concurrent_hash_map.h</b> <a href="a00424.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>concurrent_priority_queue.h</b> <a href="a00433.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>concurrent_queue.h</b> <a href="a00436.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>concurrent_unordered_map.h</b> <a href="a00437.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>concurrent_vector.h</b> <a href="a00442.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>critical_section.h</b> <a href="a00451.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>enumerable_thread_specific.h</b> <a href="a00454.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><a class="el" href="a00326.html">graph.h</a> <a href="a00466.html">[code]</a></td><td class="indexvalue">The graph related classes and functions </td></tr>
- <tr><td class="indexkey"><b>mutex.h</b> <a href="a00499.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>null_mutex.h</b> <a href="a00501.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>null_rw_mutex.h</b> <a href="a00502.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>parallel_do.h</b> <a href="a00503.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>parallel_for.h</b> <a href="a00512.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>parallel_for_each.h</b> <a href="a00516.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>parallel_invoke.h</b> <a href="a00518.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>parallel_reduce.h</b> <a href="a00524.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>parallel_scan.h</b> <a href="a00528.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>parallel_sort.h</b> <a href="a00533.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>parallel_while.h</b> <a href="a00537.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>partitioner.h</b> <a href="a00541.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>pipeline.h</b> <a href="a00546.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>queuing_mutex.h</b> <a href="a00560.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>queuing_rw_mutex.h</b> <a href="a00561.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>reader_writer_lock.h</b> <a href="a00562.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>recursive_mutex.h</b> <a href="a00563.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><a class="el" href="a00344.html">scalable_allocator.h</a> <a href="a00564.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>aligned_space.h</b> <a href="a00401.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>atomic.h</b> <a href="a00403.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>blocked_range.h</b> <a href="a00412.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>blocked_range2d.h</b> <a href="a00413.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>blocked_range3d.h</b> <a href="a00414.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>cache_aligned_allocator.h</b> <a href="a00415.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>combinable.h</b> <a href="a00417.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>concurrent_hash_map.h</b> <a href="a00418.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>concurrent_priority_queue.h</b> <a href="a00429.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>concurrent_queue.h</b> <a href="a00432.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>concurrent_unordered_map.h</b> <a href="a00436.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>concurrent_unordered_set.h</b> <a href="a00440.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>concurrent_vector.h</b> <a href="a00443.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>critical_section.h</b> <a href="a00452.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>enumerable_thread_specific.h</b> <a href="a00455.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00343.html">flow_graph.h</a> <a href="a00468.html">[code]</a></td><td class="indexvalue">The graph related classes and functions </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00344.html">memory_pool.h</a> <a href="a00480.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>mutex.h</b> <a href="a00487.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>null_mutex.h</b> <a href="a00489.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>null_rw_mutex.h</b> <a href="a00490.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>parallel_do.h</b> <a href="a00491.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>parallel_for.h</b> <a href="a00500.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>parallel_for_each.h</b> <a href="a00504.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>parallel_invoke.h</b> <a href="a00506.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>parallel_reduce.h</b> <a href="a00512.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>parallel_scan.h</b> <a href="a00518.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>parallel_sort.h</b> <a href="a00523.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>parallel_while.h</b> <a href="a00527.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>partitioner.h</b> <a href="a00531.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>pipeline.h</b> <a href="a00543.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>queuing_mutex.h</b> <a href="a00557.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>queuing_rw_mutex.h</b> <a href="a00558.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>reader_writer_lock.h</b> <a href="a00559.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>recursive_mutex.h</b> <a href="a00560.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>runtime_loader.h</b> <a href="a00561.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00363.html">scalable_allocator.h</a> <a href="a00562.html">[code]</a></td><td class="indexvalue"></td></tr>
<tr><td class="indexkey"><b>spin_mutex.h</b> <a href="a00565.html">[code]</a></td><td class="indexvalue"></td></tr>
<tr><td class="indexkey"><b>spin_rw_mutex.h</b> <a href="a00566.html">[code]</a></td><td class="indexvalue"></td></tr>
<tr><td class="indexkey"><b>task.h</b> <a href="a00567.html">[code]</a></td><td class="indexvalue"></td></tr>
@@ -68,11 +67,11 @@
<tr><td class="indexkey"><b>tbb_config.h</b> <a href="a00592.html">[code]</a></td><td class="indexvalue"></td></tr>
<tr><td class="indexkey"><b>tbb_exception.h</b> <a href="a00593.html">[code]</a></td><td class="indexvalue"></td></tr>
<tr><td class="indexkey"><b>tbb_machine.h</b> <a href="a00594.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>tbb_profiling.h</b> <a href="a00599.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>tbb_stddef.h</b> <a href="a00600.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>tbb_thread.h</b> <a href="a00606.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>tbbmalloc_proxy.h</b> <a href="a00614.html">[code]</a></td><td class="indexvalue"></td></tr>
- <tr><td class="indexkey"><b>tick_count.h</b> <a href="a00616.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>tbb_profiling.h</b> <a href="a00600.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>tbb_stddef.h</b> <a href="a00601.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>tbb_thread.h</b> <a href="a00608.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>tbbmalloc_proxy.h</b> <a href="a00616.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey"><b>tick_count.h</b> <a href="a00618.html">[code]</a></td><td class="indexvalue"></td></tr>
</table>
<hr>
<p></p>
diff --git a/doc/html/functions.html b/doc/html/functions.html
index 9d6e83b..4a75e7c 100644
--- a/doc/html/functions.html
+++ b/doc/html/functions.html
@@ -62,21 +62,21 @@ 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>acquire()
-: <a class="el" href="a00289.html#b0b646ec5be02a127d159bbb7ca65353">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00287.html#3ee3c338732b1f64b0b32a757807a30d">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00279.html#7fb04da37cccf8c99b1f9102d9074f9a">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00273.html#a8dd5ab8686e76de21587544dbb681e0">tbb::queuing_rw_mutex::scoped_lock</a>, <a class="el" href="a00271.html#533e4fc8355ee321206a0609c42d909d">tbb::qu [...]
-: <a class="el" href="a00285.html#d71ed386c53032463f3435f79a15b6ff">tbb::source_node< Output ></a><li>add()
-: <a class="el" href="a00265.html#e131c560057a58229992b61eb8dba4c6">tbb::parallel_while< Body ></a>, <a class="el" href="a00264.html#40baaf0f6856f4491dd0adf896c93516">tbb::parallel_do_feeder< Item ></a><li>add_filter()
-: <a class="el" href="a00266.html#38fb5c9c8395dd6f89a4ae2011a83e0d">tbb::pipeline</a><li>affinity()
-: <a class="el" href="a00291.html#3a920a56b0bcf2801518fb45b2c9d2be">tbb::task</a><li>affinity_id
-: <a class="el" href="a00291.html#d61bb32389d3857bf7511d69beaafb76">tbb::task</a><li>allocate()
-: <a class="el" href="a00299.html#c35e5db8e9cdff5d1387db5b0bad2e4a">tbb::internal::tbb_exception_ptr</a>, <a class="el" href="a00296.html#f6cb487b1bdce0b581f265a77dca6d53">tbb::tbb_allocator< T ></a>, <a class="el" href="a00280.html#726b1586d05d44665a36e1c7b2699bfd">tbb::scalable_allocator< T ></a>, <a class="el" href="a00226.html#4cdeea67af6c1fcd8f1d5e9c4cab61e8">tbb::cache_aligned_allocator< T ></a><li>allocate_child()
-: <a class="el" href="a00291.html#1ff794f7053cd9148d5f280fbf07377f">tbb::task</a><li>allocate_continuation()
-: <a class="el" href="a00291.html#1434c79a5138993269d034008bff7329">tbb::task</a><li>allocate_root()
-: <a class="el" href="a00291.html#8ccc518caf31075a3e073996d2d240a4">tbb::task</a><li>allocated
-: <a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293ebe94d3348dd038e41107819f00c1884c">tbb::task</a><li>allocator_type
-: <a class="el" href="a00296.html#78701e7454ef8e1a25b5acd364367080">tbb::tbb_allocator< T ></a>, <a class="el" href="a00243.html#3c03eb40955b933b01987222722ac4bd">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00230.html#2e2726fccf6d975dc1071608cc0bbf90">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00236.html#5a3956341728eaa558d8827063718cac">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a c [...]
-: <a class="el" href="a00238.html#93a06b3112cb804f42f40efb5e7387b4">tbb::concurrent_vector< T, A ></a><li>at()
-: <a class="el" href="a00238.html#23e14a38af748edff96a7adc3a0f1c58">tbb::concurrent_vector< T, A ></a><li>automatic
-: <a class="el" href="a00295.html#8f5988e2b0fbb2d533fcbb7f2583743f">tbb::task_scheduler_init</a></ul>
+: <a class="el" href="a00308.html#b0b646ec5be02a127d159bbb7ca65353">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00306.html#3ee3c338732b1f64b0b32a757807a30d">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00297.html#7fb04da37cccf8c99b1f9102d9074f9a">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00291.html#a8dd5ab8686e76de21587544dbb681e0">tbb::queuing_rw_mutex::scoped_lock</a>, <a class="el" href="a00289.html#533e4fc8355ee321206a0609c42d909d">tbb::qu [...]
+: <a class="el" href="a00304.html#4b647e4a93d08ccdd8d323279e4eaaa6">tbb::flow::interface6::source_node< Output ></a><li>add()
+: <a class="el" href="a00282.html#e131c560057a58229992b61eb8dba4c6">tbb::parallel_while< Body ></a>, <a class="el" href="a00281.html#40baaf0f6856f4491dd0adf896c93516">tbb::parallel_do_feeder< Item ></a><li>add_filter()
+: <a class="el" href="a00284.html#38fb5c9c8395dd6f89a4ae2011a83e0d">tbb::pipeline</a><li>affinity()
+: <a class="el" href="a00311.html#3a920a56b0bcf2801518fb45b2c9d2be">tbb::task</a><li>affinity_id
+: <a class="el" href="a00311.html#d61bb32389d3857bf7511d69beaafb76">tbb::task</a><li>allocate()
+: <a class="el" href="a00320.html#c35e5db8e9cdff5d1387db5b0bad2e4a">tbb::internal::tbb_exception_ptr</a>, <a class="el" href="a00317.html#f6cb487b1bdce0b581f265a77dca6d53">tbb::tbb_allocator< T ></a>, <a class="el" href="a00299.html#726b1586d05d44665a36e1c7b2699bfd">tbb::scalable_allocator< T ></a>, <a class="el" href="a00270.html#365bd64d284c80d85bb2149a12681526">tbb::interface6::memory_pool_allocator< T, P ></a>, <a class="el" href="a00238.html#4cdeea67af6c1fcd8f1d5e9 [...]
+: <a class="el" href="a00311.html#1ff794f7053cd9148d5f280fbf07377f">tbb::task</a><li>allocate_continuation()
+: <a class="el" href="a00311.html#1434c79a5138993269d034008bff7329">tbb::task</a><li>allocate_root()
+: <a class="el" href="a00311.html#8ccc518caf31075a3e073996d2d240a4">tbb::task</a><li>allocated
+: <a class="el" href="a00311.html#4a3c415562d17905390ea5b49d12293ebe94d3348dd038e41107819f00c1884c">tbb::task</a><li>allocator_type
+: <a class="el" href="a00317.html#78701e7454ef8e1a25b5acd364367080">tbb::tbb_allocator< T ></a>, <a class="el" href="a00255.html#3c03eb40955b933b01987222722ac4bd">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00242.html#2e2726fccf6d975dc1071608cc0bbf90">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00248.html#5a3956341728eaa558d8827063718cac">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a c [...]
+: <a class="el" href="a00250.html#93a06b3112cb804f42f40efb5e7387b4">tbb::concurrent_vector< T, A ></a><li>at()
+: <a class="el" href="a00250.html#23e14a38af748edff96a7adc3a0f1c58">tbb::concurrent_vector< T, A ></a><li>automatic
+: <a class="el" href="a00316.html#8f5988e2b0fbb2d533fcbb7f2583743f">tbb::task_scheduler_init</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/functions_0x62.html b/doc/html/functions_0x62.html
index 07268d8..c7802c8 100644
--- a/doc/html/functions_0x62.html
+++ b/doc/html/functions_0x62.html
@@ -62,11 +62,11 @@ 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="a00238.html#bd518e204107d07fd08d0ec5bdfd383d">tbb::concurrent_vector< T, A ></a><li>begin()
-: <a class="el" href="a00243.html#84afb3906a39e399cde1c950d6351300">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00238.html#78a06182276ff758788d4c0623ae0d71">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00221.html#18d2258400756ac1446dac7676b18df3">tbb::blocked_range< Value ></a>, <a class="el" href="a00215.html#0d702fc6b9e9d061ace3501b3c861cdf">tbb::aligned_space< T, N ></a><li>blocked_range()
-: <a class="el" href="a00221.html#4c0efd2be3f96a0ab3ba5085e8b3fcc7">tbb::blocked_range< Value ></a><li>bucket_count()
-: <a class="el" href="a00231.html#af34cb91b1d0f36a885a1a3432dd9af1">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>buffer_node()
-: <a class="el" href="a00225.html#7360978fa427d054bc6cde05c80e5e9f">tbb::buffer_node< T ></a></ul>
+: <a class="el" href="a00250.html#bd518e204107d07fd08d0ec5bdfd383d">tbb::concurrent_vector< T, A ></a><li>begin()
+: <a class="el" href="a00255.html#84afb3906a39e399cde1c950d6351300">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00250.html#78a06182276ff758788d4c0623ae0d71">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00233.html#18d2258400756ac1446dac7676b18df3">tbb::blocked_range< Value ></a>, <a class="el" href="a00227.html#0d702fc6b9e9d061ace3501b3c861cdf">tbb::aligned_space< T, N ></a><li>blocked_range()
+: <a class="el" href="a00233.html#4c0efd2be3f96a0ab3ba5085e8b3fcc7">tbb::blocked_range< Value ></a><li>bucket_count()
+: <a class="el" href="a00243.html#af34cb91b1d0f36a885a1a3432dd9af1">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>buffer_node()
+: <a class="el" href="a00237.html#03ad7b85a8341437f584af06ad050cdc">tbb::flow::interface6::buffer_node< T, A ></a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/functions_0x63.html b/doc/html/functions_0x63.html
index 472f7a3..573ef7c 100644
--- a/doc/html/functions_0x63.html
+++ b/doc/html/functions_0x63.html
@@ -62,30 +62,29 @@ 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="a00291.html#0f3fb4aac549ab642022450a4bd13326">tbb::task</a>, <a class="el" href="a00293.html#8bcdfdf4e6bfb76125b6de15c00b571d">tbb::task_group_context</a><li>capacity()
-: <a class="el" href="a00238.html#3ed6b9ae7217af5103d974045b6f5cd5">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00230.html#b2888b3e4e837d7e03f2c731963a402b">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00235.html#e5d6a0aca1579ecebb716bbe53514963">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>cbegin()
-: <a class="el" href="a00238.html#f88fcf1c920693c39bd9709db33c199f">tbb::concurrent_vector< T, A ></a><li>cend()
-: <a class="el" href="a00238.html#0c15a5d0f1cf75d687dabba07da1d46b">tbb::concurrent_vector< T, A ></a><li>change_group()
-: <a class="el" href="a00291.html#62247be9a637a814c8e8f4bcfb3a1908">tbb::task</a><li>clear()
-: <a class="el" href="a00294.html#fce446ee13e025969945328f3ff59b95">tbb::task_list</a>, <a class="el" href="a00266.html#2c84aef5b834b555ee220b176e25931e">tbb::pipeline</a>, <a class="el" href="a00243.html#a8764176d4b6014c5d65f1051851abc8">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00238.html#26f937a359a66b6aae904c3cd9a3c444">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00230.html#90b31e2954c6e4596c7900435a5f [...]
-: <a class="el" href="a00223.html#3336ba9480fd6c43e158f9beb024c050">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>, <a class="el" href="a00222.html#392a46759af2c884957115771affa7f4">tbb::blocked_range2d< RowValue, ColValue ></a><li>compact()
-: <a class="el" href="a00238.html#1693d1da41b1a8235871be9c6633be35">tbb::concurrent_vector< T, A ></a><li>concurrency
-: <a class="el" href="a00250.html#633b9b55e3248b785efd13264261f0e5">tbb::graph</a><li>concurrent_bounded_queue()
-: <a class="el" href="a00230.html#a5e04dcd7db9fd9b583b4e7df832246a">tbb::concurrent_bounded_queue< T, A ></a><li>concurrent_hash_map()
-: <a class="el" href="a00231.html#83c40f2053f208861b90390e12a36436">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>concurrent_priority_queue()
-: <a class="el" href="a00235.html#509419e320f200456d89dc54a65140b3">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>concurrent_queue()
-: <a class="el" href="a00237.html#9102b897776bd2d9e908e6604ff16b5f">tbb::deprecated::concurrent_queue< T, A ></a>, <a class="el" href="a00236.html#8a6b98ea11a867db8ac868f0113ca429">tbb::strict_ppl::concurrent_queue< T, A ></a><li>concurrent_vector()
-: <a class="el" href="a00238.html#4450de83c5862ea4bcd9443fd7e67419">tbb::concurrent_vector< T, A ></a><li>const_accessor()
-: <a class="el" href="a00234.html#27399c613eb1aecd4660803955dda09d">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a><li>const_iterator
-: <a class="el" href="a00221.html#1a8d05842c2b3dfc177bc4d347e4cef7">tbb::blocked_range< Value ></a><li>const_reference
-: <a class="el" href="a00230.html#796713d0b9ba93a4721cbe13e4474068">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00236.html#4d48e7ff93f81636bca2c74f7da34750">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00235.html#a4ded8601a434098605be0dcc4febc60">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>construct()
-: <a class="el" href="a00296.html#ab228ab9e324ed041c2226e1d717df5f">tbb::tbb_allocator< T ></a>, <a class="el" href="a00226.html#958ee8745c86c275bfc9533af565e017">tbb::cache_aligned_allocator< T ></a><li>consume()
-: <a class="el" href="a00304.html#684f6bbc3290270ed43cb34ffd273f71">tbb::internal::two_phase_port< T ></a><li>context()
-: <a class="el" href="a00291.html#d8c36a93f3972590fbb65ff1cef3173b">tbb::task</a><li>continue_receiver()
-: <a class="el" href="a00241.html#799d383813261426d881b10247caadba">tbb::continue_receiver</a><li>count()
-: <a class="el" href="a00231.html#6968eb6feed2df36be421df0464297af">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>crbegin()
-: <a class="el" href="a00238.html#db78a1d28c9c966050e8a2926d834a33">tbb::concurrent_vector< T, A ></a><li>crend()
-: <a class="el" href="a00238.html#fff9cece89438587997ebedf93c5e962">tbb::concurrent_vector< T, A ></a></ul>
+: <a class="el" href="a00311.html#0f3fb4aac549ab642022450a4bd13326">tbb::task</a>, <a class="el" href="a00313.html#8bcdfdf4e6bfb76125b6de15c00b571d">tbb::task_group_context</a><li>capacity()
+: <a class="el" href="a00250.html#3ed6b9ae7217af5103d974045b6f5cd5">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00242.html#b2888b3e4e837d7e03f2c731963a402b">tbb::concurrent_bounded_queue< T, A ></a><li>cbegin()
+: <a class="el" href="a00250.html#f88fcf1c920693c39bd9709db33c199f">tbb::concurrent_vector< T, A ></a><li>cend()
+: <a class="el" href="a00250.html#0c15a5d0f1cf75d687dabba07da1d46b">tbb::concurrent_vector< T, A ></a><li>change_group()
+: <a class="el" href="a00311.html#62247be9a637a814c8e8f4bcfb3a1908">tbb::task</a><li>clear()
+: <a class="el" href="a00315.html#fce446ee13e025969945328f3ff59b95">tbb::task_list</a>, <a class="el" href="a00284.html#2c84aef5b834b555ee220b176e25931e">tbb::pipeline</a>, <a class="el" href="a00255.html#a8764176d4b6014c5d65f1051851abc8">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00250.html#26f937a359a66b6aae904c3cd9a3c444">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00242.html#90b31e2954c6e4596c7900435a5f [...]
+: <a class="el" href="a00235.html#3336ba9480fd6c43e158f9beb024c050">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>, <a class="el" href="a00234.html#392a46759af2c884957115771affa7f4">tbb::blocked_range2d< RowValue, ColValue ></a><li>compact()
+: <a class="el" href="a00250.html#1693d1da41b1a8235871be9c6633be35">tbb::concurrent_vector< T, A ></a><li>concurrent_bounded_queue()
+: <a class="el" href="a00242.html#a5e04dcd7db9fd9b583b4e7df832246a">tbb::concurrent_bounded_queue< T, A ></a><li>concurrent_hash_map()
+: <a class="el" href="a00243.html#83c40f2053f208861b90390e12a36436">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>concurrent_priority_queue()
+: <a class="el" href="a00247.html#c8b20e7430c5302936030bef59a562be">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>concurrent_queue()
+: <a class="el" href="a00249.html#9102b897776bd2d9e908e6604ff16b5f">tbb::deprecated::concurrent_queue< T, A ></a>, <a class="el" href="a00248.html#8a6b98ea11a867db8ac868f0113ca429">tbb::strict_ppl::concurrent_queue< T, A ></a><li>concurrent_vector()
+: <a class="el" href="a00250.html#4450de83c5862ea4bcd9443fd7e67419">tbb::concurrent_vector< T, A ></a><li>const_accessor()
+: <a class="el" href="a00246.html#27399c613eb1aecd4660803955dda09d">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a><li>const_iterator
+: <a class="el" href="a00233.html#1a8d05842c2b3dfc177bc4d347e4cef7">tbb::blocked_range< Value ></a><li>const_reference
+: <a class="el" href="a00242.html#796713d0b9ba93a4721cbe13e4474068">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00248.html#4d48e7ff93f81636bca2c74f7da34750">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00247.html#a4ded8601a434098605be0dcc4febc60">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>construct()
+: <a class="el" href="a00317.html#ab228ab9e324ed041c2226e1d717df5f">tbb::tbb_allocator< T ></a>, <a class="el" href="a00270.html#c7e1671b725894b94ce9a6ac544e24f2">tbb::interface6::memory_pool_allocator< T, P ></a>, <a class="el" href="a00238.html#958ee8745c86c275bfc9533af565e017">tbb::cache_aligned_allocator< T ></a><li>context()
+: <a class="el" href="a00311.html#d8c36a93f3972590fbb65ff1cef3173b">tbb::task</a><li>continue_node()
+: <a class="el" href="a00252.html#869562787fcb5c57a90aea120f26d492">tbb::flow::interface6::continue_node< Output ></a><li>continue_receiver()
+: <a class="el" href="a00253.html#a0b292ed7fa6556b2a735f6d1e82dc74">tbb::flow::interface6::continue_receiver</a><li>count()
+: <a class="el" href="a00243.html#6968eb6feed2df36be421df0464297af">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>crbegin()
+: <a class="el" href="a00250.html#db78a1d28c9c966050e8a2926d834a33">tbb::concurrent_vector< T, A ></a><li>crend()
+: <a class="el" href="a00250.html#fff9cece89438587997ebedf93c5e962">tbb::concurrent_vector< T, A ></a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/functions_0x64.html b/doc/html/functions_0x64.html
index b3be88e..9e2845e 100644
--- a/doc/html/functions_0x64.html
+++ b/doc/html/functions_0x64.html
@@ -62,15 +62,15 @@ 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="a00296.html#fdd011fdf2f9ad07006dc7c0a7ec1da2">tbb::tbb_allocator< T ></a>, <a class="el" href="a00280.html#f806a238c18cbcfb531e1e0a0d2ec59d">tbb::scalable_allocator< T ></a>, <a class="el" href="a00226.html#3d4eadf188f7d85d3805ae534e0b8e1c">tbb::cache_aligned_allocator< T ></a><li>decrement
-: <a class="el" href="a00255.html#181fa37d3e3c68ec3819ea46beed79a2">tbb::limiter_node< T ></a><li>decrement_ref_count()
-: <a class="el" href="a00291.html#ef4680f5c148020c5e7e43ddef44cd5d">tbb::task</a><li>decrement_wait_count()
-: <a class="el" href="a00250.html#ff3b6a3ef2ae1e661dcdb398c227b43c">tbb::graph</a><li>default_num_threads()
-: <a class="el" href="a00295.html#ba00714c33a41a3c2216f48613971cab">tbb::task_scheduler_init</a><li>deferred
-: <a class="el" href="a00295.html#e6c860f1e559026ff3ef4599c0d6c514">tbb::task_scheduler_init</a><li>destroy()
-: <a class="el" href="a00299.html#921875bbacd2c8a5f324c7da7a415262">tbb::internal::tbb_exception_ptr</a>, <a class="el" href="a00257.html#7a46873119d9f85a7b0009c13e41a258">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00228.html#93d875d3555502ff6f18513525de204c">tbb::captured_exception</a>, <a class="el" href="a00298.html#66c94938eca8bf88b76f3eccaaf215d8">tbb::tbb_exception</a>, <a class="el" href="a00296.html#ef133522bf55f05a605bee0763208281">tbb::tbb_allocator [...]
-: <a class="el" href="a00230.html#4b45c91297e69515d83d5eef85ae1f49">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00236.html#068576d16c7e4e05d52f9db7a45b5b65">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00235.html#77399bc76b3ecd60e33f7e35a5becd87">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>downgrade_to_reader()
-: <a class="el" href="a00289.html#c2c2c38a08cb9080e87099fac3e5bc94">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00273.html#0d2f93edf7b15ec4bcee138823220c52">tbb::queuing_rw_mutex::scoped_lock</a></ul>
+: <a class="el" href="a00317.html#fdd011fdf2f9ad07006dc7c0a7ec1da2">tbb::tbb_allocator< T ></a>, <a class="el" href="a00299.html#f806a238c18cbcfb531e1e0a0d2ec59d">tbb::scalable_allocator< T ></a>, <a class="el" href="a00270.html#4e24a03de38638af07548383024c54ab">tbb::interface6::memory_pool_allocator< T, P ></a>, <a class="el" href="a00238.html#3d4eadf188f7d85d3805ae534e0b8e1c">tbb::cache_aligned_allocator< T ></a><li>decrement
+: <a class="el" href="a00266.html#a3344b2461966631b6ee34b79fb105c7">tbb::flow::interface6::limiter_node< T ></a><li>decrement_ref_count()
+: <a class="el" href="a00311.html#ef4680f5c148020c5e7e43ddef44cd5d">tbb::task</a><li>decrement_wait_count()
+: <a class="el" href="a00262.html#29b85506870f13a884a21655aec2a65d">tbb::flow::interface6::graph</a><li>default_num_threads()
+: <a class="el" href="a00316.html#ba00714c33a41a3c2216f48613971cab">tbb::task_scheduler_init</a><li>deferred
+: <a class="el" href="a00316.html#e6c860f1e559026ff3ef4599c0d6c514">tbb::task_scheduler_init</a><li>destroy()
+: <a class="el" href="a00320.html#921875bbacd2c8a5f324c7da7a415262">tbb::internal::tbb_exception_ptr</a>, <a class="el" href="a00273.html#7a46873119d9f85a7b0009c13e41a258">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00240.html#93d875d3555502ff6f18513525de204c">tbb::captured_exception</a>, <a class="el" href="a00319.html#66c94938eca8bf88b76f3eccaaf215d8">tbb::tbb_exception</a>, <a class="el" href="a00317.html#ef133522bf55f05a605bee0763208281">tbb::tbb_allocator [...]
+: <a class="el" href="a00242.html#4b45c91297e69515d83d5eef85ae1f49">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00248.html#068576d16c7e4e05d52f9db7a45b5b65">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00247.html#77399bc76b3ecd60e33f7e35a5becd87">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>downgrade_to_reader()
+: <a class="el" href="a00308.html#c2c2c38a08cb9080e87099fac3e5bc94">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00291.html#0d2f93edf7b15ec4bcee138823220c52">tbb::queuing_rw_mutex::scoped_lock</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/functions_0x65.html b/doc/html/functions_0x65.html
index 3033112..89bfe0d 100644
--- a/doc/html/functions_0x65.html
+++ b/doc/html/functions_0x65.html
@@ -61,17 +61,27 @@
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_e">- e -</a></h3><ul>
-<li>empty()
-: <a class="el" href="a00294.html#f3ac31e092814b90929f81bb30441959">tbb::task_list</a>, <a class="el" href="a00243.html#72595886d0ac8fd0543f90038570510d">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00238.html#c6426cb93cf20d3af40f3c90f1f0481a">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00230.html#f64924f2ee9225c368a270fc3c394db9">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00236.htm [...]
-: <a class="el" href="a00243.html#cb448bb4977ce366ceb7344085cc7050">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00238.html#1e6aa764ce5a1cbd24526f68bc0a2f6b">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00221.html#8b929d93ddc13f148b11bceef3a3bdf8">tbb::blocked_range< Value ></a>, <a class="el" href="a00215.html#024be075c23c0394c9a2518d993bcd9e">tbb::aligned_space< T, N ></a><li>enqueue()
-: <a class="el" href="a00291.html#fe6bf6aaf84e664134fabb6c4f409ea9">tbb::task</a><li>enumerable_thread_specific()
-: <a class="el" href="a00243.html#7bce6829981c9efe3f59cae2355e383e">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a><li>erase()
-: <a class="el" href="a00231.html#5f12d150d421420965db07368666a84f">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>exact_exception_propagation
-: <a class="el" href="a00245.html#f17200974c33be21f42a5f00893de028">tbb::filter</a><li>exclude()
-: <a class="el" href="a00231.html#0c964214eb38f54603aa75fdff6d2709">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>executable_node()
-: <a class="el" href="a00244.html#c13030111d34feeafd9cdb1dd21584f1">tbb::executable_node< Output ></a><li>execute()
-: <a class="el" href="a00291.html#22c298cd40937a431a06777423f002f6">tbb::task</a>, <a class="el" href="a00241.html#e6bf1d21e670b78ea00c71fccbe17c78">tbb::continue_receiver</a>, <a class="el" href="a00214.html#282d5a2f1216b185c91ed23d00119481">tbb::interface6::internal::aggregator< handler_type, operation_type ></a><li>executing
-: <a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293ead0fe2302ccc360923f738c2ed7ec1b9">tbb::task</a></ul>
+<li>ec_bad_arg
+: <a class="el" href="a00298.html#6831be91cdc64e57e565ce0dde01878927e94a7b173bb8d0623bf48aad8fc703">tbb::interface6::runtime_loader</a><li>ec_bad_call
+: <a class="el" href="a00298.html#6831be91cdc64e57e565ce0dde018789e6ce2b091083b80878cbb70cd00782a1">tbb::interface6::runtime_loader</a><li>ec_bad_lib
+: <a class="el" href="a00298.html#6831be91cdc64e57e565ce0dde01878903ee81d8c05966bc1125666713dee5f6">tbb::interface6::runtime_loader</a><li>ec_bad_ver
+: <a class="el" href="a00298.html#6831be91cdc64e57e565ce0dde01878907790f32918e60d670a96c1f0349e8d6">tbb::interface6::runtime_loader</a><li>ec_no_lib
+: <a class="el" href="a00298.html#6831be91cdc64e57e565ce0dde01878902acc03ebfcdb16e3e26b24f64da2bdb">tbb::interface6::runtime_loader</a><li>ec_ok
+: <a class="el" href="a00298.html#6831be91cdc64e57e565ce0dde0187891e3a364f63f419e5ea2f1d1e52289b27">tbb::interface6::runtime_loader</a><li>em_abort
+: <a class="el" href="a00298.html#bb0130fe0f596399707e61431231ebcb630dd30c9ba61d5ab187e80313bbad94">tbb::interface6::runtime_loader</a><li>em_status
+: <a class="el" href="a00298.html#bb0130fe0f596399707e61431231ebcbdb47fe5ffbd2eaf47e6de0af433ada38">tbb::interface6::runtime_loader</a><li>em_throw
+: <a class="el" href="a00298.html#bb0130fe0f596399707e61431231ebcbdeb59ca2912432b47fd3ec831574653b">tbb::interface6::runtime_loader</a><li>empty()
+: <a class="el" href="a00315.html#f3ac31e092814b90929f81bb30441959">tbb::task_list</a>, <a class="el" href="a00255.html#72595886d0ac8fd0543f90038570510d">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00250.html#c6426cb93cf20d3af40f3c90f1f0481a">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00242.html#f64924f2ee9225c368a270fc3c394db9">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00248.htm [...]
+: <a class="el" href="a00255.html#cb448bb4977ce366ceb7344085cc7050">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00250.html#1e6aa764ce5a1cbd24526f68bc0a2f6b">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00233.html#8b929d93ddc13f148b11bceef3a3bdf8">tbb::blocked_range< Value ></a>, <a class="el" href="a00227.html#024be075c23c0394c9a2518d993bcd9e">tbb::aligned_space< T, N ></a><li>enqueue()
+: <a class="el" href="a00311.html#fe6bf6aaf84e664134fabb6c4f409ea9">tbb::task</a><li>enumerable_thread_specific()
+: <a class="el" href="a00255.html#7bce6829981c9efe3f59cae2355e383e">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a><li>erase()
+: <a class="el" href="a00243.html#5f12d150d421420965db07368666a84f">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>error_code
+: <a class="el" href="a00298.html#6831be91cdc64e57e565ce0dde018789">tbb::interface6::runtime_loader</a><li>error_mode
+: <a class="el" href="a00298.html#bb0130fe0f596399707e61431231ebcb">tbb::interface6::runtime_loader</a><li>exact_exception_propagation
+: <a class="el" href="a00256.html#f17200974c33be21f42a5f00893de028">tbb::filter</a><li>exclude()
+: <a class="el" href="a00243.html#0c964214eb38f54603aa75fdff6d2709">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>execute()
+: <a class="el" href="a00311.html#22c298cd40937a431a06777423f002f6">tbb::task</a>, <a class="el" href="a00253.html#40ca8b7e96c5bc3428b4d1e409725ee5">tbb::flow::interface6::continue_receiver</a><li>executing
+: <a class="el" href="a00311.html#4a3c415562d17905390ea5b49d12293ead0fe2302ccc360923f738c2ed7ec1b9">tbb::task</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/functions_0x66.html b/doc/html/functions_0x66.html
index f710d19..98f21be 100644
--- a/doc/html/functions_0x66.html
+++ b/doc/html/functions_0x66.html
@@ -62,16 +62,16 @@ 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="a00245.html#dd6a6e7210efc9bcaf2c5e08767d92b5">tbb::filter</a><li>filter_is_out_of_order
-: <a class="el" href="a00245.html#2e5eb65f95d8050186278077e433c5b1">tbb::filter</a><li>filter_is_serial
-: <a class="el" href="a00245.html#4b7de3a76e744f3d9c1bc5d437ea851d">tbb::filter</a><li>filter_may_emit_null
-: <a class="el" href="a00245.html#bdd02a434a6e7499dd1e8f43aae96793">tbb::filter</a><li>finalize()
-: <a class="el" href="a00245.html#56275eb889c77c4807967133e21401bd">tbb::filter</a><li>find()
-: <a class="el" href="a00231.html#7bc475d1968f7f0af3d736d7e8a0d7df">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>forward()
-: <a class="el" href="a00225.html#3a31b3b55bee417de3af09c7b45b9ad6">tbb::buffer_node< T ></a><li>freed
-: <a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293ecc67ca92bd6f1ce9738a1e9e7206b735">tbb::task</a><li>front()
-: <a class="el" href="a00238.html#502615a858eb9fa0390ee59169065e90">tbb::concurrent_vector< T, A ></a><li>function_node()
-: <a class="el" href="a00249.html#7bde12e8ee43d4cafbdd5b1fc2031e2b">tbb::function_node< Input, Output ></a></ul>
+: <a class="el" href="a00256.html#dd6a6e7210efc9bcaf2c5e08767d92b5">tbb::filter</a><li>filter_is_out_of_order
+: <a class="el" href="a00256.html#2e5eb65f95d8050186278077e433c5b1">tbb::filter</a><li>filter_is_serial
+: <a class="el" href="a00256.html#4b7de3a76e744f3d9c1bc5d437ea851d">tbb::filter</a><li>filter_may_emit_null
+: <a class="el" href="a00256.html#bdd02a434a6e7499dd1e8f43aae96793">tbb::filter</a><li>finalize()
+: <a class="el" href="a00256.html#56275eb889c77c4807967133e21401bd">tbb::filter</a><li>find()
+: <a class="el" href="a00243.html#7bc475d1968f7f0af3d736d7e8a0d7df">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>forward()
+: <a class="el" href="a00237.html#2648324ce0a38b40132b8502ef250e3a">tbb::flow::interface6::buffer_node< T, A ></a><li>freed
+: <a class="el" href="a00311.html#4a3c415562d17905390ea5b49d12293ecc67ca92bd6f1ce9738a1e9e7206b735">tbb::task</a><li>front()
+: <a class="el" href="a00250.html#502615a858eb9fa0390ee59169065e90">tbb::concurrent_vector< T, A ></a><li>function_node()
+: <a class="el" href="a00261.html#01055081ed477714503820035db3a965">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a>, <a class="el" href="a00260.html#d5132323fd2ac6a00ea0c78beda78723">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/functions_0x67.html b/doc/html/functions_0x67.html
index f9096f0..b1ff300 100644
--- a/doc/html/functions_0x67.html
+++ b/doc/html/functions_0x67.html
@@ -62,14 +62,13 @@ 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="a00238.html#2fdba8e90de6a4d2300222236d46758e">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00230.html#415eb87e53b1c6a266de06ecbc490d16">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00236.html#f034f70caef445fe8abc9113ec926a8d">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00235.html#d545d444fb0d16148f9b61fd89f9a337">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a>, <a class="e [...]
-: <a class="el" href="a00221.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">tbb::blocked_range< Value ></a><li>graph()
-: <a class="el" href="a00250.html#1ba8311506558a2419101722f5d49ba9">tbb::graph</a><li>group()
-: <a class="el" href="a00291.html#5987123486afca36ddebb9e2a8b7779a">tbb::task</a><li>group_priority()
-: <a class="el" href="a00291.html#e1d969a1ccab6796e3b8b2c1a5be33d2">tbb::task</a><li>grow_by()
-: <a class="el" href="a00238.html#473a59a4c9308b93411b898b3110d26c">tbb::concurrent_vector< T, A ></a><li>grow_my_array()
-: <a class="el" href="a00225.html#3ec9d33aa9f1e9292d5952e3eb477ca1">tbb::buffer_node< T ></a><li>grow_to_at_least()
-: <a class="el" href="a00238.html#a7e3b67c8ccab16d0aecc80899ae799d">tbb::concurrent_vector< T, A ></a></ul>
+: <a class="el" href="a00250.html#2fdba8e90de6a4d2300222236d46758e">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00242.html#415eb87e53b1c6a266de06ecbc490d16">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00248.html#f034f70caef445fe8abc9113ec926a8d">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00247.html#d545d444fb0d16148f9b61fd89f9a337">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a>, <a class="e [...]
+: <a class="el" href="a00233.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">tbb::blocked_range< Value ></a><li>graph()
+: <a class="el" href="a00262.html#4ab3d4b5208ece28c4c3ced647e26e12">tbb::flow::interface6::graph</a><li>group()
+: <a class="el" href="a00311.html#5987123486afca36ddebb9e2a8b7779a">tbb::task</a><li>group_priority()
+: <a class="el" href="a00311.html#e1d969a1ccab6796e3b8b2c1a5be33d2">tbb::task</a><li>grow_by()
+: <a class="el" href="a00250.html#473a59a4c9308b93411b898b3110d26c">tbb::concurrent_vector< T, A ></a><li>grow_to_at_least()
+: <a class="el" href="a00250.html#a7e3b67c8ccab16d0aecc80899ae799d">tbb::concurrent_vector< T, A ></a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/functions_0x69.html b/doc/html/functions_0x69.html
index 732763d..875163c 100644
--- a/doc/html/functions_0x69.html
+++ b/doc/html/functions_0x69.html
@@ -62,29 +62,29 @@ 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="a00291.html#f5fb43c7ad0de5a4b95703cebc39e345">tbb::task</a><li>increment_wait_count()
-: <a class="el" href="a00250.html#1e5c5ae6538ec714cee107d1004705b9">tbb::graph</a><li>init()
-: <a class="el" href="a00293.html#49a55352084fd44b8863d182e839e6dc">tbb::task_group_context</a><li>initialize()
-: <a class="el" href="a00295.html#d5ed214a8bb53b0466ed91ff4734b9a3">tbb::task_scheduler_init</a><li>input_type
-: <a class="el" href="a00304.html#0f464d59e15941d6d625e8c7d634e26b">tbb::internal::two_phase_port< T ></a>, <a class="el" href="a00255.html#f654b8974c613e8fd3de5a40e181d5ff">tbb::limiter_node< T ></a>, <a class="el" href="a00268.html#40fdedd4829aeae3ebd1a5fdaf39b23d">tbb::priority_queue_node< T, Compare ></a>, <a class="el" href="a00283.html#a73e4a3ae6c430281f08226d448ebfc8">tbb::sequencer_node< T ></a>, <a class="el" href="a00269.html#27016487003a4ff2908748c3cf11 [...]
-: <a class="el" href="a00231.html#1dd37fad87e561151ba1e242ca94bcc1">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>internal_copy()
-: <a class="el" href="a00231.html#72c9c9e9655fcf096f5f0ed9c8ba6669">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>internal_equal_range()
-: <a class="el" href="a00231.html#8f5373b8e1864619d1ffcf3bf3f1f13d">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>internal_fast_find()
-: <a class="el" href="a00231.html#2f76ed101a0ccc8875b846c2f747897e">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>internal_forward()
-: <a class="el" href="a00268.html#79161e73f79cc43b2c2b08367504dfda">tbb::priority_queue_node< T, Compare ></a>, <a class="el" href="a00269.html#fb58bac5ac355e5134c51125e601fa2a">tbb::queue_node< T ></a>, <a class="el" href="a00225.html#a3cb61d8a98bc4bc860b1cb04944b4f8">tbb::buffer_node< T ></a><li>internal_reg_succ()
-: <a class="el" href="a00225.html#017f16c8d6e0fb65d0d3a61aec86b3e2">tbb::buffer_node< T ></a><li>internal_rem_succ()
-: <a class="el" href="a00225.html#a75f731cf9fc93f7487eb72de3fcf7b1">tbb::buffer_node< T ></a><li>interval_t()
-: <a class="el" href="a00303.html#1a21a428e00cced2e6a49e0f5f2258bf">tbb::tick_count::interval_t</a><li>is_active()
-: <a class="el" href="a00295.html#12752282977029f23416642bc03e8b74">tbb::task_scheduler_init</a><li>is_bound()
-: <a class="el" href="a00245.html#15c29cae5d237e6d63dbfe5c94af89d5">tbb::filter</a><li>is_cancelled()
-: <a class="el" href="a00291.html#025f18118c057c4c8db87ff2ce8df975">tbb::task</a><li>is_divisible()
-: <a class="el" href="a00223.html#39d69191721c488e737ae5d9c5336b9c">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>, <a class="el" href="a00222.html#ad36a9b38e4fef26d376f99552ce2d92">tbb::blocked_range2d< RowValue, ColValue ></a>, <a class="el" href="a00221.html#41a58b703d574b6e1ca155df3576f578">tbb::blocked_range< Value ></a><li>is_group_execution_cancelled()
-: <a class="el" href="a00293.html#4db72f16210b0a991b2c134d6763a4cc">tbb::task_group_context</a><li>is_ordered()
-: <a class="el" href="a00245.html#cd53206c4795ef2df5df26b795caf692">tbb::filter</a><li>is_owned_by_current_thread()
-: <a class="el" href="a00291.html#c26718b3b247cd13deb1a741902e7105">tbb::task</a><li>is_serial()
-: <a class="el" href="a00245.html#fcfec27656a69ff2072802ac001e936f">tbb::filter</a><li>is_stolen_task()
-: <a class="el" href="a00291.html#f9169402702f56bf519448aaf34450aa">tbb::task</a><li>is_writer
-: <a class="el" href="a00233.html#07d958f151a0eaa92f50fd56ad6440e2">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a>, <a class="el" href="a00289.html#6b5a7c3c67a36b05c4df8410d32627d8">tbb::spin_rw_mutex_v3::scoped_lock</a></ul>
+: <a class="el" href="a00311.html#f5fb43c7ad0de5a4b95703cebc39e345">tbb::task</a><li>increment_wait_count()
+: <a class="el" href="a00262.html#a993b789d1e488e0c3929135beae560e">tbb::flow::interface6::graph</a><li>init()
+: <a class="el" href="a00313.html#49a55352084fd44b8863d182e839e6dc">tbb::task_group_context</a><li>initialize()
+: <a class="el" href="a00316.html#d5ed214a8bb53b0466ed91ff4734b9a3">tbb::task_scheduler_init</a><li>input_type
+: <a class="el" href="a00266.html#035196d3c9240ef041f528ebcde8baa7">tbb::flow::interface6::limiter_node< T ></a>, <a class="el" href="a00286.html#b2829b518979874ad3d2a939e14ae7bd">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>, <a class="el" href="a00302.html#af629f26832ff4e476e240637a78bc0c">tbb::flow::interface6::sequencer_node< T, A ></a>, <a class="el" href="a00287.html#1e71030845210b6c4c7380eb9e11a2ac">tbb::flow::interface6::queue_node< T, A > [...]
+: <a class="el" href="a00243.html#1dd37fad87e561151ba1e242ca94bcc1">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>internal_copy()
+: <a class="el" href="a00243.html#72c9c9e9655fcf096f5f0ed9c8ba6669">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>internal_equal_range()
+: <a class="el" href="a00243.html#8f5373b8e1864619d1ffcf3bf3f1f13d">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>internal_fast_find()
+: <a class="el" href="a00243.html#2f76ed101a0ccc8875b846c2f747897e">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>internal_forward()
+: <a class="el" href="a00286.html#ed2d8dc0a9c1c2571e4a69df2f2209e5">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>, <a class="el" href="a00287.html#eadcbbb81f9a9d223afabe0f40e77ecb">tbb::flow::interface6::queue_node< T, A ></a>, <a class="el" href="a00237.html#dcbffbae514f4d95205b0845785c0a91">tbb::flow::interface6::buffer_node< T, A ></a><li>internal_reg_succ()
+: <a class="el" href="a00237.html#df21388252b8963e839dca29d2c67ea5">tbb::flow::interface6::buffer_node< T, A ></a><li>internal_rem_succ()
+: <a class="el" href="a00237.html#6b6cf76dff80fd679251da93351c1291">tbb::flow::interface6::buffer_node< T, A ></a><li>interval_t()
+: <a class="el" href="a00324.html#1a21a428e00cced2e6a49e0f5f2258bf">tbb::tick_count::interval_t</a><li>is_active()
+: <a class="el" href="a00316.html#12752282977029f23416642bc03e8b74">tbb::task_scheduler_init</a><li>is_bound()
+: <a class="el" href="a00256.html#15c29cae5d237e6d63dbfe5c94af89d5">tbb::filter</a><li>is_cancelled()
+: <a class="el" href="a00311.html#025f18118c057c4c8db87ff2ce8df975">tbb::task</a><li>is_divisible()
+: <a class="el" href="a00235.html#39d69191721c488e737ae5d9c5336b9c">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>, <a class="el" href="a00234.html#ad36a9b38e4fef26d376f99552ce2d92">tbb::blocked_range2d< RowValue, ColValue ></a>, <a class="el" href="a00233.html#41a58b703d574b6e1ca155df3576f578">tbb::blocked_range< Value ></a><li>is_group_execution_cancelled()
+: <a class="el" href="a00313.html#4db72f16210b0a991b2c134d6763a4cc">tbb::task_group_context</a><li>is_ordered()
+: <a class="el" href="a00256.html#cd53206c4795ef2df5df26b795caf692">tbb::filter</a><li>is_owned_by_current_thread()
+: <a class="el" href="a00311.html#c26718b3b247cd13deb1a741902e7105">tbb::task</a><li>is_serial()
+: <a class="el" href="a00256.html#fcfec27656a69ff2072802ac001e936f">tbb::filter</a><li>is_stolen_task()
+: <a class="el" href="a00311.html#f9169402702f56bf519448aaf34450aa">tbb::task</a><li>is_writer
+: <a class="el" href="a00245.html#07d958f151a0eaa92f50fd56ad6440e2">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a>, <a class="el" href="a00308.html#6b5a7c3c67a36b05c4df8410d32627d8">tbb::spin_rw_mutex_v3::scoped_lock</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/functions_0x6c.html b/doc/html/functions_0x6c.html
index 89e6902..1017946 100644
--- a/doc/html/functions_0x6c.html
+++ b/doc/html/functions_0x6c.html
@@ -62,11 +62,12 @@ Here is a list of all documented class members with links to the class documenta
<p>
<h3><a class="anchor" name="index_l">- l -</a></h3><ul>
<li>limiter_node()
-: <a class="el" href="a00255.html#f0139fc645a51ce30b7aebb59c38a4ed">tbb::limiter_node< T ></a><li>local()
-: <a class="el" href="a00243.html#7dc79058d2832f7447de8e691c3455ea">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a><li>lock()
-: <a class="el" href="a00288.html#4007d6e1523dbc3c2bb7f889ab789a8a">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00286.html#4f748989e19b6045e3a2d2ee73626a28">tbb::spin_mutex</a>, <a class="el" href="a00278.html#4c342c69d47f4bb0b393535dee4015d6">tbb::recursive_mutex</a>, <a class="el" href="a00274.html#2653d1a2d560059a51219a8ceab3ade9">tbb::interface5::reader_writer_lock</a>, <a class="el" href="a00258.html#4470e61c24c129a0299ca6c17240adbb">tbb::mutex</a><li>lock_read()
-: <a class="el" href="a00288.html#13f799708ac4ca437a16be202e263e18">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00274.html#d9d16a24d9f6c3dada73c6b9ff214f5b">tbb::interface5::reader_writer_lock</a><li>lookup()
-: <a class="el" href="a00231.html#3f3413264a99174a224ef96f6c4ea769">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></ul>
+: <a class="el" href="a00266.html#83d3ab884543b070ee5b345a87f241fa">tbb::flow::interface6::limiter_node< T ></a><li>load()
+: <a class="el" href="a00298.html#5f3f6f1683386705a6931acae45f0862">tbb::interface6::runtime_loader</a><li>local()
+: <a class="el" href="a00255.html#7dc79058d2832f7447de8e691c3455ea">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a><li>lock()
+: <a class="el" href="a00307.html#4007d6e1523dbc3c2bb7f889ab789a8a">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00305.html#4f748989e19b6045e3a2d2ee73626a28">tbb::spin_mutex</a>, <a class="el" href="a00296.html#4c342c69d47f4bb0b393535dee4015d6">tbb::recursive_mutex</a>, <a class="el" href="a00292.html#2653d1a2d560059a51219a8ceab3ade9">tbb::interface5::reader_writer_lock</a>, <a class="el" href="a00275.html#4470e61c24c129a0299ca6c17240adbb">tbb::mutex</a><li>lock_read()
+: <a class="el" href="a00307.html#13f799708ac4ca437a16be202e263e18">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00292.html#d9d16a24d9f6c3dada73c6b9ff214f5b">tbb::interface5::reader_writer_lock</a><li>lookup()
+: <a class="el" href="a00243.html#3f3413264a99174a224ef96f6c4ea769">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/functions_0x6d.html b/doc/html/functions_0x6d.html
index 95a0db3..b50d20d 100644
--- a/doc/html/functions_0x6d.html
+++ b/doc/html/functions_0x6d.html
@@ -62,12 +62,13 @@ 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="a00246.html#85c2892eff1fddcd06e28911e75838bd">tbb::interface6::filter_t< T, U ></a><li>malloc_type
-: <a class="el" href="a00296.html#09a7f81fb2c3055aaecf058b11538544">tbb::tbb_allocator< T ></a><li>max_size()
-: <a class="el" href="a00296.html#f059ca2c96243024f0d562ee3a87a3a5">tbb::tbb_allocator< T ></a>, <a class="el" href="a00280.html#880e766f1d913988c21973dbdd874fd5">tbb::scalable_allocator< T ></a>, <a class="el" href="a00238.html#2c248a017f0576df3e7cd99627836fd6">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00231.html#2bce57fe9b594abe1e6d2568aea8b357">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>, <a class="el" href="a00226. [...]
-: <a class="el" href="a00257.html#1aea0ad179d6f0481fe7f3495f66adf9">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00228.html#837a50b8f6a800bda225c39d1699643f">tbb::captured_exception</a>, <a class="el" href="a00298.html#3e3482bf264d4ca4dde046cd9c02c766">tbb::tbb_exception</a><li>mutex
-: <a class="el" href="a00258.html#05313cb77d4f85213103d4dab74ed454">tbb::mutex</a>, <a class="el" href="a00289.html#d96d1a1fcc3d79ef3e5c06a53b8ffeaa">tbb::spin_rw_mutex_v3::scoped_lock</a><li>my_exception_data
-: <a class="el" href="a00257.html#a8c0ae2089ae784b28907cf748b89416">tbb::movable_exception< ExceptionData ></a></ul>
+: <a class="el" href="a00257.html#85c2892eff1fddcd06e28911e75838bd">tbb::interface6::filter_t< T, U ></a><li>malloc_type
+: <a class="el" href="a00317.html#09a7f81fb2c3055aaecf058b11538544">tbb::tbb_allocator< T ></a><li>max_size()
+: <a class="el" href="a00317.html#f059ca2c96243024f0d562ee3a87a3a5">tbb::tbb_allocator< T ></a>, <a class="el" href="a00299.html#880e766f1d913988c21973dbdd874fd5">tbb::scalable_allocator< T ></a>, <a class="el" href="a00270.html#beebdb6144df8ba219fadfad4de866ea">tbb::interface6::memory_pool_allocator< T, P ></a>, <a class="el" href="a00250.html#2c248a017f0576df3e7cd99627836fd6">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00243.html#2bce57fe9b594abe1e6 [...]
+: <a class="el" href="a00269.html#2822528265718a4c779591fc37c02ca8">tbb::interface6::memory_pool< Alloc ></a><li>move()
+: <a class="el" href="a00273.html#1aea0ad179d6f0481fe7f3495f66adf9">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00240.html#837a50b8f6a800bda225c39d1699643f">tbb::captured_exception</a>, <a class="el" href="a00319.html#3e3482bf264d4ca4dde046cd9c02c766">tbb::tbb_exception</a><li>mutex
+: <a class="el" href="a00275.html#05313cb77d4f85213103d4dab74ed454">tbb::mutex</a>, <a class="el" href="a00308.html#d96d1a1fcc3d79ef3e5c06a53b8ffeaa">tbb::spin_rw_mutex_v3::scoped_lock</a><li>my_exception_data
+: <a class="el" href="a00273.html#a8c0ae2089ae784b28907cf748b89416">tbb::movable_exception< ExceptionData ></a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/functions_0x6e.html b/doc/html/functions_0x6e.html
index 7755321..6105f3d 100644
--- a/doc/html/functions_0x6e.html
+++ b/doc/html/functions_0x6e.html
@@ -62,10 +62,10 @@ 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="a00257.html#bc5f5c4739b17ac5211ac58226c2f5a5">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00228.html#5af82fd677449c5ca727fa1d7e16f9f5">tbb::captured_exception</a>, <a class="el" href="a00298.html#d00f6497e552fee978a02bfcbebf46e2">tbb::tbb_exception</a><li>native_handle_type
-: <a class="el" href="a00278.html#889fa8cc32dd707eef7c0f52dda09c0d">tbb::recursive_mutex</a>, <a class="el" href="a00258.html#9f1ec84d5815263ceae853f06ddb4cac">tbb::mutex</a><li>note_affinity()
-: <a class="el" href="a00291.html#713c338c8eeaebdc5a6b10a69c039b06">tbb::task</a><li>now()
-: <a class="el" href="a00302.html#fb7f78ca61cf28398645ace66e284473">tbb::tick_count</a></ul>
+: <a class="el" href="a00273.html#bc5f5c4739b17ac5211ac58226c2f5a5">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00240.html#5af82fd677449c5ca727fa1d7e16f9f5">tbb::captured_exception</a>, <a class="el" href="a00319.html#d00f6497e552fee978a02bfcbebf46e2">tbb::tbb_exception</a><li>native_handle_type
+: <a class="el" href="a00296.html#889fa8cc32dd707eef7c0f52dda09c0d">tbb::recursive_mutex</a>, <a class="el" href="a00275.html#9f1ec84d5815263ceae853f06ddb4cac">tbb::mutex</a><li>note_affinity()
+: <a class="el" href="a00311.html#713c338c8eeaebdc5a6b10a69c039b06">tbb::task</a><li>now()
+: <a class="el" href="a00323.html#fb7f78ca61cf28398645ace66e284473">tbb::tick_count</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/functions_0x6f.html b/doc/html/functions_0x6f.html
index 9bef6ab..8053111 100644
--- a/doc/html/functions_0x6f.html
+++ b/doc/html/functions_0x6f.html
@@ -62,18 +62,18 @@ 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="a00245.html#8ec4dfe053e94a2349d56781ddea8477">tbb::filter</a><li>operator *()
-: <a class="el" href="a00232.html#170280ea807a22e742095de3e8c5ea38">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a>, <a class="el" href="a00234.html#9411df8197ceb4881ec4c7368a0a7f88">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a><li>operator delete()
-: <a class="el" href="a00298.html#3f2da7f3d8a6e4c1df522af1213afb5a">tbb::tbb_exception</a><li>operator()()
-: <a class="el" href="a00245.html#fa1b3dc1f4f47563ccab7f4d92f5b543">tbb::filter</a>, <a class="el" href="a00233.html#fa6314b861c574f86ed189b124cf5853">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a><li>operator+
-: <a class="el" href="a00303.html#5871ead1ca230efbe52a5008470e6428">tbb::tick_count::interval_t</a><li>operator+=()
-: <a class="el" href="a00303.html#cd9814947902e26463a69a111530f81b">tbb::tick_count::interval_t</a><li>operator-
-: <a class="el" href="a00302.html#09dde78a4100800c11bb883d6204b586">tbb::tick_count</a>, <a class="el" href="a00303.html#fa509691e1d689830931e36edd274f76">tbb::tick_count::interval_t</a><li>operator-=()
-: <a class="el" href="a00303.html#35ff7eaf7c2031b4a991402ac9ecb940">tbb::tick_count::interval_t</a><li>operator->()
-: <a class="el" href="a00232.html#a807920cdffe3ec5c5e282b4d1ff92a2">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a>, <a class="el" href="a00234.html#3d03a48ecb8cd9549bd8be64b09c9b0d">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a><li>operator=()
-: <a class="el" href="a00238.html#19f4ab88a01b0fd056af3bba463e7bd6">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00235.html#2ab7f7808891027ac0f0f5b3a4be51e9">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a>, <a class="el" href="a00231.html#088d1aaccc816884a49e38f7065622c8">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>operator[]()
-: <a class="el" href="a00238.html#c6fade5c732cc95274d1d8277ea619d1">tbb::concurrent_vector< T, A ></a><li>output_type
-: <a class="el" href="a00254.html#578893d923f91b7e44a15dea8b0d7082">tbb::internal::join_node_base< JP, InputTuple, OutputTuple ></a>, <a class="el" href="a00255.html#370f88278dec6f584c1d08a375f9b4cd">tbb::limiter_node< T ></a>, <a class="el" href="a00268.html#3b3fa4479416e7cb6d4a6a4b175c2b15">tbb::priority_queue_node< T, Compare ></a>, <a class="el" href="a00283.html#0c613bb01103dfcfbc3f9cbe943f95b0">tbb::sequencer_node< T ></a>, <a class="el" href="a00269.html#d2 [...]
+: <a class="el" href="a00256.html#8ec4dfe053e94a2349d56781ddea8477">tbb::filter</a><li>operator *()
+: <a class="el" href="a00244.html#170280ea807a22e742095de3e8c5ea38">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a>, <a class="el" href="a00246.html#9411df8197ceb4881ec4c7368a0a7f88">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a><li>operator delete()
+: <a class="el" href="a00319.html#3f2da7f3d8a6e4c1df522af1213afb5a">tbb::tbb_exception</a><li>operator()()
+: <a class="el" href="a00256.html#fa1b3dc1f4f47563ccab7f4d92f5b543">tbb::filter</a>, <a class="el" href="a00245.html#fa6314b861c574f86ed189b124cf5853">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a><li>operator+
+: <a class="el" href="a00324.html#5871ead1ca230efbe52a5008470e6428">tbb::tick_count::interval_t</a><li>operator+=()
+: <a class="el" href="a00324.html#cd9814947902e26463a69a111530f81b">tbb::tick_count::interval_t</a><li>operator-
+: <a class="el" href="a00323.html#09dde78a4100800c11bb883d6204b586">tbb::tick_count</a>, <a class="el" href="a00324.html#fa509691e1d689830931e36edd274f76">tbb::tick_count::interval_t</a><li>operator-=()
+: <a class="el" href="a00324.html#35ff7eaf7c2031b4a991402ac9ecb940">tbb::tick_count::interval_t</a><li>operator->()
+: <a class="el" href="a00244.html#a807920cdffe3ec5c5e282b4d1ff92a2">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a>, <a class="el" href="a00246.html#3d03a48ecb8cd9549bd8be64b09c9b0d">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a><li>operator=()
+: <a class="el" href="a00250.html#19f4ab88a01b0fd056af3bba463e7bd6">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00247.html#2ab7f7808891027ac0f0f5b3a4be51e9">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a>, <a class="el" href="a00243.html#088d1aaccc816884a49e38f7065622c8">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>operator[]()
+: <a class="el" href="a00250.html#c6fade5c732cc95274d1d8277ea619d1">tbb::concurrent_vector< T, A ></a><li>output_type
+: <a class="el" href="a00266.html#6e67fc480147c0b88a483b85db6457b0">tbb::flow::interface6::limiter_node< T ></a>, <a class="el" href="a00286.html#2cb099b590246b6bc93cc15e78c6ee5c">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>, <a class="el" href="a00302.html#ca026eaef70e35791c407323199031a7">tbb::flow::interface6::sequencer_node< T, A ></a>, <a class="el" href="a00287.html#25b5a53ab1f9a342644fa3759bc0b1ad">tbb::flow::interface6::queue_node< T, A > [...]
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/functions_0x70.html b/doc/html/functions_0x70.html
index c3f3ee1..6f5fb7a 100644
--- a/doc/html/functions_0x70.html
+++ b/doc/html/functions_0x70.html
@@ -62,22 +62,22 @@ 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="a00223.html#b8ebf17a552ba47825e9b3887855b719">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a><li>pages()
-: <a class="el" href="a00223.html#cf971430aa12361d3ed245344b7c6764">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a><li>parallel_while()
-: <a class="el" href="a00265.html#36e26ba3880c7bcf804a97ba0cbe133f">tbb::parallel_while< Body ></a><li>parent()
-: <a class="el" href="a00291.html#314e98ee4347ccec83efcb9ee22e8596">tbb::task</a><li>pause()
-: <a class="el" href="a00218.html#a174ea93e3bd3d5cce82389c2f28d037">tbb::internal::atomic_backoff</a><li>pipeline()
-: <a class="el" href="a00266.html#596dc3beba27099c4c8581cb419e1a59">tbb::pipeline</a><li>pop()
-: <a class="el" href="a00230.html#41f4c6bd7a82ab070e840bbf81b0b123">tbb::concurrent_bounded_queue< T, A ></a><li>pop_front()
-: <a class="el" href="a00294.html#5fe85df5ed524418389d34051750347d">tbb::task_list</a><li>pop_if_present()
-: <a class="el" href="a00237.html#48da3536245318af6cb5fd58bac78039">tbb::deprecated::concurrent_queue< T, A ></a><li>predecessor_type
-: <a class="el" href="a00304.html#37ee9b5320b631c39bccc0b4745d88d1">tbb::internal::two_phase_port< T ></a>, <a class="el" href="a00255.html#fd88ce7670e7107aef2161b45f156185">tbb::limiter_node< T ></a>, <a class="el" href="a00268.html#98900a87758cac05500fcbc74113cebf">tbb::priority_queue_node< T, Compare ></a>, <a class="el" href="a00283.html#6581686ef0cf8e13c0270687628af5eb">tbb::sequencer_node< T ></a>, <a class="el" href="a00269.html#83bc7308a38f1d205377d78ec149 [...]
-: <a class="el" href="a00293.html#2f2342b9e6c9c03703248ac13ad0271d">tbb::task_group_context</a><li>priority_queue_node()
-: <a class="el" href="a00268.html#1630f68674c4b201346a391b1e8d3f5d">tbb::priority_queue_node< T, Compare ></a><li>process_item()
-: <a class="el" href="a00301.html#5e726bdc7fbd924c0b07bd558b1d4d5d">tbb::thread_bound_filter</a><li>push()
-: <a class="el" href="a00230.html#ceb08c743b11ba88c878e73fff8af20b">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00236.html#73c47563ffcc4c2f6452f25a04ebe2e2">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00235.html#d905af7b8f6defff562f5ae9c3275763">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>push_back()
-: <a class="el" href="a00294.html#4cd34756bc4763dafb8c84838a0124ff">tbb::task_list</a>, <a class="el" href="a00238.html#e94e038f915c0268fdf2d3d7f87d81b8">tbb::concurrent_vector< T, A ></a><li>push_if_not_full()
-: <a class="el" href="a00237.html#7c45561bafe71107d09b2bc1b8f4e681">tbb::deprecated::concurrent_queue< T, A ></a></ul>
+: <a class="el" href="a00235.html#b8ebf17a552ba47825e9b3887855b719">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a><li>pages()
+: <a class="el" href="a00235.html#cf971430aa12361d3ed245344b7c6764">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a><li>parallel_while()
+: <a class="el" href="a00282.html#36e26ba3880c7bcf804a97ba0cbe133f">tbb::parallel_while< Body ></a><li>parent()
+: <a class="el" href="a00311.html#314e98ee4347ccec83efcb9ee22e8596">tbb::task</a><li>pause()
+: <a class="el" href="a00230.html#a174ea93e3bd3d5cce82389c2f28d037">tbb::internal::atomic_backoff</a><li>pipeline()
+: <a class="el" href="a00284.html#596dc3beba27099c4c8581cb419e1a59">tbb::pipeline</a><li>pop()
+: <a class="el" href="a00242.html#41f4c6bd7a82ab070e840bbf81b0b123">tbb::concurrent_bounded_queue< T, A ></a><li>pop_front()
+: <a class="el" href="a00315.html#5fe85df5ed524418389d34051750347d">tbb::task_list</a><li>pop_if_present()
+: <a class="el" href="a00249.html#48da3536245318af6cb5fd58bac78039">tbb::deprecated::concurrent_queue< T, A ></a><li>predecessor_type
+: <a class="el" href="a00266.html#f89fcf44f38eb33f965ee5362d3e68e9">tbb::flow::interface6::limiter_node< T ></a>, <a class="el" href="a00286.html#fdea783bf9d5a4c98e794ac7e0f84ccf">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>, <a class="el" href="a00302.html#8127e36811832563fe1e9bc3ba391f79">tbb::flow::interface6::sequencer_node< T, A ></a>, <a class="el" href="a00287.html#5e2fdd33c45d44549dee9c1638e19898">tbb::flow::interface6::queue_node< T, A > [...]
+: <a class="el" href="a00313.html#2f2342b9e6c9c03703248ac13ad0271d">tbb::task_group_context</a><li>priority_queue_node()
+: <a class="el" href="a00286.html#17a4f66e23d54100b64805405e905d62">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a><li>process_item()
+: <a class="el" href="a00322.html#5e726bdc7fbd924c0b07bd558b1d4d5d">tbb::thread_bound_filter</a><li>push()
+: <a class="el" href="a00242.html#ceb08c743b11ba88c878e73fff8af20b">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00248.html#73c47563ffcc4c2f6452f25a04ebe2e2">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00247.html#d905af7b8f6defff562f5ae9c3275763">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>push_back()
+: <a class="el" href="a00315.html#4cd34756bc4763dafb8c84838a0124ff">tbb::task_list</a>, <a class="el" href="a00250.html#e94e038f915c0268fdf2d3d7f87d81b8">tbb::concurrent_vector< T, A ></a><li>push_if_not_full()
+: <a class="el" href="a00249.html#7c45561bafe71107d09b2bc1b8f4e681">tbb::deprecated::concurrent_queue< T, A ></a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/functions_0x71.html b/doc/html/functions_0x71.html
index a3a1519..0b42c1c 100644
--- a/doc/html/functions_0x71.html
+++ b/doc/html/functions_0x71.html
@@ -62,9 +62,9 @@ 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="a00269.html#1564c6bf9573b13d6854b0e8f7ce2b68">tbb::queue_node< T ></a><li>queuing_mutex()
-: <a class="el" href="a00270.html#b389ad9c4db7293e4bdb5b8cda69ec04">tbb::queuing_mutex</a><li>queuing_rw_mutex()
-: <a class="el" href="a00272.html#85c90877c3447690ac4e2ac4ff8dea5e">tbb::queuing_rw_mutex</a></ul>
+: <a class="el" href="a00287.html#0226762d9ebba28311b7b1518d948ab1">tbb::flow::interface6::queue_node< T, A ></a><li>queuing_mutex()
+: <a class="el" href="a00288.html#b389ad9c4db7293e4bdb5b8cda69ec04">tbb::queuing_mutex</a><li>queuing_rw_mutex()
+: <a class="el" href="a00290.html#85c90877c3447690ac4e2ac4ff8dea5e">tbb::queuing_rw_mutex</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/functions_0x72.html b/doc/html/functions_0x72.html
index 9d7531a..3d1b8e9 100644
--- a/doc/html/functions_0x72.html
+++ b/doc/html/functions_0x72.html
@@ -62,34 +62,35 @@ 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="a00243.html#3b068000cf4dbf9b40f8bb7e3fc53e0b">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00238.html#3d09ccfb581b879ae64203741035e193">tbb::concurrent_vector< T, A ></a><li>rbegin()
-: <a class="el" href="a00238.html#9f9c103e18d5f212703805354074ad44">tbb::concurrent_vector< T, A ></a><li>reader_writer_lock()
-: <a class="el" href="a00274.html#c1431c4293e777efd9aab9a95c2a46e1">tbb::interface5::reader_writer_lock</a><li>ready
-: <a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293e0841dcf1c2a96dee9aa7b69f636cb81a">tbb::task</a><li>recursive_mutex()
-: <a class="el" href="a00278.html#d2fceb7f95c24a8cd1457d4527e4b8c6">tbb::recursive_mutex</a><li>recycle
-: <a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293e58debec6ab130290640d0cc2eedba35d">tbb::task</a><li>recycle_as_child_of()
-: <a class="el" href="a00291.html#db399855177438bbc9cc61d508dae8d2">tbb::task</a><li>recycle_as_continuation()
-: <a class="el" href="a00291.html#a67a79e18f62b43a623a00cfbd76db4c">tbb::task</a><li>recycle_as_safe_continuation()
-: <a class="el" href="a00291.html#3b290d14109704e2b69dc1ac980a7a76">tbb::task</a><li>recycle_to_reexecute()
-: <a class="el" href="a00291.html#4f1be9bbcdb487830dbe298b68d85144">tbb::task</a><li>reexecute
-: <a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293e3bf499aa6e6487cd1ace883a63100513">tbb::task</a><li>ref_count()
-: <a class="el" href="a00291.html#ad774f55eaec008ae02b236423209ced">tbb::task</a><li>reference
-: <a class="el" href="a00230.html#dcd44ca6a88c0dc7a847a47a10811f0c">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00236.html#a8d725c50a9834bb7af5b67c0aff92b8">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00235.html#5804b3c708ef4e50d603f918ef2b9e58">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>register_pending_exception()
-: <a class="el" href="a00293.html#d97c8a03615594b71b4ef06ff75cf561">tbb::task_group_context</a><li>register_predecessor()
-: <a class="el" href="a00304.html#6dc1f9bf02109c7f6fe4cc58bc31a00c">tbb::internal::two_phase_port< T ></a>, <a class="el" href="a00255.html#fb9909b87538f5c881c7cb7577436d14">tbb::limiter_node< T ></a>, <a class="el" href="a00241.html#b9fa9290cbb871f8780f9d69e1ec3b4e">tbb::continue_receiver</a>, <a class="el" href="a00277.html#14ae737c8fca4c8bf8e1a736dfbac444">tbb::receiver< T ></a><li>register_successor()
-: <a class="el" href="a00255.html#b8b9dbfbfc52750fa0c6bb8849681e86">tbb::limiter_node< T ></a>, <a class="el" href="a00225.html#cd2ef588b0ee6eb8d23ee169e00c73a9">tbb::buffer_node< T ></a>, <a class="el" href="a00224.html#3f4149fa6b984b2138cb5ed40a2ddc6c">tbb::broadcast_node< T ></a>, <a class="el" href="a00285.html#ce601874ec5cbb0996f6dcb8e43badb8">tbb::source_node< Output ></a>, <a class="el" href="a00282.html#be48ac70174cf8e08e2b0279cd6343d3">tbb::sender< T & [...]
-: <a class="el" href="a00231.html#94758113d8993cfe5afdf2d63a728869">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>release()
-: <a class="el" href="a00289.html#61b14d00a78185c9b2d206ebfc379124">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00287.html#eeb615e68e963e6bf8d9c11402d0ce8e">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00279.html#ac480ea0e9d5ea0345a67d57008b6263">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00273.html#67ae221109ddc69510ab593874e435d4">tbb::queuing_rw_mutex::scoped_lock</a>, <a class="el" href="a00271.html#3bf2b8c87ff22115be9b2eac179f2d30">tbb::qu [...]
-: <a class="el" href="a00304.html#a734a55289804ff34ce1c6ac4c5075e4">tbb::internal::two_phase_port< T ></a>, <a class="el" href="a00255.html#a05cf39b2825183e9c0393890fbbbb41">tbb::limiter_node< T ></a>, <a class="el" href="a00241.html#02411d8d13b380062548aff133752cc5">tbb::continue_receiver</a>, <a class="el" href="a00277.html#d2f23b40b328dc254a7c2a0a30f408e4">tbb::receiver< T ></a><li>remove_successor()
-: <a class="el" href="a00255.html#047d77f583e789e6d3ac6a52aba3168b">tbb::limiter_node< T ></a>, <a class="el" href="a00225.html#415428db02e74a479fb056a8ed72ba53">tbb::buffer_node< T ></a>, <a class="el" href="a00224.html#eefb3210bb9727765ea7385ba163c2a6">tbb::broadcast_node< T ></a>, <a class="el" href="a00285.html#de069bfc6fae7ed4e82b2a1fbb58b721">tbb::source_node< Output ></a>, <a class="el" href="a00282.html#3f345427e812e8741370308ff88f30bf">tbb::sender< T & [...]
-: <a class="el" href="a00238.html#d438b9b32ea3a8ffb703015b6dce055b">tbb::concurrent_vector< T, A ></a><li>reserve()
-: <a class="el" href="a00304.html#1d7399cfc77fca8878d8d16049ce4e7e">tbb::internal::two_phase_port< T ></a>, <a class="el" href="a00238.html#5a0ce05026994b010018f72cfdeb72c1">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00235.html#e7c59f011c4cca83ff210aefe7c9d868">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>reset()
-: <a class="el" href="a00293.html#6d30d16bf1cd22f86c6afaf29c2b430c">tbb::task_group_context</a><li>resize()
-: <a class="el" href="a00238.html#98ce6b2c6d2622f0c030b46dfac3880c">tbb::concurrent_vector< T, A ></a><li>root_task()
-: <a class="el" href="a00250.html#34d61d8b6560e5b2eb42e0112701db0f">tbb::graph</a><li>row_range_type
-: <a class="el" href="a00222.html#a807a22fe658ec38b8edfd69521d0383">tbb::blocked_range2d< RowValue, ColValue ></a><li>rows()
-: <a class="el" href="a00223.html#1584623e59ff32a8aa82006827508be4">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>, <a class="el" href="a00222.html#f496e7348a82652fba581203477cc07c">tbb::blocked_range2d< RowValue, ColValue ></a><li>run()
-: <a class="el" href="a00266.html#93d7fec8cd607b803dd2d79fb46bd260">tbb::pipeline</a>, <a class="el" href="a00265.html#b32a0a6e5e09ebb7fad3e6652c19afe5">tbb::parallel_while< Body ></a>, <a class="el" href="a00250.html#71213dd18099298dc74731e293c8286a">tbb::graph</a></ul>
+: <a class="el" href="a00255.html#3b068000cf4dbf9b40f8bb7e3fc53e0b">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00250.html#3d09ccfb581b879ae64203741035e193">tbb::concurrent_vector< T, A ></a><li>rbegin()
+: <a class="el" href="a00250.html#9f9c103e18d5f212703805354074ad44">tbb::concurrent_vector< T, A ></a><li>reader_writer_lock()
+: <a class="el" href="a00292.html#c1431c4293e777efd9aab9a95c2a46e1">tbb::interface5::reader_writer_lock</a><li>ready
+: <a class="el" href="a00311.html#4a3c415562d17905390ea5b49d12293e0841dcf1c2a96dee9aa7b69f636cb81a">tbb::task</a><li>recursive_mutex()
+: <a class="el" href="a00296.html#d2fceb7f95c24a8cd1457d4527e4b8c6">tbb::recursive_mutex</a><li>recycle
+: <a class="el" href="a00311.html#4a3c415562d17905390ea5b49d12293e58debec6ab130290640d0cc2eedba35d">tbb::task</a><li>recycle_as_child_of()
+: <a class="el" href="a00311.html#db399855177438bbc9cc61d508dae8d2">tbb::task</a><li>recycle_as_continuation()
+: <a class="el" href="a00311.html#a67a79e18f62b43a623a00cfbd76db4c">tbb::task</a><li>recycle_as_safe_continuation()
+: <a class="el" href="a00311.html#3b290d14109704e2b69dc1ac980a7a76">tbb::task</a><li>recycle_to_reexecute()
+: <a class="el" href="a00311.html#4f1be9bbcdb487830dbe298b68d85144">tbb::task</a><li>reexecute
+: <a class="el" href="a00311.html#4a3c415562d17905390ea5b49d12293e3bf499aa6e6487cd1ace883a63100513">tbb::task</a><li>ref_count()
+: <a class="el" href="a00311.html#ad774f55eaec008ae02b236423209ced">tbb::task</a><li>reference
+: <a class="el" href="a00242.html#dcd44ca6a88c0dc7a847a47a10811f0c">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00248.html#a8d725c50a9834bb7af5b67c0aff92b8">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00247.html#5804b3c708ef4e50d603f918ef2b9e58">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>register_pending_exception()
+: <a class="el" href="a00313.html#d97c8a03615594b71b4ef06ff75cf561">tbb::task_group_context</a><li>register_predecessor()
+: <a class="el" href="a00266.html#de70a0e88ce7655d8c14b6af57f7496f">tbb::flow::interface6::limiter_node< T ></a>, <a class="el" href="a00253.html#2fcfa4990a42417bbeb1f3c8b9ac8a22">tbb::flow::interface6::continue_receiver</a>, <a class="el" href="a00295.html#30e3316466efe3a713c23062b6e806f3">tbb::flow::interface6::receiver< T ></a><li>register_successor()
+: <a class="el" href="a00266.html#c76561d8d871b4769876988a4de12a9b">tbb::flow::interface6::limiter_node< T ></a>, <a class="el" href="a00237.html#f8bf4944ede4fc106423d67715beb695">tbb::flow::interface6::buffer_node< T, A ></a>, <a class="el" href="a00236.html#fd0324c9ddb51fe6f95b3d015d338941">tbb::flow::interface6::broadcast_node< T ></a>, <a class="el" href="a00304.html#22960d499df9f1569a9d8a544e35afe3">tbb::flow::interface6::source_node< Output ></a>, <a class=" [...]
+: <a class="el" href="a00243.html#94758113d8993cfe5afdf2d63a728869">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>release()
+: <a class="el" href="a00308.html#61b14d00a78185c9b2d206ebfc379124">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00306.html#eeb615e68e963e6bf8d9c11402d0ce8e">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00297.html#ac480ea0e9d5ea0345a67d57008b6263">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00291.html#67ae221109ddc69510ab593874e435d4">tbb::queuing_rw_mutex::scoped_lock</a>, <a class="el" href="a00289.html#3bf2b8c87ff22115be9b2eac179f2d30">tbb::qu [...]
+: <a class="el" href="a00266.html#c530e7b469454e2340460795f2da3317">tbb::flow::interface6::limiter_node< T ></a>, <a class="el" href="a00253.html#cb691b18416d4742265aed84d496ebbd">tbb::flow::interface6::continue_receiver</a>, <a class="el" href="a00295.html#3bc76547b51d3c9b633e3987d22dce95">tbb::flow::interface6::receiver< T ></a><li>remove_successor()
+: <a class="el" href="a00266.html#275e328063c121b3e506ccef2a825d28">tbb::flow::interface6::limiter_node< T ></a>, <a class="el" href="a00237.html#2074da0e39b9477c32897d6e5786196f">tbb::flow::interface6::buffer_node< T, A ></a>, <a class="el" href="a00236.html#366efcc046ec08a104281109801ae629">tbb::flow::interface6::broadcast_node< T ></a>, <a class="el" href="a00304.html#222484bf295f39df36415a29e508e5c9">tbb::flow::interface6::source_node< Output ></a>, <a class=" [...]
+: <a class="el" href="a00250.html#d438b9b32ea3a8ffb703015b6dce055b">tbb::concurrent_vector< T, A ></a><li>reserve()
+: <a class="el" href="a00250.html#5a0ce05026994b010018f72cfdeb72c1">tbb::concurrent_vector< T, A ></a><li>reset()
+: <a class="el" href="a00313.html#6d30d16bf1cd22f86c6afaf29c2b430c">tbb::task_group_context</a><li>resize()
+: <a class="el" href="a00250.html#98ce6b2c6d2622f0c030b46dfac3880c">tbb::concurrent_vector< T, A ></a><li>root_task()
+: <a class="el" href="a00262.html#7f4e3ae90811a5d8b597146b5b586d10">tbb::flow::interface6::graph</a><li>row_range_type
+: <a class="el" href="a00234.html#a807a22fe658ec38b8edfd69521d0383">tbb::blocked_range2d< RowValue, ColValue ></a><li>rows()
+: <a class="el" href="a00235.html#1584623e59ff32a8aa82006827508be4">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>, <a class="el" href="a00234.html#f496e7348a82652fba581203477cc07c">tbb::blocked_range2d< RowValue, ColValue ></a><li>run()
+: <a class="el" href="a00284.html#93d7fec8cd607b803dd2d79fb46bd260">tbb::pipeline</a>, <a class="el" href="a00282.html#b32a0a6e5e09ebb7fad3e6652c19afe5">tbb::parallel_while< Body ></a>, <a class="el" href="a00262.html#c1145b00e063793a7e7bf994d202c7a0">tbb::flow::interface6::graph</a><li>runtime_loader()
+: <a class="el" href="a00298.html#7ae5330beb48fce0c702c32a5df0094a">tbb::interface6::runtime_loader</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/functions_0x73.html b/doc/html/functions_0x73.html
index fab8a63..20bf466 100644
--- a/doc/html/functions_0x73.html
+++ b/doc/html/functions_0x73.html
@@ -62,30 +62,32 @@ 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="a00289.html#42a92d4f8fdde425b111cfa8a9228071">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00287.html#5ce6807050a9e8f87bcb4a65dccb12ef">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00279.html#dec17713c4c1321ac8fec66816d0c602">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00275.html#cf19f20e082887c1bb0ba6b0911c3583">tbb::interface5::reader_writer_lock::scoped_lock</a>, <a class="el" href="a00273.html#fbb8798792d3aebb136c46fc63d [...]
-: <a class="el" href="a00276.html#87ab0dc8f7216e6ba0f7acd6aec33064">tbb::interface5::reader_writer_lock::scoped_lock_read</a><li>seconds()
-: <a class="el" href="a00303.html#d5d8429c0bc59cf6131b2abc7929fa59">tbb::tick_count::interval_t</a><li>self()
-: <a class="el" href="a00291.html#bd43e8d6249738efafd12d6a4c72c5e3">tbb::task</a><li>sequencer_node()
-: <a class="el" href="a00283.html#c3138c1c96b76ae9f13b0abbf7029590">tbb::sequencer_node< T ></a><li>set_affinity()
-: <a class="el" href="a00291.html#dca19d7a45487a7d67a0db517e2b57c9">tbb::task</a><li>set_capacity()
-: <a class="el" href="a00230.html#f3c6c934f85fd02aedbc83a16943193b">tbb::concurrent_bounded_queue< T, A ></a><li>set_group_priority()
-: <a class="el" href="a00291.html#9ac8d1542d67d9d80121ff986801ac26">tbb::task</a><li>set_priority()
-: <a class="el" href="a00293.html#c4272d4d9ab65d600ca70fc2c8c4b039">tbb::task_group_context</a><li>set_ref_count()
-: <a class="el" href="a00291.html#06a4206a57e8e12a439b14d6d41cfd92">tbb::task</a><li>set_state()
-: <a class="el" href="a00258.html#795649a185b0d6af6dc81c5f378616dd">tbb::mutex</a><li>shrink_to_fit()
-: <a class="el" href="a00238.html#03c6f4cf66532bf4cc907ee738a9a186">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00235.html#28d113288fc7e0c04c9053ec7de61368">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>size()
-: <a class="el" href="a00243.html#33fd6593da1ed14340f10f67d5a69130">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00238.html#715fe313c4a9c22731cc404dd80c9ec9">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00230.html#7dc14d1a579a4cccda9f857585e1768d">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00235.html#8b2ae25c61338c6fd59e94fe09822ba5">tbb::interface5::concurrent_priority_queue< T, [...]
-: <a class="el" href="a00230.html#a80e4c11dbb324e4b92a24a77bbcde68">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00236.html#8fc30e93f8342a1960357f71e4fe8a2b">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00235.html#b679eea8d01d041625a39f719ca2b7ed">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a>, <a class="el" href="a00221.html#f5707bffea38eee5c9680f37358afb8e">tbb::blocked_range< Value ></a><li>source_node()
-: <a class="el" href="a00285.html#0513272133a06db6742873671af98f21">tbb::source_node< Output ></a><li>spawn_and_wait_for_all()
-: <a class="el" href="a00291.html#894ab68378e502776d8220eea7ce9fa1">tbb::task</a><li>spawn_root_and_wait()
-: <a class="el" href="a00291.html#c33c7edbaec67aa8a56f48986a9dc69f">tbb::task</a><li>spin_mutex()
-: <a class="el" href="a00286.html#3d8fb44644fd8d41ada1fbeba7409be3">tbb::spin_mutex</a><li>spin_rw_mutex_v3()
-: <a class="el" href="a00288.html#61332b2756de89f3f5f69310cbb6e70c">tbb::spin_rw_mutex_v3</a><li>state()
-: <a class="el" href="a00291.html#0af7b2d7e6e8b4333b2accfce3dfb374">tbb::task</a><li>state_type
-: <a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293e">tbb::task</a><li>status_t
-: <a class="el" href="a00274.html#6f921f0d7c1812ceb5674418c8b6ccaf">tbb::interface5::reader_writer_lock</a><li>successor_type
-: <a class="el" href="a00254.html#1212cbaa293a93c3bf334da1539556bd">tbb::internal::join_node_base< JP, InputTuple, OutputTuple ></a>, <a class="el" href="a00255.html#754182cc1e5b403201495bc1fd45674b">tbb::limiter_node< T ></a>, <a class="el" href="a00268.html#e01014f2e5ceea292c68f6fe47391c57">tbb::priority_queue_node< T, Compare ></a>, <a class="el" href="a00283.html#3591313e30d0f485a09106686067411f">tbb::sequencer_node< T ></a>, <a class="el" href="a00269.html#c3 [...]
-: <a class="el" href="a00238.html#96c9c4bd968ed3edb8dd276854d2dae0">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00235.html#0ecdc6a04aa259374425d424ca2a6082">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a>, <a class="el" href="a00231.html#076f8d9e16110aac5f558777aa744eb6">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></ul>
+: <a class="el" href="a00308.html#42a92d4f8fdde425b111cfa8a9228071">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00306.html#5ce6807050a9e8f87bcb4a65dccb12ef">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00297.html#dec17713c4c1321ac8fec66816d0c602">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00293.html#cf19f20e082887c1bb0ba6b0911c3583">tbb::interface5::reader_writer_lock::scoped_lock</a>, <a class="el" href="a00291.html#fbb8798792d3aebb136c46fc63d [...]
+: <a class="el" href="a00294.html#87ab0dc8f7216e6ba0f7acd6aec33064">tbb::interface5::reader_writer_lock::scoped_lock_read</a><li>seconds()
+: <a class="el" href="a00324.html#d5d8429c0bc59cf6131b2abc7929fa59">tbb::tick_count::interval_t</a><li>self()
+: <a class="el" href="a00311.html#bd43e8d6249738efafd12d6a4c72c5e3">tbb::task</a><li>sequencer_node()
+: <a class="el" href="a00302.html#b38e7a070552960384bcc1d91af13a5c">tbb::flow::interface6::sequencer_node< T, A ></a><li>set_affinity()
+: <a class="el" href="a00311.html#dca19d7a45487a7d67a0db517e2b57c9">tbb::task</a><li>set_capacity()
+: <a class="el" href="a00242.html#f3c6c934f85fd02aedbc83a16943193b">tbb::concurrent_bounded_queue< T, A ></a><li>set_group_priority()
+: <a class="el" href="a00311.html#9ac8d1542d67d9d80121ff986801ac26">tbb::task</a><li>set_parent()
+: <a class="el" href="a00311.html#d2eaf79fcaa3ae473e3bd3f44bd8a464">tbb::task</a><li>set_priority()
+: <a class="el" href="a00313.html#c4272d4d9ab65d600ca70fc2c8c4b039">tbb::task_group_context</a><li>set_ref_count()
+: <a class="el" href="a00311.html#06a4206a57e8e12a439b14d6d41cfd92">tbb::task</a><li>set_state()
+: <a class="el" href="a00275.html#795649a185b0d6af6dc81c5f378616dd">tbb::mutex</a><li>shrink_to_fit()
+: <a class="el" href="a00250.html#03c6f4cf66532bf4cc907ee738a9a186">tbb::concurrent_vector< T, A ></a><li>size()
+: <a class="el" href="a00255.html#33fd6593da1ed14340f10f67d5a69130">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00250.html#715fe313c4a9c22731cc404dd80c9ec9">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00242.html#7dc14d1a579a4cccda9f857585e1768d">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00247.html#8b2ae25c61338c6fd59e94fe09822ba5">tbb::interface5::concurrent_priority_queue< T, [...]
+: <a class="el" href="a00242.html#a80e4c11dbb324e4b92a24a77bbcde68">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00248.html#8fc30e93f8342a1960357f71e4fe8a2b">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00247.html#b679eea8d01d041625a39f719ca2b7ed">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a>, <a class="el" href="a00233.html#f5707bffea38eee5c9680f37358afb8e">tbb::blocked_range< Value ></a><li>source_node()
+: <a class="el" href="a00304.html#adaac111fbcace95804219a5f2929304">tbb::flow::interface6::source_node< Output ></a><li>spawn_and_wait_for_all()
+: <a class="el" href="a00311.html#894ab68378e502776d8220eea7ce9fa1">tbb::task</a><li>spawn_root_and_wait()
+: <a class="el" href="a00311.html#c33c7edbaec67aa8a56f48986a9dc69f">tbb::task</a><li>spin_mutex()
+: <a class="el" href="a00305.html#3d8fb44644fd8d41ada1fbeba7409be3">tbb::spin_mutex</a><li>spin_rw_mutex_v3()
+: <a class="el" href="a00307.html#61332b2756de89f3f5f69310cbb6e70c">tbb::spin_rw_mutex_v3</a><li>state()
+: <a class="el" href="a00311.html#0af7b2d7e6e8b4333b2accfce3dfb374">tbb::task</a><li>state_type
+: <a class="el" href="a00311.html#4a3c415562d17905390ea5b49d12293e">tbb::task</a><li>status()
+: <a class="el" href="a00298.html#78d938ed2e54d38dd38d6609e6c60389">tbb::interface6::runtime_loader</a><li>status_t
+: <a class="el" href="a00292.html#6f921f0d7c1812ceb5674418c8b6ccaf">tbb::interface5::reader_writer_lock</a><li>successor_type
+: <a class="el" href="a00266.html#e8945e4dd6ea759ff9e4735da13f12ef">tbb::flow::interface6::limiter_node< T ></a>, <a class="el" href="a00286.html#09ab5064ca8192e68c03da47603e68eb">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>, <a class="el" href="a00302.html#795f3ee75f133b9d3b159172fc4a197f">tbb::flow::interface6::sequencer_node< T, A ></a>, <a class="el" href="a00287.html#f35076a19f256f9e7a61bed77ca1ccc5">tbb::flow::interface6::queue_node< T, A > [...]
+: <a class="el" href="a00250.html#96c9c4bd968ed3edb8dd276854d2dae0">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00247.html#0ecdc6a04aa259374425d424ca2a6082">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a>, <a class="el" href="a00243.html#076f8d9e16110aac5f558777aa744eb6">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/functions_0x74.html b/doc/html/functions_0x74.html
index 56fc6d5..c1b9893 100644
--- a/doc/html/functions_0x74.html
+++ b/doc/html/functions_0x74.html
@@ -62,25 +62,24 @@ 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="a00291.html#2bce8ec6e44706e70128f5cf91b76e67">tbb::task</a><li>task_group_context()
-: <a class="el" href="a00293.html#19fee08fb8ac98adccfe69c1aa63c491">tbb::task_group_context</a><li>task_list()
-: <a class="el" href="a00294.html#416341c2047eaef50417b41eaf7e9de6">tbb::task_list</a><li>task_scheduler_init()
-: <a class="el" href="a00295.html#421600bf9bf9338bcf937063f2ff0e90">tbb::task_scheduler_init</a><li>terminate()
-: <a class="el" href="a00295.html#f73257e04cb7fb9bd5be2b635d9016f1">tbb::task_scheduler_init</a><li>throw_self()
-: <a class="el" href="a00299.html#292832fd5c523e3d8081a22247840a1d">tbb::internal::tbb_exception_ptr</a>, <a class="el" href="a00257.html#17cffba35811c92b7e65d63506b69602">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00228.html#2dd1be66ab32fa27e0ddef5707fa67ef">tbb::captured_exception</a>, <a class="el" href="a00298.html#8588e07fa49692f4d734e4f2e4f048f4">tbb::tbb_exception</a><li>tick_count()
-: <a class="el" href="a00302.html#34593326ae4191e02a13c7cbdab9de4c">tbb::tick_count</a><li>try_acquire()
-: <a class="el" href="a00289.html#9879626968d9b9a04cd2ec0fb2e84ae1">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00287.html#9297ec188534b45dc0ca48f2f39a0501">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00279.html#36bfc3e93e3ef6340abef4901444d340">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00273.html#2e4ff6c9ec2fee6682f95290d1f42baa">tbb::queuing_rw_mutex::scoped_lock</a>, <a class="el" href="a00271.html#e5a014fb817599386a87170cf2cf51a9">tbb::qu [...]
-: <a class="el" href="a00225.html#46b8b257a97e2192a2b11743279e8ffe">tbb::buffer_node< T ></a>, <a class="el" href="a00285.html#809f51859ca4dd04204591d76c8572eb">tbb::source_node< Output ></a>, <a class="el" href="a00282.html#add46946c4c7330422733432e4032fac">tbb::sender< T ></a><li>try_get()
-: <a class="el" href="a00254.html#50c0e6465ac929a2e94d4e62a13ebeff">tbb::internal::join_node_base< JP, InputTuple, OutputTuple ></a>, <a class="el" href="a00225.html#b68bdec127703dbfb2d93d685abbfd67">tbb::buffer_node< T ></a>, <a class="el" href="a00285.html#0434d2933ad082d3c43a4ec774150511">tbb::source_node< Output ></a>, <a class="el" href="a00282.html#bf8c9235810354f3353a899c982645de">tbb::sender< T ></a><li>try_lock()
-: <a class="el" href="a00288.html#088bb256be794cc47d3b83791632fdfc">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00286.html#8f9a58fb56a2b4c5efe1a7f7c1ae2074">tbb::spin_mutex</a>, <a class="el" href="a00278.html#86e719b0afee25704af11ab97694d240">tbb::recursive_mutex</a>, <a class="el" href="a00274.html#721eb173e154ab38292273e9266a9b07">tbb::interface5::reader_writer_lock</a>, <a class="el" href="a00258.html#4331652c79dea1c1131bd59ab161b234">tbb::mutex</a><li>try_lock_read()
-: <a class="el" href="a00288.html#b8667415869013f840d976aa406d385a">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00274.html#595fb23952e3b89426b1f7938dea9b11">tbb::interface5::reader_writer_lock</a><li>try_pop()
-: <a class="el" href="a00230.html#0ca487019bbb00a196442aff78a1e4f7">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00236.html#ae31ca0db34ef96ef1e74aa0d28c95f8">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00235.html#e036461a29cc40902a2bb79abf9f5146">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>try_process_item()
-: <a class="el" href="a00301.html#c4f90f2c771bce748beb9be734fa286c">tbb::thread_bound_filter</a><li>try_push()
-: <a class="el" href="a00230.html#2bd6232531279fb3ccbd296bea23066b">tbb::concurrent_bounded_queue< T, A ></a><li>try_put()
-: <a class="el" href="a00304.html#f316c0d5ff67068ff23b684accbe87f4">tbb::internal::two_phase_port< T ></a>, <a class="el" href="a00255.html#a38facb46cde854cb7408bf9f3bf8999">tbb::limiter_node< T ></a>, <a class="el" href="a00225.html#f74899ffb67687998168ad428f586b64">tbb::buffer_node< T ></a>, <a class="el" href="a00224.html#9b211e02554d6b39dc04f7e7f4e00073">tbb::broadcast_node< T ></a>, <a class="el" href="a00241.html#a7f8b9cc6286eb2cd8d429d6279da64d">tbb::contin [...]
-: <a class="el" href="a00225.html#435e29a66f0719d4822a0a8dc78a0405">tbb::buffer_node< T ></a>, <a class="el" href="a00285.html#3dd7e998aa3e7258b3b5731307df23a0">tbb::source_node< Output ></a>, <a class="el" href="a00282.html#28c41df1c0c7ed485b4a691ec8f30098">tbb::sender< T ></a><li>try_reserve()
-: <a class="el" href="a00225.html#11ebad4c72082a1a03ecccd3afab4ae2">tbb::buffer_node< T ></a>, <a class="el" href="a00285.html#ecac0bb52cff61912dcd186647ccd1bf">tbb::source_node< Output ></a>, <a class="el" href="a00282.html#3506c7275aeeb2fc3ba5d5f10ee0adac">tbb::sender< T ></a><li>two_phase_port()
-: <a class="el" href="a00304.html#60e17ef935031c86c4a288eafab5c066">tbb::internal::two_phase_port< T ></a></ul>
+: <a class="el" href="a00311.html#2bce8ec6e44706e70128f5cf91b76e67">tbb::task</a><li>task_group_context()
+: <a class="el" href="a00313.html#19fee08fb8ac98adccfe69c1aa63c491">tbb::task_group_context</a><li>task_list()
+: <a class="el" href="a00315.html#416341c2047eaef50417b41eaf7e9de6">tbb::task_list</a><li>task_scheduler_init()
+: <a class="el" href="a00316.html#421600bf9bf9338bcf937063f2ff0e90">tbb::task_scheduler_init</a><li>terminate()
+: <a class="el" href="a00316.html#f73257e04cb7fb9bd5be2b635d9016f1">tbb::task_scheduler_init</a><li>throw_self()
+: <a class="el" href="a00320.html#292832fd5c523e3d8081a22247840a1d">tbb::internal::tbb_exception_ptr</a>, <a class="el" href="a00273.html#17cffba35811c92b7e65d63506b69602">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00240.html#2dd1be66ab32fa27e0ddef5707fa67ef">tbb::captured_exception</a>, <a class="el" href="a00319.html#8588e07fa49692f4d734e4f2e4f048f4">tbb::tbb_exception</a><li>tick_count()
+: <a class="el" href="a00323.html#34593326ae4191e02a13c7cbdab9de4c">tbb::tick_count</a><li>try_acquire()
+: <a class="el" href="a00308.html#9879626968d9b9a04cd2ec0fb2e84ae1">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00306.html#9297ec188534b45dc0ca48f2f39a0501">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00297.html#36bfc3e93e3ef6340abef4901444d340">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00291.html#2e4ff6c9ec2fee6682f95290d1f42baa">tbb::queuing_rw_mutex::scoped_lock</a>, <a class="el" href="a00289.html#e5a014fb817599386a87170cf2cf51a9">tbb::qu [...]
+: <a class="el" href="a00237.html#8ef07c434eb763d947a7b4e80c086a49">tbb::flow::interface6::buffer_node< T, A ></a>, <a class="el" href="a00304.html#2c7fcc29e2894b29138be3c1edce9bc9">tbb::flow::interface6::source_node< Output ></a>, <a class="el" href="a00301.html#7b840f50da117a0d6848707c1857ea2e">tbb::flow::interface6::sender< T ></a><li>try_get()
+: <a class="el" href="a00237.html#aeb8aec46ca99ca022356a792c46735e">tbb::flow::interface6::buffer_node< T, A ></a>, <a class="el" href="a00304.html#41073ad4d3510ed5a8b6bda9c0f58636">tbb::flow::interface6::source_node< Output ></a>, <a class="el" href="a00301.html#922fb56b0aad090b90a98b7d56b76a59">tbb::flow::interface6::sender< T ></a><li>try_lock()
+: <a class="el" href="a00307.html#088bb256be794cc47d3b83791632fdfc">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00305.html#8f9a58fb56a2b4c5efe1a7f7c1ae2074">tbb::spin_mutex</a>, <a class="el" href="a00296.html#86e719b0afee25704af11ab97694d240">tbb::recursive_mutex</a>, <a class="el" href="a00292.html#721eb173e154ab38292273e9266a9b07">tbb::interface5::reader_writer_lock</a>, <a class="el" href="a00275.html#4331652c79dea1c1131bd59ab161b234">tbb::mutex</a><li>try_lock_read()
+: <a class="el" href="a00307.html#b8667415869013f840d976aa406d385a">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00292.html#595fb23952e3b89426b1f7938dea9b11">tbb::interface5::reader_writer_lock</a><li>try_pop()
+: <a class="el" href="a00242.html#0ca487019bbb00a196442aff78a1e4f7">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00248.html#ae31ca0db34ef96ef1e74aa0d28c95f8">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00247.html#e036461a29cc40902a2bb79abf9f5146">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>try_process_item()
+: <a class="el" href="a00322.html#c4f90f2c771bce748beb9be734fa286c">tbb::thread_bound_filter</a><li>try_push()
+: <a class="el" href="a00242.html#2bd6232531279fb3ccbd296bea23066b">tbb::concurrent_bounded_queue< T, A ></a><li>try_put()
+: <a class="el" href="a00266.html#55a02d458a4d8ffa6accd7a70605da2f">tbb::flow::interface6::limiter_node< T ></a>, <a class="el" href="a00237.html#2b02fe332e704bbe14f297802298b63a">tbb::flow::interface6::buffer_node< T, A ></a>, <a class="el" href="a00236.html#29eb768c10b377880bbf83d31ee49acf">tbb::flow::interface6::broadcast_node< T ></a>, <a class="el" href="a00253.html#3969c70fb89c0a982f142ae9eb5facae">tbb::flow::interface6::continue_receiver</a>, <a class="el" href=" [...]
+: <a class="el" href="a00237.html#2c8e8f2f5f4ff5be27136cc1184a3c3e">tbb::flow::interface6::buffer_node< T, A ></a>, <a class="el" href="a00304.html#494678baf9096835268736b800824460">tbb::flow::interface6::source_node< Output ></a>, <a class="el" href="a00301.html#27036b06d6a91e97007e14f400529199">tbb::flow::interface6::sender< T ></a><li>try_reserve()
+: <a class="el" href="a00237.html#1cc889bb6c38bcb81757d0ebbc3a5e64">tbb::flow::interface6::buffer_node< T, A ></a>, <a class="el" href="a00304.html#ad459713ff3c1c9ad0f4826daa141f65">tbb::flow::interface6::source_node< Output ></a>, <a class="el" href="a00301.html#02c05b472271db1b68a48ea2618fa72f">tbb::flow::interface6::sender< T ></a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/functions_0x75.html b/doc/html/functions_0x75.html
index 0bdb8e4..fbb42cd 100644
--- a/doc/html/functions_0x75.html
+++ b/doc/html/functions_0x75.html
@@ -62,9 +62,9 @@ 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="a00288.html#f9f52ead2098eb5fb12da59d5ae53b55">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00286.html#0e843ee6265f57f27d228ba91e7308ef">tbb::spin_mutex</a>, <a class="el" href="a00278.html#f0a96e26b7f074588dc31e32524856ae">tbb::recursive_mutex</a>, <a class="el" href="a00274.html#5113b32689305599b2c36b5831547704">tbb::interface5::reader_writer_lock</a>, <a class="el" href="a00258.html#5fc9ef443ae75d966695546be399cc6b">tbb::mutex</a><li>unsafe_size()
-: <a class="el" href="a00236.html#eaa35a5274606779802e9a669a706260">tbb::strict_ppl::concurrent_queue< T, A ></a><li>upgrade_to_writer()
-: <a class="el" href="a00289.html#3f0b1e3f2efab63336400348bd070226">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00273.html#11ba1da4a722c9e6f73339a52c487e82">tbb::queuing_rw_mutex::scoped_lock</a></ul>
+: <a class="el" href="a00307.html#f9f52ead2098eb5fb12da59d5ae53b55">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00305.html#0e843ee6265f57f27d228ba91e7308ef">tbb::spin_mutex</a>, <a class="el" href="a00296.html#f0a96e26b7f074588dc31e32524856ae">tbb::recursive_mutex</a>, <a class="el" href="a00292.html#5113b32689305599b2c36b5831547704">tbb::interface5::reader_writer_lock</a>, <a class="el" href="a00275.html#5fc9ef443ae75d966695546be399cc6b">tbb::mutex</a><li>unsafe_size()
+: <a class="el" href="a00248.html#eaa35a5274606779802e9a669a706260">tbb::strict_ppl::concurrent_queue< T, A ></a><li>upgrade_to_writer()
+: <a class="el" href="a00308.html#3f0b1e3f2efab63336400348bd070226">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00291.html#11ba1da4a722c9e6f73339a52c487e82">tbb::queuing_rw_mutex::scoped_lock</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/functions_0x76.html b/doc/html/functions_0x76.html
index f538a90..5973c8d 100644
--- a/doc/html/functions_0x76.html
+++ b/doc/html/functions_0x76.html
@@ -62,7 +62,7 @@ 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="a00265.html#fa297e53d3af2a101e712bc200233e9c">tbb::parallel_while< Body ></a>, <a class="el" href="a00230.html#98245517a931e5893f6601e66c51fc75">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00236.html#682c3978d5cb0620000994f11c44a476">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00235.html#7c611a6b5b8f94b0e7f2afc97e31efb1">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a>, <a class="el" [...]
+: <a class="el" href="a00282.html#fa297e53d3af2a101e712bc200233e9c">tbb::parallel_while< Body ></a>, <a class="el" href="a00242.html#98245517a931e5893f6601e66c51fc75">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00248.html#682c3978d5cb0620000994f11c44a476">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00247.html#7c611a6b5b8f94b0e7f2afc97e31efb1">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a>, <a class="el" [...]
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/functions_0x77.html b/doc/html/functions_0x77.html
index e499776..6befb6e 100644
--- a/doc/html/functions_0x77.html
+++ b/doc/html/functions_0x77.html
@@ -62,8 +62,8 @@ 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="a00291.html#53d2615ad9c38859b4c8080936600283">tbb::task</a>, <a class="el" href="a00250.html#bafd6349fdc6563ffa02746866e30bec">tbb::graph</a><li>what()
-: <a class="el" href="a00257.html#b33a89bccf0c63106f1270c7bfaaf54f">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00228.html#6b5988ef74a1fe2a58998d110b3633e0">tbb::captured_exception</a>, <a class="el" href="a00298.html#e8157689ecb66bc6c72d3618bf3cc371">tbb::tbb_exception</a></ul>
+: <a class="el" href="a00311.html#53d2615ad9c38859b4c8080936600283">tbb::task</a>, <a class="el" href="a00262.html#a66b0020f7514b86d030fa8aea073d37">tbb::flow::interface6::graph</a><li>what()
+: <a class="el" href="a00273.html#b33a89bccf0c63106f1270c7bfaaf54f">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00240.html#6b5988ef74a1fe2a58998d110b3633e0">tbb::captured_exception</a>, <a class="el" href="a00319.html#e8157689ecb66bc6c72d3618bf3cc371">tbb::tbb_exception</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/functions_0x7e.html b/doc/html/functions_0x7e.html
index 7cfb90e..04656df 100644
--- a/doc/html/functions_0x7e.html
+++ b/doc/html/functions_0x7e.html
@@ -62,29 +62,31 @@ 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="a00229.html#2c87e79ae98588a5780f708773388843">tbb::combinable< T ></a><li>~concurrent_bounded_queue()
-: <a class="el" href="a00230.html#acaf5b510dc0dfc7780b8c956cf773cf">tbb::concurrent_bounded_queue< T, A ></a><li>~concurrent_hash_map()
-: <a class="el" href="a00231.html#2aa8e2d28d5af1284cf78d20a9c22731">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>~concurrent_queue()
-: <a class="el" href="a00236.html#830b33753d6b149c366344e29b2edd8c">tbb::strict_ppl::concurrent_queue< T, A ></a><li>~concurrent_vector()
-: <a class="el" href="a00238.html#da2444b28bb840d38f60d0030333a5fc">tbb::concurrent_vector< T, A ></a><li>~const_accessor()
-: <a class="el" href="a00234.html#928769b139d53427e7075c1f86148e4c">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a><li>~continue_receiver()
-: <a class="el" href="a00241.html#9a38edb7e1e3c9be4e3848145c51a617">tbb::continue_receiver</a><li>~enumerable_thread_specific()
-: <a class="el" href="a00243.html#5a7907d9e3e5b18e7a7b55211ef3213f">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a><li>~filter()
-: <a class="el" href="a00245.html#66d159f362293e3964ba3da8bc1d2604">tbb::filter</a><li>~graph()
-: <a class="el" href="a00250.html#55332084e7884a26ff288b8fe960030d">tbb::graph</a><li>~parallel_while()
-: <a class="el" href="a00265.html#6fcfc973cc56b79c6d0fbb8a31be7e84">tbb::parallel_while< Body ></a><li>~pipeline()
-: <a class="el" href="a00266.html#49513c6c24f9d5bbbb27edca5efe01c9">tbb::pipeline</a><li>~queuing_rw_mutex()
-: <a class="el" href="a00272.html#1ba73e3d95cfdf8323880bc623af9099">tbb::queuing_rw_mutex</a><li>~reader_writer_lock()
-: <a class="el" href="a00274.html#5135f64f7b7339017f33d956445edbee">tbb::interface5::reader_writer_lock</a><li>~receiver()
-: <a class="el" href="a00277.html#18f74b83abae0ee1e4ce07942797ef27">tbb::receiver< T ></a><li>~scoped_lock()
-: <a class="el" href="a00289.html#d7eaaa3f2e2c5dc11e7005811b1bdd04">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00287.html#ac6fa425d1f06c56d8b70abc51aac844">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00279.html#c1197ffb8f3cd9d4fed71d7e06265b7c">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00275.html#70246e0260493625ff956fa5926fc71f">tbb::interface5::reader_writer_lock::scoped_lock</a>, <a class="el" href="a00273.html#32c7d67a660d23ebbaab1a1d282 [...]
-: <a class="el" href="a00276.html#bd21c5f3d555d64d1de8658e15bf4966">tbb::interface5::reader_writer_lock::scoped_lock_read</a><li>~sequencer_node()
-: <a class="el" href="a00283.html#c87d80feebaf2bae4af22b5f2459b37e">tbb::sequencer_node< T ></a><li>~source_node()
-: <a class="el" href="a00285.html#90c94a8a52cc3d19cf393ce289e80733">tbb::source_node< Output ></a><li>~spin_rw_mutex_v3()
-: <a class="el" href="a00288.html#9a815fb2759e55072ed413f1b6970cf3">tbb::spin_rw_mutex_v3</a><li>~task()
-: <a class="el" href="a00291.html#98245ee0473f84cb19dbbf8c81134908">tbb::task</a><li>~task_list()
-: <a class="el" href="a00294.html#6d438f1499a02db1e59c24ab6043e5ba">tbb::task_list</a><li>~task_scheduler_init()
-: <a class="el" href="a00295.html#4da6c86292d80c703a66c1f6f5299488">tbb::task_scheduler_init</a></ul>
+: <a class="el" href="a00241.html#2c87e79ae98588a5780f708773388843">tbb::combinable< T ></a><li>~concurrent_bounded_queue()
+: <a class="el" href="a00242.html#acaf5b510dc0dfc7780b8c956cf773cf">tbb::concurrent_bounded_queue< T, A ></a><li>~concurrent_hash_map()
+: <a class="el" href="a00243.html#2aa8e2d28d5af1284cf78d20a9c22731">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>~concurrent_queue()
+: <a class="el" href="a00248.html#830b33753d6b149c366344e29b2edd8c">tbb::strict_ppl::concurrent_queue< T, A ></a><li>~concurrent_vector()
+: <a class="el" href="a00250.html#da2444b28bb840d38f60d0030333a5fc">tbb::concurrent_vector< T, A ></a><li>~const_accessor()
+: <a class="el" href="a00246.html#928769b139d53427e7075c1f86148e4c">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a><li>~continue_receiver()
+: <a class="el" href="a00253.html#1e14828fa079b9835ff7267df5ee45d7">tbb::flow::interface6::continue_receiver</a><li>~enumerable_thread_specific()
+: <a class="el" href="a00255.html#5a7907d9e3e5b18e7a7b55211ef3213f">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a><li>~filter()
+: <a class="el" href="a00256.html#66d159f362293e3964ba3da8bc1d2604">tbb::filter</a><li>~graph()
+: <a class="el" href="a00262.html#8a7d424c0616a1c37a908ead182e2fe5">tbb::flow::interface6::graph</a><li>~memory_pool()
+: <a class="el" href="a00269.html#fdad7c4ed08332ec384491a71b721957">tbb::interface6::memory_pool< Alloc ></a><li>~parallel_while()
+: <a class="el" href="a00282.html#6fcfc973cc56b79c6d0fbb8a31be7e84">tbb::parallel_while< Body ></a><li>~pipeline()
+: <a class="el" href="a00284.html#49513c6c24f9d5bbbb27edca5efe01c9">tbb::pipeline</a><li>~queuing_rw_mutex()
+: <a class="el" href="a00290.html#1ba73e3d95cfdf8323880bc623af9099">tbb::queuing_rw_mutex</a><li>~reader_writer_lock()
+: <a class="el" href="a00292.html#5135f64f7b7339017f33d956445edbee">tbb::interface5::reader_writer_lock</a><li>~receiver()
+: <a class="el" href="a00295.html#b00699b235435f7b65b663d5063624a1">tbb::flow::interface6::receiver< T ></a><li>~runtime_loader()
+: <a class="el" href="a00298.html#c25fec923a751a3e03f5cbe969f1f0c5">tbb::interface6::runtime_loader</a><li>~scoped_lock()
+: <a class="el" href="a00308.html#d7eaaa3f2e2c5dc11e7005811b1bdd04">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00306.html#ac6fa425d1f06c56d8b70abc51aac844">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00297.html#c1197ffb8f3cd9d4fed71d7e06265b7c">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00293.html#70246e0260493625ff956fa5926fc71f">tbb::interface5::reader_writer_lock::scoped_lock</a>, <a class="el" href="a00291.html#32c7d67a660d23ebbaab1a1d282 [...]
+: <a class="el" href="a00294.html#bd21c5f3d555d64d1de8658e15bf4966">tbb::interface5::reader_writer_lock::scoped_lock_read</a><li>~sequencer_node()
+: <a class="el" href="a00302.html#93d3d8f6a72b3e1387047282116ed6ee">tbb::flow::interface6::sequencer_node< T, A ></a><li>~source_node()
+: <a class="el" href="a00304.html#61700b0865fc17188b0abe26bbde65b6">tbb::flow::interface6::source_node< Output ></a><li>~spin_rw_mutex_v3()
+: <a class="el" href="a00307.html#9a815fb2759e55072ed413f1b6970cf3">tbb::spin_rw_mutex_v3</a><li>~task()
+: <a class="el" href="a00311.html#98245ee0473f84cb19dbbf8c81134908">tbb::task</a><li>~task_list()
+: <a class="el" href="a00315.html#6d438f1499a02db1e59c24ab6043e5ba">tbb::task_list</a><li>~task_scheduler_init()
+: <a class="el" href="a00316.html#4da6c86292d80c703a66c1f6f5299488">tbb::task_scheduler_init</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/functions_enum.html b/doc/html/functions_enum.html
index 0101d18..d61b61c 100644
--- a/doc/html/functions_enum.html
+++ b/doc/html/functions_enum.html
@@ -34,11 +34,12 @@
<p>
<ul>
-<li>concurrency
-: <a class="el" href="a00250.html#633b9b55e3248b785efd13264261f0e5">tbb::graph</a><li>malloc_type
-: <a class="el" href="a00296.html#09a7f81fb2c3055aaecf058b11538544">tbb::tbb_allocator< T ></a><li>state_type
-: <a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293e">tbb::task</a><li>status_t
-: <a class="el" href="a00274.html#6f921f0d7c1812ceb5674418c8b6ccaf">tbb::interface5::reader_writer_lock</a></ul>
+<li>error_code
+: <a class="el" href="a00298.html#6831be91cdc64e57e565ce0dde018789">tbb::interface6::runtime_loader</a><li>error_mode
+: <a class="el" href="a00298.html#bb0130fe0f596399707e61431231ebcb">tbb::interface6::runtime_loader</a><li>malloc_type
+: <a class="el" href="a00317.html#09a7f81fb2c3055aaecf058b11538544">tbb::tbb_allocator< T ></a><li>state_type
+: <a class="el" href="a00311.html#4a3c415562d17905390ea5b49d12293e">tbb::task</a><li>status_t
+: <a class="el" href="a00292.html#6f921f0d7c1812ceb5674418c8b6ccaf">tbb::interface5::reader_writer_lock</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/functions_eval.html b/doc/html/functions_eval.html
index 779d408..bdb73c6 100644
--- a/doc/html/functions_eval.html
+++ b/doc/html/functions_eval.html
@@ -35,12 +35,21 @@
<p>
<ul>
<li>allocated
-: <a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293ebe94d3348dd038e41107819f00c1884c">tbb::task</a><li>executing
-: <a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293ead0fe2302ccc360923f738c2ed7ec1b9">tbb::task</a><li>freed
-: <a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293ecc67ca92bd6f1ce9738a1e9e7206b735">tbb::task</a><li>ready
-: <a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293e0841dcf1c2a96dee9aa7b69f636cb81a">tbb::task</a><li>recycle
-: <a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293e58debec6ab130290640d0cc2eedba35d">tbb::task</a><li>reexecute
-: <a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293e3bf499aa6e6487cd1ace883a63100513">tbb::task</a></ul>
+: <a class="el" href="a00311.html#4a3c415562d17905390ea5b49d12293ebe94d3348dd038e41107819f00c1884c">tbb::task</a><li>ec_bad_arg
+: <a class="el" href="a00298.html#6831be91cdc64e57e565ce0dde01878927e94a7b173bb8d0623bf48aad8fc703">tbb::interface6::runtime_loader</a><li>ec_bad_call
+: <a class="el" href="a00298.html#6831be91cdc64e57e565ce0dde018789e6ce2b091083b80878cbb70cd00782a1">tbb::interface6::runtime_loader</a><li>ec_bad_lib
+: <a class="el" href="a00298.html#6831be91cdc64e57e565ce0dde01878903ee81d8c05966bc1125666713dee5f6">tbb::interface6::runtime_loader</a><li>ec_bad_ver
+: <a class="el" href="a00298.html#6831be91cdc64e57e565ce0dde01878907790f32918e60d670a96c1f0349e8d6">tbb::interface6::runtime_loader</a><li>ec_no_lib
+: <a class="el" href="a00298.html#6831be91cdc64e57e565ce0dde01878902acc03ebfcdb16e3e26b24f64da2bdb">tbb::interface6::runtime_loader</a><li>ec_ok
+: <a class="el" href="a00298.html#6831be91cdc64e57e565ce0dde0187891e3a364f63f419e5ea2f1d1e52289b27">tbb::interface6::runtime_loader</a><li>em_abort
+: <a class="el" href="a00298.html#bb0130fe0f596399707e61431231ebcb630dd30c9ba61d5ab187e80313bbad94">tbb::interface6::runtime_loader</a><li>em_status
+: <a class="el" href="a00298.html#bb0130fe0f596399707e61431231ebcbdb47fe5ffbd2eaf47e6de0af433ada38">tbb::interface6::runtime_loader</a><li>em_throw
+: <a class="el" href="a00298.html#bb0130fe0f596399707e61431231ebcbdeb59ca2912432b47fd3ec831574653b">tbb::interface6::runtime_loader</a><li>executing
+: <a class="el" href="a00311.html#4a3c415562d17905390ea5b49d12293ead0fe2302ccc360923f738c2ed7ec1b9">tbb::task</a><li>freed
+: <a class="el" href="a00311.html#4a3c415562d17905390ea5b49d12293ecc67ca92bd6f1ce9738a1e9e7206b735">tbb::task</a><li>ready
+: <a class="el" href="a00311.html#4a3c415562d17905390ea5b49d12293e0841dcf1c2a96dee9aa7b69f636cb81a">tbb::task</a><li>recycle
+: <a class="el" href="a00311.html#4a3c415562d17905390ea5b49d12293e58debec6ab130290640d0cc2eedba35d">tbb::task</a><li>reexecute
+: <a class="el" href="a00311.html#4a3c415562d17905390ea5b49d12293e3bf499aa6e6487cd1ace883a63100513">tbb::task</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/functions_func.html b/doc/html/functions_func.html
index 46bfd23..c114b87 100644
--- a/doc/html/functions_func.html
+++ b/doc/html/functions_func.html
@@ -61,18 +61,18 @@
<p>
<h3><a class="anchor" name="index_a">- a -</a></h3><ul>
<li>acquire()
-: <a class="el" href="a00289.html#b0b646ec5be02a127d159bbb7ca65353">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00287.html#3ee3c338732b1f64b0b32a757807a30d">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00279.html#7fb04da37cccf8c99b1f9102d9074f9a">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00273.html#a8dd5ab8686e76de21587544dbb681e0">tbb::queuing_rw_mutex::scoped_lock</a>, <a class="el" href="a00271.html#533e4fc8355ee321206a0609c42d909d">tbb::qu [...]
-: <a class="el" href="a00285.html#d71ed386c53032463f3435f79a15b6ff">tbb::source_node< Output ></a><li>add()
-: <a class="el" href="a00265.html#e131c560057a58229992b61eb8dba4c6">tbb::parallel_while< Body ></a>, <a class="el" href="a00264.html#40baaf0f6856f4491dd0adf896c93516">tbb::parallel_do_feeder< Item ></a><li>add_filter()
-: <a class="el" href="a00266.html#38fb5c9c8395dd6f89a4ae2011a83e0d">tbb::pipeline</a><li>affinity()
-: <a class="el" href="a00291.html#3a920a56b0bcf2801518fb45b2c9d2be">tbb::task</a><li>allocate()
-: <a class="el" href="a00299.html#c35e5db8e9cdff5d1387db5b0bad2e4a">tbb::internal::tbb_exception_ptr</a>, <a class="el" href="a00296.html#f6cb487b1bdce0b581f265a77dca6d53">tbb::tbb_allocator< T ></a>, <a class="el" href="a00280.html#726b1586d05d44665a36e1c7b2699bfd">tbb::scalable_allocator< T ></a>, <a class="el" href="a00226.html#4cdeea67af6c1fcd8f1d5e9c4cab61e8">tbb::cache_aligned_allocator< T ></a><li>allocate_child()
-: <a class="el" href="a00291.html#1ff794f7053cd9148d5f280fbf07377f">tbb::task</a><li>allocate_continuation()
-: <a class="el" href="a00291.html#1434c79a5138993269d034008bff7329">tbb::task</a><li>allocate_root()
-: <a class="el" href="a00291.html#8ccc518caf31075a3e073996d2d240a4">tbb::task</a><li>allocator_type()
-: <a class="el" href="a00296.html#78701e7454ef8e1a25b5acd364367080">tbb::tbb_allocator< T ></a>, <a class="el" href="a00243.html#3c03eb40955b933b01987222722ac4bd">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00230.html#2e2726fccf6d975dc1071608cc0bbf90">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00236.html#5a3956341728eaa558d8827063718cac">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a c [...]
-: <a class="el" href="a00238.html#93a06b3112cb804f42f40efb5e7387b4">tbb::concurrent_vector< T, A ></a><li>at()
-: <a class="el" href="a00238.html#23e14a38af748edff96a7adc3a0f1c58">tbb::concurrent_vector< T, A ></a></ul>
+: <a class="el" href="a00308.html#b0b646ec5be02a127d159bbb7ca65353">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00306.html#3ee3c338732b1f64b0b32a757807a30d">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00297.html#7fb04da37cccf8c99b1f9102d9074f9a">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00291.html#a8dd5ab8686e76de21587544dbb681e0">tbb::queuing_rw_mutex::scoped_lock</a>, <a class="el" href="a00289.html#533e4fc8355ee321206a0609c42d909d">tbb::qu [...]
+: <a class="el" href="a00304.html#4b647e4a93d08ccdd8d323279e4eaaa6">tbb::flow::interface6::source_node< Output ></a><li>add()
+: <a class="el" href="a00282.html#e131c560057a58229992b61eb8dba4c6">tbb::parallel_while< Body ></a>, <a class="el" href="a00281.html#40baaf0f6856f4491dd0adf896c93516">tbb::parallel_do_feeder< Item ></a><li>add_filter()
+: <a class="el" href="a00284.html#38fb5c9c8395dd6f89a4ae2011a83e0d">tbb::pipeline</a><li>affinity()
+: <a class="el" href="a00311.html#3a920a56b0bcf2801518fb45b2c9d2be">tbb::task</a><li>allocate()
+: <a class="el" href="a00320.html#c35e5db8e9cdff5d1387db5b0bad2e4a">tbb::internal::tbb_exception_ptr</a>, <a class="el" href="a00317.html#f6cb487b1bdce0b581f265a77dca6d53">tbb::tbb_allocator< T ></a>, <a class="el" href="a00299.html#726b1586d05d44665a36e1c7b2699bfd">tbb::scalable_allocator< T ></a>, <a class="el" href="a00270.html#365bd64d284c80d85bb2149a12681526">tbb::interface6::memory_pool_allocator< T, P ></a>, <a class="el" href="a00238.html#4cdeea67af6c1fcd8f1d5e9 [...]
+: <a class="el" href="a00311.html#1ff794f7053cd9148d5f280fbf07377f">tbb::task</a><li>allocate_continuation()
+: <a class="el" href="a00311.html#1434c79a5138993269d034008bff7329">tbb::task</a><li>allocate_root()
+: <a class="el" href="a00311.html#8ccc518caf31075a3e073996d2d240a4">tbb::task</a><li>allocator_type()
+: <a class="el" href="a00317.html#78701e7454ef8e1a25b5acd364367080">tbb::tbb_allocator< T ></a>, <a class="el" href="a00255.html#3c03eb40955b933b01987222722ac4bd">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00242.html#2e2726fccf6d975dc1071608cc0bbf90">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00248.html#5a3956341728eaa558d8827063718cac">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a c [...]
+: <a class="el" href="a00250.html#93a06b3112cb804f42f40efb5e7387b4">tbb::concurrent_vector< T, A ></a><li>at()
+: <a class="el" href="a00250.html#23e14a38af748edff96a7adc3a0f1c58">tbb::concurrent_vector< T, A ></a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/functions_func_0x62.html b/doc/html/functions_func_0x62.html
index 39b430f..650d3b4 100644
--- a/doc/html/functions_func_0x62.html
+++ b/doc/html/functions_func_0x62.html
@@ -61,11 +61,11 @@
<p>
<h3><a class="anchor" name="index_b">- b -</a></h3><ul>
<li>back()
-: <a class="el" href="a00238.html#bd518e204107d07fd08d0ec5bdfd383d">tbb::concurrent_vector< T, A ></a><li>begin()
-: <a class="el" href="a00243.html#84afb3906a39e399cde1c950d6351300">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00238.html#78a06182276ff758788d4c0623ae0d71">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00221.html#18d2258400756ac1446dac7676b18df3">tbb::blocked_range< Value ></a>, <a class="el" href="a00215.html#0d702fc6b9e9d061ace3501b3c861cdf">tbb::aligned_space< T, N ></a><li>blocked_range()
-: <a class="el" href="a00221.html#4c0efd2be3f96a0ab3ba5085e8b3fcc7">tbb::blocked_range< Value ></a><li>bucket_count()
-: <a class="el" href="a00231.html#af34cb91b1d0f36a885a1a3432dd9af1">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>buffer_node()
-: <a class="el" href="a00225.html#7360978fa427d054bc6cde05c80e5e9f">tbb::buffer_node< T ></a></ul>
+: <a class="el" href="a00250.html#bd518e204107d07fd08d0ec5bdfd383d">tbb::concurrent_vector< T, A ></a><li>begin()
+: <a class="el" href="a00255.html#84afb3906a39e399cde1c950d6351300">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00250.html#78a06182276ff758788d4c0623ae0d71">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00233.html#18d2258400756ac1446dac7676b18df3">tbb::blocked_range< Value ></a>, <a class="el" href="a00227.html#0d702fc6b9e9d061ace3501b3c861cdf">tbb::aligned_space< T, N ></a><li>blocked_range()
+: <a class="el" href="a00233.html#4c0efd2be3f96a0ab3ba5085e8b3fcc7">tbb::blocked_range< Value ></a><li>bucket_count()
+: <a class="el" href="a00243.html#af34cb91b1d0f36a885a1a3432dd9af1">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>buffer_node()
+: <a class="el" href="a00237.html#03ad7b85a8341437f584af06ad050cdc">tbb::flow::interface6::buffer_node< T, A ></a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/functions_func_0x63.html b/doc/html/functions_func_0x63.html
index 6a5f078..71c33a7 100644
--- a/doc/html/functions_func_0x63.html
+++ b/doc/html/functions_func_0x63.html
@@ -61,27 +61,27 @@
<p>
<h3><a class="anchor" name="index_c">- c -</a></h3><ul>
<li>cancel_group_execution()
-: <a class="el" href="a00291.html#0f3fb4aac549ab642022450a4bd13326">tbb::task</a>, <a class="el" href="a00293.html#8bcdfdf4e6bfb76125b6de15c00b571d">tbb::task_group_context</a><li>capacity()
-: <a class="el" href="a00238.html#3ed6b9ae7217af5103d974045b6f5cd5">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00230.html#b2888b3e4e837d7e03f2c731963a402b">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00235.html#e5d6a0aca1579ecebb716bbe53514963">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>cbegin()
-: <a class="el" href="a00238.html#f88fcf1c920693c39bd9709db33c199f">tbb::concurrent_vector< T, A ></a><li>cend()
-: <a class="el" href="a00238.html#0c15a5d0f1cf75d687dabba07da1d46b">tbb::concurrent_vector< T, A ></a><li>change_group()
-: <a class="el" href="a00291.html#62247be9a637a814c8e8f4bcfb3a1908">tbb::task</a><li>clear()
-: <a class="el" href="a00294.html#fce446ee13e025969945328f3ff59b95">tbb::task_list</a>, <a class="el" href="a00266.html#2c84aef5b834b555ee220b176e25931e">tbb::pipeline</a>, <a class="el" href="a00243.html#a8764176d4b6014c5d65f1051851abc8">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00238.html#26f937a359a66b6aae904c3cd9a3c444">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00230.html#90b31e2954c6e4596c7900435a5f [...]
-: <a class="el" href="a00223.html#3336ba9480fd6c43e158f9beb024c050">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>, <a class="el" href="a00222.html#392a46759af2c884957115771affa7f4">tbb::blocked_range2d< RowValue, ColValue ></a><li>compact()
-: <a class="el" href="a00238.html#1693d1da41b1a8235871be9c6633be35">tbb::concurrent_vector< T, A ></a><li>concurrent_bounded_queue()
-: <a class="el" href="a00230.html#a5e04dcd7db9fd9b583b4e7df832246a">tbb::concurrent_bounded_queue< T, A ></a><li>concurrent_hash_map()
-: <a class="el" href="a00231.html#83c40f2053f208861b90390e12a36436">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>concurrent_priority_queue()
-: <a class="el" href="a00235.html#509419e320f200456d89dc54a65140b3">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>concurrent_queue()
-: <a class="el" href="a00237.html#9102b897776bd2d9e908e6604ff16b5f">tbb::deprecated::concurrent_queue< T, A ></a>, <a class="el" href="a00236.html#8a6b98ea11a867db8ac868f0113ca429">tbb::strict_ppl::concurrent_queue< T, A ></a><li>concurrent_vector()
-: <a class="el" href="a00238.html#4450de83c5862ea4bcd9443fd7e67419">tbb::concurrent_vector< T, A ></a><li>const_accessor()
-: <a class="el" href="a00234.html#27399c613eb1aecd4660803955dda09d">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a><li>construct()
-: <a class="el" href="a00296.html#ab228ab9e324ed041c2226e1d717df5f">tbb::tbb_allocator< T ></a>, <a class="el" href="a00226.html#958ee8745c86c275bfc9533af565e017">tbb::cache_aligned_allocator< T ></a><li>consume()
-: <a class="el" href="a00304.html#684f6bbc3290270ed43cb34ffd273f71">tbb::internal::two_phase_port< T ></a><li>context()
-: <a class="el" href="a00291.html#d8c36a93f3972590fbb65ff1cef3173b">tbb::task</a><li>continue_receiver()
-: <a class="el" href="a00241.html#799d383813261426d881b10247caadba">tbb::continue_receiver</a><li>count()
-: <a class="el" href="a00231.html#6968eb6feed2df36be421df0464297af">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>crbegin()
-: <a class="el" href="a00238.html#db78a1d28c9c966050e8a2926d834a33">tbb::concurrent_vector< T, A ></a><li>crend()
-: <a class="el" href="a00238.html#fff9cece89438587997ebedf93c5e962">tbb::concurrent_vector< T, A ></a></ul>
+: <a class="el" href="a00311.html#0f3fb4aac549ab642022450a4bd13326">tbb::task</a>, <a class="el" href="a00313.html#8bcdfdf4e6bfb76125b6de15c00b571d">tbb::task_group_context</a><li>capacity()
+: <a class="el" href="a00250.html#3ed6b9ae7217af5103d974045b6f5cd5">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00242.html#b2888b3e4e837d7e03f2c731963a402b">tbb::concurrent_bounded_queue< T, A ></a><li>cbegin()
+: <a class="el" href="a00250.html#f88fcf1c920693c39bd9709db33c199f">tbb::concurrent_vector< T, A ></a><li>cend()
+: <a class="el" href="a00250.html#0c15a5d0f1cf75d687dabba07da1d46b">tbb::concurrent_vector< T, A ></a><li>change_group()
+: <a class="el" href="a00311.html#62247be9a637a814c8e8f4bcfb3a1908">tbb::task</a><li>clear()
+: <a class="el" href="a00315.html#fce446ee13e025969945328f3ff59b95">tbb::task_list</a>, <a class="el" href="a00284.html#2c84aef5b834b555ee220b176e25931e">tbb::pipeline</a>, <a class="el" href="a00255.html#a8764176d4b6014c5d65f1051851abc8">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00250.html#26f937a359a66b6aae904c3cd9a3c444">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00242.html#90b31e2954c6e4596c7900435a5f [...]
+: <a class="el" href="a00235.html#3336ba9480fd6c43e158f9beb024c050">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>, <a class="el" href="a00234.html#392a46759af2c884957115771affa7f4">tbb::blocked_range2d< RowValue, ColValue ></a><li>compact()
+: <a class="el" href="a00250.html#1693d1da41b1a8235871be9c6633be35">tbb::concurrent_vector< T, A ></a><li>concurrent_bounded_queue()
+: <a class="el" href="a00242.html#a5e04dcd7db9fd9b583b4e7df832246a">tbb::concurrent_bounded_queue< T, A ></a><li>concurrent_hash_map()
+: <a class="el" href="a00243.html#83c40f2053f208861b90390e12a36436">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>concurrent_priority_queue()
+: <a class="el" href="a00247.html#c8b20e7430c5302936030bef59a562be">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>concurrent_queue()
+: <a class="el" href="a00249.html#9102b897776bd2d9e908e6604ff16b5f">tbb::deprecated::concurrent_queue< T, A ></a>, <a class="el" href="a00248.html#8a6b98ea11a867db8ac868f0113ca429">tbb::strict_ppl::concurrent_queue< T, A ></a><li>concurrent_vector()
+: <a class="el" href="a00250.html#4450de83c5862ea4bcd9443fd7e67419">tbb::concurrent_vector< T, A ></a><li>const_accessor()
+: <a class="el" href="a00246.html#27399c613eb1aecd4660803955dda09d">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a><li>construct()
+: <a class="el" href="a00317.html#ab228ab9e324ed041c2226e1d717df5f">tbb::tbb_allocator< T ></a>, <a class="el" href="a00270.html#c7e1671b725894b94ce9a6ac544e24f2">tbb::interface6::memory_pool_allocator< T, P ></a>, <a class="el" href="a00238.html#958ee8745c86c275bfc9533af565e017">tbb::cache_aligned_allocator< T ></a><li>context()
+: <a class="el" href="a00311.html#d8c36a93f3972590fbb65ff1cef3173b">tbb::task</a><li>continue_node()
+: <a class="el" href="a00252.html#869562787fcb5c57a90aea120f26d492">tbb::flow::interface6::continue_node< Output ></a><li>continue_receiver()
+: <a class="el" href="a00253.html#a0b292ed7fa6556b2a735f6d1e82dc74">tbb::flow::interface6::continue_receiver</a><li>count()
+: <a class="el" href="a00243.html#6968eb6feed2df36be421df0464297af">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>crbegin()
+: <a class="el" href="a00250.html#db78a1d28c9c966050e8a2926d834a33">tbb::concurrent_vector< T, A ></a><li>crend()
+: <a class="el" href="a00250.html#fff9cece89438587997ebedf93c5e962">tbb::concurrent_vector< T, A ></a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/functions_func_0x64.html b/doc/html/functions_func_0x64.html
index 41cd362..ce18572 100644
--- a/doc/html/functions_func_0x64.html
+++ b/doc/html/functions_func_0x64.html
@@ -61,12 +61,12 @@
<p>
<h3><a class="anchor" name="index_d">- d -</a></h3><ul>
<li>deallocate()
-: <a class="el" href="a00296.html#fdd011fdf2f9ad07006dc7c0a7ec1da2">tbb::tbb_allocator< T ></a>, <a class="el" href="a00280.html#f806a238c18cbcfb531e1e0a0d2ec59d">tbb::scalable_allocator< T ></a>, <a class="el" href="a00226.html#3d4eadf188f7d85d3805ae534e0b8e1c">tbb::cache_aligned_allocator< T ></a><li>decrement_ref_count()
-: <a class="el" href="a00291.html#ef4680f5c148020c5e7e43ddef44cd5d">tbb::task</a><li>decrement_wait_count()
-: <a class="el" href="a00250.html#ff3b6a3ef2ae1e661dcdb398c227b43c">tbb::graph</a><li>default_num_threads()
-: <a class="el" href="a00295.html#ba00714c33a41a3c2216f48613971cab">tbb::task_scheduler_init</a><li>destroy()
-: <a class="el" href="a00299.html#921875bbacd2c8a5f324c7da7a415262">tbb::internal::tbb_exception_ptr</a>, <a class="el" href="a00257.html#7a46873119d9f85a7b0009c13e41a258">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00228.html#93d875d3555502ff6f18513525de204c">tbb::captured_exception</a>, <a class="el" href="a00298.html#66c94938eca8bf88b76f3eccaaf215d8">tbb::tbb_exception</a>, <a class="el" href="a00296.html#ef133522bf55f05a605bee0763208281">tbb::tbb_allocator [...]
-: <a class="el" href="a00289.html#c2c2c38a08cb9080e87099fac3e5bc94">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00273.html#0d2f93edf7b15ec4bcee138823220c52">tbb::queuing_rw_mutex::scoped_lock</a></ul>
+: <a class="el" href="a00317.html#fdd011fdf2f9ad07006dc7c0a7ec1da2">tbb::tbb_allocator< T ></a>, <a class="el" href="a00299.html#f806a238c18cbcfb531e1e0a0d2ec59d">tbb::scalable_allocator< T ></a>, <a class="el" href="a00270.html#4e24a03de38638af07548383024c54ab">tbb::interface6::memory_pool_allocator< T, P ></a>, <a class="el" href="a00238.html#3d4eadf188f7d85d3805ae534e0b8e1c">tbb::cache_aligned_allocator< T ></a><li>decrement_ref_count()
+: <a class="el" href="a00311.html#ef4680f5c148020c5e7e43ddef44cd5d">tbb::task</a><li>decrement_wait_count()
+: <a class="el" href="a00262.html#29b85506870f13a884a21655aec2a65d">tbb::flow::interface6::graph</a><li>default_num_threads()
+: <a class="el" href="a00316.html#ba00714c33a41a3c2216f48613971cab">tbb::task_scheduler_init</a><li>destroy()
+: <a class="el" href="a00320.html#921875bbacd2c8a5f324c7da7a415262">tbb::internal::tbb_exception_ptr</a>, <a class="el" href="a00273.html#7a46873119d9f85a7b0009c13e41a258">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00240.html#93d875d3555502ff6f18513525de204c">tbb::captured_exception</a>, <a class="el" href="a00319.html#66c94938eca8bf88b76f3eccaaf215d8">tbb::tbb_exception</a>, <a class="el" href="a00317.html#ef133522bf55f05a605bee0763208281">tbb::tbb_allocator [...]
+: <a class="el" href="a00308.html#c2c2c38a08cb9080e87099fac3e5bc94">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00291.html#0d2f93edf7b15ec4bcee138823220c52">tbb::queuing_rw_mutex::scoped_lock</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/functions_func_0x65.html b/doc/html/functions_func_0x65.html
index f1d21cc..a7792ad 100644
--- a/doc/html/functions_func_0x65.html
+++ b/doc/html/functions_func_0x65.html
@@ -61,14 +61,13 @@
<p>
<h3><a class="anchor" name="index_e">- e -</a></h3><ul>
<li>empty()
-: <a class="el" href="a00294.html#f3ac31e092814b90929f81bb30441959">tbb::task_list</a>, <a class="el" href="a00243.html#72595886d0ac8fd0543f90038570510d">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00238.html#c6426cb93cf20d3af40f3c90f1f0481a">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00230.html#f64924f2ee9225c368a270fc3c394db9">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00236.htm [...]
-: <a class="el" href="a00243.html#cb448bb4977ce366ceb7344085cc7050">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00238.html#1e6aa764ce5a1cbd24526f68bc0a2f6b">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00221.html#8b929d93ddc13f148b11bceef3a3bdf8">tbb::blocked_range< Value ></a>, <a class="el" href="a00215.html#024be075c23c0394c9a2518d993bcd9e">tbb::aligned_space< T, N ></a><li>enqueue()
-: <a class="el" href="a00291.html#fe6bf6aaf84e664134fabb6c4f409ea9">tbb::task</a><li>enumerable_thread_specific()
-: <a class="el" href="a00243.html#7bce6829981c9efe3f59cae2355e383e">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a><li>erase()
-: <a class="el" href="a00231.html#5f12d150d421420965db07368666a84f">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>exclude()
-: <a class="el" href="a00231.html#0c964214eb38f54603aa75fdff6d2709">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>executable_node()
-: <a class="el" href="a00244.html#c13030111d34feeafd9cdb1dd21584f1">tbb::executable_node< Output ></a><li>execute()
-: <a class="el" href="a00291.html#22c298cd40937a431a06777423f002f6">tbb::task</a>, <a class="el" href="a00241.html#e6bf1d21e670b78ea00c71fccbe17c78">tbb::continue_receiver</a>, <a class="el" href="a00214.html#282d5a2f1216b185c91ed23d00119481">tbb::interface6::internal::aggregator< handler_type, operation_type ></a></ul>
+: <a class="el" href="a00315.html#f3ac31e092814b90929f81bb30441959">tbb::task_list</a>, <a class="el" href="a00255.html#72595886d0ac8fd0543f90038570510d">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00250.html#c6426cb93cf20d3af40f3c90f1f0481a">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00242.html#f64924f2ee9225c368a270fc3c394db9">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00248.htm [...]
+: <a class="el" href="a00255.html#cb448bb4977ce366ceb7344085cc7050">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00250.html#1e6aa764ce5a1cbd24526f68bc0a2f6b">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00233.html#8b929d93ddc13f148b11bceef3a3bdf8">tbb::blocked_range< Value ></a>, <a class="el" href="a00227.html#024be075c23c0394c9a2518d993bcd9e">tbb::aligned_space< T, N ></a><li>enqueue()
+: <a class="el" href="a00311.html#fe6bf6aaf84e664134fabb6c4f409ea9">tbb::task</a><li>enumerable_thread_specific()
+: <a class="el" href="a00255.html#7bce6829981c9efe3f59cae2355e383e">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a><li>erase()
+: <a class="el" href="a00243.html#5f12d150d421420965db07368666a84f">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>exclude()
+: <a class="el" href="a00243.html#0c964214eb38f54603aa75fdff6d2709">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>execute()
+: <a class="el" href="a00311.html#22c298cd40937a431a06777423f002f6">tbb::task</a>, <a class="el" href="a00253.html#40ca8b7e96c5bc3428b4d1e409725ee5">tbb::flow::interface6::continue_receiver</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/functions_func_0x66.html b/doc/html/functions_func_0x66.html
index 636de28..d16aafb 100644
--- a/doc/html/functions_func_0x66.html
+++ b/doc/html/functions_func_0x66.html
@@ -61,11 +61,11 @@
<p>
<h3><a class="anchor" name="index_f">- f -</a></h3><ul>
<li>finalize()
-: <a class="el" href="a00245.html#56275eb889c77c4807967133e21401bd">tbb::filter</a><li>find()
-: <a class="el" href="a00231.html#7bc475d1968f7f0af3d736d7e8a0d7df">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>forward()
-: <a class="el" href="a00225.html#3a31b3b55bee417de3af09c7b45b9ad6">tbb::buffer_node< T ></a><li>front()
-: <a class="el" href="a00238.html#502615a858eb9fa0390ee59169065e90">tbb::concurrent_vector< T, A ></a><li>function_node()
-: <a class="el" href="a00249.html#7bde12e8ee43d4cafbdd5b1fc2031e2b">tbb::function_node< Input, Output ></a></ul>
+: <a class="el" href="a00256.html#56275eb889c77c4807967133e21401bd">tbb::filter</a><li>find()
+: <a class="el" href="a00243.html#7bc475d1968f7f0af3d736d7e8a0d7df">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>forward()
+: <a class="el" href="a00237.html#2648324ce0a38b40132b8502ef250e3a">tbb::flow::interface6::buffer_node< T, A ></a><li>front()
+: <a class="el" href="a00250.html#502615a858eb9fa0390ee59169065e90">tbb::concurrent_vector< T, A ></a><li>function_node()
+: <a class="el" href="a00261.html#01055081ed477714503820035db3a965">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a>, <a class="el" href="a00260.html#d5132323fd2ac6a00ea0c78beda78723">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/functions_func_0x67.html b/doc/html/functions_func_0x67.html
index 759fd8e..89d0fa9 100644
--- a/doc/html/functions_func_0x67.html
+++ b/doc/html/functions_func_0x67.html
@@ -61,14 +61,13 @@
<p>
<h3><a class="anchor" name="index_g">- g -</a></h3><ul>
<li>get_allocator()
-: <a class="el" href="a00238.html#2fdba8e90de6a4d2300222236d46758e">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00230.html#415eb87e53b1c6a266de06ecbc490d16">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00236.html#f034f70caef445fe8abc9113ec926a8d">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00235.html#d545d444fb0d16148f9b61fd89f9a337">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a>, <a class="e [...]
-: <a class="el" href="a00221.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">tbb::blocked_range< Value ></a><li>graph()
-: <a class="el" href="a00250.html#1ba8311506558a2419101722f5d49ba9">tbb::graph</a><li>group()
-: <a class="el" href="a00291.html#5987123486afca36ddebb9e2a8b7779a">tbb::task</a><li>group_priority()
-: <a class="el" href="a00291.html#e1d969a1ccab6796e3b8b2c1a5be33d2">tbb::task</a><li>grow_by()
-: <a class="el" href="a00238.html#473a59a4c9308b93411b898b3110d26c">tbb::concurrent_vector< T, A ></a><li>grow_my_array()
-: <a class="el" href="a00225.html#3ec9d33aa9f1e9292d5952e3eb477ca1">tbb::buffer_node< T ></a><li>grow_to_at_least()
-: <a class="el" href="a00238.html#a7e3b67c8ccab16d0aecc80899ae799d">tbb::concurrent_vector< T, A ></a></ul>
+: <a class="el" href="a00250.html#2fdba8e90de6a4d2300222236d46758e">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00242.html#415eb87e53b1c6a266de06ecbc490d16">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00248.html#f034f70caef445fe8abc9113ec926a8d">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00247.html#d545d444fb0d16148f9b61fd89f9a337">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a>, <a class="e [...]
+: <a class="el" href="a00233.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">tbb::blocked_range< Value ></a><li>graph()
+: <a class="el" href="a00262.html#4ab3d4b5208ece28c4c3ced647e26e12">tbb::flow::interface6::graph</a><li>group()
+: <a class="el" href="a00311.html#5987123486afca36ddebb9e2a8b7779a">tbb::task</a><li>group_priority()
+: <a class="el" href="a00311.html#e1d969a1ccab6796e3b8b2c1a5be33d2">tbb::task</a><li>grow_by()
+: <a class="el" href="a00250.html#473a59a4c9308b93411b898b3110d26c">tbb::concurrent_vector< T, A ></a><li>grow_to_at_least()
+: <a class="el" href="a00250.html#a7e3b67c8ccab16d0aecc80899ae799d">tbb::concurrent_vector< T, A ></a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/functions_func_0x69.html b/doc/html/functions_func_0x69.html
index eb7cd39..c1f16ed 100644
--- a/doc/html/functions_func_0x69.html
+++ b/doc/html/functions_func_0x69.html
@@ -61,28 +61,28 @@
<p>
<h3><a class="anchor" name="index_i">- i -</a></h3><ul>
<li>increment_ref_count()
-: <a class="el" href="a00291.html#f5fb43c7ad0de5a4b95703cebc39e345">tbb::task</a><li>increment_wait_count()
-: <a class="el" href="a00250.html#1e5c5ae6538ec714cee107d1004705b9">tbb::graph</a><li>init()
-: <a class="el" href="a00293.html#49a55352084fd44b8863d182e839e6dc">tbb::task_group_context</a><li>initialize()
-: <a class="el" href="a00295.html#d5ed214a8bb53b0466ed91ff4734b9a3">tbb::task_scheduler_init</a><li>insert()
-: <a class="el" href="a00231.html#1dd37fad87e561151ba1e242ca94bcc1">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>internal_copy()
-: <a class="el" href="a00231.html#72c9c9e9655fcf096f5f0ed9c8ba6669">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>internal_equal_range()
-: <a class="el" href="a00231.html#8f5373b8e1864619d1ffcf3bf3f1f13d">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>internal_fast_find()
-: <a class="el" href="a00231.html#2f76ed101a0ccc8875b846c2f747897e">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>internal_forward()
-: <a class="el" href="a00268.html#79161e73f79cc43b2c2b08367504dfda">tbb::priority_queue_node< T, Compare ></a>, <a class="el" href="a00269.html#fb58bac5ac355e5134c51125e601fa2a">tbb::queue_node< T ></a>, <a class="el" href="a00225.html#a3cb61d8a98bc4bc860b1cb04944b4f8">tbb::buffer_node< T ></a><li>internal_reg_succ()
-: <a class="el" href="a00225.html#017f16c8d6e0fb65d0d3a61aec86b3e2">tbb::buffer_node< T ></a><li>internal_rem_succ()
-: <a class="el" href="a00225.html#a75f731cf9fc93f7487eb72de3fcf7b1">tbb::buffer_node< T ></a><li>interval_t()
-: <a class="el" href="a00303.html#1a21a428e00cced2e6a49e0f5f2258bf">tbb::tick_count::interval_t</a><li>is_active()
-: <a class="el" href="a00295.html#12752282977029f23416642bc03e8b74">tbb::task_scheduler_init</a><li>is_bound()
-: <a class="el" href="a00245.html#15c29cae5d237e6d63dbfe5c94af89d5">tbb::filter</a><li>is_cancelled()
-: <a class="el" href="a00291.html#025f18118c057c4c8db87ff2ce8df975">tbb::task</a><li>is_divisible()
-: <a class="el" href="a00223.html#39d69191721c488e737ae5d9c5336b9c">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>, <a class="el" href="a00222.html#ad36a9b38e4fef26d376f99552ce2d92">tbb::blocked_range2d< RowValue, ColValue ></a>, <a class="el" href="a00221.html#41a58b703d574b6e1ca155df3576f578">tbb::blocked_range< Value ></a><li>is_group_execution_cancelled()
-: <a class="el" href="a00293.html#4db72f16210b0a991b2c134d6763a4cc">tbb::task_group_context</a><li>is_ordered()
-: <a class="el" href="a00245.html#cd53206c4795ef2df5df26b795caf692">tbb::filter</a><li>is_owned_by_current_thread()
-: <a class="el" href="a00291.html#c26718b3b247cd13deb1a741902e7105">tbb::task</a><li>is_serial()
-: <a class="el" href="a00245.html#fcfec27656a69ff2072802ac001e936f">tbb::filter</a><li>is_stolen_task()
-: <a class="el" href="a00291.html#f9169402702f56bf519448aaf34450aa">tbb::task</a><li>is_writer()
-: <a class="el" href="a00233.html#07d958f151a0eaa92f50fd56ad6440e2">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a>, <a class="el" href="a00289.html#6b5a7c3c67a36b05c4df8410d32627d8">tbb::spin_rw_mutex_v3::scoped_lock</a></ul>
+: <a class="el" href="a00311.html#f5fb43c7ad0de5a4b95703cebc39e345">tbb::task</a><li>increment_wait_count()
+: <a class="el" href="a00262.html#a993b789d1e488e0c3929135beae560e">tbb::flow::interface6::graph</a><li>init()
+: <a class="el" href="a00313.html#49a55352084fd44b8863d182e839e6dc">tbb::task_group_context</a><li>initialize()
+: <a class="el" href="a00316.html#d5ed214a8bb53b0466ed91ff4734b9a3">tbb::task_scheduler_init</a><li>insert()
+: <a class="el" href="a00243.html#1dd37fad87e561151ba1e242ca94bcc1">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>internal_copy()
+: <a class="el" href="a00243.html#72c9c9e9655fcf096f5f0ed9c8ba6669">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>internal_equal_range()
+: <a class="el" href="a00243.html#8f5373b8e1864619d1ffcf3bf3f1f13d">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>internal_fast_find()
+: <a class="el" href="a00243.html#2f76ed101a0ccc8875b846c2f747897e">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>internal_forward()
+: <a class="el" href="a00286.html#ed2d8dc0a9c1c2571e4a69df2f2209e5">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>, <a class="el" href="a00287.html#eadcbbb81f9a9d223afabe0f40e77ecb">tbb::flow::interface6::queue_node< T, A ></a>, <a class="el" href="a00237.html#dcbffbae514f4d95205b0845785c0a91">tbb::flow::interface6::buffer_node< T, A ></a><li>internal_reg_succ()
+: <a class="el" href="a00237.html#df21388252b8963e839dca29d2c67ea5">tbb::flow::interface6::buffer_node< T, A ></a><li>internal_rem_succ()
+: <a class="el" href="a00237.html#6b6cf76dff80fd679251da93351c1291">tbb::flow::interface6::buffer_node< T, A ></a><li>interval_t()
+: <a class="el" href="a00324.html#1a21a428e00cced2e6a49e0f5f2258bf">tbb::tick_count::interval_t</a><li>is_active()
+: <a class="el" href="a00316.html#12752282977029f23416642bc03e8b74">tbb::task_scheduler_init</a><li>is_bound()
+: <a class="el" href="a00256.html#15c29cae5d237e6d63dbfe5c94af89d5">tbb::filter</a><li>is_cancelled()
+: <a class="el" href="a00311.html#025f18118c057c4c8db87ff2ce8df975">tbb::task</a><li>is_divisible()
+: <a class="el" href="a00235.html#39d69191721c488e737ae5d9c5336b9c">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>, <a class="el" href="a00234.html#ad36a9b38e4fef26d376f99552ce2d92">tbb::blocked_range2d< RowValue, ColValue ></a>, <a class="el" href="a00233.html#41a58b703d574b6e1ca155df3576f578">tbb::blocked_range< Value ></a><li>is_group_execution_cancelled()
+: <a class="el" href="a00313.html#4db72f16210b0a991b2c134d6763a4cc">tbb::task_group_context</a><li>is_ordered()
+: <a class="el" href="a00256.html#cd53206c4795ef2df5df26b795caf692">tbb::filter</a><li>is_owned_by_current_thread()
+: <a class="el" href="a00311.html#c26718b3b247cd13deb1a741902e7105">tbb::task</a><li>is_serial()
+: <a class="el" href="a00256.html#fcfec27656a69ff2072802ac001e936f">tbb::filter</a><li>is_stolen_task()
+: <a class="el" href="a00311.html#f9169402702f56bf519448aaf34450aa">tbb::task</a><li>is_writer()
+: <a class="el" href="a00245.html#07d958f151a0eaa92f50fd56ad6440e2">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a>, <a class="el" href="a00308.html#6b5a7c3c67a36b05c4df8410d32627d8">tbb::spin_rw_mutex_v3::scoped_lock</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/functions_func_0x6c.html b/doc/html/functions_func_0x6c.html
index 1a1a4b6..39c5b13 100644
--- a/doc/html/functions_func_0x6c.html
+++ b/doc/html/functions_func_0x6c.html
@@ -61,11 +61,12 @@
<p>
<h3><a class="anchor" name="index_l">- l -</a></h3><ul>
<li>limiter_node()
-: <a class="el" href="a00255.html#f0139fc645a51ce30b7aebb59c38a4ed">tbb::limiter_node< T ></a><li>local()
-: <a class="el" href="a00243.html#7dc79058d2832f7447de8e691c3455ea">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a><li>lock()
-: <a class="el" href="a00288.html#4007d6e1523dbc3c2bb7f889ab789a8a">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00286.html#4f748989e19b6045e3a2d2ee73626a28">tbb::spin_mutex</a>, <a class="el" href="a00278.html#4c342c69d47f4bb0b393535dee4015d6">tbb::recursive_mutex</a>, <a class="el" href="a00274.html#2653d1a2d560059a51219a8ceab3ade9">tbb::interface5::reader_writer_lock</a>, <a class="el" href="a00258.html#4470e61c24c129a0299ca6c17240adbb">tbb::mutex</a><li>lock_read()
-: <a class="el" href="a00288.html#13f799708ac4ca437a16be202e263e18">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00274.html#d9d16a24d9f6c3dada73c6b9ff214f5b">tbb::interface5::reader_writer_lock</a><li>lookup()
-: <a class="el" href="a00231.html#3f3413264a99174a224ef96f6c4ea769">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></ul>
+: <a class="el" href="a00266.html#83d3ab884543b070ee5b345a87f241fa">tbb::flow::interface6::limiter_node< T ></a><li>load()
+: <a class="el" href="a00298.html#5f3f6f1683386705a6931acae45f0862">tbb::interface6::runtime_loader</a><li>local()
+: <a class="el" href="a00255.html#7dc79058d2832f7447de8e691c3455ea">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a><li>lock()
+: <a class="el" href="a00307.html#4007d6e1523dbc3c2bb7f889ab789a8a">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00305.html#4f748989e19b6045e3a2d2ee73626a28">tbb::spin_mutex</a>, <a class="el" href="a00296.html#4c342c69d47f4bb0b393535dee4015d6">tbb::recursive_mutex</a>, <a class="el" href="a00292.html#2653d1a2d560059a51219a8ceab3ade9">tbb::interface5::reader_writer_lock</a>, <a class="el" href="a00275.html#4470e61c24c129a0299ca6c17240adbb">tbb::mutex</a><li>lock_read()
+: <a class="el" href="a00307.html#13f799708ac4ca437a16be202e263e18">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00292.html#d9d16a24d9f6c3dada73c6b9ff214f5b">tbb::interface5::reader_writer_lock</a><li>lookup()
+: <a class="el" href="a00243.html#3f3413264a99174a224ef96f6c4ea769">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/functions_func_0x6d.html b/doc/html/functions_func_0x6d.html
index 83efb79..276dca7 100644
--- a/doc/html/functions_func_0x6d.html
+++ b/doc/html/functions_func_0x6d.html
@@ -61,9 +61,10 @@
<p>
<h3><a class="anchor" name="index_m">- m -</a></h3><ul>
<li>max_size()
-: <a class="el" href="a00296.html#f059ca2c96243024f0d562ee3a87a3a5">tbb::tbb_allocator< T ></a>, <a class="el" href="a00280.html#880e766f1d913988c21973dbdd874fd5">tbb::scalable_allocator< T ></a>, <a class="el" href="a00238.html#2c248a017f0576df3e7cd99627836fd6">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00231.html#2bce57fe9b594abe1e6d2568aea8b357">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>, <a class="el" href="a00226. [...]
-: <a class="el" href="a00257.html#1aea0ad179d6f0481fe7f3495f66adf9">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00228.html#837a50b8f6a800bda225c39d1699643f">tbb::captured_exception</a>, <a class="el" href="a00298.html#3e3482bf264d4ca4dde046cd9c02c766">tbb::tbb_exception</a><li>mutex()
-: <a class="el" href="a00258.html#05313cb77d4f85213103d4dab74ed454">tbb::mutex</a>, <a class="el" href="a00289.html#d96d1a1fcc3d79ef3e5c06a53b8ffeaa">tbb::spin_rw_mutex_v3::scoped_lock</a></ul>
+: <a class="el" href="a00317.html#f059ca2c96243024f0d562ee3a87a3a5">tbb::tbb_allocator< T ></a>, <a class="el" href="a00299.html#880e766f1d913988c21973dbdd874fd5">tbb::scalable_allocator< T ></a>, <a class="el" href="a00270.html#beebdb6144df8ba219fadfad4de866ea">tbb::interface6::memory_pool_allocator< T, P ></a>, <a class="el" href="a00250.html#2c248a017f0576df3e7cd99627836fd6">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00243.html#2bce57fe9b594abe1e6 [...]
+: <a class="el" href="a00269.html#2822528265718a4c779591fc37c02ca8">tbb::interface6::memory_pool< Alloc ></a><li>move()
+: <a class="el" href="a00273.html#1aea0ad179d6f0481fe7f3495f66adf9">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00240.html#837a50b8f6a800bda225c39d1699643f">tbb::captured_exception</a>, <a class="el" href="a00319.html#3e3482bf264d4ca4dde046cd9c02c766">tbb::tbb_exception</a><li>mutex()
+: <a class="el" href="a00275.html#05313cb77d4f85213103d4dab74ed454">tbb::mutex</a>, <a class="el" href="a00308.html#d96d1a1fcc3d79ef3e5c06a53b8ffeaa">tbb::spin_rw_mutex_v3::scoped_lock</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/functions_func_0x6e.html b/doc/html/functions_func_0x6e.html
index 5e59bcf..2a91226 100644
--- a/doc/html/functions_func_0x6e.html
+++ b/doc/html/functions_func_0x6e.html
@@ -61,9 +61,9 @@
<p>
<h3><a class="anchor" name="index_n">- n -</a></h3><ul>
<li>name()
-: <a class="el" href="a00257.html#bc5f5c4739b17ac5211ac58226c2f5a5">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00228.html#5af82fd677449c5ca727fa1d7e16f9f5">tbb::captured_exception</a>, <a class="el" href="a00298.html#d00f6497e552fee978a02bfcbebf46e2">tbb::tbb_exception</a><li>note_affinity()
-: <a class="el" href="a00291.html#713c338c8eeaebdc5a6b10a69c039b06">tbb::task</a><li>now()
-: <a class="el" href="a00302.html#fb7f78ca61cf28398645ace66e284473">tbb::tick_count</a></ul>
+: <a class="el" href="a00273.html#bc5f5c4739b17ac5211ac58226c2f5a5">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00240.html#5af82fd677449c5ca727fa1d7e16f9f5">tbb::captured_exception</a>, <a class="el" href="a00319.html#d00f6497e552fee978a02bfcbebf46e2">tbb::tbb_exception</a><li>note_affinity()
+: <a class="el" href="a00311.html#713c338c8eeaebdc5a6b10a69c039b06">tbb::task</a><li>now()
+: <a class="el" href="a00323.html#fb7f78ca61cf28398645ace66e284473">tbb::tick_count</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/functions_func_0x6f.html b/doc/html/functions_func_0x6f.html
index cba6cd1..ad27829 100644
--- a/doc/html/functions_func_0x6f.html
+++ b/doc/html/functions_func_0x6f.html
@@ -61,15 +61,15 @@
<p>
<h3><a class="anchor" name="index_o">- o -</a></h3><ul>
<li>object_may_be_null()
-: <a class="el" href="a00245.html#8ec4dfe053e94a2349d56781ddea8477">tbb::filter</a><li>operator *()
-: <a class="el" href="a00232.html#170280ea807a22e742095de3e8c5ea38">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a>, <a class="el" href="a00234.html#9411df8197ceb4881ec4c7368a0a7f88">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a><li>operator delete()
-: <a class="el" href="a00298.html#3f2da7f3d8a6e4c1df522af1213afb5a">tbb::tbb_exception</a><li>operator()()
-: <a class="el" href="a00245.html#fa1b3dc1f4f47563ccab7f4d92f5b543">tbb::filter</a>, <a class="el" href="a00233.html#fa6314b861c574f86ed189b124cf5853">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a><li>operator+=()
-: <a class="el" href="a00303.html#cd9814947902e26463a69a111530f81b">tbb::tick_count::interval_t</a><li>operator-=()
-: <a class="el" href="a00303.html#35ff7eaf7c2031b4a991402ac9ecb940">tbb::tick_count::interval_t</a><li>operator->()
-: <a class="el" href="a00232.html#a807920cdffe3ec5c5e282b4d1ff92a2">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a>, <a class="el" href="a00234.html#3d03a48ecb8cd9549bd8be64b09c9b0d">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a><li>operator=()
-: <a class="el" href="a00238.html#19f4ab88a01b0fd056af3bba463e7bd6">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00235.html#2ab7f7808891027ac0f0f5b3a4be51e9">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a>, <a class="el" href="a00231.html#088d1aaccc816884a49e38f7065622c8">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>operator[]()
-: <a class="el" href="a00238.html#c6fade5c732cc95274d1d8277ea619d1">tbb::concurrent_vector< T, A ></a></ul>
+: <a class="el" href="a00256.html#8ec4dfe053e94a2349d56781ddea8477">tbb::filter</a><li>operator *()
+: <a class="el" href="a00244.html#170280ea807a22e742095de3e8c5ea38">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a>, <a class="el" href="a00246.html#9411df8197ceb4881ec4c7368a0a7f88">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a><li>operator delete()
+: <a class="el" href="a00319.html#3f2da7f3d8a6e4c1df522af1213afb5a">tbb::tbb_exception</a><li>operator()()
+: <a class="el" href="a00256.html#fa1b3dc1f4f47563ccab7f4d92f5b543">tbb::filter</a>, <a class="el" href="a00245.html#fa6314b861c574f86ed189b124cf5853">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a><li>operator+=()
+: <a class="el" href="a00324.html#cd9814947902e26463a69a111530f81b">tbb::tick_count::interval_t</a><li>operator-=()
+: <a class="el" href="a00324.html#35ff7eaf7c2031b4a991402ac9ecb940">tbb::tick_count::interval_t</a><li>operator->()
+: <a class="el" href="a00244.html#a807920cdffe3ec5c5e282b4d1ff92a2">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a>, <a class="el" href="a00246.html#3d03a48ecb8cd9549bd8be64b09c9b0d">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a><li>operator=()
+: <a class="el" href="a00250.html#19f4ab88a01b0fd056af3bba463e7bd6">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00247.html#2ab7f7808891027ac0f0f5b3a4be51e9">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a>, <a class="el" href="a00243.html#088d1aaccc816884a49e38f7065622c8">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>operator[]()
+: <a class="el" href="a00250.html#c6fade5c732cc95274d1d8277ea619d1">tbb::concurrent_vector< T, A ></a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/functions_func_0x70.html b/doc/html/functions_func_0x70.html
index 0920583..a624403 100644
--- a/doc/html/functions_func_0x70.html
+++ b/doc/html/functions_func_0x70.html
@@ -61,20 +61,20 @@
<p>
<h3><a class="anchor" name="index_p">- p -</a></h3><ul>
<li>pages()
-: <a class="el" href="a00223.html#cf971430aa12361d3ed245344b7c6764">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a><li>parallel_while()
-: <a class="el" href="a00265.html#36e26ba3880c7bcf804a97ba0cbe133f">tbb::parallel_while< Body ></a><li>parent()
-: <a class="el" href="a00291.html#314e98ee4347ccec83efcb9ee22e8596">tbb::task</a><li>pause()
-: <a class="el" href="a00218.html#a174ea93e3bd3d5cce82389c2f28d037">tbb::internal::atomic_backoff</a><li>pipeline()
-: <a class="el" href="a00266.html#596dc3beba27099c4c8581cb419e1a59">tbb::pipeline</a><li>pop()
-: <a class="el" href="a00230.html#41f4c6bd7a82ab070e840bbf81b0b123">tbb::concurrent_bounded_queue< T, A ></a><li>pop_front()
-: <a class="el" href="a00294.html#5fe85df5ed524418389d34051750347d">tbb::task_list</a><li>pop_if_present()
-: <a class="el" href="a00237.html#48da3536245318af6cb5fd58bac78039">tbb::deprecated::concurrent_queue< T, A ></a><li>priority()
-: <a class="el" href="a00293.html#2f2342b9e6c9c03703248ac13ad0271d">tbb::task_group_context</a><li>priority_queue_node()
-: <a class="el" href="a00268.html#1630f68674c4b201346a391b1e8d3f5d">tbb::priority_queue_node< T, Compare ></a><li>process_item()
-: <a class="el" href="a00301.html#5e726bdc7fbd924c0b07bd558b1d4d5d">tbb::thread_bound_filter</a><li>push()
-: <a class="el" href="a00230.html#ceb08c743b11ba88c878e73fff8af20b">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00236.html#73c47563ffcc4c2f6452f25a04ebe2e2">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00235.html#d905af7b8f6defff562f5ae9c3275763">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>push_back()
-: <a class="el" href="a00294.html#4cd34756bc4763dafb8c84838a0124ff">tbb::task_list</a>, <a class="el" href="a00238.html#e94e038f915c0268fdf2d3d7f87d81b8">tbb::concurrent_vector< T, A ></a><li>push_if_not_full()
-: <a class="el" href="a00237.html#7c45561bafe71107d09b2bc1b8f4e681">tbb::deprecated::concurrent_queue< T, A ></a></ul>
+: <a class="el" href="a00235.html#cf971430aa12361d3ed245344b7c6764">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a><li>parallel_while()
+: <a class="el" href="a00282.html#36e26ba3880c7bcf804a97ba0cbe133f">tbb::parallel_while< Body ></a><li>parent()
+: <a class="el" href="a00311.html#314e98ee4347ccec83efcb9ee22e8596">tbb::task</a><li>pause()
+: <a class="el" href="a00230.html#a174ea93e3bd3d5cce82389c2f28d037">tbb::internal::atomic_backoff</a><li>pipeline()
+: <a class="el" href="a00284.html#596dc3beba27099c4c8581cb419e1a59">tbb::pipeline</a><li>pop()
+: <a class="el" href="a00242.html#41f4c6bd7a82ab070e840bbf81b0b123">tbb::concurrent_bounded_queue< T, A ></a><li>pop_front()
+: <a class="el" href="a00315.html#5fe85df5ed524418389d34051750347d">tbb::task_list</a><li>pop_if_present()
+: <a class="el" href="a00249.html#48da3536245318af6cb5fd58bac78039">tbb::deprecated::concurrent_queue< T, A ></a><li>priority()
+: <a class="el" href="a00313.html#2f2342b9e6c9c03703248ac13ad0271d">tbb::task_group_context</a><li>priority_queue_node()
+: <a class="el" href="a00286.html#17a4f66e23d54100b64805405e905d62">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a><li>process_item()
+: <a class="el" href="a00322.html#5e726bdc7fbd924c0b07bd558b1d4d5d">tbb::thread_bound_filter</a><li>push()
+: <a class="el" href="a00242.html#ceb08c743b11ba88c878e73fff8af20b">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00248.html#73c47563ffcc4c2f6452f25a04ebe2e2">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00247.html#d905af7b8f6defff562f5ae9c3275763">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>push_back()
+: <a class="el" href="a00315.html#4cd34756bc4763dafb8c84838a0124ff">tbb::task_list</a>, <a class="el" href="a00250.html#e94e038f915c0268fdf2d3d7f87d81b8">tbb::concurrent_vector< T, A ></a><li>push_if_not_full()
+: <a class="el" href="a00249.html#7c45561bafe71107d09b2bc1b8f4e681">tbb::deprecated::concurrent_queue< T, A ></a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/functions_func_0x71.html b/doc/html/functions_func_0x71.html
index cea02fd..b59f3fa 100644
--- a/doc/html/functions_func_0x71.html
+++ b/doc/html/functions_func_0x71.html
@@ -61,9 +61,9 @@
<p>
<h3><a class="anchor" name="index_q">- q -</a></h3><ul>
<li>queue_node()
-: <a class="el" href="a00269.html#1564c6bf9573b13d6854b0e8f7ce2b68">tbb::queue_node< T ></a><li>queuing_mutex()
-: <a class="el" href="a00270.html#b389ad9c4db7293e4bdb5b8cda69ec04">tbb::queuing_mutex</a><li>queuing_rw_mutex()
-: <a class="el" href="a00272.html#85c90877c3447690ac4e2ac4ff8dea5e">tbb::queuing_rw_mutex</a></ul>
+: <a class="el" href="a00287.html#0226762d9ebba28311b7b1518d948ab1">tbb::flow::interface6::queue_node< T, A ></a><li>queuing_mutex()
+: <a class="el" href="a00288.html#b389ad9c4db7293e4bdb5b8cda69ec04">tbb::queuing_mutex</a><li>queuing_rw_mutex()
+: <a class="el" href="a00290.html#85c90877c3447690ac4e2ac4ff8dea5e">tbb::queuing_rw_mutex</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/functions_func_0x72.html b/doc/html/functions_func_0x72.html
index 2d81cc0..0a26187 100644
--- a/doc/html/functions_func_0x72.html
+++ b/doc/html/functions_func_0x72.html
@@ -61,29 +61,30 @@
<p>
<h3><a class="anchor" name="index_r">- r -</a></h3><ul>
<li>range()
-: <a class="el" href="a00243.html#3b068000cf4dbf9b40f8bb7e3fc53e0b">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00238.html#3d09ccfb581b879ae64203741035e193">tbb::concurrent_vector< T, A ></a><li>rbegin()
-: <a class="el" href="a00238.html#9f9c103e18d5f212703805354074ad44">tbb::concurrent_vector< T, A ></a><li>reader_writer_lock()
-: <a class="el" href="a00274.html#c1431c4293e777efd9aab9a95c2a46e1">tbb::interface5::reader_writer_lock</a><li>recursive_mutex()
-: <a class="el" href="a00278.html#d2fceb7f95c24a8cd1457d4527e4b8c6">tbb::recursive_mutex</a><li>recycle_as_child_of()
-: <a class="el" href="a00291.html#db399855177438bbc9cc61d508dae8d2">tbb::task</a><li>recycle_as_continuation()
-: <a class="el" href="a00291.html#a67a79e18f62b43a623a00cfbd76db4c">tbb::task</a><li>recycle_as_safe_continuation()
-: <a class="el" href="a00291.html#3b290d14109704e2b69dc1ac980a7a76">tbb::task</a><li>recycle_to_reexecute()
-: <a class="el" href="a00291.html#4f1be9bbcdb487830dbe298b68d85144">tbb::task</a><li>ref_count()
-: <a class="el" href="a00291.html#ad774f55eaec008ae02b236423209ced">tbb::task</a><li>register_pending_exception()
-: <a class="el" href="a00293.html#d97c8a03615594b71b4ef06ff75cf561">tbb::task_group_context</a><li>register_predecessor()
-: <a class="el" href="a00304.html#6dc1f9bf02109c7f6fe4cc58bc31a00c">tbb::internal::two_phase_port< T ></a>, <a class="el" href="a00255.html#fb9909b87538f5c881c7cb7577436d14">tbb::limiter_node< T ></a>, <a class="el" href="a00241.html#b9fa9290cbb871f8780f9d69e1ec3b4e">tbb::continue_receiver</a>, <a class="el" href="a00277.html#14ae737c8fca4c8bf8e1a736dfbac444">tbb::receiver< T ></a><li>register_successor()
-: <a class="el" href="a00255.html#b8b9dbfbfc52750fa0c6bb8849681e86">tbb::limiter_node< T ></a>, <a class="el" href="a00225.html#cd2ef588b0ee6eb8d23ee169e00c73a9">tbb::buffer_node< T ></a>, <a class="el" href="a00224.html#3f4149fa6b984b2138cb5ed40a2ddc6c">tbb::broadcast_node< T ></a>, <a class="el" href="a00285.html#ce601874ec5cbb0996f6dcb8e43badb8">tbb::source_node< Output ></a>, <a class="el" href="a00282.html#be48ac70174cf8e08e2b0279cd6343d3">tbb::sender< T & [...]
-: <a class="el" href="a00231.html#94758113d8993cfe5afdf2d63a728869">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>release()
-: <a class="el" href="a00289.html#61b14d00a78185c9b2d206ebfc379124">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00287.html#eeb615e68e963e6bf8d9c11402d0ce8e">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00279.html#ac480ea0e9d5ea0345a67d57008b6263">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00273.html#67ae221109ddc69510ab593874e435d4">tbb::queuing_rw_mutex::scoped_lock</a>, <a class="el" href="a00271.html#3bf2b8c87ff22115be9b2eac179f2d30">tbb::qu [...]
-: <a class="el" href="a00304.html#a734a55289804ff34ce1c6ac4c5075e4">tbb::internal::two_phase_port< T ></a>, <a class="el" href="a00255.html#a05cf39b2825183e9c0393890fbbbb41">tbb::limiter_node< T ></a>, <a class="el" href="a00241.html#02411d8d13b380062548aff133752cc5">tbb::continue_receiver</a>, <a class="el" href="a00277.html#d2f23b40b328dc254a7c2a0a30f408e4">tbb::receiver< T ></a><li>remove_successor()
-: <a class="el" href="a00255.html#047d77f583e789e6d3ac6a52aba3168b">tbb::limiter_node< T ></a>, <a class="el" href="a00225.html#415428db02e74a479fb056a8ed72ba53">tbb::buffer_node< T ></a>, <a class="el" href="a00224.html#eefb3210bb9727765ea7385ba163c2a6">tbb::broadcast_node< T ></a>, <a class="el" href="a00285.html#de069bfc6fae7ed4e82b2a1fbb58b721">tbb::source_node< Output ></a>, <a class="el" href="a00282.html#3f345427e812e8741370308ff88f30bf">tbb::sender< T & [...]
-: <a class="el" href="a00238.html#d438b9b32ea3a8ffb703015b6dce055b">tbb::concurrent_vector< T, A ></a><li>reserve()
-: <a class="el" href="a00304.html#1d7399cfc77fca8878d8d16049ce4e7e">tbb::internal::two_phase_port< T ></a>, <a class="el" href="a00238.html#5a0ce05026994b010018f72cfdeb72c1">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00235.html#e7c59f011c4cca83ff210aefe7c9d868">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>reset()
-: <a class="el" href="a00293.html#6d30d16bf1cd22f86c6afaf29c2b430c">tbb::task_group_context</a><li>resize()
-: <a class="el" href="a00238.html#98ce6b2c6d2622f0c030b46dfac3880c">tbb::concurrent_vector< T, A ></a><li>root_task()
-: <a class="el" href="a00250.html#34d61d8b6560e5b2eb42e0112701db0f">tbb::graph</a><li>rows()
-: <a class="el" href="a00223.html#1584623e59ff32a8aa82006827508be4">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>, <a class="el" href="a00222.html#f496e7348a82652fba581203477cc07c">tbb::blocked_range2d< RowValue, ColValue ></a><li>run()
-: <a class="el" href="a00266.html#93d7fec8cd607b803dd2d79fb46bd260">tbb::pipeline</a>, <a class="el" href="a00265.html#b32a0a6e5e09ebb7fad3e6652c19afe5">tbb::parallel_while< Body ></a>, <a class="el" href="a00250.html#71213dd18099298dc74731e293c8286a">tbb::graph</a></ul>
+: <a class="el" href="a00255.html#3b068000cf4dbf9b40f8bb7e3fc53e0b">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00250.html#3d09ccfb581b879ae64203741035e193">tbb::concurrent_vector< T, A ></a><li>rbegin()
+: <a class="el" href="a00250.html#9f9c103e18d5f212703805354074ad44">tbb::concurrent_vector< T, A ></a><li>reader_writer_lock()
+: <a class="el" href="a00292.html#c1431c4293e777efd9aab9a95c2a46e1">tbb::interface5::reader_writer_lock</a><li>recursive_mutex()
+: <a class="el" href="a00296.html#d2fceb7f95c24a8cd1457d4527e4b8c6">tbb::recursive_mutex</a><li>recycle_as_child_of()
+: <a class="el" href="a00311.html#db399855177438bbc9cc61d508dae8d2">tbb::task</a><li>recycle_as_continuation()
+: <a class="el" href="a00311.html#a67a79e18f62b43a623a00cfbd76db4c">tbb::task</a><li>recycle_as_safe_continuation()
+: <a class="el" href="a00311.html#3b290d14109704e2b69dc1ac980a7a76">tbb::task</a><li>recycle_to_reexecute()
+: <a class="el" href="a00311.html#4f1be9bbcdb487830dbe298b68d85144">tbb::task</a><li>ref_count()
+: <a class="el" href="a00311.html#ad774f55eaec008ae02b236423209ced">tbb::task</a><li>register_pending_exception()
+: <a class="el" href="a00313.html#d97c8a03615594b71b4ef06ff75cf561">tbb::task_group_context</a><li>register_predecessor()
+: <a class="el" href="a00266.html#de70a0e88ce7655d8c14b6af57f7496f">tbb::flow::interface6::limiter_node< T ></a>, <a class="el" href="a00253.html#2fcfa4990a42417bbeb1f3c8b9ac8a22">tbb::flow::interface6::continue_receiver</a>, <a class="el" href="a00295.html#30e3316466efe3a713c23062b6e806f3">tbb::flow::interface6::receiver< T ></a><li>register_successor()
+: <a class="el" href="a00266.html#c76561d8d871b4769876988a4de12a9b">tbb::flow::interface6::limiter_node< T ></a>, <a class="el" href="a00237.html#f8bf4944ede4fc106423d67715beb695">tbb::flow::interface6::buffer_node< T, A ></a>, <a class="el" href="a00236.html#fd0324c9ddb51fe6f95b3d015d338941">tbb::flow::interface6::broadcast_node< T ></a>, <a class="el" href="a00304.html#22960d499df9f1569a9d8a544e35afe3">tbb::flow::interface6::source_node< Output ></a>, <a class=" [...]
+: <a class="el" href="a00243.html#94758113d8993cfe5afdf2d63a728869">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>release()
+: <a class="el" href="a00308.html#61b14d00a78185c9b2d206ebfc379124">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00306.html#eeb615e68e963e6bf8d9c11402d0ce8e">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00297.html#ac480ea0e9d5ea0345a67d57008b6263">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00291.html#67ae221109ddc69510ab593874e435d4">tbb::queuing_rw_mutex::scoped_lock</a>, <a class="el" href="a00289.html#3bf2b8c87ff22115be9b2eac179f2d30">tbb::qu [...]
+: <a class="el" href="a00266.html#c530e7b469454e2340460795f2da3317">tbb::flow::interface6::limiter_node< T ></a>, <a class="el" href="a00253.html#cb691b18416d4742265aed84d496ebbd">tbb::flow::interface6::continue_receiver</a>, <a class="el" href="a00295.html#3bc76547b51d3c9b633e3987d22dce95">tbb::flow::interface6::receiver< T ></a><li>remove_successor()
+: <a class="el" href="a00266.html#275e328063c121b3e506ccef2a825d28">tbb::flow::interface6::limiter_node< T ></a>, <a class="el" href="a00237.html#2074da0e39b9477c32897d6e5786196f">tbb::flow::interface6::buffer_node< T, A ></a>, <a class="el" href="a00236.html#366efcc046ec08a104281109801ae629">tbb::flow::interface6::broadcast_node< T ></a>, <a class="el" href="a00304.html#222484bf295f39df36415a29e508e5c9">tbb::flow::interface6::source_node< Output ></a>, <a class=" [...]
+: <a class="el" href="a00250.html#d438b9b32ea3a8ffb703015b6dce055b">tbb::concurrent_vector< T, A ></a><li>reserve()
+: <a class="el" href="a00250.html#5a0ce05026994b010018f72cfdeb72c1">tbb::concurrent_vector< T, A ></a><li>reset()
+: <a class="el" href="a00313.html#6d30d16bf1cd22f86c6afaf29c2b430c">tbb::task_group_context</a><li>resize()
+: <a class="el" href="a00250.html#98ce6b2c6d2622f0c030b46dfac3880c">tbb::concurrent_vector< T, A ></a><li>root_task()
+: <a class="el" href="a00262.html#7f4e3ae90811a5d8b597146b5b586d10">tbb::flow::interface6::graph</a><li>rows()
+: <a class="el" href="a00235.html#1584623e59ff32a8aa82006827508be4">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>, <a class="el" href="a00234.html#f496e7348a82652fba581203477cc07c">tbb::blocked_range2d< RowValue, ColValue ></a><li>run()
+: <a class="el" href="a00284.html#93d7fec8cd607b803dd2d79fb46bd260">tbb::pipeline</a>, <a class="el" href="a00282.html#b32a0a6e5e09ebb7fad3e6652c19afe5">tbb::parallel_while< Body ></a>, <a class="el" href="a00262.html#c1145b00e063793a7e7bf994d202c7a0">tbb::flow::interface6::graph</a><li>runtime_loader()
+: <a class="el" href="a00298.html#7ae5330beb48fce0c702c32a5df0094a">tbb::interface6::runtime_loader</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/functions_func_0x73.html b/doc/html/functions_func_0x73.html
index ca03ec2..ef5e94a 100644
--- a/doc/html/functions_func_0x73.html
+++ b/doc/html/functions_func_0x73.html
@@ -61,26 +61,28 @@
<p>
<h3><a class="anchor" name="index_s">- s -</a></h3><ul>
<li>scoped_lock()
-: <a class="el" href="a00289.html#42a92d4f8fdde425b111cfa8a9228071">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00287.html#5ce6807050a9e8f87bcb4a65dccb12ef">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00279.html#dec17713c4c1321ac8fec66816d0c602">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00275.html#cf19f20e082887c1bb0ba6b0911c3583">tbb::interface5::reader_writer_lock::scoped_lock</a>, <a class="el" href="a00273.html#fbb8798792d3aebb136c46fc63d [...]
-: <a class="el" href="a00276.html#87ab0dc8f7216e6ba0f7acd6aec33064">tbb::interface5::reader_writer_lock::scoped_lock_read</a><li>seconds()
-: <a class="el" href="a00303.html#d5d8429c0bc59cf6131b2abc7929fa59">tbb::tick_count::interval_t</a><li>self()
-: <a class="el" href="a00291.html#bd43e8d6249738efafd12d6a4c72c5e3">tbb::task</a><li>sequencer_node()
-: <a class="el" href="a00283.html#c3138c1c96b76ae9f13b0abbf7029590">tbb::sequencer_node< T ></a><li>set_affinity()
-: <a class="el" href="a00291.html#dca19d7a45487a7d67a0db517e2b57c9">tbb::task</a><li>set_capacity()
-: <a class="el" href="a00230.html#f3c6c934f85fd02aedbc83a16943193b">tbb::concurrent_bounded_queue< T, A ></a><li>set_group_priority()
-: <a class="el" href="a00291.html#9ac8d1542d67d9d80121ff986801ac26">tbb::task</a><li>set_priority()
-: <a class="el" href="a00293.html#c4272d4d9ab65d600ca70fc2c8c4b039">tbb::task_group_context</a><li>set_ref_count()
-: <a class="el" href="a00291.html#06a4206a57e8e12a439b14d6d41cfd92">tbb::task</a><li>set_state()
-: <a class="el" href="a00258.html#795649a185b0d6af6dc81c5f378616dd">tbb::mutex</a><li>shrink_to_fit()
-: <a class="el" href="a00238.html#03c6f4cf66532bf4cc907ee738a9a186">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00235.html#28d113288fc7e0c04c9053ec7de61368">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>size()
-: <a class="el" href="a00243.html#33fd6593da1ed14340f10f67d5a69130">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00238.html#715fe313c4a9c22731cc404dd80c9ec9">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00230.html#7dc14d1a579a4cccda9f857585e1768d">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00235.html#8b2ae25c61338c6fd59e94fe09822ba5">tbb::interface5::concurrent_priority_queue< T, [...]
-: <a class="el" href="a00285.html#0513272133a06db6742873671af98f21">tbb::source_node< Output ></a><li>spawn_and_wait_for_all()
-: <a class="el" href="a00291.html#894ab68378e502776d8220eea7ce9fa1">tbb::task</a><li>spawn_root_and_wait()
-: <a class="el" href="a00291.html#c33c7edbaec67aa8a56f48986a9dc69f">tbb::task</a><li>spin_mutex()
-: <a class="el" href="a00286.html#3d8fb44644fd8d41ada1fbeba7409be3">tbb::spin_mutex</a><li>spin_rw_mutex_v3()
-: <a class="el" href="a00288.html#61332b2756de89f3f5f69310cbb6e70c">tbb::spin_rw_mutex_v3</a><li>state()
-: <a class="el" href="a00291.html#0af7b2d7e6e8b4333b2accfce3dfb374">tbb::task</a><li>swap()
-: <a class="el" href="a00238.html#96c9c4bd968ed3edb8dd276854d2dae0">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00235.html#0ecdc6a04aa259374425d424ca2a6082">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a>, <a class="el" href="a00231.html#076f8d9e16110aac5f558777aa744eb6">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></ul>
+: <a class="el" href="a00308.html#42a92d4f8fdde425b111cfa8a9228071">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00306.html#5ce6807050a9e8f87bcb4a65dccb12ef">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00297.html#dec17713c4c1321ac8fec66816d0c602">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00293.html#cf19f20e082887c1bb0ba6b0911c3583">tbb::interface5::reader_writer_lock::scoped_lock</a>, <a class="el" href="a00291.html#fbb8798792d3aebb136c46fc63d [...]
+: <a class="el" href="a00294.html#87ab0dc8f7216e6ba0f7acd6aec33064">tbb::interface5::reader_writer_lock::scoped_lock_read</a><li>seconds()
+: <a class="el" href="a00324.html#d5d8429c0bc59cf6131b2abc7929fa59">tbb::tick_count::interval_t</a><li>self()
+: <a class="el" href="a00311.html#bd43e8d6249738efafd12d6a4c72c5e3">tbb::task</a><li>sequencer_node()
+: <a class="el" href="a00302.html#b38e7a070552960384bcc1d91af13a5c">tbb::flow::interface6::sequencer_node< T, A ></a><li>set_affinity()
+: <a class="el" href="a00311.html#dca19d7a45487a7d67a0db517e2b57c9">tbb::task</a><li>set_capacity()
+: <a class="el" href="a00242.html#f3c6c934f85fd02aedbc83a16943193b">tbb::concurrent_bounded_queue< T, A ></a><li>set_group_priority()
+: <a class="el" href="a00311.html#9ac8d1542d67d9d80121ff986801ac26">tbb::task</a><li>set_parent()
+: <a class="el" href="a00311.html#d2eaf79fcaa3ae473e3bd3f44bd8a464">tbb::task</a><li>set_priority()
+: <a class="el" href="a00313.html#c4272d4d9ab65d600ca70fc2c8c4b039">tbb::task_group_context</a><li>set_ref_count()
+: <a class="el" href="a00311.html#06a4206a57e8e12a439b14d6d41cfd92">tbb::task</a><li>set_state()
+: <a class="el" href="a00275.html#795649a185b0d6af6dc81c5f378616dd">tbb::mutex</a><li>shrink_to_fit()
+: <a class="el" href="a00250.html#03c6f4cf66532bf4cc907ee738a9a186">tbb::concurrent_vector< T, A ></a><li>size()
+: <a class="el" href="a00255.html#33fd6593da1ed14340f10f67d5a69130">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00250.html#715fe313c4a9c22731cc404dd80c9ec9">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00242.html#7dc14d1a579a4cccda9f857585e1768d">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00247.html#8b2ae25c61338c6fd59e94fe09822ba5">tbb::interface5::concurrent_priority_queue< T, [...]
+: <a class="el" href="a00304.html#adaac111fbcace95804219a5f2929304">tbb::flow::interface6::source_node< Output ></a><li>spawn_and_wait_for_all()
+: <a class="el" href="a00311.html#894ab68378e502776d8220eea7ce9fa1">tbb::task</a><li>spawn_root_and_wait()
+: <a class="el" href="a00311.html#c33c7edbaec67aa8a56f48986a9dc69f">tbb::task</a><li>spin_mutex()
+: <a class="el" href="a00305.html#3d8fb44644fd8d41ada1fbeba7409be3">tbb::spin_mutex</a><li>spin_rw_mutex_v3()
+: <a class="el" href="a00307.html#61332b2756de89f3f5f69310cbb6e70c">tbb::spin_rw_mutex_v3</a><li>state()
+: <a class="el" href="a00311.html#0af7b2d7e6e8b4333b2accfce3dfb374">tbb::task</a><li>status()
+: <a class="el" href="a00298.html#78d938ed2e54d38dd38d6609e6c60389">tbb::interface6::runtime_loader</a><li>swap()
+: <a class="el" href="a00250.html#96c9c4bd968ed3edb8dd276854d2dae0">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00247.html#0ecdc6a04aa259374425d424ca2a6082">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a>, <a class="el" href="a00243.html#076f8d9e16110aac5f558777aa744eb6">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/functions_func_0x74.html b/doc/html/functions_func_0x74.html
index b0a91d5..5b01f3f 100644
--- a/doc/html/functions_func_0x74.html
+++ b/doc/html/functions_func_0x74.html
@@ -61,25 +61,24 @@
<p>
<h3><a class="anchor" name="index_t">- t -</a></h3><ul>
<li>task()
-: <a class="el" href="a00291.html#2bce8ec6e44706e70128f5cf91b76e67">tbb::task</a><li>task_group_context()
-: <a class="el" href="a00293.html#19fee08fb8ac98adccfe69c1aa63c491">tbb::task_group_context</a><li>task_list()
-: <a class="el" href="a00294.html#416341c2047eaef50417b41eaf7e9de6">tbb::task_list</a><li>task_scheduler_init()
-: <a class="el" href="a00295.html#421600bf9bf9338bcf937063f2ff0e90">tbb::task_scheduler_init</a><li>terminate()
-: <a class="el" href="a00295.html#f73257e04cb7fb9bd5be2b635d9016f1">tbb::task_scheduler_init</a><li>throw_self()
-: <a class="el" href="a00299.html#292832fd5c523e3d8081a22247840a1d">tbb::internal::tbb_exception_ptr</a>, <a class="el" href="a00257.html#17cffba35811c92b7e65d63506b69602">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00228.html#2dd1be66ab32fa27e0ddef5707fa67ef">tbb::captured_exception</a>, <a class="el" href="a00298.html#8588e07fa49692f4d734e4f2e4f048f4">tbb::tbb_exception</a><li>tick_count()
-: <a class="el" href="a00302.html#34593326ae4191e02a13c7cbdab9de4c">tbb::tick_count</a><li>try_acquire()
-: <a class="el" href="a00289.html#9879626968d9b9a04cd2ec0fb2e84ae1">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00287.html#9297ec188534b45dc0ca48f2f39a0501">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00279.html#36bfc3e93e3ef6340abef4901444d340">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00273.html#2e4ff6c9ec2fee6682f95290d1f42baa">tbb::queuing_rw_mutex::scoped_lock</a>, <a class="el" href="a00271.html#e5a014fb817599386a87170cf2cf51a9">tbb::qu [...]
-: <a class="el" href="a00225.html#46b8b257a97e2192a2b11743279e8ffe">tbb::buffer_node< T ></a>, <a class="el" href="a00285.html#809f51859ca4dd04204591d76c8572eb">tbb::source_node< Output ></a>, <a class="el" href="a00282.html#add46946c4c7330422733432e4032fac">tbb::sender< T ></a><li>try_get()
-: <a class="el" href="a00254.html#50c0e6465ac929a2e94d4e62a13ebeff">tbb::internal::join_node_base< JP, InputTuple, OutputTuple ></a>, <a class="el" href="a00225.html#b68bdec127703dbfb2d93d685abbfd67">tbb::buffer_node< T ></a>, <a class="el" href="a00285.html#0434d2933ad082d3c43a4ec774150511">tbb::source_node< Output ></a>, <a class="el" href="a00282.html#bf8c9235810354f3353a899c982645de">tbb::sender< T ></a><li>try_lock()
-: <a class="el" href="a00288.html#088bb256be794cc47d3b83791632fdfc">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00286.html#8f9a58fb56a2b4c5efe1a7f7c1ae2074">tbb::spin_mutex</a>, <a class="el" href="a00278.html#86e719b0afee25704af11ab97694d240">tbb::recursive_mutex</a>, <a class="el" href="a00274.html#721eb173e154ab38292273e9266a9b07">tbb::interface5::reader_writer_lock</a>, <a class="el" href="a00258.html#4331652c79dea1c1131bd59ab161b234">tbb::mutex</a><li>try_lock_read()
-: <a class="el" href="a00288.html#b8667415869013f840d976aa406d385a">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00274.html#595fb23952e3b89426b1f7938dea9b11">tbb::interface5::reader_writer_lock</a><li>try_pop()
-: <a class="el" href="a00230.html#0ca487019bbb00a196442aff78a1e4f7">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00236.html#ae31ca0db34ef96ef1e74aa0d28c95f8">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00235.html#e036461a29cc40902a2bb79abf9f5146">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>try_process_item()
-: <a class="el" href="a00301.html#c4f90f2c771bce748beb9be734fa286c">tbb::thread_bound_filter</a><li>try_push()
-: <a class="el" href="a00230.html#2bd6232531279fb3ccbd296bea23066b">tbb::concurrent_bounded_queue< T, A ></a><li>try_put()
-: <a class="el" href="a00304.html#f316c0d5ff67068ff23b684accbe87f4">tbb::internal::two_phase_port< T ></a>, <a class="el" href="a00255.html#a38facb46cde854cb7408bf9f3bf8999">tbb::limiter_node< T ></a>, <a class="el" href="a00225.html#f74899ffb67687998168ad428f586b64">tbb::buffer_node< T ></a>, <a class="el" href="a00224.html#9b211e02554d6b39dc04f7e7f4e00073">tbb::broadcast_node< T ></a>, <a class="el" href="a00241.html#a7f8b9cc6286eb2cd8d429d6279da64d">tbb::contin [...]
-: <a class="el" href="a00225.html#435e29a66f0719d4822a0a8dc78a0405">tbb::buffer_node< T ></a>, <a class="el" href="a00285.html#3dd7e998aa3e7258b3b5731307df23a0">tbb::source_node< Output ></a>, <a class="el" href="a00282.html#28c41df1c0c7ed485b4a691ec8f30098">tbb::sender< T ></a><li>try_reserve()
-: <a class="el" href="a00225.html#11ebad4c72082a1a03ecccd3afab4ae2">tbb::buffer_node< T ></a>, <a class="el" href="a00285.html#ecac0bb52cff61912dcd186647ccd1bf">tbb::source_node< Output ></a>, <a class="el" href="a00282.html#3506c7275aeeb2fc3ba5d5f10ee0adac">tbb::sender< T ></a><li>two_phase_port()
-: <a class="el" href="a00304.html#60e17ef935031c86c4a288eafab5c066">tbb::internal::two_phase_port< T ></a></ul>
+: <a class="el" href="a00311.html#2bce8ec6e44706e70128f5cf91b76e67">tbb::task</a><li>task_group_context()
+: <a class="el" href="a00313.html#19fee08fb8ac98adccfe69c1aa63c491">tbb::task_group_context</a><li>task_list()
+: <a class="el" href="a00315.html#416341c2047eaef50417b41eaf7e9de6">tbb::task_list</a><li>task_scheduler_init()
+: <a class="el" href="a00316.html#421600bf9bf9338bcf937063f2ff0e90">tbb::task_scheduler_init</a><li>terminate()
+: <a class="el" href="a00316.html#f73257e04cb7fb9bd5be2b635d9016f1">tbb::task_scheduler_init</a><li>throw_self()
+: <a class="el" href="a00320.html#292832fd5c523e3d8081a22247840a1d">tbb::internal::tbb_exception_ptr</a>, <a class="el" href="a00273.html#17cffba35811c92b7e65d63506b69602">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00240.html#2dd1be66ab32fa27e0ddef5707fa67ef">tbb::captured_exception</a>, <a class="el" href="a00319.html#8588e07fa49692f4d734e4f2e4f048f4">tbb::tbb_exception</a><li>tick_count()
+: <a class="el" href="a00323.html#34593326ae4191e02a13c7cbdab9de4c">tbb::tick_count</a><li>try_acquire()
+: <a class="el" href="a00308.html#9879626968d9b9a04cd2ec0fb2e84ae1">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00306.html#9297ec188534b45dc0ca48f2f39a0501">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00297.html#36bfc3e93e3ef6340abef4901444d340">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00291.html#2e4ff6c9ec2fee6682f95290d1f42baa">tbb::queuing_rw_mutex::scoped_lock</a>, <a class="el" href="a00289.html#e5a014fb817599386a87170cf2cf51a9">tbb::qu [...]
+: <a class="el" href="a00237.html#8ef07c434eb763d947a7b4e80c086a49">tbb::flow::interface6::buffer_node< T, A ></a>, <a class="el" href="a00304.html#2c7fcc29e2894b29138be3c1edce9bc9">tbb::flow::interface6::source_node< Output ></a>, <a class="el" href="a00301.html#7b840f50da117a0d6848707c1857ea2e">tbb::flow::interface6::sender< T ></a><li>try_get()
+: <a class="el" href="a00237.html#aeb8aec46ca99ca022356a792c46735e">tbb::flow::interface6::buffer_node< T, A ></a>, <a class="el" href="a00304.html#41073ad4d3510ed5a8b6bda9c0f58636">tbb::flow::interface6::source_node< Output ></a>, <a class="el" href="a00301.html#922fb56b0aad090b90a98b7d56b76a59">tbb::flow::interface6::sender< T ></a><li>try_lock()
+: <a class="el" href="a00307.html#088bb256be794cc47d3b83791632fdfc">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00305.html#8f9a58fb56a2b4c5efe1a7f7c1ae2074">tbb::spin_mutex</a>, <a class="el" href="a00296.html#86e719b0afee25704af11ab97694d240">tbb::recursive_mutex</a>, <a class="el" href="a00292.html#721eb173e154ab38292273e9266a9b07">tbb::interface5::reader_writer_lock</a>, <a class="el" href="a00275.html#4331652c79dea1c1131bd59ab161b234">tbb::mutex</a><li>try_lock_read()
+: <a class="el" href="a00307.html#b8667415869013f840d976aa406d385a">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00292.html#595fb23952e3b89426b1f7938dea9b11">tbb::interface5::reader_writer_lock</a><li>try_pop()
+: <a class="el" href="a00242.html#0ca487019bbb00a196442aff78a1e4f7">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00248.html#ae31ca0db34ef96ef1e74aa0d28c95f8">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00247.html#e036461a29cc40902a2bb79abf9f5146">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>try_process_item()
+: <a class="el" href="a00322.html#c4f90f2c771bce748beb9be734fa286c">tbb::thread_bound_filter</a><li>try_push()
+: <a class="el" href="a00242.html#2bd6232531279fb3ccbd296bea23066b">tbb::concurrent_bounded_queue< T, A ></a><li>try_put()
+: <a class="el" href="a00266.html#55a02d458a4d8ffa6accd7a70605da2f">tbb::flow::interface6::limiter_node< T ></a>, <a class="el" href="a00237.html#2b02fe332e704bbe14f297802298b63a">tbb::flow::interface6::buffer_node< T, A ></a>, <a class="el" href="a00236.html#29eb768c10b377880bbf83d31ee49acf">tbb::flow::interface6::broadcast_node< T ></a>, <a class="el" href="a00253.html#3969c70fb89c0a982f142ae9eb5facae">tbb::flow::interface6::continue_receiver</a>, <a class="el" href=" [...]
+: <a class="el" href="a00237.html#2c8e8f2f5f4ff5be27136cc1184a3c3e">tbb::flow::interface6::buffer_node< T, A ></a>, <a class="el" href="a00304.html#494678baf9096835268736b800824460">tbb::flow::interface6::source_node< Output ></a>, <a class="el" href="a00301.html#27036b06d6a91e97007e14f400529199">tbb::flow::interface6::sender< T ></a><li>try_reserve()
+: <a class="el" href="a00237.html#1cc889bb6c38bcb81757d0ebbc3a5e64">tbb::flow::interface6::buffer_node< T, A ></a>, <a class="el" href="a00304.html#ad459713ff3c1c9ad0f4826daa141f65">tbb::flow::interface6::source_node< Output ></a>, <a class="el" href="a00301.html#02c05b472271db1b68a48ea2618fa72f">tbb::flow::interface6::sender< T ></a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/functions_func_0x75.html b/doc/html/functions_func_0x75.html
index e6ebc87..fb19c2b 100644
--- a/doc/html/functions_func_0x75.html
+++ b/doc/html/functions_func_0x75.html
@@ -61,9 +61,9 @@
<p>
<h3><a class="anchor" name="index_u">- u -</a></h3><ul>
<li>unlock()
-: <a class="el" href="a00288.html#f9f52ead2098eb5fb12da59d5ae53b55">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00286.html#0e843ee6265f57f27d228ba91e7308ef">tbb::spin_mutex</a>, <a class="el" href="a00278.html#f0a96e26b7f074588dc31e32524856ae">tbb::recursive_mutex</a>, <a class="el" href="a00274.html#5113b32689305599b2c36b5831547704">tbb::interface5::reader_writer_lock</a>, <a class="el" href="a00258.html#5fc9ef443ae75d966695546be399cc6b">tbb::mutex</a><li>unsafe_size()
-: <a class="el" href="a00236.html#eaa35a5274606779802e9a669a706260">tbb::strict_ppl::concurrent_queue< T, A ></a><li>upgrade_to_writer()
-: <a class="el" href="a00289.html#3f0b1e3f2efab63336400348bd070226">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00273.html#11ba1da4a722c9e6f73339a52c487e82">tbb::queuing_rw_mutex::scoped_lock</a></ul>
+: <a class="el" href="a00307.html#f9f52ead2098eb5fb12da59d5ae53b55">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00305.html#0e843ee6265f57f27d228ba91e7308ef">tbb::spin_mutex</a>, <a class="el" href="a00296.html#f0a96e26b7f074588dc31e32524856ae">tbb::recursive_mutex</a>, <a class="el" href="a00292.html#5113b32689305599b2c36b5831547704">tbb::interface5::reader_writer_lock</a>, <a class="el" href="a00275.html#5fc9ef443ae75d966695546be399cc6b">tbb::mutex</a><li>unsafe_size()
+: <a class="el" href="a00248.html#eaa35a5274606779802e9a669a706260">tbb::strict_ppl::concurrent_queue< T, A ></a><li>upgrade_to_writer()
+: <a class="el" href="a00308.html#3f0b1e3f2efab63336400348bd070226">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00291.html#11ba1da4a722c9e6f73339a52c487e82">tbb::queuing_rw_mutex::scoped_lock</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/functions_func_0x77.html b/doc/html/functions_func_0x77.html
index 3c76237..4d904d2 100644
--- a/doc/html/functions_func_0x77.html
+++ b/doc/html/functions_func_0x77.html
@@ -61,8 +61,8 @@
<p>
<h3><a class="anchor" name="index_w">- w -</a></h3><ul>
<li>wait_for_all()
-: <a class="el" href="a00291.html#53d2615ad9c38859b4c8080936600283">tbb::task</a>, <a class="el" href="a00250.html#bafd6349fdc6563ffa02746866e30bec">tbb::graph</a><li>what()
-: <a class="el" href="a00257.html#b33a89bccf0c63106f1270c7bfaaf54f">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00228.html#6b5988ef74a1fe2a58998d110b3633e0">tbb::captured_exception</a>, <a class="el" href="a00298.html#e8157689ecb66bc6c72d3618bf3cc371">tbb::tbb_exception</a></ul>
+: <a class="el" href="a00311.html#53d2615ad9c38859b4c8080936600283">tbb::task</a>, <a class="el" href="a00262.html#a66b0020f7514b86d030fa8aea073d37">tbb::flow::interface6::graph</a><li>what()
+: <a class="el" href="a00273.html#b33a89bccf0c63106f1270c7bfaaf54f">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00240.html#6b5988ef74a1fe2a58998d110b3633e0">tbb::captured_exception</a>, <a class="el" href="a00319.html#e8157689ecb66bc6c72d3618bf3cc371">tbb::tbb_exception</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/functions_func_0x7e.html b/doc/html/functions_func_0x7e.html
index 69f38a5..5f016b1 100644
--- a/doc/html/functions_func_0x7e.html
+++ b/doc/html/functions_func_0x7e.html
@@ -61,29 +61,31 @@
<p>
<h3><a class="anchor" name="index_~">- ~ -</a></h3><ul>
<li>~combinable()
-: <a class="el" href="a00229.html#2c87e79ae98588a5780f708773388843">tbb::combinable< T ></a><li>~concurrent_bounded_queue()
-: <a class="el" href="a00230.html#acaf5b510dc0dfc7780b8c956cf773cf">tbb::concurrent_bounded_queue< T, A ></a><li>~concurrent_hash_map()
-: <a class="el" href="a00231.html#2aa8e2d28d5af1284cf78d20a9c22731">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>~concurrent_queue()
-: <a class="el" href="a00236.html#830b33753d6b149c366344e29b2edd8c">tbb::strict_ppl::concurrent_queue< T, A ></a><li>~concurrent_vector()
-: <a class="el" href="a00238.html#da2444b28bb840d38f60d0030333a5fc">tbb::concurrent_vector< T, A ></a><li>~const_accessor()
-: <a class="el" href="a00234.html#928769b139d53427e7075c1f86148e4c">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a><li>~continue_receiver()
-: <a class="el" href="a00241.html#9a38edb7e1e3c9be4e3848145c51a617">tbb::continue_receiver</a><li>~enumerable_thread_specific()
-: <a class="el" href="a00243.html#5a7907d9e3e5b18e7a7b55211ef3213f">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a><li>~filter()
-: <a class="el" href="a00245.html#66d159f362293e3964ba3da8bc1d2604">tbb::filter</a><li>~graph()
-: <a class="el" href="a00250.html#55332084e7884a26ff288b8fe960030d">tbb::graph</a><li>~parallel_while()
-: <a class="el" href="a00265.html#6fcfc973cc56b79c6d0fbb8a31be7e84">tbb::parallel_while< Body ></a><li>~pipeline()
-: <a class="el" href="a00266.html#49513c6c24f9d5bbbb27edca5efe01c9">tbb::pipeline</a><li>~queuing_rw_mutex()
-: <a class="el" href="a00272.html#1ba73e3d95cfdf8323880bc623af9099">tbb::queuing_rw_mutex</a><li>~reader_writer_lock()
-: <a class="el" href="a00274.html#5135f64f7b7339017f33d956445edbee">tbb::interface5::reader_writer_lock</a><li>~receiver()
-: <a class="el" href="a00277.html#18f74b83abae0ee1e4ce07942797ef27">tbb::receiver< T ></a><li>~scoped_lock()
-: <a class="el" href="a00289.html#d7eaaa3f2e2c5dc11e7005811b1bdd04">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00287.html#ac6fa425d1f06c56d8b70abc51aac844">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00279.html#c1197ffb8f3cd9d4fed71d7e06265b7c">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00275.html#70246e0260493625ff956fa5926fc71f">tbb::interface5::reader_writer_lock::scoped_lock</a>, <a class="el" href="a00273.html#32c7d67a660d23ebbaab1a1d282 [...]
-: <a class="el" href="a00276.html#bd21c5f3d555d64d1de8658e15bf4966">tbb::interface5::reader_writer_lock::scoped_lock_read</a><li>~sequencer_node()
-: <a class="el" href="a00283.html#c87d80feebaf2bae4af22b5f2459b37e">tbb::sequencer_node< T ></a><li>~source_node()
-: <a class="el" href="a00285.html#90c94a8a52cc3d19cf393ce289e80733">tbb::source_node< Output ></a><li>~spin_rw_mutex_v3()
-: <a class="el" href="a00288.html#9a815fb2759e55072ed413f1b6970cf3">tbb::spin_rw_mutex_v3</a><li>~task()
-: <a class="el" href="a00291.html#98245ee0473f84cb19dbbf8c81134908">tbb::task</a><li>~task_list()
-: <a class="el" href="a00294.html#6d438f1499a02db1e59c24ab6043e5ba">tbb::task_list</a><li>~task_scheduler_init()
-: <a class="el" href="a00295.html#4da6c86292d80c703a66c1f6f5299488">tbb::task_scheduler_init</a></ul>
+: <a class="el" href="a00241.html#2c87e79ae98588a5780f708773388843">tbb::combinable< T ></a><li>~concurrent_bounded_queue()
+: <a class="el" href="a00242.html#acaf5b510dc0dfc7780b8c956cf773cf">tbb::concurrent_bounded_queue< T, A ></a><li>~concurrent_hash_map()
+: <a class="el" href="a00243.html#2aa8e2d28d5af1284cf78d20a9c22731">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>~concurrent_queue()
+: <a class="el" href="a00248.html#830b33753d6b149c366344e29b2edd8c">tbb::strict_ppl::concurrent_queue< T, A ></a><li>~concurrent_vector()
+: <a class="el" href="a00250.html#da2444b28bb840d38f60d0030333a5fc">tbb::concurrent_vector< T, A ></a><li>~const_accessor()
+: <a class="el" href="a00246.html#928769b139d53427e7075c1f86148e4c">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a><li>~continue_receiver()
+: <a class="el" href="a00253.html#1e14828fa079b9835ff7267df5ee45d7">tbb::flow::interface6::continue_receiver</a><li>~enumerable_thread_specific()
+: <a class="el" href="a00255.html#5a7907d9e3e5b18e7a7b55211ef3213f">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a><li>~filter()
+: <a class="el" href="a00256.html#66d159f362293e3964ba3da8bc1d2604">tbb::filter</a><li>~graph()
+: <a class="el" href="a00262.html#8a7d424c0616a1c37a908ead182e2fe5">tbb::flow::interface6::graph</a><li>~memory_pool()
+: <a class="el" href="a00269.html#fdad7c4ed08332ec384491a71b721957">tbb::interface6::memory_pool< Alloc ></a><li>~parallel_while()
+: <a class="el" href="a00282.html#6fcfc973cc56b79c6d0fbb8a31be7e84">tbb::parallel_while< Body ></a><li>~pipeline()
+: <a class="el" href="a00284.html#49513c6c24f9d5bbbb27edca5efe01c9">tbb::pipeline</a><li>~queuing_rw_mutex()
+: <a class="el" href="a00290.html#1ba73e3d95cfdf8323880bc623af9099">tbb::queuing_rw_mutex</a><li>~reader_writer_lock()
+: <a class="el" href="a00292.html#5135f64f7b7339017f33d956445edbee">tbb::interface5::reader_writer_lock</a><li>~receiver()
+: <a class="el" href="a00295.html#b00699b235435f7b65b663d5063624a1">tbb::flow::interface6::receiver< T ></a><li>~runtime_loader()
+: <a class="el" href="a00298.html#c25fec923a751a3e03f5cbe969f1f0c5">tbb::interface6::runtime_loader</a><li>~scoped_lock()
+: <a class="el" href="a00308.html#d7eaaa3f2e2c5dc11e7005811b1bdd04">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00306.html#ac6fa425d1f06c56d8b70abc51aac844">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00297.html#c1197ffb8f3cd9d4fed71d7e06265b7c">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00293.html#70246e0260493625ff956fa5926fc71f">tbb::interface5::reader_writer_lock::scoped_lock</a>, <a class="el" href="a00291.html#32c7d67a660d23ebbaab1a1d282 [...]
+: <a class="el" href="a00294.html#bd21c5f3d555d64d1de8658e15bf4966">tbb::interface5::reader_writer_lock::scoped_lock_read</a><li>~sequencer_node()
+: <a class="el" href="a00302.html#93d3d8f6a72b3e1387047282116ed6ee">tbb::flow::interface6::sequencer_node< T, A ></a><li>~source_node()
+: <a class="el" href="a00304.html#61700b0865fc17188b0abe26bbde65b6">tbb::flow::interface6::source_node< Output ></a><li>~spin_rw_mutex_v3()
+: <a class="el" href="a00307.html#9a815fb2759e55072ed413f1b6970cf3">tbb::spin_rw_mutex_v3</a><li>~task()
+: <a class="el" href="a00311.html#98245ee0473f84cb19dbbf8c81134908">tbb::task</a><li>~task_list()
+: <a class="el" href="a00315.html#6d438f1499a02db1e59c24ab6043e5ba">tbb::task_list</a><li>~task_scheduler_init()
+: <a class="el" href="a00316.html#4da6c86292d80c703a66c1f6f5299488">tbb::task_scheduler_init</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/functions_rela.html b/doc/html/functions_rela.html
index 730db22..b41cc37 100644
--- a/doc/html/functions_rela.html
+++ b/doc/html/functions_rela.html
@@ -35,9 +35,9 @@
<p>
<ul>
<li>make_filter
-: <a class="el" href="a00246.html#85c2892eff1fddcd06e28911e75838bd">tbb::interface6::filter_t< T, U ></a><li>operator+
-: <a class="el" href="a00303.html#5871ead1ca230efbe52a5008470e6428">tbb::tick_count::interval_t</a><li>operator-
-: <a class="el" href="a00302.html#09dde78a4100800c11bb883d6204b586">tbb::tick_count</a>, <a class="el" href="a00303.html#fa509691e1d689830931e36edd274f76">tbb::tick_count::interval_t</a></ul>
+: <a class="el" href="a00257.html#85c2892eff1fddcd06e28911e75838bd">tbb::interface6::filter_t< T, U ></a><li>operator+
+: <a class="el" href="a00324.html#5871ead1ca230efbe52a5008470e6428">tbb::tick_count::interval_t</a><li>operator-
+: <a class="el" href="a00323.html#09dde78a4100800c11bb883d6204b586">tbb::tick_count</a>, <a class="el" href="a00324.html#fa509691e1d689830931e36edd274f76">tbb::tick_count::interval_t</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/functions_type.html b/doc/html/functions_type.html
index 807d610..e92554c 100644
--- a/doc/html/functions_type.html
+++ b/doc/html/functions_type.html
@@ -35,21 +35,21 @@
<p>
<ul>
<li>affinity_id
-: <a class="el" href="a00291.html#d61bb32389d3857bf7511d69beaafb76">tbb::task</a><li>allocator_type
-: <a class="el" href="a00296.html#78701e7454ef8e1a25b5acd364367080">tbb::tbb_allocator< T ></a>, <a class="el" href="a00243.html#3c03eb40955b933b01987222722ac4bd">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00230.html#2e2726fccf6d975dc1071608cc0bbf90">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00236.html#5a3956341728eaa558d8827063718cac">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a c [...]
-: <a class="el" href="a00221.html#1a8d05842c2b3dfc177bc4d347e4cef7">tbb::blocked_range< Value ></a><li>const_reference
-: <a class="el" href="a00230.html#796713d0b9ba93a4721cbe13e4474068">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00236.html#4d48e7ff93f81636bca2c74f7da34750">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00235.html#a4ded8601a434098605be0dcc4febc60">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>difference_type
-: <a class="el" href="a00230.html#4b45c91297e69515d83d5eef85ae1f49">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00236.html#068576d16c7e4e05d52f9db7a45b5b65">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00235.html#77399bc76b3ecd60e33f7e35a5becd87">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>input_type
-: <a class="el" href="a00304.html#0f464d59e15941d6d625e8c7d634e26b">tbb::internal::two_phase_port< T ></a>, <a class="el" href="a00255.html#f654b8974c613e8fd3de5a40e181d5ff">tbb::limiter_node< T ></a>, <a class="el" href="a00268.html#40fdedd4829aeae3ebd1a5fdaf39b23d">tbb::priority_queue_node< T, Compare ></a>, <a class="el" href="a00283.html#a73e4a3ae6c430281f08226d448ebfc8">tbb::sequencer_node< T ></a>, <a class="el" href="a00269.html#27016487003a4ff2908748c3cf11 [...]
-: <a class="el" href="a00278.html#889fa8cc32dd707eef7c0f52dda09c0d">tbb::recursive_mutex</a>, <a class="el" href="a00258.html#9f1ec84d5815263ceae853f06ddb4cac">tbb::mutex</a><li>output_type
-: <a class="el" href="a00254.html#578893d923f91b7e44a15dea8b0d7082">tbb::internal::join_node_base< JP, InputTuple, OutputTuple ></a>, <a class="el" href="a00255.html#370f88278dec6f584c1d08a375f9b4cd">tbb::limiter_node< T ></a>, <a class="el" href="a00268.html#3b3fa4479416e7cb6d4a6a4b175c2b15">tbb::priority_queue_node< T, Compare ></a>, <a class="el" href="a00283.html#0c613bb01103dfcfbc3f9cbe943f95b0">tbb::sequencer_node< T ></a>, <a class="el" href="a00269.html#d2 [...]
-: <a class="el" href="a00223.html#b8ebf17a552ba47825e9b3887855b719">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a><li>predecessor_type
-: <a class="el" href="a00304.html#37ee9b5320b631c39bccc0b4745d88d1">tbb::internal::two_phase_port< T ></a>, <a class="el" href="a00255.html#fd88ce7670e7107aef2161b45f156185">tbb::limiter_node< T ></a>, <a class="el" href="a00268.html#98900a87758cac05500fcbc74113cebf">tbb::priority_queue_node< T, Compare ></a>, <a class="el" href="a00283.html#6581686ef0cf8e13c0270687628af5eb">tbb::sequencer_node< T ></a>, <a class="el" href="a00269.html#83bc7308a38f1d205377d78ec149 [...]
-: <a class="el" href="a00230.html#dcd44ca6a88c0dc7a847a47a10811f0c">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00236.html#a8d725c50a9834bb7af5b67c0aff92b8">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00235.html#5804b3c708ef4e50d603f918ef2b9e58">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>row_range_type
-: <a class="el" href="a00222.html#a807a22fe658ec38b8edfd69521d0383">tbb::blocked_range2d< RowValue, ColValue ></a><li>size_type
-: <a class="el" href="a00230.html#a80e4c11dbb324e4b92a24a77bbcde68">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00236.html#8fc30e93f8342a1960357f71e4fe8a2b">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00235.html#b679eea8d01d041625a39f719ca2b7ed">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a>, <a class="el" href="a00221.html#f5707bffea38eee5c9680f37358afb8e">tbb::blocked_range< Value ></a><li>successor_type
-: <a class="el" href="a00254.html#1212cbaa293a93c3bf334da1539556bd">tbb::internal::join_node_base< JP, InputTuple, OutputTuple ></a>, <a class="el" href="a00255.html#754182cc1e5b403201495bc1fd45674b">tbb::limiter_node< T ></a>, <a class="el" href="a00268.html#e01014f2e5ceea292c68f6fe47391c57">tbb::priority_queue_node< T, Compare ></a>, <a class="el" href="a00283.html#3591313e30d0f485a09106686067411f">tbb::sequencer_node< T ></a>, <a class="el" href="a00269.html#c3 [...]
-: <a class="el" href="a00265.html#fa297e53d3af2a101e712bc200233e9c">tbb::parallel_while< Body ></a>, <a class="el" href="a00230.html#98245517a931e5893f6601e66c51fc75">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00236.html#682c3978d5cb0620000994f11c44a476">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00235.html#7c611a6b5b8f94b0e7f2afc97e31efb1">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a>, <a class="el" [...]
+: <a class="el" href="a00311.html#d61bb32389d3857bf7511d69beaafb76">tbb::task</a><li>allocator_type
+: <a class="el" href="a00317.html#78701e7454ef8e1a25b5acd364367080">tbb::tbb_allocator< T ></a>, <a class="el" href="a00255.html#3c03eb40955b933b01987222722ac4bd">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00242.html#2e2726fccf6d975dc1071608cc0bbf90">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00248.html#5a3956341728eaa558d8827063718cac">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a c [...]
+: <a class="el" href="a00233.html#1a8d05842c2b3dfc177bc4d347e4cef7">tbb::blocked_range< Value ></a><li>const_reference
+: <a class="el" href="a00242.html#796713d0b9ba93a4721cbe13e4474068">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00248.html#4d48e7ff93f81636bca2c74f7da34750">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00247.html#a4ded8601a434098605be0dcc4febc60">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>difference_type
+: <a class="el" href="a00242.html#4b45c91297e69515d83d5eef85ae1f49">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00248.html#068576d16c7e4e05d52f9db7a45b5b65">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00247.html#77399bc76b3ecd60e33f7e35a5becd87">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>input_type
+: <a class="el" href="a00266.html#035196d3c9240ef041f528ebcde8baa7">tbb::flow::interface6::limiter_node< T ></a>, <a class="el" href="a00286.html#b2829b518979874ad3d2a939e14ae7bd">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>, <a class="el" href="a00302.html#af629f26832ff4e476e240637a78bc0c">tbb::flow::interface6::sequencer_node< T, A ></a>, <a class="el" href="a00287.html#1e71030845210b6c4c7380eb9e11a2ac">tbb::flow::interface6::queue_node< T, A > [...]
+: <a class="el" href="a00296.html#889fa8cc32dd707eef7c0f52dda09c0d">tbb::recursive_mutex</a>, <a class="el" href="a00275.html#9f1ec84d5815263ceae853f06ddb4cac">tbb::mutex</a><li>output_type
+: <a class="el" href="a00266.html#6e67fc480147c0b88a483b85db6457b0">tbb::flow::interface6::limiter_node< T ></a>, <a class="el" href="a00286.html#2cb099b590246b6bc93cc15e78c6ee5c">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>, <a class="el" href="a00302.html#ca026eaef70e35791c407323199031a7">tbb::flow::interface6::sequencer_node< T, A ></a>, <a class="el" href="a00287.html#25b5a53ab1f9a342644fa3759bc0b1ad">tbb::flow::interface6::queue_node< T, A > [...]
+: <a class="el" href="a00235.html#b8ebf17a552ba47825e9b3887855b719">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a><li>predecessor_type
+: <a class="el" href="a00266.html#f89fcf44f38eb33f965ee5362d3e68e9">tbb::flow::interface6::limiter_node< T ></a>, <a class="el" href="a00286.html#fdea783bf9d5a4c98e794ac7e0f84ccf">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>, <a class="el" href="a00302.html#8127e36811832563fe1e9bc3ba391f79">tbb::flow::interface6::sequencer_node< T, A ></a>, <a class="el" href="a00287.html#5e2fdd33c45d44549dee9c1638e19898">tbb::flow::interface6::queue_node< T, A > [...]
+: <a class="el" href="a00242.html#dcd44ca6a88c0dc7a847a47a10811f0c">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00248.html#a8d725c50a9834bb7af5b67c0aff92b8">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00247.html#5804b3c708ef4e50d603f918ef2b9e58">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>row_range_type
+: <a class="el" href="a00234.html#a807a22fe658ec38b8edfd69521d0383">tbb::blocked_range2d< RowValue, ColValue ></a><li>size_type
+: <a class="el" href="a00242.html#a80e4c11dbb324e4b92a24a77bbcde68">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00248.html#8fc30e93f8342a1960357f71e4fe8a2b">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00247.html#b679eea8d01d041625a39f719ca2b7ed">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a>, <a class="el" href="a00233.html#f5707bffea38eee5c9680f37358afb8e">tbb::blocked_range< Value ></a><li>successor_type
+: <a class="el" href="a00266.html#e8945e4dd6ea759ff9e4735da13f12ef">tbb::flow::interface6::limiter_node< T ></a>, <a class="el" href="a00286.html#09ab5064ca8192e68c03da47603e68eb">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>, <a class="el" href="a00302.html#795f3ee75f133b9d3b159172fc4a197f">tbb::flow::interface6::sequencer_node< T, A ></a>, <a class="el" href="a00287.html#f35076a19f256f9e7a61bed77ca1ccc5">tbb::flow::interface6::queue_node< T, A > [...]
+: <a class="el" href="a00282.html#fa297e53d3af2a101e712bc200233e9c">tbb::parallel_while< Body ></a>, <a class="el" href="a00242.html#98245517a931e5893f6601e66c51fc75">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00248.html#682c3978d5cb0620000994f11c44a476">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00247.html#7c611a6b5b8f94b0e7f2afc97e31efb1">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a>, <a class="el" [...]
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/functions_vars.html b/doc/html/functions_vars.html
index ff417cd..76c4d9c 100644
--- a/doc/html/functions_vars.html
+++ b/doc/html/functions_vars.html
@@ -35,17 +35,17 @@
<p>
<ul>
<li>automatic
-: <a class="el" href="a00295.html#8f5988e2b0fbb2d533fcbb7f2583743f">tbb::task_scheduler_init</a><li>decrement
-: <a class="el" href="a00255.html#181fa37d3e3c68ec3819ea46beed79a2">tbb::limiter_node< T ></a><li>deferred
-: <a class="el" href="a00295.html#e6c860f1e559026ff3ef4599c0d6c514">tbb::task_scheduler_init</a><li>exact_exception_propagation
-: <a class="el" href="a00245.html#f17200974c33be21f42a5f00893de028">tbb::filter</a><li>filter_is_bound
-: <a class="el" href="a00245.html#dd6a6e7210efc9bcaf2c5e08767d92b5">tbb::filter</a><li>filter_is_out_of_order
-: <a class="el" href="a00245.html#2e5eb65f95d8050186278077e433c5b1">tbb::filter</a><li>filter_is_serial
-: <a class="el" href="a00245.html#4b7de3a76e744f3d9c1bc5d437ea851d">tbb::filter</a><li>filter_may_emit_null
-: <a class="el" href="a00245.html#bdd02a434a6e7499dd1e8f43aae96793">tbb::filter</a><li>is_writer
-: <a class="el" href="a00233.html#07d958f151a0eaa92f50fd56ad6440e2">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a>, <a class="el" href="a00289.html#6b5a7c3c67a36b05c4df8410d32627d8">tbb::spin_rw_mutex_v3::scoped_lock</a><li>mutex
-: <a class="el" href="a00258.html#05313cb77d4f85213103d4dab74ed454">tbb::mutex</a>, <a class="el" href="a00289.html#d96d1a1fcc3d79ef3e5c06a53b8ffeaa">tbb::spin_rw_mutex_v3::scoped_lock</a><li>my_exception_data
-: <a class="el" href="a00257.html#a8c0ae2089ae784b28907cf748b89416">tbb::movable_exception< ExceptionData ></a></ul>
+: <a class="el" href="a00316.html#8f5988e2b0fbb2d533fcbb7f2583743f">tbb::task_scheduler_init</a><li>decrement
+: <a class="el" href="a00266.html#a3344b2461966631b6ee34b79fb105c7">tbb::flow::interface6::limiter_node< T ></a><li>deferred
+: <a class="el" href="a00316.html#e6c860f1e559026ff3ef4599c0d6c514">tbb::task_scheduler_init</a><li>exact_exception_propagation
+: <a class="el" href="a00256.html#f17200974c33be21f42a5f00893de028">tbb::filter</a><li>filter_is_bound
+: <a class="el" href="a00256.html#dd6a6e7210efc9bcaf2c5e08767d92b5">tbb::filter</a><li>filter_is_out_of_order
+: <a class="el" href="a00256.html#2e5eb65f95d8050186278077e433c5b1">tbb::filter</a><li>filter_is_serial
+: <a class="el" href="a00256.html#4b7de3a76e744f3d9c1bc5d437ea851d">tbb::filter</a><li>filter_may_emit_null
+: <a class="el" href="a00256.html#bdd02a434a6e7499dd1e8f43aae96793">tbb::filter</a><li>is_writer
+: <a class="el" href="a00245.html#07d958f151a0eaa92f50fd56ad6440e2">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a>, <a class="el" href="a00308.html#6b5a7c3c67a36b05c4df8410d32627d8">tbb::spin_rw_mutex_v3::scoped_lock</a><li>mutex
+: <a class="el" href="a00275.html#05313cb77d4f85213103d4dab74ed454">tbb::mutex</a>, <a class="el" href="a00308.html#d96d1a1fcc3d79ef3e5c06a53b8ffeaa">tbb::spin_rw_mutex_v3::scoped_lock</a><li>my_exception_data
+: <a class="el" href="a00273.html#a8c0ae2089ae784b28907cf748b89416">tbb::movable_exception< ExceptionData ></a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/globals.html b/doc/html/globals.html
index 428e922..3165200 100644
--- a/doc/html/globals.html
+++ b/doc/html/globals.html
@@ -28,18 +28,16 @@
Here is a list of all documented file members with links to the documentation:
<p>
<ul>
-<li>make_edge()
-: <a class="el" href="a00362.html#0a5a2559e7d28a9bf8f9e5e60d745e86">graph.h</a><li>make_edges()
-: <a class="el" href="a00362.html#9368d2f689961f790bf7aa4a8cc1135e">graph.h</a><li>scalable_aligned_free()
-: <a class="el" href="a00373.html#g65a20e812012f15ec7442d5b45d0cba5">scalable_allocator.h</a><li>scalable_aligned_malloc()
-: <a class="el" href="a00373.html#gc1c7aaa1fe85c17ba5a3a96f7e8d89e7">scalable_allocator.h</a><li>scalable_aligned_realloc()
-: <a class="el" href="a00373.html#gbaea91376be80dfabd7c93eaffd9abaa">scalable_allocator.h</a><li>scalable_calloc()
-: <a class="el" href="a00373.html#g3f5a2fde0bcaa3eda35be32c8658f444">scalable_allocator.h</a><li>scalable_free()
-: <a class="el" href="a00373.html#gca3579c21244dba9f0c351e5984d4565">scalable_allocator.h</a><li>scalable_malloc()
-: <a class="el" href="a00373.html#gc25b8e6c76db0b346a8249796a7a2475">scalable_allocator.h</a><li>scalable_msize()
-: <a class="el" href="a00373.html#g0965ce1b4b7835f92869c7fd867265f7">scalable_allocator.h</a><li>scalable_posix_memalign()
-: <a class="el" href="a00373.html#g05dcec987480bb2c82ecdead6a085899">scalable_allocator.h</a><li>scalable_realloc()
-: <a class="el" href="a00373.html#g951bbbbd2d041acb59ba5fa910b52543">scalable_allocator.h</a></ul>
+<li>scalable_aligned_free()
+: <a class="el" href="a00397.html#g65a20e812012f15ec7442d5b45d0cba5">scalable_allocator.h</a><li>scalable_aligned_malloc()
+: <a class="el" href="a00397.html#gc1c7aaa1fe85c17ba5a3a96f7e8d89e7">scalable_allocator.h</a><li>scalable_aligned_realloc()
+: <a class="el" href="a00397.html#gbaea91376be80dfabd7c93eaffd9abaa">scalable_allocator.h</a><li>scalable_calloc()
+: <a class="el" href="a00397.html#g3f5a2fde0bcaa3eda35be32c8658f444">scalable_allocator.h</a><li>scalable_free()
+: <a class="el" href="a00397.html#gca3579c21244dba9f0c351e5984d4565">scalable_allocator.h</a><li>scalable_malloc()
+: <a class="el" href="a00397.html#gc25b8e6c76db0b346a8249796a7a2475">scalable_allocator.h</a><li>scalable_msize()
+: <a class="el" href="a00397.html#g0965ce1b4b7835f92869c7fd867265f7">scalable_allocator.h</a><li>scalable_posix_memalign()
+: <a class="el" href="a00397.html#g05dcec987480bb2c82ecdead6a085899">scalable_allocator.h</a><li>scalable_realloc()
+: <a class="el" href="a00397.html#g951bbbbd2d041acb59ba5fa910b52543">scalable_allocator.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/globals_func.html b/doc/html/globals_func.html
index 7a70e40..e9eed12 100644
--- a/doc/html/globals_func.html
+++ b/doc/html/globals_func.html
@@ -28,18 +28,16 @@
<p>
<ul>
-<li>make_edge()
-: <a class="el" href="a00362.html#0a5a2559e7d28a9bf8f9e5e60d745e86">graph.h</a><li>make_edges()
-: <a class="el" href="a00362.html#9368d2f689961f790bf7aa4a8cc1135e">graph.h</a><li>scalable_aligned_free()
-: <a class="el" href="a00373.html#g65a20e812012f15ec7442d5b45d0cba5">scalable_allocator.h</a><li>scalable_aligned_malloc()
-: <a class="el" href="a00373.html#gc1c7aaa1fe85c17ba5a3a96f7e8d89e7">scalable_allocator.h</a><li>scalable_aligned_realloc()
-: <a class="el" href="a00373.html#gbaea91376be80dfabd7c93eaffd9abaa">scalable_allocator.h</a><li>scalable_calloc()
-: <a class="el" href="a00373.html#g3f5a2fde0bcaa3eda35be32c8658f444">scalable_allocator.h</a><li>scalable_free()
-: <a class="el" href="a00373.html#gca3579c21244dba9f0c351e5984d4565">scalable_allocator.h</a><li>scalable_malloc()
-: <a class="el" href="a00373.html#gc25b8e6c76db0b346a8249796a7a2475">scalable_allocator.h</a><li>scalable_msize()
-: <a class="el" href="a00373.html#g0965ce1b4b7835f92869c7fd867265f7">scalable_allocator.h</a><li>scalable_posix_memalign()
-: <a class="el" href="a00373.html#g05dcec987480bb2c82ecdead6a085899">scalable_allocator.h</a><li>scalable_realloc()
-: <a class="el" href="a00373.html#g951bbbbd2d041acb59ba5fa910b52543">scalable_allocator.h</a></ul>
+<li>scalable_aligned_free()
+: <a class="el" href="a00397.html#g65a20e812012f15ec7442d5b45d0cba5">scalable_allocator.h</a><li>scalable_aligned_malloc()
+: <a class="el" href="a00397.html#gc1c7aaa1fe85c17ba5a3a96f7e8d89e7">scalable_allocator.h</a><li>scalable_aligned_realloc()
+: <a class="el" href="a00397.html#gbaea91376be80dfabd7c93eaffd9abaa">scalable_allocator.h</a><li>scalable_calloc()
+: <a class="el" href="a00397.html#g3f5a2fde0bcaa3eda35be32c8658f444">scalable_allocator.h</a><li>scalable_free()
+: <a class="el" href="a00397.html#gca3579c21244dba9f0c351e5984d4565">scalable_allocator.h</a><li>scalable_malloc()
+: <a class="el" href="a00397.html#gc25b8e6c76db0b346a8249796a7a2475">scalable_allocator.h</a><li>scalable_msize()
+: <a class="el" href="a00397.html#g0965ce1b4b7835f92869c7fd867265f7">scalable_allocator.h</a><li>scalable_posix_memalign()
+: <a class="el" href="a00397.html#g05dcec987480bb2c82ecdead6a085899">scalable_allocator.h</a><li>scalable_realloc()
+: <a class="el" href="a00397.html#g951bbbbd2d041acb59ba5fa910b52543">scalable_allocator.h</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/hierarchy.html b/doc/html/hierarchy.html
index 4b094d7..b684037 100644
--- a/doc/html/hierarchy.html
+++ b/doc/html/hierarchy.html
@@ -21,187 +21,149 @@
<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="a00212.html">tbb::affinity_partitioner</a>
-<li><a class="el" href="a00213.html">tbb::interface6::internal::aggregated_operation< Derived ></a>
-<li><a class="el" href="a00214.html">tbb::interface6::internal::aggregator< handler_type, operation_type ></a>
-<li><a class="el" href="a00215.html">tbb::aligned_space< T, N ></a>
-<li><a class="el" href="a00216.html">tbb::atomic< T ></a>
-<li><a class="el" href="a00217.html">tbb::atomic< void * ></a>
-<li><a class="el" href="a00218.html">tbb::internal::atomic_backoff</a>
-<li><a class="el" href="a00219.html">tbb::auto_partitioner</a>
-<li><a class="el" href="a00220.html">tbb::bad_last_alloc</a>
-<li><a class="el" href="a00221.html">tbb::blocked_range< Value ></a>
-<li><a class="el" href="a00222.html">tbb::blocked_range2d< RowValue, ColValue ></a>
-<li><a class="el" href="a00223.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>
-<li><a class="el" href="a00221.html">tbb::blocked_range< I ></a>
-<li><a class="el" href="a00226.html">tbb::cache_aligned_allocator< T ></a>
-<li><a class="el" href="a00227.html">tbb::cache_aligned_allocator< void ></a>
-<li><a class="el" href="a00229.html">tbb::combinable< T ></a>
-<li><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a>
+<li><a class="el" href="a00226.html">tbb::internal::affinity_partitioner_base_v3</a>
<ul>
-<li><a class="el" href="a00237.html">tbb::deprecated::concurrent_queue< T, A ></a>
-</ul>
-<li><a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>
-<li><a class="el" href="a00233.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a>
-<li><a class="el" href="a00234.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a>
+<li><a class="el" href="a00225.html">tbb::affinity_partitioner</a>
+</ul>
+<li><a class="el" href="a00227.html">tbb::aligned_space< T, N ></a>
+<li><a class="el" href="a00228.html">tbb::atomic< T ></a>
+<li><a class="el" href="a00229.html">tbb::atomic< void * ></a>
+<li><a class="el" href="a00230.html">tbb::internal::atomic_backoff</a>
+<li><a class="el" href="a00231.html">tbb::auto_partitioner</a>
+<li><a class="el" href="a00232.html">tbb::bad_last_alloc</a>
+<li><a class="el" href="a00233.html">tbb::blocked_range< Value ></a>
+<li><a class="el" href="a00234.html">tbb::blocked_range2d< RowValue, ColValue ></a>
+<li><a class="el" href="a00235.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>
+<li><a class="el" href="a00233.html">tbb::blocked_range< I ></a>
+<li><a class="el" href="a00238.html">tbb::cache_aligned_allocator< T ></a>
+<li><a class="el" href="a00239.html">tbb::cache_aligned_allocator< void ></a>
+<li><a class="el" href="a00241.html">tbb::combinable< T ></a>
+<li><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a>
<ul>
-<li><a class="el" href="a00232.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a>
+<li><a class="el" href="a00249.html">tbb::deprecated::concurrent_queue< T, A ></a>
</ul>
-<li><a class="el" href="a00235.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a>
-<li><a class="el" href="a00236.html">tbb::strict_ppl::concurrent_queue< T, A ></a>
-<li><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a>
-<li><a class="el" href="a00239.html">tbb::continue_msg</a>
-<li><a class="el" href="a00243.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>
-<li><a class="el" href="a00245.html">tbb::filter</a>
+<li><a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>
+<li><a class="el" href="a00245.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a>
+<li><a class="el" href="a00246.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a>
+<ul>
+<li><a class="el" href="a00244.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a>
+</ul>
+<li><a class="el" href="a00247.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a>
+<li><a class="el" href="a00248.html">tbb::strict_ppl::concurrent_queue< T, A ></a>
+<li><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a>
+<li><a class="el" href="a00251.html">tbb::flow::interface6::continue_msg</a>
+<li><a class="el" href="a00255.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>
+<li><a class="el" href="a00256.html">tbb::filter</a>
<ul>
-<li><a class="el" href="a00301.html">tbb::thread_bound_filter</a>
+<li><a class="el" href="a00322.html">tbb::thread_bound_filter</a>
</ul>
-<li><a class="el" href="a00246.html">tbb::interface6::filter_t< T, U ></a>
-<li><a class="el" href="a00247.html">tbb::final_scan_tag</a>
-<li><a class="el" href="a00248.html">tbb::interface6::flow_control</a>
-<li><a class="el" href="a00250.html">tbb::graph</a>
-<li><a class="el" href="a00251.html">tbb::graph_node</a>
+<li><a class="el" href="a00257.html">tbb::interface6::filter_t< T, U ></a>
+<li><a class="el" href="a00258.html">tbb::final_scan_tag</a>
+<li><a class="el" href="a00259.html">tbb::interface6::flow_control</a>
+<li><a class="el" href="a00262.html">tbb::flow::interface6::graph</a>
+<li><a class="el" href="a00263.html">tbb::flow::interface6::graph_node</a>
<ul>
-<li><a class="el" href="a00224.html">tbb::broadcast_node< T ></a>
-<li><a class="el" href="a00225.html">tbb::buffer_node< T ></a>
+<li><a class="el" href="a00236.html">tbb::flow::interface6::broadcast_node< T ></a>
+<li><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>
<ul>
-<li><a class="el" href="a00268.html">tbb::priority_queue_node< T, Compare ></a>
-<li><a class="el" href="a00269.html">tbb::queue_node< T ></a>
+<li><a class="el" href="a00286.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>
+<li><a class="el" href="a00287.html">tbb::flow::interface6::queue_node< T, A ></a>
<ul>
-<li><a class="el" href="a00283.html">tbb::sequencer_node< T ></a>
-</ul>
-</ul>
-<li><a class="el" href="a00244.html">tbb::executable_node< Output ></a>
-<ul>
-<li><a class="el" href="a00240.html">tbb::continue_node</a>
-</ul>
-<li><a class="el" href="a00244.html">tbb::executable_node< tbb::continue_msg ></a>
-<li><a class="el" href="a00249.html">tbb::function_node< Input, Output ></a>
-<li><a class="el" href="a00254.html">tbb::internal::join_node_base< JP, InputTuple, OutputTuple ></a>
-<li><a class="el" href="a00254.html">tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type > >, OutputTuple ></a>
-<li><a class="el" href="a00254.html">tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 2, OutputTuple >::type > >, OutputTuple ></a>
-<li><a class="el" href="a00254.html">tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 2, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 3, OutputTuple >::type > >, OutputTuple ></a>
-<li><a class="el" href="a00254.html">tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 2, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 3, OutputTuple >::type >, tbb::internal::two_phase_port< std:: [...]
-<li><a class="el" href="a00254.html">tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 2, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 3, OutputTuple >::type >, tbb::internal::two_phase_port< std:: [...]
-<li><a class="el" href="a00254.html">tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 2, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 3, OutputTuple >::type >, tbb::internal::two_phase_port< std:: [...]
-<li><a class="el" href="a00254.html">tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 2, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 3, OutputTuple >::type >, tbb::internal::two_phase_port< std:: [...]
-<li><a class="el" href="a00254.html">tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 2, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 3, OutputTuple >::type >, tbb::internal::two_phase_port< std:: [...]
-<li><a class="el" href="a00254.html">tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 2, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 3, OutputTuple >::type >, tbb::internal::two_phase_port< std:: [...]
-<li><a class="el" href="a00255.html">tbb::limiter_node< T ></a>
-<li><a class="el" href="a00285.html">tbb::source_node< Output ></a>
-</ul>
-<li><a class="el" href="a00252.html">tbb::improper_lock</a>
-<li><b>atomic_impl</b><li><b>continue_input</b><ul>
-<li><a class="el" href="a00244.html">tbb::executable_node< tbb::continue_msg ></a>
+<li><a class="el" href="a00302.html">tbb::flow::interface6::sequencer_node< T, A ></a>
</ul>
-<li><b>function_output</b><ul>
-<li><a class="el" href="a00244.html">tbb::executable_node< tbb::continue_msg ></a>
</ul>
-<li><a class="el" href="a00253.html">tbb::invalid_multiple_scheduling</a>
-<li><b>join_node_FE</b><ul>
-<li><a class="el" href="a00254.html">tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type > >, OutputTuple ></a>
-<li><a class="el" href="a00254.html">tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 2, OutputTuple >::type > >, OutputTuple ></a>
-<li><a class="el" href="a00254.html">tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 2, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 3, OutputTuple >::type > >, OutputTuple ></a>
-<li><a class="el" href="a00254.html">tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 2, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 3, OutputTuple >::type >, tbb::internal::two_phase_port< std:: [...]
-<li><a class="el" href="a00254.html">tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 2, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 3, OutputTuple >::type >, tbb::internal::two_phase_port< std:: [...]
-<li><a class="el" href="a00254.html">tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 2, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 3, OutputTuple >::type >, tbb::internal::two_phase_port< std:: [...]
-<li><a class="el" href="a00254.html">tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 2, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 3, OutputTuple >::type >, tbb::internal::two_phase_port< std:: [...]
-<li><a class="el" href="a00254.html">tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 2, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 3, OutputTuple >::type >, tbb::internal::two_phase_port< std:: [...]
-<li><a class="el" href="a00254.html">tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 2, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 3, OutputTuple >::type >, tbb::internal::two_phase_port< std:: [...]
-</ul>
-<li><a class="el" href="a00256.html">tbb::missing_wait</a>
-<li><a class="el" href="a00258.html">tbb::mutex</a>
-<li><a class="el" href="a00259.html">tbb::mutex::scoped_lock</a>
-<li><b>no_copy</b><ul>
-<li><a class="el" href="a00254.html">tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type > >, OutputTuple ></a>
-<li><a class="el" href="a00254.html">tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 2, OutputTuple >::type > >, OutputTuple ></a>
-<li><a class="el" href="a00254.html">tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 2, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 3, OutputTuple >::type > >, OutputTuple ></a>
-<li><a class="el" href="a00254.html">tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 2, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 3, OutputTuple >::type >, tbb::internal::two_phase_port< std:: [...]
-<li><a class="el" href="a00254.html">tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 2, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 3, OutputTuple >::type >, tbb::internal::two_phase_port< std:: [...]
-<li><a class="el" href="a00254.html">tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 2, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 3, OutputTuple >::type >, tbb::internal::two_phase_port< std:: [...]
-<li><a class="el" href="a00254.html">tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 2, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 3, OutputTuple >::type >, tbb::internal::two_phase_port< std:: [...]
-<li><a class="el" href="a00254.html">tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 2, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 3, OutputTuple >::type >, tbb::internal::two_phase_port< std:: [...]
-<li><a class="el" href="a00254.html">tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 2, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 3, OutputTuple >::type >, tbb::internal::two_phase_port< std:: [...]
-</ul>
-<li><a class="el" href="a00260.html">tbb::null_mutex</a>
-<li><a class="el" href="a00261.html">tbb::null_mutex::scoped_lock</a>
-<li><a class="el" href="a00262.html">tbb::null_rw_mutex</a>
-<li><a class="el" href="a00263.html">tbb::null_rw_mutex::scoped_lock</a>
-<li><a class="el" href="a00264.html">tbb::parallel_do_feeder< Item ></a>
-<li><a class="el" href="a00265.html">tbb::parallel_while< Body ></a>
-<li><a class="el" href="a00266.html">tbb::pipeline</a>
-<li><a class="el" href="a00267.html">tbb::pre_scan_tag</a>
-<li><a class="el" href="a00270.html">tbb::queuing_mutex</a>
-<li><a class="el" href="a00271.html">tbb::queuing_mutex::scoped_lock</a>
-<li><a class="el" href="a00272.html">tbb::queuing_rw_mutex</a>
-<li><a class="el" href="a00273.html">tbb::queuing_rw_mutex::scoped_lock</a>
-<li><a class="el" href="a00274.html">tbb::interface5::reader_writer_lock</a>
-<li><a class="el" href="a00275.html">tbb::interface5::reader_writer_lock::scoped_lock</a>
-<li><a class="el" href="a00276.html">tbb::interface5::reader_writer_lock::scoped_lock_read</a>
-<li><a class="el" href="a00277.html">tbb::receiver< T ></a>
+<li><a class="el" href="a00252.html">tbb::flow::interface6::continue_node< Output ></a>
+<li><a class="el" href="a00260.html">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a>
+<li><a class="el" href="a00261.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a>
+<li><a class="el" href="a00266.html">tbb::flow::interface6::limiter_node< T ></a>
+<li><a class="el" href="a00274.html">tbb::flow::interface6::multioutput_function_node< Input, Output,, Allocator ></a>
+<li><a class="el" href="a00274.html">tbb::flow::interface6::multioutput_function_node< TupleType, TupleType, rejecting, Allocator ></a>
<ul>
-<li><a class="el" href="a00224.html">tbb::broadcast_node< T ></a>
-<li><a class="el" href="a00225.html">tbb::buffer_node< T ></a>
-<li><a class="el" href="a00241.html">tbb::continue_receiver</a>
-<li><a class="el" href="a00304.html">tbb::internal::two_phase_port< T ></a>
-<li><a class="el" href="a00255.html">tbb::limiter_node< T ></a>
-</ul>
-<li><a class="el" href="a00277.html">tbb::receiver< tbb::continue_msg ></a>
-<li><a class="el" href="a00278.html">tbb::recursive_mutex</a>
-<li><a class="el" href="a00279.html">tbb::recursive_mutex::scoped_lock</a>
-<li><a class="el" href="a00280.html">tbb::scalable_allocator< T ></a>
-<li><a class="el" href="a00281.html">tbb::scalable_allocator< void ></a>
-<li><a class="el" href="a00282.html">tbb::sender< T ></a>
+<li><a class="el" href="a00310.html">tbb::flow::interface6::split_node< TupleType, Allocator ></a>
+</ul>
+<li><a class="el" href="a00304.html">tbb::flow::interface6::source_node< Output ></a>
+</ul>
+<li><a class="el" href="a00264.html">tbb::improper_lock</a>
+<li><b>atomic_impl</b><li><b>multioutput_function_input</b><ul>
+<li><a class="el" href="a00274.html">tbb::flow::interface6::multioutput_function_node< TupleType, TupleType, rejecting, Allocator ></a>
+</ul>
+<li><a class="el" href="a00265.html">tbb::invalid_multiple_scheduling</a>
+<li><a class="el" href="a00267.html">tbb::internal::machine_load_store_relaxed< T, S ></a>
+<li><a class="el" href="a00268.html">tbb::internal::machine_load_store_seq_cst< T, 8 ></a>
+<li><a class="el" href="a00269.html">tbb::interface6::memory_pool< Alloc ></a>
+<li><a class="el" href="a00270.html">tbb::interface6::memory_pool_allocator< T, P ></a>
+<li><a class="el" href="a00271.html">tbb::interface6::memory_pool_allocator< void, P ></a>
+<li><a class="el" href="a00272.html">tbb::missing_wait</a>
+<li><a class="el" href="a00275.html">tbb::mutex</a>
+<li><a class="el" href="a00276.html">tbb::mutex::scoped_lock</a>
+<li><a class="el" href="a00277.html">tbb::null_mutex</a>
+<li><a class="el" href="a00278.html">tbb::null_mutex::scoped_lock</a>
+<li><a class="el" href="a00279.html">tbb::null_rw_mutex</a>
+<li><a class="el" href="a00280.html">tbb::null_rw_mutex::scoped_lock</a>
+<li><a class="el" href="a00281.html">tbb::parallel_do_feeder< Item ></a>
+<li><a class="el" href="a00282.html">tbb::parallel_while< Body ></a>
+<li><a class="el" href="a00283.html">tbb::internal::partition_type_base</a>
+<li><a class="el" href="a00284.html">tbb::pipeline</a>
+<li><a class="el" href="a00285.html">tbb::pre_scan_tag</a>
+<li><a class="el" href="a00288.html">tbb::queuing_mutex</a>
+<li><a class="el" href="a00289.html">tbb::queuing_mutex::scoped_lock</a>
+<li><a class="el" href="a00290.html">tbb::queuing_rw_mutex</a>
+<li><a class="el" href="a00291.html">tbb::queuing_rw_mutex::scoped_lock</a>
+<li><a class="el" href="a00292.html">tbb::interface5::reader_writer_lock</a>
+<li><a class="el" href="a00293.html">tbb::interface5::reader_writer_lock::scoped_lock</a>
+<li><a class="el" href="a00294.html">tbb::interface5::reader_writer_lock::scoped_lock_read</a>
+<li><a class="el" href="a00295.html">tbb::flow::interface6::receiver< T ></a>
<ul>
-<li><a class="el" href="a00224.html">tbb::broadcast_node< T ></a>
-<li><a class="el" href="a00225.html">tbb::buffer_node< T ></a>
-<li><a class="el" href="a00255.html">tbb::limiter_node< T ></a>
-</ul>
-<li><a class="el" href="a00282.html">tbb::sender< Output ></a>
+<li><a class="el" href="a00236.html">tbb::flow::interface6::broadcast_node< T ></a>
+<li><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>
+<li><a class="el" href="a00253.html">tbb::flow::interface6::continue_receiver</a>
+<li><a class="el" href="a00266.html">tbb::flow::interface6::limiter_node< T ></a>
+</ul>
+<li><a class="el" href="a00295.html">tbb::flow::interface6::receiver< tbb::flow::interface6::continue_msg ></a>
+<li><a class="el" href="a00296.html">tbb::recursive_mutex</a>
+<li><a class="el" href="a00297.html">tbb::recursive_mutex::scoped_lock</a>
+<li><a class="el" href="a00298.html">tbb::interface6::runtime_loader</a>
+<li><a class="el" href="a00299.html">tbb::scalable_allocator< T ></a>
+<li><a class="el" href="a00300.html">tbb::scalable_allocator< void ></a>
+<li><a class="el" href="a00301.html">tbb::flow::interface6::sender< T ></a>
<ul>
-<li><a class="el" href="a00285.html">tbb::source_node< Output ></a>
+<li><a class="el" href="a00236.html">tbb::flow::interface6::broadcast_node< T ></a>
+<li><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>
+<li><a class="el" href="a00266.html">tbb::flow::interface6::limiter_node< T ></a>
</ul>
-<li><a class="el" href="a00282.html">tbb::sender< OutputTuple ></a>
+<li><a class="el" href="a00301.html">tbb::flow::interface6::sender< Output ></a>
<ul>
-<li><a class="el" href="a00254.html">tbb::internal::join_node_base< JP, InputTuple, OutputTuple ></a>
-<li><a class="el" href="a00254.html">tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type > >, OutputTuple ></a>
-<li><a class="el" href="a00254.html">tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 2, OutputTuple >::type > >, OutputTuple ></a>
-<li><a class="el" href="a00254.html">tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 2, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 3, OutputTuple >::type > >, OutputTuple ></a>
-<li><a class="el" href="a00254.html">tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 2, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 3, OutputTuple >::type >, tbb::internal::two_phase_port< std:: [...]
-<li><a class="el" href="a00254.html">tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 2, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 3, OutputTuple >::type >, tbb::internal::two_phase_port< std:: [...]
-<li><a class="el" href="a00254.html">tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 2, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 3, OutputTuple >::type >, tbb::internal::two_phase_port< std:: [...]
-<li><a class="el" href="a00254.html">tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 2, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 3, OutputTuple >::type >, tbb::internal::two_phase_port< std:: [...]
-<li><a class="el" href="a00254.html">tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 2, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 3, OutputTuple >::type >, tbb::internal::two_phase_port< std:: [...]
-<li><a class="el" href="a00254.html">tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 2, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 3, OutputTuple >::type >, tbb::internal::two_phase_port< std:: [...]
-</ul>
-<li><a class="el" href="a00284.html">tbb::simple_partitioner</a>
-<li><a class="el" href="a00286.html">tbb::spin_mutex</a>
-<li><a class="el" href="a00287.html">tbb::spin_mutex::scoped_lock</a>
-<li><a class="el" href="a00288.html">tbb::spin_rw_mutex_v3</a>
-<li><a class="el" href="a00289.html">tbb::spin_rw_mutex_v3::scoped_lock</a>
-<li><a class="el" href="a00290.html">tbb::split</a>
-<li><a class="el" href="a00291.html">tbb::task</a>
+<li><a class="el" href="a00304.html">tbb::flow::interface6::source_node< Output ></a>
+</ul>
+<li><a class="el" href="a00303.html">tbb::simple_partitioner</a>
+<li><a class="el" href="a00305.html">tbb::spin_mutex</a>
+<li><a class="el" href="a00306.html">tbb::spin_mutex::scoped_lock</a>
+<li><a class="el" href="a00307.html">tbb::spin_rw_mutex_v3</a>
+<li><a class="el" href="a00308.html">tbb::spin_rw_mutex_v3::scoped_lock</a>
+<li><a class="el" href="a00309.html">tbb::split</a>
+<li><a class="el" href="a00311.html">tbb::task</a>
<ul>
-<li><a class="el" href="a00242.html">tbb::empty_task</a>
-</ul>
-<li><a class="el" href="a00292.html">tbb::interface5::internal::task_base</a>
-<li><a class="el" href="a00293.html">tbb::task_group_context</a>
-<li><a class="el" href="a00294.html">tbb::task_list</a>
-<li><a class="el" href="a00295.html">tbb::task_scheduler_init</a>
-<li><a class="el" href="a00296.html">tbb::tbb_allocator< T ></a>
-<li><a class="el" href="a00297.html">tbb::tbb_allocator< void ></a>
-<li><a class="el" href="a00298.html">tbb::tbb_exception</a>
+<li><a class="el" href="a00254.html">tbb::empty_task</a>
+</ul>
+<li><a class="el" href="a00312.html">tbb::interface5::internal::task_base</a>
+<li><a class="el" href="a00313.html">tbb::task_group_context</a>
+<li><a class="el" href="a00314.html">tbb::task_group_context</a>
+<li><a class="el" href="a00315.html">tbb::task_list</a>
+<li><a class="el" href="a00316.html">tbb::task_scheduler_init</a>
+<li><a class="el" href="a00317.html">tbb::tbb_allocator< T ></a>
+<li><a class="el" href="a00318.html">tbb::tbb_allocator< void ></a>
+<li><a class="el" href="a00319.html">tbb::tbb_exception</a>
<ul>
-<li><a class="el" href="a00228.html">tbb::captured_exception</a>
-<li><a class="el" href="a00257.html">tbb::movable_exception< ExceptionData ></a>
-</ul>
-<li><a class="el" href="a00299.html">tbb::internal::tbb_exception_ptr</a>
-<li><a class="el" href="a00300.html">tbb::tbb_hash_compare< Key ></a>
-<li><a class="el" href="a00302.html">tbb::tick_count</a>
-<li><a class="el" href="a00303.html">tbb::tick_count::interval_t</a>
-<li><a class="el" href="a00305.html">tbb::internal::work_around_alignment_bug< Size, T ></a>
-<li><a class="el" href="a00306.html">tbb::zero_allocator< T, Allocator ></a>
-<li><a class="el" href="a00307.html">tbb::zero_allocator< void, Allocator ></a>
+<li><a class="el" href="a00240.html">tbb::captured_exception</a>
+<li><a class="el" href="a00273.html">tbb::movable_exception< ExceptionData ></a>
+</ul>
+<li><a class="el" href="a00320.html">tbb::internal::tbb_exception_ptr</a>
+<li><a class="el" href="a00321.html">tbb::tbb_hash_compare< Key ></a>
+<li><a class="el" href="a00323.html">tbb::tick_count</a>
+<li><a class="el" href="a00324.html">tbb::tick_count::interval_t</a>
+<li><a class="el" href="a00325.html">tbb::internal::work_around_alignment_bug< Size, T ></a>
+<li><a class="el" href="a00326.html">tbb::zero_allocator< T, Allocator ></a>
+<li><a class="el" href="a00327.html">tbb::zero_allocator< void, Allocator ></a>
</ul>
<hr>
<p></p>
diff --git a/doc/html/modules.html b/doc/html/modules.html
index f80ae48..a92e814 100644
--- a/doc/html/modules.html
+++ b/doc/html/modules.html
@@ -15,12 +15,12 @@
<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="a00371.html">Algorithms</a>
-<li><a class="el" href="a00372.html">Containers</a>
-<li><a class="el" href="a00373.html">Memory Allocation</a>
-<li><a class="el" href="a00374.html">Synchronization</a>
-<li><a class="el" href="a00375.html">Timing</a>
-<li><a class="el" href="a00376.html">Task Scheduling</a>
+<li><a class="el" href="a00395.html">Algorithms</a>
+<li><a class="el" href="a00396.html">Containers</a>
+<li><a class="el" href="a00397.html">Memory Allocation</a>
+<li><a class="el" href="a00398.html">Synchronization</a>
+<li><a class="el" href="a00399.html">Timing</a>
+<li><a class="el" href="a00400.html">Task Scheduling</a>
</ul>
<hr>
<p></p>
diff --git a/doc/html/namespacemembers.html b/doc/html/namespacemembers.html
index b79d04c..64fed08 100644
--- a/doc/html/namespacemembers.html
+++ b/doc/html/namespacemembers.html
@@ -32,26 +32,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="a00362.html#ad165cf61abbe349d413df2589679add">tbb</a><li>__TBB_full_fence
-: <a class="el" href="a00362.html#a8686246bb5d3664bd07563749970fefc6db01678b1749dff7554688d079520c">tbb</a><li>acquire
-: <a class="el" href="a00362.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">tbb</a><li>assertion_failure()
-: <a class="el" href="a00362.html#3d1252787be39b4aef311f1cadaff9e8">tbb</a><li>assertion_handler_type
-: <a class="el" href="a00362.html#ed375248ff6019a70ca0f9da528e5d0b">tbb</a><li>atomic_fence()
-: <a class="el" href="a00362.html#250275615f10d5b5de6ad466ae2f54de">tbb</a><li>ets_key_usage_type
-: <a class="el" href="a00362.html#a8622ae61b7e7737dac26542e181178e">tbb</a><li>make_edge()
-: <a class="el" href="a00362.html#0a5a2559e7d28a9bf8f9e5e60d745e86">tbb</a><li>make_edges()
-: <a class="el" href="a00362.html#9368d2f689961f790bf7aa4a8cc1135e">tbb</a><li>memory_semantics
-: <a class="el" href="a00362.html#a8686246bb5d3664bd07563749970fef">tbb</a><li>parallel_do()
-: <a class="el" href="a00371.html#g2617dc9b88b3285a7212599d49f74228">tbb</a><li>parallel_for()
-: <a class="el" href="a00370.html#490399525b1e690ec31d6db964c6b272">tbb::strict_ppl</a>, <a class="el" href="a00371.html#g04b4696b67370c01353ff5974c8f1196">tbb</a><li>parallel_for_each()
-: <a class="el" href="a00371.html#gc2d710ca573f0a9bd94379cba3772def">tbb</a><li>parallel_invoke()
-: <a class="el" href="a00371.html#gd3e2998f171494f94c2103f4eb924084">tbb</a><li>parallel_reduce()
-: <a class="el" href="a00371.html#g496bd7eadb3b97495ccb5655ef90319e">tbb</a><li>parallel_scan()
-: <a class="el" href="a00371.html#g62fde400a37bbca1a2fddc8e3d22f556">tbb</a><li>parallel_sort()
-: <a class="el" href="a00371.html#gc7576f82fdedc8a701a6c17ad9415926">tbb</a><li>release
-: <a class="el" href="a00362.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">tbb</a><li>set_assertion_handler()
-: <a class="el" href="a00362.html#823fa1c15dd829d1d9167157450ddcd9">tbb</a><li>TBB_runtime_interface_version()
-: <a class="el" href="a00362.html#a6858b22e90041c9c4669674ff39b056">tbb</a></ul>
+: <a class="el" href="a00383.html#ad165cf61abbe349d413df2589679add">tbb</a><li>acquire
+: <a class="el" href="a00383.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">tbb</a><li>assertion_failure()
+: <a class="el" href="a00383.html#3d1252787be39b4aef311f1cadaff9e8">tbb</a><li>assertion_handler_type
+: <a class="el" href="a00383.html#ed375248ff6019a70ca0f9da528e5d0b">tbb</a><li>atomic_fence()
+: <a class="el" href="a00383.html#250275615f10d5b5de6ad466ae2f54de">tbb</a><li>ets_key_usage_type
+: <a class="el" href="a00383.html#a8622ae61b7e7737dac26542e181178e">tbb</a><li>full_fence
+: <a class="el" href="a00383.html#a8686246bb5d3664bd07563749970fef07b959f69a4f70d821c67b85316803ff">tbb</a><li>memory_semantics
+: <a class="el" href="a00383.html#a8686246bb5d3664bd07563749970fef">tbb</a><li>parallel_deterministic_reduce()
+: <a class="el" href="a00395.html#g0a66bc67567b2d01d709b59b9bddf84a">tbb</a><li>parallel_do()
+: <a class="el" href="a00395.html#g2617dc9b88b3285a7212599d49f74228">tbb</a><li>parallel_for()
+: <a class="el" href="a00395.html#g04b4696b67370c01353ff5974c8f1196">tbb</a><li>parallel_for_each()
+: <a class="el" href="a00395.html#gc2d710ca573f0a9bd94379cba3772def">tbb</a><li>parallel_invoke()
+: <a class="el" href="a00395.html#gd3e2998f171494f94c2103f4eb924084">tbb</a><li>parallel_reduce()
+: <a class="el" href="a00395.html#g496bd7eadb3b97495ccb5655ef90319e">tbb</a><li>parallel_scan()
+: <a class="el" href="a00395.html#g62fde400a37bbca1a2fddc8e3d22f556">tbb</a><li>parallel_sort()
+: <a class="el" href="a00395.html#gc7576f82fdedc8a701a6c17ad9415926">tbb</a><li>relaxed
+: <a class="el" href="a00383.html#a8686246bb5d3664bd07563749970fefaba4b1574646947f1b519188a93c1900">tbb</a><li>release
+: <a class="el" href="a00383.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">tbb</a><li>set_assertion_handler()
+: <a class="el" href="a00383.html#823fa1c15dd829d1d9167157450ddcd9">tbb</a><li>TBB_runtime_interface_version()
+: <a class="el" href="a00383.html#a6858b22e90041c9c4669674ff39b056">tbb</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/namespacemembers_enum.html b/doc/html/namespacemembers_enum.html
index 9b77301..b9bb315 100644
--- a/doc/html/namespacemembers_enum.html
+++ b/doc/html/namespacemembers_enum.html
@@ -32,8 +32,8 @@
<p>
<ul>
<li>ets_key_usage_type
-: <a class="el" href="a00362.html#a8622ae61b7e7737dac26542e181178e">tbb</a><li>memory_semantics
-: <a class="el" href="a00362.html#a8686246bb5d3664bd07563749970fef">tbb</a></ul>
+: <a class="el" href="a00383.html#a8622ae61b7e7737dac26542e181178e">tbb</a><li>memory_semantics
+: <a class="el" href="a00383.html#a8686246bb5d3664bd07563749970fef">tbb</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/namespacemembers_eval.html b/doc/html/namespacemembers_eval.html
index f4ac168..921c79f 100644
--- a/doc/html/namespacemembers_eval.html
+++ b/doc/html/namespacemembers_eval.html
@@ -31,10 +31,11 @@
<p>
<ul>
-<li>__TBB_full_fence
-: <a class="el" href="a00362.html#a8686246bb5d3664bd07563749970fefc6db01678b1749dff7554688d079520c">tbb</a><li>acquire
-: <a class="el" href="a00362.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">tbb</a><li>release
-: <a class="el" href="a00362.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">tbb</a></ul>
+<li>acquire
+: <a class="el" href="a00383.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">tbb</a><li>full_fence
+: <a class="el" href="a00383.html#a8686246bb5d3664bd07563749970fef07b959f69a4f70d821c67b85316803ff">tbb</a><li>relaxed
+: <a class="el" href="a00383.html#a8686246bb5d3664bd07563749970fefaba4b1574646947f1b519188a93c1900">tbb</a><li>release
+: <a class="el" href="a00383.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">tbb</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/namespacemembers_func.html b/doc/html/namespacemembers_func.html
index 022da27..056f2b6 100644
--- a/doc/html/namespacemembers_func.html
+++ b/doc/html/namespacemembers_func.html
@@ -32,20 +32,19 @@
<p>
<ul>
<li>__TBB_DECL_ATOMIC_ALT()
-: <a class="el" href="a00362.html#ad165cf61abbe349d413df2589679add">tbb</a><li>assertion_failure()
-: <a class="el" href="a00362.html#3d1252787be39b4aef311f1cadaff9e8">tbb</a><li>atomic_fence()
-: <a class="el" href="a00362.html#250275615f10d5b5de6ad466ae2f54de">tbb</a><li>make_edge()
-: <a class="el" href="a00362.html#0a5a2559e7d28a9bf8f9e5e60d745e86">tbb</a><li>make_edges()
-: <a class="el" href="a00362.html#9368d2f689961f790bf7aa4a8cc1135e">tbb</a><li>parallel_do()
-: <a class="el" href="a00371.html#g2617dc9b88b3285a7212599d49f74228">tbb</a><li>parallel_for()
-: <a class="el" href="a00370.html#490399525b1e690ec31d6db964c6b272">tbb::strict_ppl</a>, <a class="el" href="a00371.html#g04b4696b67370c01353ff5974c8f1196">tbb</a><li>parallel_for_each()
-: <a class="el" href="a00371.html#gc2d710ca573f0a9bd94379cba3772def">tbb</a><li>parallel_invoke()
-: <a class="el" href="a00371.html#gd3e2998f171494f94c2103f4eb924084">tbb</a><li>parallel_reduce()
-: <a class="el" href="a00371.html#g496bd7eadb3b97495ccb5655ef90319e">tbb</a><li>parallel_scan()
-: <a class="el" href="a00371.html#g62fde400a37bbca1a2fddc8e3d22f556">tbb</a><li>parallel_sort()
-: <a class="el" href="a00371.html#gc7576f82fdedc8a701a6c17ad9415926">tbb</a><li>set_assertion_handler()
-: <a class="el" href="a00362.html#823fa1c15dd829d1d9167157450ddcd9">tbb</a><li>TBB_runtime_interface_version()
-: <a class="el" href="a00362.html#a6858b22e90041c9c4669674ff39b056">tbb</a></ul>
+: <a class="el" href="a00383.html#ad165cf61abbe349d413df2589679add">tbb</a><li>assertion_failure()
+: <a class="el" href="a00383.html#3d1252787be39b4aef311f1cadaff9e8">tbb</a><li>atomic_fence()
+: <a class="el" href="a00383.html#250275615f10d5b5de6ad466ae2f54de">tbb</a><li>parallel_deterministic_reduce()
+: <a class="el" href="a00395.html#g0a66bc67567b2d01d709b59b9bddf84a">tbb</a><li>parallel_do()
+: <a class="el" href="a00395.html#g2617dc9b88b3285a7212599d49f74228">tbb</a><li>parallel_for()
+: <a class="el" href="a00395.html#g04b4696b67370c01353ff5974c8f1196">tbb</a><li>parallel_for_each()
+: <a class="el" href="a00395.html#gc2d710ca573f0a9bd94379cba3772def">tbb</a><li>parallel_invoke()
+: <a class="el" href="a00395.html#gd3e2998f171494f94c2103f4eb924084">tbb</a><li>parallel_reduce()
+: <a class="el" href="a00395.html#g496bd7eadb3b97495ccb5655ef90319e">tbb</a><li>parallel_scan()
+: <a class="el" href="a00395.html#g62fde400a37bbca1a2fddc8e3d22f556">tbb</a><li>parallel_sort()
+: <a class="el" href="a00395.html#gc7576f82fdedc8a701a6c17ad9415926">tbb</a><li>set_assertion_handler()
+: <a class="el" href="a00383.html#823fa1c15dd829d1d9167157450ddcd9">tbb</a><li>TBB_runtime_interface_version()
+: <a class="el" href="a00383.html#a6858b22e90041c9c4669674ff39b056">tbb</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/namespacemembers_type.html b/doc/html/namespacemembers_type.html
index fe239ae..65280f2 100644
--- a/doc/html/namespacemembers_type.html
+++ b/doc/html/namespacemembers_type.html
@@ -32,7 +32,7 @@
<p>
<ul>
<li>assertion_handler_type
-: <a class="el" href="a00362.html#ed375248ff6019a70ca0f9da528e5d0b">tbb</a></ul>
+: <a class="el" href="a00383.html#ed375248ff6019a70ca0f9da528e5d0b">tbb</a></ul>
<hr>
<p></p>
Copyright © 2005-2011 Intel Corporation. All Rights Reserved.
diff --git a/doc/html/namespaces.html b/doc/html/namespaces.html
index eb030d5..c3cca49 100644
--- a/doc/html/namespaces.html
+++ b/doc/html/namespaces.html
@@ -20,8 +20,7 @@
<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="a00362.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="a00370.html">tbb::strict_ppl</a></td><td class="indexvalue">For internal use only </td></tr>
+ <tr><td class="indexkey"><a class="el" href="a00383.html">tbb</a></td><td class="indexvalue">The namespace tbb contains all components of the library </td></tr>
</table>
<hr>
<p></p>
diff --git a/examples/GettingStarted/index.html b/examples/GettingStarted/index.html
index bf756eb..dff3353 100644
--- a/examples/GettingStarted/index.html
+++ b/examples/GettingStarted/index.html
@@ -14,10 +14,9 @@ This directory contains the examples referenced by the Threading Building Blocks
<A HREF="../index.html">Up to parent directory</A>
<p></p>
Copyright © 2005-2011 Intel Corporation. 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>
+Intel is a registered trademark or trademark 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.
</BODY>
diff --git a/examples/GettingStarted/sub_string_finder/Makefile b/examples/GettingStarted/sub_string_finder/Makefile
index 83e220b..6fdc52b 100644
--- a/examples/GettingStarted/sub_string_finder/Makefile
+++ b/examples/GettingStarted/sub_string_finder/Makefile
@@ -27,12 +27,17 @@
# GNU Makefile that builds and runs example.
PROG=sub_string_finder_extended
ARGS=
+LIGHT_PROG=sub_string_finder
# The C++ compiler
ifneq (,$(shell which icc 2>/dev/null))
CXX=icc
endif # icc
+ifeq ($(shell uname), Linux)
+LIBS+= -lrt
+endif
+
all: release test
release: *.cpp
@@ -50,3 +55,6 @@ clean:
test:
./$(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 f0719d6..d379d4e 100644
--- a/examples/GettingStarted/sub_string_finder/Makefile.windows
+++ b/examples/GettingStarted/sub_string_finder/Makefile.windows
@@ -27,6 +27,7 @@
# Common Makefile that builds and runs examples.
PROG=sub_string_finder_extended
ARGS=
+LIGHT_PROG=sub_string_finder
# The C++ compiler options
# Trying to find if icl.exe is set
@@ -50,6 +51,8 @@ clean:
@cmd.exe /C del sub_string_finder*.exe *.obj *.?db *.manifest
test:
$(PROG) $(ARGS)
+light_test:
+ $(LIGHT_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
diff --git a/examples/GettingStarted/sub_string_finder/index.html b/examples/GettingStarted/sub_string_finder/index.html
index 8dc50f2..17acf9e 100644
--- a/examples/GettingStarted/sub_string_finder/index.html
+++ b/examples/GettingStarted/sub_string_finder/index.html
@@ -51,10 +51,9 @@ General build directions can be found <A HREF=../../index.html#build>here</A>.
<A HREF="../index.html">Up to parent directory</A>
<p></p>
Copyright © 2005-2011 Intel Corporation. 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>
+Intel is a registered trademark or trademark 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.
</BODY>
diff --git a/examples/GettingStarted/sub_string_finder/msvs/sub_string_finder.vcproj b/examples/GettingStarted/sub_string_finder/msvs/sub_string_finder.vcproj
index 8e20b66..97cc62e 100644
--- a/examples/GettingStarted/sub_string_finder/msvs/sub_string_finder.vcproj
+++ b/examples/GettingStarted/sub_string_finder/msvs/sub_string_finder.vcproj
@@ -43,7 +43,7 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
RuntimeLibrary="3"
UsePrecompiledHeader="0"
@@ -63,7 +63,7 @@
Name="VCLinkerTool"
AdditionalDependencies="tbb_debug.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+ 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"
@@ -93,7 +93,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 debug "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 debug "$(OutDir)""
/>
</Configuration>
<Configuration
@@ -122,7 +122,7 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
RuntimeLibrary="3"
UsePrecompiledHeader="0"
@@ -141,7 +141,7 @@
Name="VCLinkerTool"
AdditionalDependencies="tbb_debug.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+ 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"
@@ -171,7 +171,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 debug "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 debug "$(OutDir)""
/>
</Configuration>
<Configuration
@@ -198,7 +198,7 @@
/>
<Tool
Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
RuntimeLibrary="2"
UsePrecompiledHeader="0"
@@ -218,7 +218,7 @@
Name="VCLinkerTool"
AdditionalDependencies="tbb.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+ 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"
@@ -250,7 +250,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 release "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 release "$(OutDir)""
/>
</Configuration>
<Configuration
@@ -278,7 +278,7 @@
/>
<Tool
Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="WIN64;NDEBUG;_CONSOLE"
RuntimeLibrary="2"
UsePrecompiledHeader="0"
@@ -297,7 +297,7 @@
Name="VCLinkerTool"
AdditionalDependencies="tbb.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+ 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"
@@ -329,7 +329,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 release "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 release "$(OutDir)""
/>
</Configuration>
</Configurations>
diff --git a/examples/GettingStarted/sub_string_finder/msvs/sub_string_finder_extended.vcproj b/examples/GettingStarted/sub_string_finder/msvs/sub_string_finder_extended.vcproj
index 8eb1b8d..05175b2 100644
--- a/examples/GettingStarted/sub_string_finder/msvs/sub_string_finder_extended.vcproj
+++ b/examples/GettingStarted/sub_string_finder/msvs/sub_string_finder_extended.vcproj
@@ -43,7 +43,7 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
RuntimeLibrary="3"
UsePrecompiledHeader="0"
@@ -63,7 +63,7 @@
Name="VCLinkerTool"
AdditionalDependencies="tbb_debug.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+ 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"
@@ -93,7 +93,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 debug "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 debug "$(OutDir)""
/>
</Configuration>
<Configuration
@@ -122,7 +122,7 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
RuntimeLibrary="3"
UsePrecompiledHeader="0"
@@ -141,7 +141,7 @@
Name="VCLinkerTool"
AdditionalDependencies="tbb_debug.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+ 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"
@@ -171,7 +171,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 debug "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 debug "$(OutDir)""
/>
</Configuration>
<Configuration
@@ -198,7 +198,7 @@
/>
<Tool
Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
RuntimeLibrary="2"
UsePrecompiledHeader="0"
@@ -218,7 +218,7 @@
Name="VCLinkerTool"
AdditionalDependencies="tbb.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+ 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"
@@ -250,7 +250,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 release "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 release "$(OutDir)""
/>
</Configuration>
<Configuration
@@ -278,7 +278,7 @@
/>
<Tool
Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="WIN64;NDEBUG;_CONSOLE"
RuntimeLibrary="2"
UsePrecompiledHeader="0"
@@ -297,7 +297,7 @@
Name="VCLinkerTool"
AdditionalDependencies="tbb.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+ 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"
@@ -329,7 +329,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 release "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 release "$(OutDir)""
/>
</Configuration>
</Configurations>
diff --git a/examples/GettingStarted/sub_string_finder/msvs/sub_string_finder_pretty.vcproj b/examples/GettingStarted/sub_string_finder/msvs/sub_string_finder_pretty.vcproj
index cff384d..527a11b 100644
--- a/examples/GettingStarted/sub_string_finder/msvs/sub_string_finder_pretty.vcproj
+++ b/examples/GettingStarted/sub_string_finder/msvs/sub_string_finder_pretty.vcproj
@@ -43,7 +43,7 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
RuntimeLibrary="3"
UsePrecompiledHeader="0"
@@ -63,7 +63,7 @@
Name="VCLinkerTool"
AdditionalDependencies="tbb_debug.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+ 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"
@@ -93,7 +93,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 debug "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 debug "$(OutDir)""
/>
</Configuration>
<Configuration
@@ -122,7 +122,7 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
RuntimeLibrary="3"
UsePrecompiledHeader="0"
@@ -141,7 +141,7 @@
Name="VCLinkerTool"
AdditionalDependencies="tbb_debug.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+ 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"
@@ -171,7 +171,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 debug "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 debug "$(OutDir)""
/>
</Configuration>
<Configuration
@@ -198,7 +198,7 @@
/>
<Tool
Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
RuntimeLibrary="2"
UsePrecompiledHeader="0"
@@ -218,7 +218,7 @@
Name="VCLinkerTool"
AdditionalDependencies="tbb.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+ 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"
@@ -250,7 +250,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 release "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 release "$(OutDir)""
/>
</Configuration>
<Configuration
@@ -278,7 +278,7 @@
/>
<Tool
Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="WIN64;NDEBUG;_CONSOLE"
RuntimeLibrary="2"
UsePrecompiledHeader="0"
@@ -297,7 +297,7 @@
Name="VCLinkerTool"
AdditionalDependencies="tbb.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+ 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"
@@ -329,7 +329,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 release "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 release "$(OutDir)""
/>
</Configuration>
</Configurations>
diff --git a/examples/GettingStarted/sub_string_finder/xcode/sub_string_finder.xcodeproj/project.pbxproj b/examples/GettingStarted/sub_string_finder/xcode/sub_string_finder.xcodeproj/project.pbxproj
index e487e98..9e28b39 100644
--- a/examples/GettingStarted/sub_string_finder/xcode/sub_string_finder.xcodeproj/project.pbxproj
+++ b/examples/GettingStarted/sub_string_finder/xcode/sub_string_finder.xcodeproj/project.pbxproj
@@ -3,7 +3,7 @@
archiveVersion = 1;
classes = {
};
- objectVersion = 42;
+ objectVersion = 46;
objects = {
/* Begin PBXBuildFile section */
@@ -187,9 +187,16 @@
/* Begin PBXProject section */
08FB7793FE84155DC02AAC07 /* Project object */ = {
isa = PBXProject;
+ attributes = {
+ LastUpgradeCheck = 0410;
+ };
buildConfigurationList = 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "sub_string_finder" */;
- compatibilityVersion = "Xcode 2.4";
+ compatibilityVersion = "Xcode 3.2";
+ developmentRegion = English;
hasScannedForEncodings = 1;
+ knownRegions = (
+ en,
+ );
mainGroup = 08FB7794FE84155DC02AAC07 /* sub_string_finder */;
projectDirPath = "";
projectRoot = "";
@@ -234,14 +241,13 @@
buildSettings = {
COPY_PHASE_STRIP = NO;
GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
GCC_OPTIMIZATION_LEVEL = 0;
- GCC_VERSION = 4.0;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
HEADER_SEARCH_PATHS = ../../../../include;
INSTALL_PATH = "$(HOME)/bin";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
- "../../../../lib",
+ ../../../../lib,
);
PRODUCT_NAME = sub_string_finder;
ZERO_LINK = NO;
@@ -252,12 +258,12 @@
isa = XCBuildConfiguration;
buildSettings = {
GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
- GCC_VERSION = 4.0;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
HEADER_SEARCH_PATHS = ../../../../include;
INSTALL_PATH = "$(HOME)/bin";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
- "../../../../lib",
+ ../../../../lib,
);
PRODUCT_NAME = sub_string_finder;
ZERO_LINK = NO;
@@ -274,7 +280,6 @@
GCC_VERSION = 4.0;
GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
- PREBINDING = NO;
PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
SYMROOT = "/tmp/tbb-$(USER)";
};
@@ -290,7 +295,6 @@
GCC_VERSION = 4.0;
GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
- PREBINDING = NO;
PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
SYMROOT = "/tmp/tbb-$(USER)";
};
@@ -299,18 +303,16 @@
A1F593C60B8F0E6E00073279 /* Debug64 */ = {
isa = XCBuildConfiguration;
buildSettings = {
- ARCHS = "$(ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1)";
- ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1 = x86_64;
+ ARCHS = "$(ARCHS_STANDARD_64_BIT)";
COPY_PHASE_STRIP = NO;
GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
GCC_OPTIMIZATION_LEVEL = 0;
- GCC_VERSION = 4.0;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
HEADER_SEARCH_PATHS = ../../../../include;
INSTALL_PATH = "$(HOME)/bin";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
- "../../../../lib",
+ ../../../../lib,
);
PRODUCT_NAME = sub_string_finder;
ZERO_LINK = NO;
@@ -320,15 +322,14 @@
A1F593C70B8F0E6E00073279 /* Release64 */ = {
isa = XCBuildConfiguration;
buildSettings = {
- ARCHS = "$(ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1)";
- ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1 = x86_64;
+ ARCHS = "$(ARCHS_STANDARD_64_BIT)";
GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
- GCC_VERSION = 4.0;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
HEADER_SEARCH_PATHS = ../../../../include;
INSTALL_PATH = "$(HOME)/bin";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
- "../../../../lib",
+ ../../../../lib,
);
PRODUCT_NAME = sub_string_finder;
ZERO_LINK = NO;
@@ -350,7 +351,6 @@
"-m64",
);
OTHER_LDFLAGS = "-m64";
- PREBINDING = NO;
PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
SYMROOT = "/tmp/tbb-$(USER)";
};
@@ -371,7 +371,6 @@
"-m64",
);
OTHER_LDFLAGS = "-m64";
- PREBINDING = NO;
PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
SYMROOT = "/tmp/tbb-$(USER)";
};
@@ -382,17 +381,15 @@
buildSettings = {
COPY_PHASE_STRIP = NO;
GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
GCC_GENERATE_DEBUGGING_SYMBOLS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
- GCC_VERSION = 4.0;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
HEADER_SEARCH_PATHS = ../../../../include;
INSTALL_PATH = "$(HOME)/bin";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
- "../../../../lib",
+ ../../../../lib,
);
- PREBINDING = NO;
PRODUCT_NAME = sub_string_finder_pretty;
ZERO_LINK = NO;
};
@@ -401,20 +398,17 @@
A1F5940E0B8F1DB600073279 /* Debug64 */ = {
isa = XCBuildConfiguration;
buildSettings = {
- ARCHS = "$(ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1)";
- ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1 = x86_64;
+ ARCHS = "$(ARCHS_STANDARD_64_BIT)";
COPY_PHASE_STRIP = NO;
GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
GCC_OPTIMIZATION_LEVEL = 0;
- GCC_VERSION = 4.0;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
HEADER_SEARCH_PATHS = ../../../../include;
INSTALL_PATH = "$(HOME)/bin";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
- "../../../../lib",
+ ../../../../lib,
);
- PREBINDING = NO;
PRODUCT_NAME = sub_string_finder_pretty;
ZERO_LINK = NO;
};
@@ -424,16 +418,14 @@
isa = XCBuildConfiguration;
buildSettings = {
COPY_PHASE_STRIP = YES;
- GCC_ENABLE_FIX_AND_CONTINUE = NO;
GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
- GCC_VERSION = 4.0;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
HEADER_SEARCH_PATHS = ../../../../include;
INSTALL_PATH = "$(HOME)/bin";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
- "../../../../lib",
+ ../../../../lib,
);
- PREBINDING = NO;
PRODUCT_NAME = sub_string_finder_pretty;
ZERO_LINK = NO;
};
@@ -442,17 +434,15 @@
A1F594100B8F1DB600073279 /* Release64 */ = {
isa = XCBuildConfiguration;
buildSettings = {
- ARCHS = "$(ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1)";
- ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1 = x86_64;
+ ARCHS = "$(ARCHS_STANDARD_64_BIT)";
GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
- GCC_VERSION = 4.0;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
HEADER_SEARCH_PATHS = ../../../../include;
INSTALL_PATH = "$(HOME)/bin";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
- "../../../../lib",
+ ../../../../lib,
);
- PREBINDING = NO;
PRODUCT_NAME = sub_string_finder_pretty;
ZERO_LINK = NO;
};
@@ -463,17 +453,15 @@
buildSettings = {
COPY_PHASE_STRIP = NO;
GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
GCC_GENERATE_DEBUGGING_SYMBOLS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
- GCC_VERSION = 4.0;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
HEADER_SEARCH_PATHS = ../../../../include;
INSTALL_PATH = "$(HOME)/bin";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
- "../../../../lib",
+ ../../../../lib,
);
- PREBINDING = NO;
PRODUCT_NAME = sub_string_finder_extended;
ZERO_LINK = NO;
};
@@ -482,20 +470,17 @@
A1F594210B8F1F4E00073279 /* Debug64 */ = {
isa = XCBuildConfiguration;
buildSettings = {
- ARCHS = "$(ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1)";
- ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1 = x86_64;
+ ARCHS = "$(ARCHS_STANDARD_64_BIT)";
COPY_PHASE_STRIP = NO;
GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
GCC_OPTIMIZATION_LEVEL = 0;
- GCC_VERSION = 4.0;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
HEADER_SEARCH_PATHS = ../../../../include;
INSTALL_PATH = "$(HOME)/bin";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
- "../../../../lib",
+ ../../../../lib,
);
- PREBINDING = NO;
PRODUCT_NAME = sub_string_finder_extended;
ZERO_LINK = NO;
};
@@ -505,16 +490,14 @@
isa = XCBuildConfiguration;
buildSettings = {
COPY_PHASE_STRIP = YES;
- GCC_ENABLE_FIX_AND_CONTINUE = NO;
GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
- GCC_VERSION = 4.0;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
HEADER_SEARCH_PATHS = ../../../../include;
INSTALL_PATH = "$(HOME)/bin";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
- "../../../../lib",
+ ../../../../lib,
);
- PREBINDING = NO;
PRODUCT_NAME = sub_string_finder_extended;
ZERO_LINK = NO;
};
@@ -523,17 +506,15 @@
A1F594230B8F1F4E00073279 /* Release64 */ = {
isa = XCBuildConfiguration;
buildSettings = {
- ARCHS = "$(ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1)";
- ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1 = x86_64;
+ ARCHS = "$(ARCHS_STANDARD_64_BIT)";
GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
- GCC_VERSION = 4.0;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
HEADER_SEARCH_PATHS = ../../../../include;
INSTALL_PATH = "$(HOME)/bin";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
- "../../../../lib",
+ ../../../../lib,
);
- PREBINDING = NO;
PRODUCT_NAME = sub_string_finder_extended;
ZERO_LINK = NO;
};
diff --git a/examples/Makefile b/examples/Makefile
index 018d5e0..d775633 100644
--- a/examples/Makefile
+++ b/examples/Makefile
@@ -41,7 +41,7 @@ include ../build/common.inc
ifeq ($(filter /% $(SLASH)%, $(subst :, ,$(tbb_root)) ),)
# also changes related variables like work_dir
override tbb_root := $(CWD)$(SLASH)..
- export TBB30_INSTALL_DIR := $(tbb_root)
+ export TBBROOT := $(tbb_root)
endif
ifeq ($(tbb_os),windows)
@@ -72,7 +72,10 @@ else
ifeq ($(arch),ia64)
override CXXFLAGS += $(PIC_KEY)
endif
- ifeq ($(compiler),gcc)
+ ifeq ($(subst suncc,gcc,$(compiler)),gcc)
+ ifeq ($(compiler),suncc)
+ override CXXFLAGS += -I$(tbb_root)$(SLASH)include -library=stlport4 -M$(tbb_root)/build/suncc.map.pause -erroff=unassigned,attrskipunsup,badargtype2w,badbinaryopw,wbadasg,wvarhidemem,wbadinit
+ endif
ifeq ($(arch),intel64)
override CXXFLAGS += -m64
endif
@@ -89,16 +92,21 @@ else
override CXXFLAGS += -mcpu=v9 -m64
endif
endif
- ifeq ($(compiler),suncc)
- override CXXFLAGS += -I$(tbb_root)$(SLASH)include -library=stlport4 -M$(tbb_root)/build/suncc.map.pause -erroff=unassigned,attrskipunsup,badargtype2w,badbinaryopw,wbadasg,wvarhidemem,wbadinit
+ ifeq ($(compiler),xl)
+ # -qsuppress=1540-0198 suppresses warnings like "1540-0198 (W) The omitted keyword "private" is assumed for base class "no_copy"."
+ # -qsuppress=1540-1401 suppresses warnings like "1540-1401 (I) An unknown "pragma ivdep" is specified."
+ override CXXFLAGS += -I$(tbb_root)$(SLASH)include -qsuppress=1540-0198:1540-1401 -L$(work_dir)_release -L$(work_dir)_debug
ifeq ($(arch),intel64)
- override CXXFLAGS += -m64
+ override CXXFLAGS += -q64
endif
ifeq ($(arch),ia32)
- override CXXFLAGS += -m32
+ override CXXFLAGS += -q32
endif
- ifeq ($(arch),sparc)
- override CXXFLAGS += -m64
+ ifeq ($(arch),ppc64)
+ override CXXFLAGS += -q64
+ endif
+ ifeq ($(arch),ppc32)
+ override CXXFLAGS += -q32
endif
endif
ifeq ($(tbb_os),macos)
@@ -111,6 +119,8 @@ else
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
endif
export LIBS
@@ -118,7 +128,7 @@ else
export CPATH := $(CPATH):$(tbb_root)/include
endif
-COMMON_TARGETS := all clean release debug test
+COMMON_TARGETS := all clean release debug test perf_build perf_run
# list of directories of examples
EXAMPLES_DIRS := $(foreach T,$(EXAMPLES),$(dir $(T)))
# targets to explicitly call example have format: {example's dir}/{example's target}
@@ -133,6 +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)"
printenv:
diff --git a/examples/common/copy_libraries.bat b/examples/common/copy_libraries.bat
index adbf1b1..eae9e25 100644
--- a/examples/common/copy_libraries.bat
+++ b/examples/common/copy_libraries.bat
@@ -36,9 +36,9 @@ if ("%2") == ("debug") set postfix=_debug
set output_dir=%3
:: Optional 4th parameter to set install root
-if ("%4") NEQ ("") set TBB30_INSTALL_DIR=%4
+if ("%4") NEQ ("") set TBBROOT=%4
:: Actually we can set install root by ourselves
-if ("%TBB30_INSTALL_DIR%") == ("") set TBB30_INSTALL_DIR=%~d0%~p0..\..\
+if ("%TBBROOT%") == ("") set TBBROOT=%~d0%~p0..\..\
:: Getting vs folders in case vc_mt binaries are not provided
if ("%VS80COMNTOOLS%") NEQ ("") set vc_dir=vc8
@@ -46,23 +46,23 @@ if ("%VS90COMNTOOLS%") NEQ ("") set vc_dir=vc9
if ("%VS100COMNTOOLS%") NEQ ("") set vc_dir=vc10
:: Are we standalone/oss or inside compiler?
-if exist "%TBB30_INSTALL_DIR%\bin\%arch%\vc8\tbb%postfix%.dll" set interim_path=bin\%arch%
-if exist "%TBB30_INSTALL_DIR%\..\redist\%arch%\tbb\vc8\tbb%postfix%.dll" set interim_path=..\redist\%arch%\tbb
+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 ("%interim_path%") == ("") goto error
:: Do we provide vc_mt binaries?
-if exist "%TBB30_INSTALL_DIR%\%interim_path%\vc_mt\tbb%postfix%.dll" set vc_dir=vc_mt
+if exist "%TBBROOT%\%interim_path%\vc_mt\tbb%postfix%.dll" set vc_dir=vc_mt
if ("%vc_dir%") == ("") goto error
:: We know everything we wanted and there are no errors
:: Copying binaries
-copy "%TBB30_INSTALL_DIR%\%interim_path%\%vc_dir%\tbb%postfix%.dll" "%output_dir%"
-copy "%TBB30_INSTALL_DIR%\%interim_path%\%vc_dir%\tbb%postfix%.pdb" "%output_dir%"
-copy "%TBB30_INSTALL_DIR%\%interim_path%\%vc_dir%\tbbmalloc%postfix%.dll" "%output_dir%"
-copy "%TBB30_INSTALL_DIR%\%interim_path%\%vc_dir%\tbbmalloc%postfix%.pdb" "%output_dir%"
-if exist "%TBB30_INSTALL_DIR%\%interim_path%\%vc_dir%\tbb_preview%postfix%.dll" copy "%TBB30_INSTALL_DIR%\%interim_path%\%vc_dir%\tbb_preview%postfix%.dll" "%output_dir%"
-if exist "%TBB30_INSTALL_DIR%\%interim_path%\%vc_dir%\tbb_preview%postfix%.pdb" copy "%TBB30_INSTALL_DIR%\%interim_path%\%vc_dir%\tbb_preview%postfix%.pdb" "%output_dir%"
+copy "%TBBROOT%\%interim_path%\%vc_dir%\tbb%postfix%.dll" "%output_dir%"
+copy "%TBBROOT%\%interim_path%\%vc_dir%\tbb%postfix%.pdb" "%output_dir%"
+copy "%TBBROOT%\%interim_path%\%vc_dir%\tbbmalloc%postfix%.dll" "%output_dir%"
+copy "%TBBROOT%\%interim_path%\%vc_dir%\tbbmalloc%postfix%.pdb" "%output_dir%"
+if exist "%TBBROOT%\%interim_path%\%vc_dir%\tbb_preview%postfix%.dll" copy "%TBBROOT%\%interim_path%\%vc_dir%\tbb_preview%postfix%.dll" "%output_dir%"
+if exist "%TBBROOT%\%interim_path%\%vc_dir%\tbb_preview%postfix%.pdb" copy "%TBBROOT%\%interim_path%\%vc_dir%\tbb_preview%postfix%.pdb" "%output_dir%"
goto end
:error
diff --git a/examples/common/gui/Makefile.gmake b/examples/common/gui/Makefile.gmake
index 4f27a11..ae40dbf 100644
--- a/examples/common/gui/Makefile.gmake
+++ b/examples/common/gui/Makefile.gmake
@@ -50,20 +50,22 @@ endif
ifeq ($(UI),x)
EXE = $(NAME)$(SUFFIX)
-CXXFLAGS += -I/usr/X11R6/include
+UI_CXXFLAGS += -I/usr/X11R6/include
LIBS += -lpthread -L/usr/X11R6/lib$(x64) -lX11
# detect if libXext can be found
ifeq ($(shell sh -c "[ -f /usr/X11R6/lib$(x64)/libXext.so -o -f /usr/lib$(x64)/libXext.so ] && echo 0"),0)
LIBS += -lXext
else # no libXext
-CXXFLAGS += -DX_NOSHMEM
+UI_CXXFLAGS += -DX_NOSHMEM
endif # libXext
else # ! X
ifeq ($(UI),mac)
-TBBLIBSPATH ?= /Library/Frameworks/TBB.framework/Libraries
-CXXFLAGS += -arch i386 -mmacosx-version-min=10.4 -msse3 -ftree-vectorize
-LIBS += -framework OpenGL -framework AGL -framework Carbon -L$(TBBLIBSPATH)
+# TODO: Replace Carbon by Cocoa, SDK10.7 does no support Carbon headers.
+UI_CXXFLAGS += -arch i386 -mmacosx-version-min=10.6 -isysroot /Developer/SDKs/MacOSX10.6.sdk
+# TODO: figure out and comment why these flags are set here (supposedly for Seismic)
+CXXFLAGS += -msse3 -ftree-vectorize
+LIBS += -framework OpenGL -framework AGL -framework Carbon
APPRES = $(NAME)$(SUFFIX).app/Contents/Resources
EXE = $(NAME)$(SUFFIX).app/Contents/MacOS/$(NAME)$(SUFFIX)
ifneq (,$(shell xcode-select -print-path 2>/dev/null))
diff --git a/examples/common/gui/macvideo.cpp b/examples/common/gui/macvideo.cpp
index 17966e2..5bbcc74 100644
--- a/examples/common/gui/macvideo.cpp
+++ b/examples/common/gui/macvideo.cpp
@@ -43,7 +43,7 @@
#include <Carbon/Carbon.h>
#include <AGL/agl.h>
#include <OpenGL/gl.h> // for OpenGL API
-#include <OpenGL/glext.h> // for OpenGL extension support
+#include <OpenGL/glext.h> // for OpenGL extension support
unsigned int * g_pImg = 0;
int g_sizex, g_sizey;
@@ -60,7 +60,7 @@ static OSStatus WindowEventHandler( EventHandlerCallRef inCaller, EventRef i
static IBNibRef sNibRef;
-//--------------------------------------------------------------------------------------------
+//--------------------------------------------------------------------------------------------
// structure for creating a fullscreen context
struct structGLInfo // storage for setup info
@@ -86,16 +86,16 @@ struct structGLWindowInfo // storage for setup info
SInt32 VRAM; // input: minimum VRAM; output: actual (if successful otherwise input)
SInt32 textureRAM; // input: amount of texture RAM required on card; output: same (used in allcoation to ensure enough texture
AGLPixelFormat fmt; // input: none; output pixel format...
- Boolean fDraggable; // input: is window going to be dragable,
+ Boolean fDraggable; // input: is window going to be draggable,
// if so renderer check (accel, VRAM, textureRAM) will look at all renderers vice just the current one
- // if window is not dragable renderer check will either check the single device or short
- // circuit to software if window spans multiple devices
+ // if window is not draggable renderer check will either check the single device or short
+ // circuit to software if window spans multiple devices
// software renderer is consider to have unlimited VRAM, unlimited textureRAM and to not be accelerated
};
typedef struct structGLWindowInfo structGLWindowInfo;
typedef struct structGLWindowInfo * pstructGLWindowInfo;
-//--------------------------------------------------------------------------------------------
+//--------------------------------------------------------------------------------------------
struct recGLCap // structure to store minimum OpenGL capabilites across all displays and GPUs
{
@@ -117,15 +117,15 @@ struct recImage // OpenGL and image information associated with each window
structGLWindowInfo glInfo; // gl info used with SetupGL to build context
AGLContext aglContext; // the OpenGL context (read: state)
GLuint fontList; // the display list storing the bitmap font created for the context to display info
-
+
Boolean fAGPTexturing; // 10.1+ only: texture from AGP memory without loading to GPU
-
+
// texture display stuff
Boolean fNPOTTextures; // are we using Non-Power Of Two (NPOT) textures?
Boolean fTileTextures; // are multiple tiled textures used to display image?
Boolean fOverlapTextures; // do tiled textures overlapped to create correct filtering between tiles? (only applies if using tiled textures)
Boolean fClientTextures; // 10.1+ only: texture from client memory
-
+
unsigned char * pImageBuffer; // image buffer that contains data for image (disposed after loading into texture if not using client textures)
long imageWidth; // height of orginal image
long imageHeight; // width of orginal image
@@ -168,7 +168,7 @@ OSStatus ResizeMoveGLWindow (WindowRef window);
// main GL drawing routine, should be valid window passed in (will setupGL if require). Draw image
void DrawGL (WindowRef window);
-pRecGLCap gpOpenGLCaps;
+pRecGLCap gpOpenGLCaps;
// prototypes (internal/private) --------------------------------------------
@@ -192,8 +192,8 @@ static long GetTextureNumFromTextureDim (long textureDimension, long maxTextureS
void ReportErrorNum (char * strError, long numError)
{
char errMsgPStr [257];
-
- errMsgPStr[0] = (char)snprintf (errMsgPStr+1, 255, "%s %ld (0x%lx)\n", strError, numError, numError);
+
+ errMsgPStr[0] = (char)snprintf (errMsgPStr+1, 255, "%s %ld (0x%lx)\n", strError, numError, numError);
// ensure we are faded in
DebugStr ( (ConstStr255Param) errMsgPStr );
@@ -204,8 +204,8 @@ void ReportErrorNum (char * strError, long numError)
void ReportError (char * strError)
{
char errMsgPStr [257];
-
- errMsgPStr[0] = (char)snprintf (errMsgPStr+1, 255, "%s\n", strError);
+
+ errMsgPStr[0] = (char)snprintf (errMsgPStr+1, 255, "%s\n", strError);
// ensure we are faded in
DebugStr ( (ConstStr255Param) errMsgPStr );
@@ -300,7 +300,7 @@ static Boolean CheckRenderer (GDHandle hGD, long* pVRAM, long* pTextureRAM, GLin
// see if we have an accelerated renderer, if so ignore non-accelerated ones
// this prevents returning info on software renderer when actually we'll get the hardware one
while (info)
- {
+ {
aglDescribeRenderer(info, AGL_ACCELERATED, &dAccel);
aglReportError ();
if (dAccel)
@@ -309,14 +309,14 @@ static Boolean CheckRenderer (GDHandle hGD, long* pVRAM, long* pTextureRAM, GLin
aglReportError ();
inum++;
}
-
+
info = head_info;
inum = 0;
while (info)
{
aglDescribeRenderer (info, AGL_ACCELERATED, &dAccel);
aglReportError ();
- // if we can accel then we will choose the accelerated renderer
+ // if we can accel then we will choose the accelerated renderer
// how about compliant renderers???
if ((canAccel && dAccel) || (!canAccel && (!fAccelMust || dAccel)))
{
@@ -350,7 +350,7 @@ static Boolean CheckRenderer (GDHandle hGD, long* pVRAM, long* pTextureRAM, GLin
//-----------------------------------------------------------------------------------------------------------------------
-// CheckAllDeviceRenderers
+// CheckAllDeviceRenderers
// looks at renderer attributes and each device must have at least one renderer that fits the profile
@@ -394,14 +394,14 @@ static Boolean CheckAllDeviceRenderers (long* pVRAM, long* pTextureRAM, GLint* p
aglReportError ();
inum++;
}
-
+
info = head_info;
inum = 0;
while (info)
- {
+ {
aglDescribeRenderer(info, AGL_ACCELERATED, &dAccel);
aglReportError ();
- // if we can accel then we will choose the accelerated renderer
+ // if we can accel then we will choose the accelerated renderer
// how about compliant renderers???
if ((canAccel && dAccel) || (!canAccel && (!fAccelMust || dAccel)))
{
@@ -428,7 +428,7 @@ static Boolean CheckAllDeviceRenderers (long* pVRAM, long* pTextureRAM, GLint* p
{
if (MinVRAM > dMaxVRAM)
MinVRAM = dMaxVRAM; // return VRAM
-
+
}
else
goodCheck = false; // one device failed thus entire requirement fails
@@ -463,7 +463,7 @@ void DumpCurrent (AGLDrawable* paglDraw, AGLContext* paglContext, pstructGLInfo
aglReportError ();
*paglContext = NULL;
}
-
+
if (pcontextInfo->fmt)
{
aglDestroyPixelFormat (pcontextInfo->fmt); // pixel format is no longer needed
@@ -488,13 +488,13 @@ static OSStatus BuildGLonWindow (WindowPtr pWindow, AGLContext* paglContext, pst
short numDevices;
GLint depthSizeSupport;
OSStatus err = noErr;
-
+
if (!pWindow || !pcontextInfo)
{
ReportError ("NULL parameter passed to BuildGLonWindow.");
return paramErr;
}
-
+
GetPort (&cgrafSave);
SetPortWindowPort(pWindow);
@@ -527,13 +527,13 @@ static OSStatus BuildGLonWindow (WindowPtr pWindow, AGLContext* paglContext, pst
ReportError ("Renderer check failed");
return err;
}
-
+
// do agl
if ((Ptr) kUnresolvedCFragSymbolAddress == (Ptr) aglChoosePixelFormat) // check for existance of OpenGL
{
ReportError ("OpenGL not installed");
return noErr;
- }
+ }
// we successfully passed the renderer check
if ((!pcontextInfo->fDraggable && (numDevices == 1))) // not draggable on a single device
@@ -541,7 +541,7 @@ static OSStatus BuildGLonWindow (WindowPtr pWindow, AGLContext* paglContext, pst
else
pcontextInfo->fmt = aglChoosePixelFormat (NULL, 0, pcontextInfo->aglAttributes); // get an appropriate pixel format
aglReportError ();
- if (NULL == pcontextInfo->fmt)
+ if (NULL == pcontextInfo->fmt)
{
ReportError("Could not find valid pixel format");
return noErr;
@@ -551,15 +551,15 @@ static OSStatus BuildGLonWindow (WindowPtr pWindow, AGLContext* paglContext, pst
if (AGL_BAD_MATCH == aglGetError())
*paglContext = aglCreateContext (pcontextInfo->fmt, 0); // unable to sahre context, create without sharing
aglReportError ();
- if (NULL == *paglContext)
+ if (NULL == *paglContext)
{
ReportError ("Could not create context");
return noErr;
}
-
+
if (!aglSetDrawable (*paglContext, GetWindowPort (pWindow))) // attach the CGrafPtr to the context
return aglReportError ();
-
+
if(!aglSetCurrentContext (*paglContext)) // make the context the current context
return aglReportError ();
@@ -580,7 +580,7 @@ static OSStatus BuildGLonWindow (WindowPtr pWindow, AGLContext* paglContext, pst
OSStatus DestroyGLFromWindow (AGLContext* paglContext, pstructGLWindowInfo pcontextInfo)
{
OSStatus err;
-
+
if ((!paglContext) || (!*paglContext))
return paramErr; // not a valid context
glFinish ();
@@ -598,7 +598,7 @@ OSStatus DestroyGLFromWindow (AGLContext* paglContext, pstructGLWindowInfo pcont
err = aglReportError ();
}
pcontextInfo->fmt = 0;
-
+
return err;
}
@@ -619,31 +619,31 @@ short FindGDHandleFromWindow (WindowPtr pWindow, GDHandle * phgdOnThisDevice)
long greatestArea, sectArea;
short numDevices = 0;
GDHandle hgdNthDevice;
-
+
if (!pWindow || !phgdOnThisDevice)
return 0;
-
+
*phgdOnThisDevice = NULL;
-
+
GetPort (&pgpSave);
SetPortWindowPort (pWindow);
-
+
GetWindowPortBounds (pWindow, &rectWind);
LocalToGlobal ((Point*)& rectWind.top); // convert to global coordinates
LocalToGlobal ((Point*)& rectWind.bottom);
hgdNthDevice = GetDeviceList ();
greatestArea = 0;
- // check window against all gdRects in gDevice list and remember
+ // check window against all gdRects in gDevice list and remember
// which gdRect contains largest area of window}
while (hgdNthDevice)
{
if (TestDeviceAttribute (hgdNthDevice, screenDevice))
if (TestDeviceAttribute (hgdNthDevice, screenActive))
{
- // The SectRect routine calculates the intersection
- // of the window rectangle and this gDevice
- // rectangle and returns TRUE if the rectangles intersect,
+ // The SectRect routine calculates the intersection
+ // of the window rectangle and this gDevice
+ // rectangle and returns TRUE if the rectangles intersect,
// FALSE if they don't.
SectRect (&rectWind, &(**hgdNthDevice).gdRect, &rectSect);
// determine which screen holds greatest window area
@@ -659,7 +659,7 @@ short FindGDHandleFromWindow (WindowPtr pWindow, GDHandle * phgdOnThisDevice)
hgdNthDevice = GetNextDevice(hgdNthDevice);
}
}
-
+
SetPort (pgpSave);
return numDevices;
}
@@ -683,7 +683,7 @@ static long GetNextTextureSize (long textureDimension, long maxTextureSize, Bool
else
{
do // while we have txture sizes check for texture value being equal or greater
- {
+ {
if (textureDimension >= targetTextureSize) // the texture dimension is greater than the target texture size (i.e., it fits)
return targetTextureSize; // return corresponding texture size
}
@@ -698,12 +698,12 @@ static long GetNextTextureSize (long textureDimension, long maxTextureSize, Bool
// requirement for power of 2 textures as the maximum texture size
// for the overlap case each texture effectively covers two less pixels so must iterate through using whole statement
-static long GetTextureNumFromTextureDim (long textureDimension, long maxTextureSize, Boolean texturesOverlap, Boolean textureRectangle)
+static long GetTextureNumFromTextureDim (long textureDimension, long maxTextureSize, Boolean texturesOverlap, Boolean textureRectangle)
{
- // start at max texture size
+ // start at max texture size
// loop through each texture size, removing textures in turn which are less than the remaining texture dimension
// each texture has 2 pixels of overlap (one on each side) thus effective texture removed is 2 less than texture size
-
+
long i = 0; // initially no textures
long bitValue = maxTextureSize; // start at max texture size
long texOverlapx2 = texturesOverlap ? 2 : 0;
@@ -717,7 +717,7 @@ static long GetTextureNumFromTextureDim (long textureDimension, long maxTextureS
textureDimension -= bitValue - texOverlapx2; // remove effective texture size
}
// add one partial texture
- i++;
+ i++;
}
else
{
@@ -734,7 +734,7 @@ static long GetTextureNumFromTextureDim (long textureDimension, long maxTextureS
ReportErrorNum ("GetTextureNumFromTextureDim error: Texture to small to draw, should not ever get here, texture size remaining:", textureDimension);
}
return i; // return textures counted
-}
+}
#pragma mark -
// ==================================
@@ -788,7 +788,7 @@ OSStatus BuildGLForWindow (WindowRef window)
pRecImage pWindowInfo = (pRecImage) GetWRefCon (window); // the info structure for the window stored in the refcon
short i; // iterator
GLenum textureTarget = GL_TEXTURE_2D;
-
+
if (!pWindowInfo->aglContext) // if we get here and do not have a context built, build one
{
GetPort (&portSave); // save current port
@@ -799,7 +799,7 @@ OSStatus BuildGLForWindow (WindowRef window)
pWindowInfo->glInfo.textureRAM = 0 * 1048576; // minimum texture RAM (if not zero this is always required)
pWindowInfo->glInfo.fDraggable = true; // is this a draggable window
pWindowInfo->glInfo.fmt = 0; // output pixel format
-
+
i = 0; // first attribute in array
pWindowInfo->glInfo.aglAttributes [i++] = AGL_RGBA; // RGB + Alpha pixels
pWindowInfo->glInfo.aglAttributes [i++] = AGL_DOUBLEBUFFER; // doble buffered context
@@ -834,23 +834,23 @@ OSStatus BuildGLForWindow (WindowRef window)
glViewport (0, 0, rectPort.right - rectPort.left, rectPort.bottom - rectPort.top); // reset viewport to entier window area
aglSetInteger (pWindowInfo->aglContext, AGL_SWAP_INTERVAL, &swap); // set swap interval to account for vbl syncing or not
-
+
// set correct texture target // if building on 10.0 or 9 this will be undefined
#ifdef GL_TEXTURE_RECTANGLE_EXT
if (pWindowInfo->fNPOTTextures)
textureTarget = GL_TEXTURE_RECTANGLE_EXT;
#endif
-
+
// Set texture mapping parameters
glEnable (textureTarget); // enable texturing
-
+
glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // set clear color buffer to dark gray
glClear (GL_COLOR_BUFFER_BIT); // clear just to color buffer
aglSwapBuffers (pWindowInfo->aglContext); // swap the cleared buffer to front
-
+
//GetFNum ("\pMonaco", &fNum); // get font number for named font
//pWindowInfo->fontList = BuildFontGL (pWindowInfo->aglContext, fNum, normal, 9); // build display list for fonts for this context (see aglString for more info)
-
+
// if we can use texture rectangle // if building on 10.0 or 9 this will be undefined
#ifdef GL_TEXTURE_RECTANGLE_EXT
if (pWindowInfo->fNPOTTextures)
@@ -861,23 +861,23 @@ OSStatus BuildGLForWindow (WindowRef window)
glPixelStorei (GL_UNPACK_ROW_LENGTH, pWindowInfo->textureWidth); // set image width in groups (pixels), accounts for border this ensures proper image alignment row to row
// get number of textures x and y
// extract the number of horiz. textures needed to tile image
- pWindowInfo->textureX = GetTextureNumFromTextureDim (pWindowInfo->textureWidth, pWindowInfo->maxTextureSize, pWindowInfo->fOverlapTextures, pWindowInfo->fNPOTTextures);
+ pWindowInfo->textureX = GetTextureNumFromTextureDim (pWindowInfo->textureWidth, pWindowInfo->maxTextureSize, pWindowInfo->fOverlapTextures, pWindowInfo->fNPOTTextures);
// extract the number of horiz. textures needed to tile image
- pWindowInfo->textureY = GetTextureNumFromTextureDim (pWindowInfo->textureHeight, pWindowInfo->maxTextureSize, pWindowInfo->fOverlapTextures, pWindowInfo->fNPOTTextures);
+ pWindowInfo->textureY = GetTextureNumFromTextureDim (pWindowInfo->textureHeight, pWindowInfo->maxTextureSize, pWindowInfo->fOverlapTextures, pWindowInfo->fNPOTTextures);
pWindowInfo->pTextureName = (GLuint *) NewPtrClear ((long) sizeof (GLuint) * pWindowInfo->textureX * pWindowInfo->textureY); // allocate storage for texture name lists
glGenTextures (pWindowInfo->textureX * pWindowInfo->textureY, pWindowInfo->pTextureName); // generate textures names need to support tiling
{
long x, y, k = 0, offsetY, offsetX = 0, currWidth, currHeight; // texture iterators, texture name iterator, image offsets for tiling, current texture width and height
for (x = 0; x < pWindowInfo->textureX; x++) // for all horizontal textures
{
- currWidth = GetNextTextureSize (pWindowInfo->textureWidth - offsetX, pWindowInfo->maxTextureSize, pWindowInfo->fNPOTTextures); // use remaining to determine next texture size
+ currWidth = GetNextTextureSize (pWindowInfo->textureWidth - offsetX, pWindowInfo->maxTextureSize, pWindowInfo->fNPOTTextures); // use remaining to determine next texture size
// (basically greatest power of 2 which fits into remaining space)
offsetY = 0; // reset vertical offest for every column
for (y = 0; y < pWindowInfo->textureY; y++) // for all vertical textures
{
// buffer pointer is at base + rows * row size + columns
- unsigned char * pBuffer = pWindowInfo->pImageBuffer +
- offsetY * pWindowInfo->textureWidth * (pWindowInfo->imageDepth >> 3) +
+ unsigned char * pBuffer = pWindowInfo->pImageBuffer +
+ offsetY * pWindowInfo->textureWidth * (pWindowInfo->imageDepth >> 3) +
offsetX * (pWindowInfo->imageDepth >> 3);
currHeight = GetNextTextureSize (pWindowInfo->textureHeight - offsetY, pWindowInfo->maxTextureSize, pWindowInfo->fNPOTTextures); // use remaining to determine next texture size
glBindTexture (textureTarget, pWindowInfo->pTextureName[k++]);
@@ -887,7 +887,7 @@ OSStatus BuildGLForWindow (WindowRef window)
}
else
glTexParameterf (textureTarget, GL_TEXTURE_PRIORITY, 1.0f);
-
+
#ifdef GL_UNPACK_CLIENT_STORAGE_APPLE
if (pWindowInfo->fClientTextures)
glPixelStorei (GL_UNPACK_CLIENT_STORAGE_APPLE, 1);
@@ -900,14 +900,14 @@ OSStatus BuildGLForWindow (WindowRef window)
glTexParameteri (textureTarget, GL_TEXTURE_WRAP_S, gpOpenGLCaps->edgeClampParam);
glTexParameteri (textureTarget, GL_TEXTURE_WRAP_T, gpOpenGLCaps->edgeClampParam);
glReportError (); // report any errors so far
- glTexImage2D (textureTarget, 0, GL_RGBA, currWidth, currHeight, 0,
- GL_BGRA_EXT, pWindowInfo->imageDepth == 32 ? GL_UNSIGNED_INT_8_8_8_8_REV : GL_UNSIGNED_SHORT_1_5_5_5_REV,
+ glTexImage2D (textureTarget, 0, GL_RGBA, currWidth, currHeight, 0,
+ GL_BGRA_EXT, pWindowInfo->imageDepth == 32 ? GL_UNSIGNED_INT_8_8_8_8_REV : GL_UNSIGNED_SHORT_1_5_5_5_REV,
pBuffer); // texture with current width and height at pBuffer location in image buffer with image size as GL_UNPACK_ROW_LENGTH
glReportError (); // report any errors
- offsetY += currHeight - 2 * pWindowInfo->fOverlapTextures; // offset in for the amount of texture used,
+ offsetY += currHeight - 2 * pWindowInfo->fOverlapTextures; // offset in for the amount of texture used,
// since we are overlapping the effective texture used is 2 texels less than texture width
}
- offsetX += currWidth - 2 * pWindowInfo->fOverlapTextures; // offset in for the amount of texture used,
+ offsetX += currWidth - 2 * pWindowInfo->fOverlapTextures; // offset in for the amount of texture used,
// since we are overlapping the effective texture used is 2 texels less than texture width
}
}
@@ -945,7 +945,7 @@ OSStatus ResizeMoveGLWindow (WindowRef window)
}
else
err = paramErr; // bad window
- return err; // return any error
+ return err; // return any error
}
// ---------------------------------
@@ -955,12 +955,12 @@ OSStatus ResizeMoveGLWindow (WindowRef window)
void DrawGL (WindowRef window)
{
Rect rectPort; // rectangle for port
- pRecImage pWindowInfo; // the gl info for the target window
+ pRecImage pWindowInfo; // the gl info for the target window
long width, height; // width and height or the port and the row of the raster position
long effectiveTextureMod = 0; // texture size modification (inset) to account for borders
long x, y, k = 0, offsetY, offsetX = 0, currTextureWidth, currTextureHeight;
GLenum textureTarget = GL_TEXTURE_2D;
-
+
if (NULL == window) // if we do not have a window
return; // drop out
pWindowInfo = (pRecImage) GetWRefCon (window); // get the gl info for the window
@@ -970,7 +970,7 @@ void DrawGL (WindowRef window)
BuildGLForWindow (window);
if (NULL == pWindowInfo->aglContext) // if we still don't have one then drop out
return;
-
+
if (pWindowInfo->fOverlapTextures)
effectiveTextureMod = 2; // if we overlap then we need to inset the textures passed to the drawing code
// set texture target
@@ -986,19 +986,19 @@ void DrawGL (WindowRef window)
width = rectPort.right - rectPort.left; // find width
height = rectPort.bottom - rectPort.top; // and height
glViewport (0, 0, width, height); // set the viewport to cover entire window
-
+
glMatrixMode (GL_PROJECTION); // set projection matrix
glLoadIdentity (); // to indetity
glMatrixMode (GL_MODELVIEW); // set modelview matrix
glLoadIdentity (); // to identity
glReportError (); // report any GL errors so far
-
+
// set the model view matrix for an orthographic view scaled to one screen pixel equal image pixel (independent of image zoom)
glScalef (2.0f / width, -2.0f / height, 1.0f); // scale to port per pixel scale
//glTranslatef (pWindowInfo->centerX, pWindowInfo->centerY, 0.0f); // translate for image movement
//glRotatef (0.0f, 0.0f, 0.0f, 1.0f); // ratate matrix for image rotation
glReportError (); // report any GL errors
-
+
glClear (GL_COLOR_BUFFER_BIT); // clear the color buffer before drawing
// draw image
@@ -1054,7 +1054,7 @@ void DrawGL (WindowRef window)
else
endYTexCoord = 1.0f - 2.0f * startYTexCoord; // for the last texture in odd size images there are two texels of padding so step in 2
}
-
+
glBegin (GL_TRIANGLE_STRIP); // draw either tri strips of line strips
glTexCoord2f (startXTexCoord, startYTexCoord); // draw upper left in world coordinates
glVertex3d (startXDraw, startYDraw, 0.0);
@@ -1068,7 +1068,7 @@ void DrawGL (WindowRef window)
glTexCoord2f (endXTexCoord, endYTexCoord); // draw lower right in world coordinates
glVertex3d (endXDraw, endYDraw, 0.0);
glEnd();
-
+
}
//////////////////////
@@ -1081,7 +1081,7 @@ void DrawGL (WindowRef window)
glReportError (); // report any errors
glDisable (textureTarget); // done with texturing
-
+
aglSwapBuffers (pWindowInfo->aglContext);
}
@@ -1089,13 +1089,13 @@ void DrawGL (WindowRef window)
static void FindMinimumOpenGLCapabilities (pRecGLCap pOpenGLCaps)
{
- WindowPtr pWin = NULL;
+ WindowPtr pWin = NULL;
Rect rectWin = {0, 0, 10, 10};
GLint attrib[] = { AGL_RGBA, AGL_NONE };
AGLPixelFormat fmt = NULL;
AGLContext ctx = NULL;
GLint deviceMaxTextureSize = 0, NPOTDMaxTextureSize = 0;
-
+
if (NULL != gpOpenGLCaps)
{
// init desired caps to max values
@@ -1110,7 +1110,7 @@ static void FindMinimumOpenGLCapabilities (pRecGLCap pOpenGLCaps)
// build window
pWin = NewCWindow (0L, &rectWin, NULL, false,
plainDBox, (WindowPtr) -1L, true, 0L);
-
+
// build context
fmt = aglChoosePixelFormat(NULL, 0, attrib);
if (fmt)
@@ -1118,10 +1118,10 @@ static void FindMinimumOpenGLCapabilities (pRecGLCap pOpenGLCaps)
if (ctx)
{
GDHandle hgdNthDevice;
-
+
aglSetDrawable(ctx, GetWindowPort (pWin));
aglSetCurrentContext(ctx);
-
+
// for each display
hgdNthDevice = GetDeviceList ();
while (hgdNthDevice)
@@ -1132,7 +1132,7 @@ static void FindMinimumOpenGLCapabilities (pRecGLCap pOpenGLCaps)
// move window to display
MoveWindow (pWin, (**hgdNthDevice).gdRect.left + 5, (**hgdNthDevice).gdRect.top + 5, false);
aglUpdateContext(ctx);
-
+
// for each cap (this can obviously be expanded)
// if this driver/GPU/display is less capable
// save this minimum capability
@@ -1141,26 +1141,26 @@ static void FindMinimumOpenGLCapabilities (pRecGLCap pOpenGLCaps)
enum { kShortVersionLength = 32 };
const GLubyte * strVersion = glGetString (GL_VERSION); // get version string
const GLubyte * strExtension = glGetString (GL_EXTENSIONS); // get extension string
-
+
// get just the non-vendor specific part of version string
GLubyte strShortVersion [kShortVersionLength];
short i = 0;
while ((((strVersion[i] <= '9') && (strVersion[i] >= '0')) || (strVersion[i] == '.')) && (i < kShortVersionLength)) // get only basic version info (until first space)
strShortVersion [i] = strVersion[i++];
strShortVersion [i] = 0; //truncate string
-
+
// compare capabilities based on extension string and GL version
- pOpenGLCaps->f_ext_texture_rectangle =
+ pOpenGLCaps->f_ext_texture_rectangle =
pOpenGLCaps->f_ext_texture_rectangle && (NULL != strstr ((const char *) strExtension, "GL_EXT_texture_rectangle"));
- pOpenGLCaps->f_ext_client_storage =
+ pOpenGLCaps->f_ext_client_storage =
pOpenGLCaps->f_ext_client_storage && (NULL != strstr ((const char *) strExtension, "GL_APPLE_client_storage"));
- pOpenGLCaps->f_ext_packed_pixel =
+ pOpenGLCaps->f_ext_packed_pixel =
pOpenGLCaps->f_ext_packed_pixel && (NULL != strstr ((const char *) strExtension, "GL_APPLE_packed_pixel"));
- pOpenGLCaps->f_ext_texture_edge_clamp =
+ pOpenGLCaps->f_ext_texture_edge_clamp =
pOpenGLCaps->f_ext_texture_edge_clamp && (NULL != strstr ((const char *) strExtension, "GL_SGIS_texture_edge_clamp"));
- pOpenGLCaps->f_gl_texture_edge_clamp =
+ pOpenGLCaps->f_gl_texture_edge_clamp =
pOpenGLCaps->f_gl_texture_edge_clamp && (!strstr ((const char *) strShortVersion, "1.0") && !strstr ((const char *) strShortVersion, "1.1")); // if not 1.0 and not 1.1 must be 1.2 or greater
-
+
// get device max texture size
glGetIntegerv (GL_MAX_TEXTURE_SIZE, &deviceMaxTextureSize);
if (deviceMaxTextureSize < pOpenGLCaps->maxTextureSize)
@@ -1190,7 +1190,7 @@ static void FindMinimumOpenGLCapabilities (pRecGLCap pOpenGLCaps)
pOpenGLCaps->f_gl_texture_edge_clamp = false;
pOpenGLCaps->maxTextureSize = 0;
}
-
+
// set clamp param based on retrieved capabilities
if (pOpenGLCaps->f_gl_texture_edge_clamp) // if OpenGL 1.2 or later and texture edge clamp is supported natively
pOpenGLCaps->edgeClampParam = GL_CLAMP_TO_EDGE; // use 1.2+ constant to clamp texture coords so as to not sample the border color
@@ -1260,7 +1260,7 @@ WindowEventHandler( EventHandlerCallRef inCaller, EventRef inEvent, void* inRefc
err = ResizeMoveGLWindow (window);
}
}
-
+
return err;
}
//--------------------------------------------------------------------------------------------
@@ -1291,13 +1291,13 @@ WindowRef HandleNew()
FindMinimumOpenGLCapabilities (gpOpenGLCaps);
}
- // Create a window. "MainWindow" is the name of the window object. This name is set in
+ // Create a window. "MainWindow" is the name of the window object. This name is set in
// InterfaceBuilder when the nib is created.
err = CreateWindowFromNib( sNibRef, CFSTR("MainWindow"), &window );
require_noerr( err, CantCreateWindow );
// We don't need the nib reference anymore.
DisposeNibReference(sNibRef);
-
+
pWindowInfo = (recImage *) NewPtrClear (sizeof (recImage));
pWindowInfo->textureWidth = pWindowInfo->imageWidth = g_sizex;
pWindowInfo->textureHeight = pWindowInfo->imageHeight = g_sizey;
@@ -1329,11 +1329,11 @@ WindowRef HandleNew()
// Position new windows in a staggered arrangement on the main screen
RepositionWindow( window, NULL, kWindowCascadeOnMainScreen );
-
+
// The window was created hidden, so show it
ShowWindow( window );
return window;
-
+
CantCreateWindow:
return 0;
}
@@ -1385,7 +1385,7 @@ bool video::init_window(int x, int y)
InstallStandardEventHandler(GetApplicationEventTarget()); // Doesn't work?
verify_noerr( InstallApplicationEventHandler( NewEventHandlerUPP( AppEventHandler ),
GetEventTypeCount( kAppEvents ), kAppEvents, 0, NULL ) );
-
+
// Once the nib reference is created, set the menu bar. "MainMenu" is the name of the menu bar
// object. This name is set in InterfaceBuilder when the nib is created.
//err = SetMenuBarFromNib( sNibRef, CFSTR("MenuBar") );
diff --git a/examples/common/gui/video.h b/examples/common/gui/video.h
index d969c4a..5e733d0 100644
--- a/examples/common/gui/video.h
+++ b/examples/common/gui/video.h
@@ -55,11 +55,11 @@ public:
depth_t pixel_depth;
int sizex, sizey;
//! Get drawing memory
- inline void* get_address() const { return reinterpret_cast<void*>(my_address); }
+ inline char* get_address() const { return reinterpret_cast<char*>(my_address); }
//! Get drawing memory size
inline int get_size() const { return ((pixel_depth>16) ? 4:2) * sizex * sizey; }
//! Set drawing memory
- inline void set_address(void *mem) { my_address = reinterpret_cast<uintptr_t>(mem); }
+ inline void set_address(char *mem) { my_address = reinterpret_cast<uintptr_t>(mem); }
friend class drawing_area;
friend class video;
diff --git a/examples/common/index.html b/examples/common/index.html
index 11c4481..18785f5 100644
--- a/examples/common/index.html
+++ b/examples/common/index.html
@@ -30,10 +30,9 @@ This code is not intended to be used directly. It is incorporated automatically
<A HREF="../index.html">Up to parent directory</A>
<p></p>
Copyright © 2005-2011 Intel Corporation. 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>
+Intel is a registered trademark or trademark 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.
</BODY>
diff --git a/examples/common/utility/fast_random.h b/examples/common/utility/fast_random.h
new file mode 100644
index 0000000..7616455
--- /dev/null
+++ b/examples/common/utility/fast_random.h
@@ -0,0 +1,90 @@
+/*
+ Copyright 2005-2011 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 FAST_RANDOM_H_
+#define FAST_RANDOM_H_
+namespace utility{
+//------------------------------------------------------------------------
+// FastRandom
+//------------------------------------------------------------------------
+
+namespace internal{
+ size_t GetPrime ( size_t seed );
+}
+
+//! A fast random number generator.
+/** Uses linear congruential method. */
+class FastRandom {
+ size_t x, a;
+public:
+ //! Get a random number.
+ unsigned short get() {
+ return get(x);
+ }
+ //! Get a random number for the given seed; update the seed for next use.
+ unsigned short get( size_t& seed ) {
+ unsigned short r = (unsigned short)(seed>>16);
+ seed = seed*a+1;
+ return r;
+ }
+ //! Construct a random number generator.
+ FastRandom( size_t seed ) {
+ x = seed*internal::GetPrime(seed);
+ a = internal::GetPrime(x);
+ }
+};
+}
+
+namespace utility {
+namespace internal{
+//! Table of primes used by fast random-number generator (FastRandom).
+ static const unsigned Primes[] = {
+ 0x9e3779b1, 0xffe6cc59, 0x2109f6dd, 0x43977ab5,
+ 0xba5703f5, 0xb495a877, 0xe1626741, 0x79695e6b,
+ 0xbc98c09f, 0xd5bee2b3, 0x287488f9, 0x3af18231,
+ 0x9677cd4d, 0xbe3a6929, 0xadc6a877, 0xdcf0674b,
+ 0xbe4d6fe9, 0x5f15e201, 0x99afc3fd, 0xf3f16801,
+ 0xe222cfff, 0x24ba5fdb, 0x0620452d, 0x79f149e3,
+ 0xc8b93f49, 0x972702cd, 0xb07dd827, 0x6c97d5ed,
+ 0x085a3d61, 0x46eb5ea7, 0x3d9910ed, 0x2e687b5b,
+ 0x29609227, 0x6eb081f1, 0x0954c4e1, 0x9d114db9,
+ 0x542acfa9, 0xb3e6bd7b, 0x0742d917, 0xe9f3ffa7,
+ 0x54581edb, 0xf2480f45, 0x0bb9288f, 0xef1affc7,
+ 0x85fa0ca7, 0x3ccc14db, 0xe6baf34b, 0x343377f7,
+ 0x5ca19031, 0xe6d9293b, 0xf0a9f391, 0x5d2e980b,
+ 0xfc411073, 0xc3749363, 0xb892d829, 0x3549366b,
+ 0x629750ad, 0xb98294e5, 0x892d9483, 0xc235baf3,
+ 0x3d2402a3, 0x6bdef3c9, 0xbec333cd, 0x40c9520f
+ };
+ size_t GetPrime ( size_t seed ) {
+ return Primes[seed%(sizeof(Primes)/sizeof(Primes[0]))];
+ }
+}
+}
+
+#endif /* FAST_RANDOM_H_ */
diff --git a/examples/concurrent_hash_map/count_strings/Makefile b/examples/concurrent_hash_map/count_strings/Makefile
index b24a1f5..c8f698f 100644
--- a/examples/concurrent_hash_map/count_strings/Makefile
+++ b/examples/concurrent_hash_map/count_strings/Makefile
@@ -34,6 +34,10 @@ ifneq (,$(shell which icc 2>/dev/null))
CXX=icc
endif # icc
+ifeq ($(shell uname), Linux)
+LIBS+= -lrt
+endif
+
all: release test
release: *.cpp
diff --git a/examples/concurrent_hash_map/count_strings/index.html b/examples/concurrent_hash_map/count_strings/index.html
index f6a0ca1..41888b6 100644
--- a/examples/concurrent_hash_map/count_strings/index.html
+++ b/examples/concurrent_hash_map/count_strings/index.html
@@ -45,10 +45,9 @@ General build directions can be found <A HREF=../../index.html#build>here</A>.
<A HREF="../index.html">Up to parent directory</A>
<p></p>
Copyright © 2005-2011 Intel Corporation. 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>
+Intel is a registered trademark or trademark 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.
</BODY>
diff --git a/examples/concurrent_hash_map/count_strings/msvs/count_strings.vcproj b/examples/concurrent_hash_map/count_strings/msvs/count_strings.vcproj
index bef6268..6a74e2e 100644
--- a/examples/concurrent_hash_map/count_strings/msvs/count_strings.vcproj
+++ b/examples/concurrent_hash_map/count_strings/msvs/count_strings.vcproj
@@ -43,7 +43,7 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
RuntimeLibrary="3"
UsePrecompiledHeader="0"
@@ -63,7 +63,7 @@
Name="VCLinkerTool"
AdditionalDependencies="tbb_debug.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+ 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"
@@ -93,7 +93,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 debug "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 debug "$(OutDir)""
/>
</Configuration>
<Configuration
@@ -122,7 +122,7 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
RuntimeLibrary="3"
UsePrecompiledHeader="0"
@@ -141,7 +141,7 @@
Name="VCLinkerTool"
AdditionalDependencies="tbb_debug.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+ 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"
@@ -171,7 +171,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 debug "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 debug "$(OutDir)""
/>
</Configuration>
<Configuration
@@ -198,7 +198,7 @@
/>
<Tool
Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
RuntimeLibrary="2"
UsePrecompiledHeader="0"
@@ -218,7 +218,7 @@
Name="VCLinkerTool"
AdditionalDependencies="tbb.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+ 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"
@@ -250,7 +250,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 release "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 release "$(OutDir)""
/>
</Configuration>
<Configuration
@@ -278,7 +278,7 @@
/>
<Tool
Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="WIN64;NDEBUG;_CONSOLE"
RuntimeLibrary="2"
UsePrecompiledHeader="0"
@@ -297,7 +297,7 @@
Name="VCLinkerTool"
AdditionalDependencies="tbb.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+ 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"
@@ -329,7 +329,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 release "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 release "$(OutDir)""
/>
</Configuration>
</Configurations>
diff --git a/examples/concurrent_hash_map/count_strings/xcode/count_strings.xcodeproj/project.pbxproj b/examples/concurrent_hash_map/count_strings/xcode/count_strings.xcodeproj/project.pbxproj
index 339cbea..1b90bf7 100644
--- a/examples/concurrent_hash_map/count_strings/xcode/count_strings.xcodeproj/project.pbxproj
+++ b/examples/concurrent_hash_map/count_strings/xcode/count_strings.xcodeproj/project.pbxproj
@@ -3,7 +3,7 @@
archiveVersion = 1;
classes = {
};
- objectVersion = 42;
+ objectVersion = 46;
objects = {
/* Begin PBXBuildFile section */
@@ -103,9 +103,16 @@
/* Begin PBXProject section */
08FB7793FE84155DC02AAC07 /* Project object */ = {
isa = PBXProject;
+ attributes = {
+ LastUpgradeCheck = 0410;
+ };
buildConfigurationList = 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "count_strings" */;
- compatibilityVersion = "Xcode 2.4";
+ compatibilityVersion = "Xcode 3.2";
+ developmentRegion = English;
hasScannedForEncodings = 1;
+ knownRegions = (
+ en,
+ );
mainGroup = 08FB7794FE84155DC02AAC07 /* count_strings */;
projectDirPath = "";
projectRoot = "";
@@ -132,14 +139,13 @@
buildSettings = {
COPY_PHASE_STRIP = NO;
GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
GCC_OPTIMIZATION_LEVEL = 0;
- GCC_VERSION = 4.0;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
HEADER_SEARCH_PATHS = ../../../../include;
INSTALL_PATH = "$(HOME)/bin";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
- "../../../../lib",
+ ../../../../lib,
);
PRODUCT_NAME = count_strings;
ZERO_LINK = NO;
@@ -150,12 +156,12 @@
isa = XCBuildConfiguration;
buildSettings = {
GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
- GCC_VERSION = 4.0;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
HEADER_SEARCH_PATHS = ../../../../include;
INSTALL_PATH = "$(HOME)/bin";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
- "../../../../lib",
+ ../../../../lib,
);
PRODUCT_NAME = count_strings;
ZERO_LINK = NO;
@@ -172,7 +178,6 @@
GCC_VERSION = 4.0;
GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
- PREBINDING = NO;
PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
SYMROOT = "/tmp/tbb-$(USER)";
};
@@ -188,7 +193,6 @@
GCC_VERSION = 4.0;
GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
- PREBINDING = NO;
PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
SYMROOT = "/tmp/tbb-$(USER)";
};
@@ -197,18 +201,16 @@
A1F593C60B8F0E6E00073279 /* Debug64 */ = {
isa = XCBuildConfiguration;
buildSettings = {
- ARCHS = "$(ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1)";
- ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1 = x86_64;
+ ARCHS = "$(ARCHS_STANDARD_64_BIT)";
COPY_PHASE_STRIP = NO;
GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
GCC_OPTIMIZATION_LEVEL = 0;
- GCC_VERSION = 4.0;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
HEADER_SEARCH_PATHS = ../../../../include;
INSTALL_PATH = "$(HOME)/bin";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
- "../../../../lib",
+ ../../../../lib,
);
PRODUCT_NAME = count_strings;
ZERO_LINK = NO;
@@ -218,15 +220,14 @@
A1F593C70B8F0E6E00073279 /* Release64 */ = {
isa = XCBuildConfiguration;
buildSettings = {
- ARCHS = "$(ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1)";
- ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1 = x86_64;
+ ARCHS = "$(ARCHS_STANDARD_64_BIT)";
GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
- GCC_VERSION = 4.0;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
HEADER_SEARCH_PATHS = ../../../../include;
INSTALL_PATH = "$(HOME)/bin";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
- "../../../../lib",
+ ../../../../lib,
);
PRODUCT_NAME = count_strings;
ZERO_LINK = NO;
@@ -248,7 +249,6 @@
"-m64",
);
OTHER_LDFLAGS = "-m64";
- PREBINDING = NO;
PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
SYMROOT = "/tmp/tbb-$(USER)";
};
@@ -269,7 +269,6 @@
"-m64",
);
OTHER_LDFLAGS = "-m64";
- PREBINDING = NO;
PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
SYMROOT = "/tmp/tbb-$(USER)";
};
diff --git a/examples/concurrent_hash_map/index.html b/examples/concurrent_hash_map/index.html
index 8956f44..0949575 100644
--- a/examples/concurrent_hash_map/index.html
+++ b/examples/concurrent_hash_map/index.html
@@ -14,10 +14,9 @@ This directory has examples of the template <code>concurrent_hash_map</code>.
<A HREF="../index.html">Up to parent directory</A>
<p></p>
Copyright © 2005-2011 Intel Corporation. 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>
+Intel is a registered trademark or trademark 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.
</BODY>
diff --git a/examples/task_group/sudoku/Makefile b/examples/concurrent_priority_queue/shortpath/Makefile
similarity index 88%
copy from examples/task_group/sudoku/Makefile
copy to examples/concurrent_priority_queue/shortpath/Makefile
index 180d19f..a9c358a 100644
--- a/examples/task_group/sudoku/Makefile
+++ b/examples/concurrent_priority_queue/shortpath/Makefile
@@ -25,8 +25,9 @@
# the GNU General Public License.
# GNU Makefile that builds and runs example.
-PROG=sudoku
-ARGS=input1 4 0 -p
+PROG=shortpath
+ARGS=4 N=1000 start=0 end=999 verbose
+PERF_RUN_ARGS=auto N=1000 start=0 end=99 silent
# The C++ compiler
ifneq (,$(shell which icc 2>/dev/null))
@@ -36,7 +37,11 @@ ifeq ($(CXX),icc)
CXX0XFLAGS=-std=c++0x -D_TBB_CPP0X
endif # icc
-all: release test
+ifeq ($(shell uname), Linux)
+LIBS+= -lrt
+endif
+
+all: release test
release: *.cpp
$(CXX) -O2 -DNDEBUG $(CXXFLAGS) -o $(PROG) $^ -ltbb $(LIBS) $(CXX0XFLAGS)
@@ -49,3 +54,8 @@ clean:
test:
./$(PROG) $(ARGS)
+
+perf_build: release
+
+perf_run:
+ ./$(PROG) $(PERF_RUN_ARGS)
diff --git a/examples/task_group/sudoku/Makefile.windows b/examples/concurrent_priority_queue/shortpath/Makefile.windows
similarity index 93%
copy from examples/task_group/sudoku/Makefile.windows
copy to examples/concurrent_priority_queue/shortpath/Makefile.windows
index 246377f..529e930 100644
--- a/examples/task_group/sudoku/Makefile.windows
+++ b/examples/concurrent_priority_queue/shortpath/Makefile.windows
@@ -27,8 +27,9 @@
# Common Makefile that builds and runs example.
# Just specify your program basename
-PROG=sudoku
-ARGS=input1 4 2 -p
+PROG=shortpath
+ARGS=4 N=1000 start=0 end=999 verbose
+PERF_RUN_ARGS=auto N=1000 start=0 end=99 silent
# Trying to find if icl.exe is set
CXX1 = $(TBB_CXX)-
@@ -50,3 +51,8 @@ test:
$(PROG) $(ARGS)
compiler_check:
@$(CXX) >nul 2>&1 || echo "$(CXX) command not found. Check if CXX=$(CXX) is set properly"
+
+perf_build: release
+
+perf_run:
+ $(PROG) $(PERF_RUN_ARGS)
diff --git a/examples/concurrent_priority_queue/shortpath/index.html b/examples/concurrent_priority_queue/shortpath/index.html
new file mode 100644
index 0000000..a6bfdbe
--- /dev/null
+++ b/examples/concurrent_priority_queue/shortpath/index.html
@@ -0,0 +1,82 @@
+<HTML>
+<BODY>
+
+<H2>Overview</H2>
+
+This directory contains a simple example that solves the single source
+shortest path problem. It is parameterized by N, a number of nodes,
+and a start and end node in [0..N). A graph is generated with N nodes
+and some random number of connections between those nodes. A parallel
+algorithm based on A* is used to find the shortest path. This
+algorithm varies from serial A* in that it needs to add nodes back to
+the open set when the g estimate (shortest path from start to the
+node) is improved, even if the node has already been "visited". This
+is because nodes are added and removed from the open-set in parallel,
+resulting in some less optimal paths being explored. The open-set is
+implemented with the concurrent_priority_queue. Note that since we
+re-visit nodes, the f estimate (on which the priority queue is sorted)
+is not technically needed, so we could use this same parallel
+algorithm with just a concurrent_queue. However, keeping the f
+estimate and using concurrent_priority_queue results in much better
+performance. Silent mode prints run time only, regular mode prints
+shortest path length, and verbose mode prints out the shortest path.
+The generated graph follows a pattern in which the closer two pairs of
+node ids are together, the fewer hops there are in a typical path
+between those nodes. So, for example, the path between 5 and 7 likely
+has few hops whereas 14 to 78 has more and 0 to 9999 has even more,
+etc.
+
+
+<H2>Files</H2>
+<DL>
+<DT><A HREF="shortpath.cpp">shortpath.cpp</A>
+<DD>Driver.
+
+<DT><A HREF="Makefile">Makefile</A>
+<DD>Makefile for building example.
+
+</DL>
+
+<H2>Directories</H2>
+<DL>
+<DT><A HREF="msvs">msvs</A>
+<DD>Contains Microsoft* Visual Studio* 2008 workspace for building and running the example with the Intel® C++ compiler.
+<DT><A HREF="xcode">xcode</A>
+<DD>Contains Mac OS* Xcode* workspace for building and running the example.
+</DL>
+
+<H2>To Build</H2>
+General build directions can be found <A HREF=../../index.html#build>here</A>.
+<P></P>
+
+<H2>Usage</H2>
+<DL>
+
+<DT><TT>shortpath <I>-h</I></TT>
+<DD>Prints the help for command line options
+<DT><TT>shortpath [<I>#threads</I>=value] [<I>verbose</I>] [<I>silent</I>] [<I>N</I>=value] [<I>start</I>=value] [<I>end</I>=value] [<I>#threads</I>]</TT>
+<DD><I>#threads</I> is the number of threads to use; a range of the form <I>low</I>[:<I>high</I>] where low and optional high are non-negative integers, or 'auto' for the TBB default.<BR>
+ <I>verbose</I> print full path to screen<BR>
+ <I>silent</I> limits output to timing info; overrides verbose<BR>
+ <I>N</I> number of nodes in graph<BR>
+ <I>start</I> node to start path at<BR>
+ <I>end</I> node to end path at<BR>
+
+
+<DT>To run a short version of this example, e.g., for use with Intel® Parallel Inspector:
+<DD>Build a <I>debug</I> version of the example
+ (see the <A HREF=../../index.html#build>build directions</A>).
+ <BR>Run it with a small problem size and the desired number of threads, e.g., <TT>shortpath 4 N=20 start=0 end=19</TT>.
+</DL>
+
+<HR>
+<A HREF="../index.html">Up to parent directory</A>
+<p></p>
+Copyright © 2005-2011 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.
+<p></p>
+* Other names and brands may be claimed as the property of others.
+</BODY>
+</HTML>
diff --git a/examples/concurrent_priority_queue/shortpath/msvs/shortpath.icproj b/examples/concurrent_priority_queue/shortpath/msvs/shortpath.icproj
new file mode 100644
index 0000000..38334ea
--- /dev/null
+++ b/examples/concurrent_priority_queue/shortpath/msvs/shortpath.icproj
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="windows-1251"?>
+<VisualStudioProject
+ ProjectType="Intel C++ Project"
+ Version="11.1"
+ Name="shortpath"
+ ProjectGUID="{D731702C-B704-468D-9497-A75EE0521C89}"
+ VCNestedProjectGUID="{3AA40693-F93D-4D4B-B32E-068F511A252A}"
+ VCNestedProjectFileName="shortpath.vcproj">
+ <Configurations/>
+ <Files/>
+</VisualStudioProject>
diff --git a/examples/parallel_reduce/convex_hull/msvs/convex_hull_benchmark.vcproj b/examples/concurrent_priority_queue/shortpath/msvs/shortpath.vcproj
similarity index 76%
copy from examples/parallel_reduce/convex_hull/msvs/convex_hull_benchmark.vcproj
copy to examples/concurrent_priority_queue/shortpath/msvs/shortpath.vcproj
index 3f43cd2..e5463df 100644
--- a/examples/parallel_reduce/convex_hull/msvs/convex_hull_benchmark.vcproj
+++ b/examples/concurrent_priority_queue/shortpath/msvs/shortpath.vcproj
@@ -2,9 +2,9 @@
<VisualStudioProject
ProjectType="Visual C++"
Version="8,00"
- Name="convex_hull_benchmark"
+ Name="shortpath"
ProjectGUID="{3AA40693-F93D-4D4B-B32E-068F511A252A}"
- RootNamespace="convex_hull_benchmark"
+ RootNamespace="shortpath"
Keyword="Win32Proj"
>
<Platforms>
@@ -43,7 +43,7 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
RuntimeLibrary="3"
UsePrecompiledHeader="0"
@@ -63,7 +63,7 @@
Name="VCLinkerTool"
AdditionalDependencies="tbb_debug.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+ 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"
@@ -93,7 +93,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 debug "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 debug "$(OutDir)""
/>
</Configuration>
<Configuration
@@ -122,7 +122,7 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
RuntimeLibrary="3"
UsePrecompiledHeader="0"
@@ -141,7 +141,7 @@
Name="VCLinkerTool"
AdditionalDependencies="tbb_debug.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+ 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"
@@ -171,7 +171,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 debug "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 debug "$(OutDir)""
/>
</Configuration>
<Configuration
@@ -198,8 +198,7 @@
/>
<Tool
Name="VCCLCompilerTool"
- Optimization="3"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
RuntimeLibrary="2"
UsePrecompiledHeader="0"
@@ -219,7 +218,7 @@
Name="VCLinkerTool"
AdditionalDependencies="tbb.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+ 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"
@@ -251,7 +250,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 release "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 release "$(OutDir)""
/>
</Configuration>
<Configuration
@@ -279,8 +278,7 @@
/>
<Tool
Name="VCCLCompilerTool"
- Optimization="3"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="WIN64;NDEBUG;_CONSOLE"
RuntimeLibrary="2"
UsePrecompiledHeader="0"
@@ -299,7 +297,7 @@
Name="VCLinkerTool"
AdditionalDependencies="tbb.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+ 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"
@@ -331,7 +329,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 release "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 release "$(OutDir)""
/>
</Configuration>
</Configurations>
@@ -344,15 +342,7 @@
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
>
<File
- RelativePath="..\convex_hull_bench.cpp"
- >
- </File>
- </Filter>
- <Filter
- Name="Header files"
- >
- <File
- RelativePath="..\convex_hull.h"
+ RelativePath="..\shortpath.cpp"
>
</File>
</Filter>
diff --git a/examples/concurrent_priority_queue/shortpath/msvs/shortpath_cl.sln b/examples/concurrent_priority_queue/shortpath/msvs/shortpath_cl.sln
new file mode 100644
index 0000000..cf1789a
--- /dev/null
+++ b/examples/concurrent_priority_queue/shortpath/msvs/shortpath_cl.sln
@@ -0,0 +1,25 @@
+Microsoft Visual Studio Solution File, Format Version 9.00
+# Visual Studio 2005
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "shortpath", "shortpath.vcproj", "{3AA40693-F93D-4D4B-B32E-068F511A252A}"
+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
+ {3AA40693-F93D-4D4B-B32E-068F511A252A}.Debug|Win32.ActiveCfg = Debug|Win32
+ {3AA40693-F93D-4D4B-B32E-068F511A252A}.Debug|Win32.Build.0 = Debug|Win32
+ {3AA40693-F93D-4D4B-B32E-068F511A252A}.Debug|x64.ActiveCfg = Debug|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A252A}.Debug|x64.Build.0 = Debug|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A252A}.Release|Win32.ActiveCfg = Release|Win32
+ {3AA40693-F93D-4D4B-B32E-068F511A252A}.Release|Win32.Build.0 = Release|Win32
+ {3AA40693-F93D-4D4B-B32E-068F511A252A}.Release|x64.ActiveCfg = Release|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A252A}.Release|x64.Build.0 = Release|x64
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/examples/concurrent_priority_queue/shortpath/msvs/shortpath_icl.sln b/examples/concurrent_priority_queue/shortpath/msvs/shortpath_icl.sln
new file mode 100644
index 0000000..70881aa
--- /dev/null
+++ b/examples/concurrent_priority_queue/shortpath/msvs/shortpath_icl.sln
@@ -0,0 +1,33 @@
+Microsoft Visual Studio Solution File, Format Version 9.00
+# Visual Studio 2005
+Project("{EAF909A5-FA59-4C3D-9431-0FCC20D5BCF9}") = "shortpath", "shortpath.icproj", "{D731702C-B704-468D-9497-A75EE0521C89}"
+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
+ {D731702C-B704-468D-9497-A75EE0521C89}.Debug|Win32.ActiveCfg = Debug|Win32
+ {D731702C-B704-468D-9497-A75EE0521C89}.Debug|Win32.Build.0 = Debug|Win32
+ {D731702C-B704-468D-9497-A75EE0521C89}.Debug|x64.ActiveCfg = Debug|x64
+ {D731702C-B704-468D-9497-A75EE0521C89}.Debug|x64.Build.0 = Debug|x64
+ {D731702C-B704-468D-9497-A75EE0521C89}.Release|Win32.ActiveCfg = Release|Win32
+ {D731702C-B704-468D-9497-A75EE0521C89}.Release|Win32.Build.0 = Release|Win32
+ {D731702C-B704-468D-9497-A75EE0521C89}.Release|x64.ActiveCfg = Release|x64
+ {D731702C-B704-468D-9497-A75EE0521C89}.Release|x64.Build.0 = Release|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A252A}.Release|x64.Build.0 = Release|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A252A}.Release|x64.ActiveCfg = Release|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A252A}.Release|Win32.Build.0 = Release|Win32
+ {3AA40693-F93D-4D4B-B32E-068F511A252A}.Release|Win32.ActiveCfg = Release|Win32
+ {3AA40693-F93D-4D4B-B32E-068F511A252A}.Debug|x64.Build.0 = Debug|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A252A}.Debug|x64.ActiveCfg = Debug|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A252A}.Debug|Win32.Build.0 = Debug|Win32
+ {3AA40693-F93D-4D4B-B32E-068F511A252A}.Debug|Win32.ActiveCfg = Debug|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/examples/concurrent_priority_queue/shortpath/shortpath.cpp b/examples/concurrent_priority_queue/shortpath/shortpath.cpp
new file mode 100644
index 0000000..a4cd148
--- /dev/null
+++ b/examples/concurrent_priority_queue/shortpath/shortpath.cpp
@@ -0,0 +1,375 @@
+/*
+ Copyright 2005-2011 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 <cstdio>
+#include <vector>
+#include <math.h>
+#include "tbb/atomic.h"
+#include "tbb/tick_count.h"
+#include "tbb/task_scheduler_init.h"
+#include "tbb/task_group.h"
+#include "tbb/concurrent_priority_queue.h"
+#include "tbb/spin_mutex.h"
+#include "tbb/parallel_for.h"
+#include "tbb/blocked_range.h"
+#include "../../common/utility/utility.h"
+#include "../../common/utility/fast_random.h"
+
+#if defined(_MSC_VER) && defined(_Wp64)
+ // Workaround for overzealous compiler warnings in /Wp64 mode
+ #pragma warning (disable: 4267)
+#endif /* _MSC_VER && _Wp64 */
+
+#define __TBB_LAMBDAS_PRESENT ( _MSC_VER >= 1600 && !__INTEL_COMPILER || __INTEL_COMPILER > 1100 && _TBB_CPP0X )
+
+using namespace std;
+using namespace tbb;
+
+struct point {
+ double x, y;
+ point() {}
+ point(double _x, double _y) : x(_x), y(_y) {}
+ point(const point& p) : x(p.x), y(p.y) {}
+};
+
+double get_distance(const point& p1, const point& p2) {
+ double xdiff=p1.x-p2.x, ydiff=p1.y-p2.y;
+ return sqrt(xdiff*xdiff + ydiff*ydiff);
+}
+
+// generates random points on 2D plane within a box of maxsize width & height
+point generate_random_point(utility::FastRandom& mr) {
+ const size_t maxsize=500;
+ double x = (double)(mr.get() % maxsize);
+ double y = (double)(mr.get() % maxsize);
+ return point(x,y);
+}
+
+// weighted toss makes closer nodes (in the point vector) heavily connected
+bool die_toss(size_t a, size_t b, utility::FastRandom& mr) {
+ int node_diff = std::abs((int)(a-b));
+ // near nodes
+ if (node_diff < 16) return true;
+ // mid nodes
+ if (node_diff < 64) return ((int)mr.get() % 8 == 0);
+ // far nodes
+ if (node_diff < 512) return ((int)mr.get() % 16 == 0);
+ return false;
+}
+
+typedef vector<point> point_set;
+typedef size_t vertex_id;
+typedef std::pair<vertex_id,double> vertex_rec;
+typedef vector<vector<vertex_id> > edge_set;
+
+bool verbose = false; // prints bin details and other diagnostics to screen
+bool silent = false; // suppress all output except for time
+size_t N = 1000; // number of vertices
+size_t src = 0; // start of path
+size_t dst = N-1; // end of path
+double INF=100000.0; // infinity
+size_t grainsize = 16; // number of vertices per task on average
+size_t max_spawn; // max tasks to spawn
+atomic<size_t> num_spawn; // number of active tasks
+
+point_set vertices; // vertices
+edge_set edges; // edges
+vector<vertex_id> predecessor; // for recreating path from src to dst
+
+vector<double> f_distance; // estimated distances at particular vertex
+vector<double> g_distance; // current shortest distances from src vertex
+vector<spin_mutex> locks; // a lock for each vertex
+task_group *sp_group; // task group for tasks executing sub-problems
+
+class compare_f {
+public:
+ bool operator()(const vertex_rec& u, const vertex_rec& v) const {
+ return u.second>v.second;
+ }
+};
+
+concurrent_priority_queue<vertex_rec, compare_f> open_set; // tentative vertices
+
+void shortpath_helper();
+
+#if !__TBB_LAMBDAS_PRESENT
+class shortpath_helper_functor {
+public:
+ shortpath_helper_functor() {};
+ void operator() () const { shortpath_helper(); }
+};
+#endif
+
+void shortpath() {
+ g_distance[src] = 0.0; // src's distance from src is zero
+ f_distance[src] = get_distance(vertices[src], vertices[dst]); // estimate distance from src to dst
+ open_set.push(make_pair(src,f_distance[src])); // push src into open_set
+#if __TBB_LAMBDAS_PRESENT
+ sp_group->run([](){ shortpath_helper(); });
+#else
+ sp_group->run( shortpath_helper_functor() );
+#endif
+ sp_group->wait();
+}
+
+void shortpath_helper() {
+ vertex_rec u_rec;
+ while (open_set.try_pop(u_rec)) {
+ vertex_id u = u_rec.first;
+ if (u==dst) continue;
+ double f = u_rec.second;
+ double old_g_u = 0.0;
+ {
+ spin_mutex::scoped_lock l(locks[u]);
+ if (f > f_distance[u]) continue; // prune search space
+ old_g_u = g_distance[u];
+ }
+ for (size_t i=0; i<edges[u].size(); ++i) {
+ vertex_id v = edges[u][i];
+ double new_g_v = old_g_u + get_distance(vertices[u], vertices[v]);
+ double new_f_v = 0.0;
+ // the push flag lets us move some work out of the critical section below
+ bool push = false;
+ {
+ spin_mutex::scoped_lock l(locks[v]);
+ if (new_g_v < g_distance[v]) {
+ predecessor[v] = u;
+ g_distance[v] = new_g_v;
+ new_f_v = f_distance[v] = g_distance[v] + get_distance(vertices[v], vertices[dst]);
+ push = true;
+ }
+ }
+ if (push) {
+ open_set.push(make_pair(v,new_f_v));
+ size_t n_spawn = ++num_spawn;
+ if (n_spawn < max_spawn) {
+#if __TBB_LAMBDAS_PRESENT
+ sp_group->run([]{ shortpath_helper(); });
+#else
+ sp_group->run( shortpath_helper_functor() );
+#endif
+ }
+ else --num_spawn;
+ }
+ }
+ }
+ --num_spawn;
+}
+
+void make_path(vertex_id src, vertex_id dst, vector<vertex_id>& path) {
+ vertex_id at = predecessor[dst];
+ if (at == N) path.push_back(src);
+ else if (at == src) { path.push_back(src); path.push_back(dst); }
+ else { make_path(src, at, path); path.push_back(dst); }
+}
+
+void print_path() {
+ vector<vertex_id> path;
+ double path_length=0.0;
+ make_path(src, dst, path);
+ if (verbose) printf("\n ");
+ for (size_t i=0; i<path.size(); ++i) {
+ if (path[i] != dst) {
+ double seg_length = get_distance(vertices[path[i]], vertices[path[i+1]]);
+ if (verbose) printf("%6.1f ", seg_length);
+ path_length += seg_length;
+ }
+ else if (verbose) printf("\n");
+ }
+ if (verbose) {
+ for (size_t i=0; i<path.size(); ++i) {
+ if (path[i] != dst) printf("(%4d)------>", (int)path[i]);
+ else printf("(%4d)\n", (int)path[i]);
+ }
+ }
+ if (verbose) printf("Total distance = %5.1f\n", path_length);
+ else if (!silent) printf(" %5.1f\n", path_length);
+}
+
+int get_default_num_threads() {
+ static int threads = 0;
+ if (threads == 0)
+ threads = tbb::task_scheduler_init::default_num_threads();
+ return threads;
+}
+
+#if !__TBB_LAMBDAS_PRESENT
+class gen_vertices {
+public:
+ gen_vertices() {}
+ void operator() (blocked_range<size_t>& r) const {
+ utility::FastRandom my_random((unsigned int)r.begin());
+ for (size_t i=r.begin(); i!=r.end(); ++i) {
+ vertices[i] = generate_random_point(my_random);
+ }
+ }
+};
+
+class gen_edges {
+public:
+ gen_edges() {}
+ void operator() (blocked_range<size_t>& r) const {
+ utility::FastRandom my_random((unsigned int)r.begin());
+ for (size_t i=r.begin(); i!=r.end(); ++i) {
+ for (size_t j=0; j<i; ++j) {
+ if (die_toss(i, j, my_random))
+ edges[i].push_back(j);
+ }
+ }
+ }
+};
+
+class reset_vertices {
+public:
+ reset_vertices() {}
+ void operator() (blocked_range<size_t>& r) const {
+ for (size_t i=r.begin(); i!=r.end(); ++i) {
+ f_distance[i] = g_distance[i] = INF;
+ predecessor[i] = N;
+ }
+ }
+};
+#endif
+
+void InitializeGraph() {
+ sp_group = new task_group;
+ vertices.resize(N);
+ edges.resize(N);
+ predecessor.resize(N);
+ g_distance.resize(N);
+ f_distance.resize(N);
+ locks.resize(N);
+ task_scheduler_init init(get_default_num_threads());
+ if (verbose) printf("Generating vertices...\n");
+#if __TBB_LAMBDAS_PRESENT
+ parallel_for(blocked_range<size_t>(0,N,64),
+ [&](blocked_range<size_t>& r) {
+ utility::FastRandom my_random(r.begin());
+ for (size_t i=r.begin(); i!=r.end(); ++i) {
+ vertices[i] = generate_random_point(my_random);
+ }
+ }, simple_partitioner());
+#else
+ parallel_for(blocked_range<size_t>(0,N,64), gen_vertices(), simple_partitioner());
+#endif
+ if (verbose) printf("Generating edges...\n");
+#if __TBB_LAMBDAS_PRESENT
+ parallel_for(blocked_range<size_t>(0,N,64),
+ [&](blocked_range<size_t>& r) {
+ utility::FastRandom my_random(r.begin());
+ for (size_t i=r.begin(); i!=r.end(); ++i) {
+ for (size_t j=0; j<i; ++j) {
+ if (die_toss(i, j, my_random))
+ edges[i].push_back(j);
+ }
+ }
+ }, simple_partitioner());
+#else
+ parallel_for(blocked_range<size_t>(0,N,64), gen_edges(), simple_partitioner());
+#endif
+ for (size_t i=0; i<N; ++i) {
+ for (size_t j=0; j<edges[i].size(); ++j) {
+ vertex_id k = edges[i][j];
+ edges[k].push_back(i);
+ }
+ }
+ if (verbose) printf("Done.\n");
+}
+
+void ResetGraph() {
+ task_scheduler_init init(get_default_num_threads());
+#if __TBB_LAMBDAS_PRESENT
+ parallel_for(blocked_range<size_t>(0,N),
+ [&](blocked_range<size_t>& r) {
+ for (size_t i=r.begin(); i!=r.end(); ++i) {
+ f_distance[i] = g_distance[i] = INF;
+ predecessor[i] = N;
+ }
+ });
+#else
+ parallel_for(blocked_range<size_t>(0,N), reset_vertices());
+#endif
+}
+
+int main(int argc, char *argv[]) {
+ try {
+ 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")
+ .arg(verbose,"verbose"," print diagnostic output to screen")
+ .arg(silent,"silent"," limits output to timing info; overrides verbose")
+ .arg(N,"N"," number of vertices")
+ .arg(src,"start"," start of path")
+ .arg(dst,"end"," end of path")
+ );
+ if (silent) verbose = false; // make silent override verbose
+ else
+ printf("shortpath will run with %d vertices to find shortest path between vertices"
+ " %d and %d using %d:%d threads.\n",
+ (int)N, (int)src, (int)dst, (int)threads.first, (int)threads.last);
+
+ if (dst >= N) {
+ if (verbose)
+ printf("end value %d is invalid for %d vertices; correcting to %d\n", (int)dst, (int)N, (int)N-1);
+ dst = N-1;
+ }
+
+ num_spawn = 0;
+ max_spawn = N/grainsize;
+ tick_count t0, t1;
+ InitializeGraph();
+ for (int n_thr=threads.first; n_thr<=threads.last; ++n_thr) {
+ ResetGraph();
+ task_scheduler_init init(n_thr);
+ t0 = tick_count::now();
+ shortpath();
+ t1 = tick_count::now();
+ if (!silent) {
+ if (predecessor[dst] != N) {
+ printf("%d threads: [%6.6f] The shortest path from vertex %d to vertex %d is:",
+ (int)n_thr, (t1-t0).seconds(), (int)src, (int)dst);
+ print_path();
+ }
+ else {
+ printf("%d threads: [%6.6f] There is no path from vertex %d to vertex %d\n",
+ (int)n_thr, (t1-t0).seconds(), (int)src, (int)dst);
+ }
+ } else
+ utility::report_elapsed_time((t1-t0).seconds());
+ }
+ return 0;
+ } catch(std::exception& e) {
+ cerr<<"error occurred. error text is :\"" <<e.what()<<"\"\n";
+ return 1;
+ }
+}
diff --git a/examples/parallel_for/game_of_life/xcode/game_of_life.xcodeproj/project.pbxproj b/examples/concurrent_priority_queue/shortpath/xcode/shortpath.xcodeproj/project.pbxproj
similarity index 65%
copy from examples/parallel_for/game_of_life/xcode/game_of_life.xcodeproj/project.pbxproj
copy to examples/concurrent_priority_queue/shortpath/xcode/shortpath.xcodeproj/project.pbxproj
index 7eed01d..112449b 100644
--- a/examples/parallel_for/game_of_life/xcode/game_of_life.xcodeproj/project.pbxproj
+++ b/examples/concurrent_priority_queue/shortpath/xcode/shortpath.xcodeproj/project.pbxproj
@@ -3,15 +3,13 @@
archiveVersion = 1;
classes = {
};
- objectVersion = 42;
+ objectVersion = 46;
objects = {
/* Begin PBXBuildFile section */
- 612CD8DD11F573FC00A587B2 /* Game_of_life.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 612CD8DB11F573FC00A587B2 /* Game_of_life.cpp */; };
- 612CD8DE11F573FC00A587B2 /* Update_state.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 612CD8DC11F573FC00A587B2 /* Update_state.cpp */; };
- 612CD8E111F5742000A587B2 /* Evolution.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 612CD8E011F5742000A587B2 /* Evolution.cpp */; };
- A1F593B70B8F06F900073279 /* libtbb.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = A1F593B30B8F06F900073279 /* libtbb.dylib */; };
- A1F593BB0B8F072500073279 /* libtbb.dylib in CopyFiles */ = {isa = PBXBuildFile; fileRef = A1F593B30B8F06F900073279 /* libtbb.dylib */; };
+ 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 */
@@ -21,18 +19,16 @@
dstPath = "";
dstSubfolderSpec = 16;
files = (
- A1F593BB0B8F072500073279 /* libtbb.dylib in CopyFiles */,
+ 0E8A7311136F4A4600453C80 /* libtbb.dylib in CopyFiles */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
- 612CD8DB11F573FC00A587B2 /* Game_of_life.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Game_of_life.cpp; path = ../src/Game_of_life.cpp; sourceTree = SOURCE_ROOT; };
- 612CD8DC11F573FC00A587B2 /* Update_state.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Update_state.cpp; path = ../src/Update_state.cpp; sourceTree = SOURCE_ROOT; };
- 612CD8E011F5742000A587B2 /* Evolution.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Evolution.cpp; path = ../src/Evolution.cpp; sourceTree = SOURCE_ROOT; };
- 8DD76F6C0486A84900D96B5E /* game_of_life */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = game_of_life; sourceTree = BUILT_PRODUCTS_DIR; };
- A1F593B30B8F06F900073279 /* libtbb.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libtbb.dylib; path = ../../../../lib/libtbb.dylib; sourceTree = SOURCE_ROOT; };
+ 0E8A7310136F4A4600453C80 /* libtbb.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; path = 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 */
@@ -40,29 +36,27 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
- A1F593B70B8F06F900073279 /* libtbb.dylib in Frameworks */,
+ 0E8A7325136F4D3600453C80 /* libtbb.dylib in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
- 08FB7794FE84155DC02AAC07 /* game_of_life */ = {
+ 08FB7794FE84155DC02AAC07 /* Shortpath */ = {
isa = PBXGroup;
children = (
08FB7795FE84155DC02AAC07 /* Source */,
A1F593B20B8F06F900073279 /* External Frameworks and Libraries */,
1AB674ADFE9D54B511CA2CBB /* Products */,
);
- name = game_of_life;
+ name = Shortpath;
sourceTree = "<group>";
};
08FB7795FE84155DC02AAC07 /* Source */ = {
isa = PBXGroup;
children = (
- 612CD8E011F5742000A587B2 /* Evolution.cpp */,
- 612CD8DB11F573FC00A587B2 /* Game_of_life.cpp */,
- 612CD8DC11F573FC00A587B2 /* Update_state.cpp */,
+ 61C4771A13CE199D0022F8F6 /* shortpath.cpp */,
);
name = Source;
sourceTree = "<group>";
@@ -70,7 +64,7 @@
1AB674ADFE9D54B511CA2CBB /* Products */ = {
isa = PBXGroup;
children = (
- 8DD76F6C0486A84900D96B5E /* game_of_life */,
+ 8DD76F6C0486A84900D96B5E /* Shortpath */,
);
name = Products;
sourceTree = "<group>";
@@ -78,7 +72,7 @@
A1F593B20B8F06F900073279 /* External Frameworks and Libraries */ = {
isa = PBXGroup;
children = (
- A1F593B30B8F06F900073279 /* libtbb.dylib */,
+ 0E8A7310136F4A4600453C80 /* libtbb.dylib */,
);
name = "External Frameworks and Libraries";
sourceTree = "<group>";
@@ -86,9 +80,9 @@
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
- 8DD76F620486A84900D96B5E /* game_of_life */ = {
+ 8DD76F620486A84900D96B5E /* Shortpath */ = {
isa = PBXNativeTarget;
- buildConfigurationList = 1DEB923108733DC60010E9CD /* Build configuration list for PBXNativeTarget "game_of_life" */;
+ buildConfigurationList = 1DEB923108733DC60010E9CD /* Build configuration list for PBXNativeTarget "Shortpath" */;
buildPhases = (
8DD76F640486A84900D96B5E /* Sources */,
8DD76F660486A84900D96B5E /* Frameworks */,
@@ -98,10 +92,10 @@
);
dependencies = (
);
- name = game_of_life;
+ name = Shortpath;
productInstallPath = "$(HOME)/bin";
- productName = game_of_life;
- productReference = 8DD76F6C0486A84900D96B5E /* game_of_life */;
+ productName = Shortpath;
+ productReference = 8DD76F6C0486A84900D96B5E /* Shortpath */;
productType = "com.apple.product-type.tool";
};
/* End PBXNativeTarget section */
@@ -109,14 +103,21 @@
/* Begin PBXProject section */
08FB7793FE84155DC02AAC07 /* Project object */ = {
isa = PBXProject;
- buildConfigurationList = 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "game_of_life" */;
- compatibilityVersion = "Xcode 2.4";
+ attributes = {
+ LastUpgradeCheck = 0410;
+ };
+ buildConfigurationList = 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "shortpath" */;
+ compatibilityVersion = "Xcode 3.2";
+ developmentRegion = English;
hasScannedForEncodings = 1;
- mainGroup = 08FB7794FE84155DC02AAC07 /* game_of_life */;
+ knownRegions = (
+ en,
+ );
+ mainGroup = 08FB7794FE84155DC02AAC07 /* Shortpath */;
projectDirPath = "";
projectRoot = "";
targets = (
- 8DD76F620486A84900D96B5E /* game_of_life */,
+ 8DD76F620486A84900D96B5E /* Shortpath */,
);
};
/* End PBXProject section */
@@ -126,9 +127,7 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
- 612CD8DD11F573FC00A587B2 /* Game_of_life.cpp in Sources */,
- 612CD8DE11F573FC00A587B2 /* Update_state.cpp in Sources */,
- 612CD8E111F5742000A587B2 /* Evolution.cpp in Sources */,
+ 61C4771B13CE199D0022F8F6 /* shortpath.cpp in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -140,17 +139,21 @@
buildSettings = {
COPY_PHASE_STRIP = NO;
GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PREPROCESSOR_DEFINITIONS = _CONSOLE;
- GCC_VERSION = 4.0;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
HEADER_SEARCH_PATHS = ../../../../include;
INSTALL_PATH = "$(HOME)/bin";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
../../../../lib,
+ "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_1)",
+ "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_2)",
+ "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_3)",
);
- PRODUCT_NAME = game_of_life;
+ LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_1 = "\"$(SRCROOT)\"";
+ LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_2 = "\"$(SRCROOT)\"";
+ LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_3 = "\"$(SRCROOT)\"";
+ PRODUCT_NAME = Shortpath;
ZERO_LINK = NO;
};
name = Debug;
@@ -159,15 +162,20 @@
isa = XCBuildConfiguration;
buildSettings = {
GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
- GCC_PREPROCESSOR_DEFINITIONS = _CONSOLE;
- GCC_VERSION = 4.0;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
HEADER_SEARCH_PATHS = ../../../../include;
INSTALL_PATH = "$(HOME)/bin";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
../../../../lib,
+ "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_1)",
+ "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_2)",
+ "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_3)",
);
- PRODUCT_NAME = game_of_life;
+ LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_1 = "\"$(SRCROOT)\"";
+ LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_2 = "\"$(SRCROOT)\"";
+ LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_3 = "\"$(SRCROOT)\"";
+ PRODUCT_NAME = Shortpath;
ZERO_LINK = NO;
};
name = Release;
@@ -182,7 +190,6 @@
GCC_VERSION = 4.0;
GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
- PREBINDING = NO;
PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
SYMROOT = "/tmp/tbb-$(USER)";
};
@@ -198,7 +205,6 @@
GCC_VERSION = 4.0;
GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
- PREBINDING = NO;
PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
SYMROOT = "/tmp/tbb-$(USER)";
};
@@ -207,21 +213,24 @@
A1F593C60B8F0E6E00073279 /* Debug64 */ = {
isa = XCBuildConfiguration;
buildSettings = {
- ARCHS = "$(ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1)";
- ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1 = x86_64;
+ ARCHS = "$(ARCHS_STANDARD_64_BIT)";
COPY_PHASE_STRIP = NO;
GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PREPROCESSOR_DEFINITIONS = _CONSOLE;
- GCC_VERSION = 4.0;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
HEADER_SEARCH_PATHS = ../../../../include;
INSTALL_PATH = "$(HOME)/bin";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
../../../../lib,
+ "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_1)",
+ "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_2)",
+ "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_3)",
);
- PRODUCT_NAME = game_of_life;
+ LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_1 = "\"$(SRCROOT)\"";
+ LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_2 = "\"$(SRCROOT)\"";
+ LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_3 = "\"$(SRCROOT)\"";
+ PRODUCT_NAME = Shortpath;
ZERO_LINK = NO;
};
name = Debug64;
@@ -229,18 +238,22 @@
A1F593C70B8F0E6E00073279 /* Release64 */ = {
isa = XCBuildConfiguration;
buildSettings = {
- ARCHS = "$(ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1)";
- ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1 = x86_64;
+ ARCHS = "$(ARCHS_STANDARD_64_BIT)";
GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
- GCC_PREPROCESSOR_DEFINITIONS = _CONSOLE;
- GCC_VERSION = 4.0;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
HEADER_SEARCH_PATHS = ../../../../include;
INSTALL_PATH = "$(HOME)/bin";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
../../../../lib,
+ "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_1)",
+ "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_2)",
+ "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_3)",
);
- PRODUCT_NAME = game_of_life;
+ LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_1 = "\"$(SRCROOT)\"";
+ LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_2 = "\"$(SRCROOT)\"";
+ LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_3 = "\"$(SRCROOT)\"";
+ PRODUCT_NAME = Shortpath;
ZERO_LINK = NO;
};
name = Release64;
@@ -260,7 +273,6 @@
"-m64",
);
OTHER_LDFLAGS = "-m64";
- PREBINDING = NO;
PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
SYMROOT = "/tmp/tbb-$(USER)";
};
@@ -281,7 +293,6 @@
"-m64",
);
OTHER_LDFLAGS = "-m64";
- PREBINDING = NO;
PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
SYMROOT = "/tmp/tbb-$(USER)";
};
@@ -290,7 +301,7 @@
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
- 1DEB923108733DC60010E9CD /* Build configuration list for PBXNativeTarget "game_of_life" */ = {
+ 1DEB923108733DC60010E9CD /* Build configuration list for PBXNativeTarget "Shortpath" */ = {
isa = XCConfigurationList;
buildConfigurations = (
1DEB923208733DC60010E9CD /* Debug */,
@@ -301,7 +312,7 @@
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
- 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "game_of_life" */ = {
+ 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "shortpath" */ = {
isa = XCConfigurationList;
buildConfigurations = (
1DEB923608733DC60010E9CD /* Debug */,
diff --git a/examples/task_group/sudoku/Makefile b/examples/graph/binpack/Makefile
similarity index 90%
copy from examples/task_group/sudoku/Makefile
copy to examples/graph/binpack/Makefile
index 180d19f..8379b1e 100644
--- a/examples/task_group/sudoku/Makefile
+++ b/examples/graph/binpack/Makefile
@@ -25,18 +25,20 @@
# the GNU General Public License.
# GNU Makefile that builds and runs example.
-PROG=sudoku
-ARGS=input1 4 0 -p
+PROG=binpack
+ARGS=4 N=1000
+PERF_RUN_ARGS=auto N=1000 silent
# The C++ compiler
ifneq (,$(shell which icc 2>/dev/null))
CXX=icc
endif # which icc
-ifeq ($(CXX),icc)
-CXX0XFLAGS=-std=c++0x -D_TBB_CPP0X
-endif # icc
-all: release test
+ifeq ($(shell uname), Linux)
+LIBS+= -lrt
+endif
+
+all: release test
release: *.cpp
$(CXX) -O2 -DNDEBUG $(CXXFLAGS) -o $(PROG) $^ -ltbb $(LIBS) $(CXX0XFLAGS)
@@ -49,3 +51,8 @@ clean:
test:
./$(PROG) $(ARGS)
+
+perf_build: release
+
+perf_run:
+ ./$(PROG) $(PERF_RUN_ARGS)
diff --git a/examples/task_group/sudoku/Makefile.windows b/examples/graph/binpack/Makefile.windows
similarity index 94%
copy from examples/task_group/sudoku/Makefile.windows
copy to examples/graph/binpack/Makefile.windows
index 246377f..00c1e4e 100644
--- a/examples/task_group/sudoku/Makefile.windows
+++ b/examples/graph/binpack/Makefile.windows
@@ -27,8 +27,9 @@
# Common Makefile that builds and runs example.
# Just specify your program basename
-PROG=sudoku
-ARGS=input1 4 2 -p
+PROG=binpack
+ARGS= 4 N=1000
+PERF_RUN_ARGS=auto N=1000 silent
# Trying to find if icl.exe is set
CXX1 = $(TBB_CXX)-
@@ -50,3 +51,8 @@ test:
$(PROG) $(ARGS)
compiler_check:
@$(CXX) >nul 2>&1 || echo "$(CXX) command not found. Check if CXX=$(CXX) is set properly"
+
+perf_build: release
+
+perf_run:
+ $(PROG) $(PERF_RUN_ARGS)
diff --git a/examples/graph/binpack/binpack.cpp b/examples/graph/binpack/binpack.cpp
new file mode 100644
index 0000000..0391a78
--- /dev/null
+++ b/examples/graph/binpack/binpack.cpp
@@ -0,0 +1,305 @@
+/*
+ Copyright 2005-2011 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.
+*/
+
+
+/* Bin-packing algorithm that attempts to use minimal number of bins B of
+ size V to contain N items of varying sizes. */
+
+#include <string>
+#include <iostream>
+#include <cmath>
+#include "tbb/atomic.h"
+#include "tbb/task_scheduler_init.h"
+#include "tbb/tick_count.h"
+#include "tbb/flow_graph.h"
+#include "../../common/utility/utility.h"
+
+using namespace std;
+using namespace tbb;
+using namespace tbb::flow;
+
+typedef size_t size_type; // to represent non-zero indices, capacities, etc.
+typedef size_t value_type; // the type of items we are attempting to pack into bins
+typedef vector<value_type> bin; // we use a simple vector to represent a bin
+// Our bin packers will be function nodes in the graph that take value_type items and
+// return a dummy value. They will also implicitly send packed bins to the bin_buffer
+// node, and unused items back to the value_pool node:
+typedef function_node<value_type, continue_msg, rejecting> bin_packer;
+// Items are placed into a pool that all bin packers grab from, represent by a queue_node:
+typedef queue_node<value_type> value_pool;
+// Packed bins are placed in this buffer waiting to be serially printed and/or accounted for:
+typedef buffer_node<bin> bin_buffer;
+// Packed bins are taken from the_bin_buffer and processed by the_writer:
+typedef function_node<bin, continue_msg, rejecting> bin_writer;
+// Items are injected into the graph when this node sends them to the_value_pool:
+typedef source_node<value_type> value_source;
+
+// User-specified globals with default values
+size_type V = 42; // desired capacity for each bin
+size_type N = 1000; // number of elements to generate
+bool verbose = false; // prints bin details and other diagnostics to screen
+bool silent = false; // suppress all output except for time
+int num_bin_packers=-1; // number of concurrent bin packers in operation; default is #threads;
+ // larger values can result in more bins at less than full capacity
+size_type optimality=1; // 1 (default) is highest the algorithm can obtain; larger numbers run faster
+
+// Calculated globals
+size_type min_B; // lower bound on the optimal number of bins
+size_type B; // the answer, i.e. number of bins used by the algorithm
+size_type *input_array; // stores randomly generated input values
+value_type item_sum; // sum of all randomly generated input values
+atomic<value_type> packed_sum; // sum of all values currently packed into all bins
+atomic<size_type> packed_items; // number of values currently packed into all bins
+atomic<size_type> active_bins; // number of active bin_packers
+bin_packer **bins; // the array of bin packers
+
+// This class is the Body type for bin_packer
+class bin_filler {
+ bin my_bin; // the current bin that this bin_filler is packing
+ size_type my_used; // capacity of bin used by current contents (not to be confused with my_bin.size())
+ size_type relax, relax_val; // relaxation counter for determining when to settle for a non-full bin
+ bin_packer* my_bin_packer; // ptr to the bin packer that this body object is associated with
+ size_type bin_index; // index of the encapsulating bin packer in the global bins array
+ value_pool* the_value_pool; // ptr to the pool of items to pack
+ bin_buffer* the_bin_buffer; // ptr to the buffer of resulting bins
+ value_type looking_for; // the minimum size of item this bin_packer will accept
+ bool done; // flag to indicate that this binpacker has been deactivated
+ public:
+ bin_filler(size_t bidx, value_pool* q, bin_buffer* r) :
+ my_used(0), relax(0), relax_val(0), my_bin_packer(NULL), bin_index(bidx), the_value_pool(q),
+ the_bin_buffer(r), looking_for(V), done(false) {}
+ continue_msg operator()(const value_type& item) {
+ if (!my_bin_packer) my_bin_packer = bins[bin_index];
+ if (done) the_value_pool->try_put(item); // this bin_packer is done packing items; put item back to pool
+ else if (item > V) { // signal that packed_sum has reached item_sum at some point
+ size_type remaining = active_bins--;
+ if (remaining == 1 && packed_sum == item_sum) { // this is the last bin and it has seen everything
+ // this bin_packer may not have seen everything, so stay active
+ if (my_used>0) the_bin_buffer->try_put(my_bin);
+ my_bin.clear();
+ my_used = 0;
+ looking_for = V;
+ ++active_bins;
+ }
+ else if (remaining == 1) { // this is the last bin, but there are remaining items
+ the_value_pool->try_put(V+1); // send out signal
+ ++active_bins;
+ }
+ else if (remaining > 1) { // this is not the last bin; deactivate
+ if (my_used < V/(1+optimality*.1)) { // this bin is ill-utilized; throw back items and deactivate
+ packed_sum -= my_used;
+ packed_items -= my_bin.size();
+ for (size_type i=0; i<my_bin.size(); ++i)
+ the_value_pool->try_put(my_bin[i]);
+ the_value_pool->remove_successor(*my_bin_packer); // deactivate
+ done = true;
+ the_value_pool->try_put(V+1); // send out signal
+ }
+ else { // this bin is well-utilized; send out bin and deactivate
+ the_value_pool->remove_successor(*my_bin_packer); // build no more bins
+ done = true;
+ if (my_used>0) the_bin_buffer->try_put(my_bin);
+ the_value_pool->try_put(V+1); // send out signal
+ }
+ }
+ }
+ else if (item <= V-my_used && item >= looking_for) { // this item can be packed
+ my_bin.push_back(item);
+ my_used += item;
+ packed_sum += item;
+ ++packed_items;
+ looking_for = V-my_used;
+ relax = 0;
+ if (packed_sum == item_sum) {
+ the_value_pool->try_put(V+1); // send out signal
+ }
+ if (my_used == V) {
+ the_bin_buffer->try_put(my_bin);
+ my_bin.clear();
+ my_used = 0;
+ looking_for = V;
+ }
+ }
+ else { // this item can't be packed; relax constraints
+ ++relax;
+ if (relax >= (N-packed_items)/optimality) { // this bin_packer has looked through enough items
+ relax = 0;
+ --looking_for; // accept a wider range of items
+ if (looking_for == 0 && my_used < V/(1+optimality*.1) && my_used > 0 && active_bins > 1) {
+ // this bin_packer is ill-utilized and can't find items; deactivate and throw back items
+ size_type remaining = active_bins--;
+ if (remaining > 1) { // not the last bin_packer
+ the_value_pool->remove_successor(*my_bin_packer); // deactivate
+ done = true;
+ }
+ else active_bins++; // can't deactivate last bin_packer
+ packed_sum -= my_used;
+ packed_items -= my_bin.size();
+ for (size_type i=0; i<my_bin.size(); ++i)
+ the_value_pool->try_put(my_bin[i]);
+ my_bin.clear();
+ my_used = 0;
+ }
+ else if (looking_for == 0 && (my_used >= V/(1+optimality*.1) || active_bins == 1)) {
+ // this bin_packer can't find items but is well-utilized, so send it out and reset
+ the_bin_buffer->try_put(my_bin);
+ my_bin.clear();
+ my_used = 0;
+ looking_for = V;
+ }
+ }
+ the_value_pool->try_put(item); // put unused item back to pool
+ }
+ return continue_msg(); // need to return something
+ }
+};
+
+// source node uses this to send the values to the value_pool
+class item_generator {
+ size_type counter;
+public:
+ item_generator() : counter(0) {}
+ bool operator()(value_type& m) {
+ if (counter<N) {
+ m = input_array[counter];
+ ++counter;
+ return true;
+ }
+ return false;
+ }
+};
+
+// the terminal function_node uses this to gather stats and print bin information
+class bin_printer {
+ value_type running_count;
+ size_type item_count;
+ value_type my_min, my_max;
+ double avg;
+public:
+ bin_printer() : running_count(0), item_count(0), my_min(V), my_max(0), avg(0) {}
+ continue_msg operator()(bin b) {
+ value_type sum=0;
+ ++B;
+ if (verbose)
+ cout << "[ ";
+ for (size_type i=0; i<b.size(); ++i) {
+ if (verbose)
+ cout << b[i] << " ";
+ sum+=b[i];
+ ++item_count;
+ }
+ if (sum < my_min) my_min = sum;
+ if (sum > my_max) my_max = sum;
+ avg += sum;
+ running_count += sum;
+ if (verbose)
+ cout << "]=" << sum << "; Done/Packed/Total cap: " << running_count << "/" << packed_sum << "/" << item_sum
+ << " items:" << item_count << "/" << packed_items << "/" << N << " B=" << B << endl;
+ if (item_count == N) { // should be the last; print stats
+ avg = avg/(double)B;
+ if (!silent)
+ cout << "SUMMARY: #Bins used: " << B << "; Avg size: " << avg << "; Max size: " << my_max
+ << "; Min size: " << my_min << "\n Lower bound on optimal #bins: " << min_B
+ << "; Start #bins: " << num_bin_packers << endl;
+ }
+ return continue_msg(); // need to return something
+ }
+};
+
+int get_default_num_threads() {
+ static int threads = 0;
+ if (threads == 0)
+ threads = tbb::task_scheduler_init::default_num_threads();
+ return threads;
+}
+
+int main(int argc, char *argv[]) {
+ try {
+ 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")
+ .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")
+ .arg(V,"V"," capacity of each bin")
+ .arg(num_bin_packers,"#packers"," number of concurrent bin packers to use "
+ "(default=#threads)")
+ .arg(optimality,"optimality","controls optimality of solution; 1 is highest, use\n"
+ " larger numbers for less optimal but faster solution")
+ );
+
+ if (silent) verbose = false; // make silent override verbose
+ // Generate random input data
+ srand(42);
+ input_array = new value_type[N];
+ item_sum = 0;
+ for (size_type i=0; i<N; ++i) {
+ input_array[i] = rand() % V + 1; // generate items that fit in a bin
+ item_sum += input_array[i];
+ }
+ 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 ) {
+ task_scheduler_init init(p);
+ packed_sum = 0;
+ packed_items = 0;
+ B = 0;
+ if (num_bin_packers == -1) num_bin_packers = p;
+ active_bins = num_bin_packers;
+ if (!silent)
+ cout << "binpack running with " << item_sum << " capacity over " << N << " items, optimality="
+ << optimality << ", " << num_bin_packers << " bins of capacity=" << V << " on " << p
+ << " threads.\n";
+ graph g;
+ value_source the_source(g, item_generator(), false);
+ value_pool the_value_pool(g);
+ make_edge(the_source, the_value_pool);
+ bin_buffer the_bin_buffer(g);
+ bins = new bin_packer*[num_bin_packers];
+ for (int i=0; i<num_bin_packers; ++i) {
+ bins[i] = new bin_packer(g, 1, bin_filler(i, &the_value_pool, &the_bin_buffer));
+ make_edge(the_value_pool, *(bins[i]));
+ }
+ bin_writer the_writer(g, 1, bin_printer());
+ make_edge(the_bin_buffer, the_writer);
+ the_source.activate();
+ g.wait_for_all();
+ }
+ utility::report_elapsed_time((tbb::tick_count::now() - start).seconds());
+ return 0;
+ } catch(std::exception& e) {
+ cerr<<"error occurred. error text is :\"" <<e.what()<<"\"\n";
+ return 1;
+ }
+}
diff --git a/examples/graph/binpack/index.html b/examples/graph/binpack/index.html
new file mode 100644
index 0000000..14908aa
--- /dev/null
+++ b/examples/graph/binpack/index.html
@@ -0,0 +1,72 @@
+<HTML>
+<BODY>
+
+<H2>Overview</H2>
+
+This directory contains a simple tbb::flow example that performs
+binpacking of N integer values into a near-optimal number of bins
+of capacity V. It features a source_node which passes randomly
+generated integer values of size<=V to a queue_node. Multiple
+function_nodes set about taking values from this queue_node and
+packing them into bins according to a best-fit policy. Items that
+cannot be made to fit are rejected and returned to the queue. When
+a bin is packed as well as it can be, it is passed to a buffer_node
+where it waits to be picked up by another function_node. This final
+function nodes gathers stats about the bin and optionally prints its
+contents. When all bins are accounted for, it optionally prints a
+summary of the quality of the bin-packing.
+
+<H2>Files</H2>
+<DL>
+<DT><A HREF="binpack.cpp">binpack.cpp</A>
+<DD>Driver.
+
+<DT><A HREF="Makefile">Makefile</A>
+<DD>Makefile for building example.
+
+</DL>
+
+<H2>Directories</H2>
+<DL>
+<DT><A HREF="msvs">msvs</A>
+<DD>Contains Microsoft* Visual Studio* 2008 workspace for building and running the example with the Intel® C++ compiler.
+<DT><A HREF="xcode">xcode</A>
+<DD>Contains Mac OS* Xcode* workspace for building and running the example.
+</DL>
+
+<H2>To Build</H2>
+General build directions can be found <A HREF=../../index.html#build>here</A>.
+<P></P>
+
+<H2>Usage</H2>
+<DL>
+
+<DT><TT>binpack <I>-h</I></TT>
+<DD>Prints the help for command line options
+<DT><TT>binpack [<I>#threads</I>=value] [<I>verbose</I>] [<I>silent</I>] [<I>N</I>=value] [<I>V</I>=value] [<I>#packers</I>=value] [<I>optimality</I>=value] [<I>#threads</I>]</TT>
+<DD><I>#threads</I> is the number of threads to use; a range of the form <I>low</I>[:<I>high</I>] where low and optional high are non-negative integers, or 'auto' for the TBB default.<BR>
+ <I>verbose</I> print diagnostic output to screen<BR>
+ <I>silent</I> limits output to timing info; overrides verbose<BR>
+ <I>N</I> number of values to pack<BR>
+ <I>V</I> capacity of each bin<BR>
+ <I>#packers</I> number of concurrent bin packers to use (default=#threads)<BR>
+ <I>optimality</I> controls optimality of solution; 1 is highest, use larger numbers for less optimal but faster solution<BR>
+
+
+<DT>To run a short version of this example, e.g., for use with Intel® Parallel Inspector:
+<DD>Build a <I>debug</I> version of the example
+ (see the <A HREF=../../index.html#build>build directions</A>).
+ <BR>Run it with a small problem size and the desired number of threads, e.g., <TT>binpack 4 N=100</TT>.
+</DL>
+
+<HR>
+<A HREF="../index.html">Up to parent directory</A>
+<p></p>
+Copyright © 2005-2011 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.
+<p></p>
+* Other names and brands may be claimed as the property of others.
+</BODY>
+</HTML>
diff --git a/examples/graph/binpack/msvs/binpack.icproj b/examples/graph/binpack/msvs/binpack.icproj
new file mode 100644
index 0000000..74a4049
--- /dev/null
+++ b/examples/graph/binpack/msvs/binpack.icproj
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Intel C++ Project"
+ Version="11.1"
+ Name="binpack"
+ ProjectGUID="{CB292CD9-903E-464C-AAFE-E7A49003565C}"
+ VCNestedProjectGUID="{C931C7A2-074E-4150-9E7A-39A03250411E}"
+ VCNestedProjectFileName="binpack.vcproj">
+ <Configurations/>
+ <Files/>
+</VisualStudioProject>
diff --git a/examples/task/tree_sum/msvs/tree_sum.vcproj b/examples/graph/binpack/msvs/binpack.vcproj
similarity index 76%
copy from examples/task/tree_sum/msvs/tree_sum.vcproj
copy to examples/graph/binpack/msvs/binpack.vcproj
index 4f85ec3..b93a9ae 100644
--- a/examples/task/tree_sum/msvs/tree_sum.vcproj
+++ b/examples/graph/binpack/msvs/binpack.vcproj
@@ -2,9 +2,9 @@
<VisualStudioProject
ProjectType="Visual C++"
Version="8,00"
- Name="tree_sum"
+ Name="binpack"
ProjectGUID="{C931C7A2-074E-4150-9E7A-39A03250411E}"
- RootNamespace="tree_sum"
+ RootNamespace="binpack"
Keyword="Win32Proj"
>
<Platforms>
@@ -43,7 +43,7 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
RuntimeLibrary="3"
UsePrecompiledHeader="0"
@@ -63,7 +63,7 @@
Name="VCLinkerTool"
AdditionalDependencies="tbb_debug.lib tbbmalloc_debug.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+ 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"
@@ -93,7 +93,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 debug "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 debug "$(OutDir)""
/>
</Configuration>
<Configuration
@@ -122,7 +122,7 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
RuntimeLibrary="3"
UsePrecompiledHeader="0"
@@ -141,7 +141,7 @@
Name="VCLinkerTool"
AdditionalDependencies="tbb_debug.lib tbbmalloc_debug.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+ 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"
@@ -171,7 +171,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 debug "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 debug "$(OutDir)""
/>
</Configuration>
<Configuration
@@ -198,7 +198,7 @@
/>
<Tool
Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
RuntimeLibrary="2"
UsePrecompiledHeader="0"
@@ -218,7 +218,7 @@
Name="VCLinkerTool"
AdditionalDependencies="tbb.lib tbbmalloc.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+ 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"
@@ -250,7 +250,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 release "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 release "$(OutDir)""
/>
</Configuration>
<Configuration
@@ -278,7 +278,7 @@
/>
<Tool
Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="WIN64;NDEBUG;_CONSOLE"
RuntimeLibrary="2"
UsePrecompiledHeader="0"
@@ -297,7 +297,7 @@
Name="VCLinkerTool"
AdditionalDependencies="tbb.lib tbbmalloc.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+ 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"
@@ -329,7 +329,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 release "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 release "$(OutDir)""
/>
</Configuration>
</Configurations>
@@ -342,23 +342,7 @@
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
>
<File
- RelativePath="..\common.h"
- >
- </File>
- <File
- RelativePath="..\main.cpp"
- >
- </File>
- <File
- RelativePath="..\OptimizedParallelSumTree.cpp"
- >
- </File>
- <File
- RelativePath="..\SerialSumTree.cpp"
- >
- </File>
- <File
- RelativePath="..\SimpleParallelSumTree.cpp"
+ RelativePath="..\binpack.cpp"
>
</File>
</Filter>
diff --git a/examples/graph/binpack/msvs/binpack_cl.sln b/examples/graph/binpack/msvs/binpack_cl.sln
new file mode 100644
index 0000000..ac5cd2f
--- /dev/null
+++ b/examples/graph/binpack/msvs/binpack_cl.sln
@@ -0,0 +1,25 @@
+Microsoft Visual Studio Solution File, Format Version 9.00
+# Visual Studio 2005
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "binpack", "binpack.vcproj", "{C931C7A2-074E-4150-9E7A-39A03250411E}"
+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
+ {C931C7A2-074E-4150-9E7A-39A03250411E}.Debug|Win32.ActiveCfg = Debug|Win32
+ {C931C7A2-074E-4150-9E7A-39A03250411E}.Debug|Win32.Build.0 = Debug|Win32
+ {C931C7A2-074E-4150-9E7A-39A03250411E}.Debug|x64.ActiveCfg = Debug|x64
+ {C931C7A2-074E-4150-9E7A-39A03250411E}.Debug|x64.Build.0 = Debug|x64
+ {C931C7A2-074E-4150-9E7A-39A03250411E}.Release|Win32.ActiveCfg = Release|Win32
+ {C931C7A2-074E-4150-9E7A-39A03250411E}.Release|Win32.Build.0 = Release|Win32
+ {C931C7A2-074E-4150-9E7A-39A03250411E}.Release|x64.ActiveCfg = Release|x64
+ {C931C7A2-074E-4150-9E7A-39A03250411E}.Release|x64.Build.0 = Release|x64
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/examples/graph/binpack/msvs/binpack_icl.sln b/examples/graph/binpack/msvs/binpack_icl.sln
new file mode 100644
index 0000000..4f86c03
--- /dev/null
+++ b/examples/graph/binpack/msvs/binpack_icl.sln
@@ -0,0 +1,33 @@
+Microsoft Visual Studio Solution File, Format Version 9.00
+# Visual Studio 2005
+Project("{EAF909A5-FA59-4C3D-9431-0FCC20D5BCF9}") = "binpack", "binpack.icproj", "{CB292CD9-903E-464C-AAFE-E7A49003565C}"
+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
+ {CB292CD9-903E-464C-AAFE-E7A49003565C}.Debug|Win32.ActiveCfg = Debug|Win32
+ {CB292CD9-903E-464C-AAFE-E7A49003565C}.Debug|Win32.Build.0 = Debug|Win32
+ {CB292CD9-903E-464C-AAFE-E7A49003565C}.Debug|x64.ActiveCfg = Debug|x64
+ {CB292CD9-903E-464C-AAFE-E7A49003565C}.Debug|x64.Build.0 = Debug|x64
+ {CB292CD9-903E-464C-AAFE-E7A49003565C}.Release|Win32.ActiveCfg = Release|Win32
+ {CB292CD9-903E-464C-AAFE-E7A49003565C}.Release|Win32.Build.0 = Release|Win32
+ {CB292CD9-903E-464C-AAFE-E7A49003565C}.Release|x64.ActiveCfg = Release|x64
+ {CB292CD9-903E-464C-AAFE-E7A49003565C}.Release|x64.Build.0 = Release|x64
+ {C931C7A2-074E-4150-9E7A-39A03250411E}.Release|x64.Build.0 = Release|x64
+ {C931C7A2-074E-4150-9E7A-39A03250411E}.Release|x64.ActiveCfg = Release|x64
+ {C931C7A2-074E-4150-9E7A-39A03250411E}.Release|Win32.Build.0 = Release|Win32
+ {C931C7A2-074E-4150-9E7A-39A03250411E}.Release|Win32.ActiveCfg = Release|Win32
+ {C931C7A2-074E-4150-9E7A-39A03250411E}.Debug|x64.Build.0 = Debug|x64
+ {C931C7A2-074E-4150-9E7A-39A03250411E}.Debug|x64.ActiveCfg = Debug|x64
+ {C931C7A2-074E-4150-9E7A-39A03250411E}.Debug|Win32.Build.0 = Debug|Win32
+ {C931C7A2-074E-4150-9E7A-39A03250411E}.Debug|Win32.ActiveCfg = Debug|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/examples/parallel_for/game_of_life/xcode/game_of_life.xcodeproj/project.pbxproj b/examples/graph/binpack/xcode/binpack.xcodeproj/project.pbxproj
similarity index 65%
copy from examples/parallel_for/game_of_life/xcode/game_of_life.xcodeproj/project.pbxproj
copy to examples/graph/binpack/xcode/binpack.xcodeproj/project.pbxproj
index 7eed01d..fe95d4d 100644
--- a/examples/parallel_for/game_of_life/xcode/game_of_life.xcodeproj/project.pbxproj
+++ b/examples/graph/binpack/xcode/binpack.xcodeproj/project.pbxproj
@@ -3,15 +3,13 @@
archiveVersion = 1;
classes = {
};
- objectVersion = 42;
+ objectVersion = 46;
objects = {
/* Begin PBXBuildFile section */
- 612CD8DD11F573FC00A587B2 /* Game_of_life.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 612CD8DB11F573FC00A587B2 /* Game_of_life.cpp */; };
- 612CD8DE11F573FC00A587B2 /* Update_state.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 612CD8DC11F573FC00A587B2 /* Update_state.cpp */; };
- 612CD8E111F5742000A587B2 /* Evolution.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 612CD8E011F5742000A587B2 /* Evolution.cpp */; };
- A1F593B70B8F06F900073279 /* libtbb.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = A1F593B30B8F06F900073279 /* libtbb.dylib */; };
- A1F593BB0B8F072500073279 /* libtbb.dylib in CopyFiles */ = {isa = PBXBuildFile; fileRef = A1F593B30B8F06F900073279 /* libtbb.dylib */; };
+ 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 */
@@ -21,18 +19,16 @@
dstPath = "";
dstSubfolderSpec = 16;
files = (
- A1F593BB0B8F072500073279 /* libtbb.dylib in CopyFiles */,
+ 0E8A7311136F4A4600453C80 /* libtbb.dylib in CopyFiles */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
- 612CD8DB11F573FC00A587B2 /* Game_of_life.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Game_of_life.cpp; path = ../src/Game_of_life.cpp; sourceTree = SOURCE_ROOT; };
- 612CD8DC11F573FC00A587B2 /* Update_state.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Update_state.cpp; path = ../src/Update_state.cpp; sourceTree = SOURCE_ROOT; };
- 612CD8E011F5742000A587B2 /* Evolution.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Evolution.cpp; path = ../src/Evolution.cpp; sourceTree = SOURCE_ROOT; };
- 8DD76F6C0486A84900D96B5E /* game_of_life */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = game_of_life; sourceTree = BUILT_PRODUCTS_DIR; };
- A1F593B30B8F06F900073279 /* libtbb.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libtbb.dylib; path = ../../../../lib/libtbb.dylib; sourceTree = SOURCE_ROOT; };
+ 0E8A7310136F4A4600453C80 /* libtbb.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; path = 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 */
@@ -40,29 +36,27 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
- A1F593B70B8F06F900073279 /* libtbb.dylib in Frameworks */,
+ 0E8A7325136F4D3600453C80 /* libtbb.dylib in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
- 08FB7794FE84155DC02AAC07 /* game_of_life */ = {
+ 08FB7794FE84155DC02AAC07 /* Binpack */ = {
isa = PBXGroup;
children = (
08FB7795FE84155DC02AAC07 /* Source */,
A1F593B20B8F06F900073279 /* External Frameworks and Libraries */,
1AB674ADFE9D54B511CA2CBB /* Products */,
);
- name = game_of_life;
+ name = Binpack;
sourceTree = "<group>";
};
08FB7795FE84155DC02AAC07 /* Source */ = {
isa = PBXGroup;
children = (
- 612CD8E011F5742000A587B2 /* Evolution.cpp */,
- 612CD8DB11F573FC00A587B2 /* Game_of_life.cpp */,
- 612CD8DC11F573FC00A587B2 /* Update_state.cpp */,
+ A1F593A50B8F042A00073279 /* binpack.cpp */,
);
name = Source;
sourceTree = "<group>";
@@ -70,7 +64,7 @@
1AB674ADFE9D54B511CA2CBB /* Products */ = {
isa = PBXGroup;
children = (
- 8DD76F6C0486A84900D96B5E /* game_of_life */,
+ 8DD76F6C0486A84900D96B5E /* Binpack */,
);
name = Products;
sourceTree = "<group>";
@@ -78,7 +72,7 @@
A1F593B20B8F06F900073279 /* External Frameworks and Libraries */ = {
isa = PBXGroup;
children = (
- A1F593B30B8F06F900073279 /* libtbb.dylib */,
+ 0E8A7310136F4A4600453C80 /* libtbb.dylib */,
);
name = "External Frameworks and Libraries";
sourceTree = "<group>";
@@ -86,9 +80,9 @@
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
- 8DD76F620486A84900D96B5E /* game_of_life */ = {
+ 8DD76F620486A84900D96B5E /* Binpack */ = {
isa = PBXNativeTarget;
- buildConfigurationList = 1DEB923108733DC60010E9CD /* Build configuration list for PBXNativeTarget "game_of_life" */;
+ buildConfigurationList = 1DEB923108733DC60010E9CD /* Build configuration list for PBXNativeTarget "Binpack" */;
buildPhases = (
8DD76F640486A84900D96B5E /* Sources */,
8DD76F660486A84900D96B5E /* Frameworks */,
@@ -98,10 +92,10 @@
);
dependencies = (
);
- name = game_of_life;
+ name = Binpack;
productInstallPath = "$(HOME)/bin";
- productName = game_of_life;
- productReference = 8DD76F6C0486A84900D96B5E /* game_of_life */;
+ productName = Binpack;
+ productReference = 8DD76F6C0486A84900D96B5E /* Binpack */;
productType = "com.apple.product-type.tool";
};
/* End PBXNativeTarget section */
@@ -109,14 +103,21 @@
/* Begin PBXProject section */
08FB7793FE84155DC02AAC07 /* Project object */ = {
isa = PBXProject;
- buildConfigurationList = 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "game_of_life" */;
- compatibilityVersion = "Xcode 2.4";
+ attributes = {
+ LastUpgradeCheck = 0410;
+ };
+ buildConfigurationList = 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "binpack" */;
+ compatibilityVersion = "Xcode 3.2";
+ developmentRegion = English;
hasScannedForEncodings = 1;
- mainGroup = 08FB7794FE84155DC02AAC07 /* game_of_life */;
+ knownRegions = (
+ en,
+ );
+ mainGroup = 08FB7794FE84155DC02AAC07 /* Binpack */;
projectDirPath = "";
projectRoot = "";
targets = (
- 8DD76F620486A84900D96B5E /* game_of_life */,
+ 8DD76F620486A84900D96B5E /* Binpack */,
);
};
/* End PBXProject section */
@@ -126,9 +127,7 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
- 612CD8DD11F573FC00A587B2 /* Game_of_life.cpp in Sources */,
- 612CD8DE11F573FC00A587B2 /* Update_state.cpp in Sources */,
- 612CD8E111F5742000A587B2 /* Evolution.cpp in Sources */,
+ A1F593A60B8F042A00073279 /* binpack.cpp in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -140,17 +139,21 @@
buildSettings = {
COPY_PHASE_STRIP = NO;
GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PREPROCESSOR_DEFINITIONS = _CONSOLE;
- GCC_VERSION = 4.0;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
HEADER_SEARCH_PATHS = ../../../../include;
INSTALL_PATH = "$(HOME)/bin";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
../../../../lib,
+ "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_1)",
+ "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_2)",
+ "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_3)",
);
- PRODUCT_NAME = game_of_life;
+ LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_1 = "\"$(SRCROOT)\"";
+ LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_2 = "\"$(SRCROOT)\"";
+ LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_3 = "\"$(SRCROOT)\"";
+ PRODUCT_NAME = Binpack;
ZERO_LINK = NO;
};
name = Debug;
@@ -159,15 +162,20 @@
isa = XCBuildConfiguration;
buildSettings = {
GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
- GCC_PREPROCESSOR_DEFINITIONS = _CONSOLE;
- GCC_VERSION = 4.0;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
HEADER_SEARCH_PATHS = ../../../../include;
INSTALL_PATH = "$(HOME)/bin";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
../../../../lib,
+ "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_1)",
+ "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_2)",
+ "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_3)",
);
- PRODUCT_NAME = game_of_life;
+ LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_1 = "\"$(SRCROOT)\"";
+ LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_2 = "\"$(SRCROOT)\"";
+ LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_3 = "\"$(SRCROOT)\"";
+ PRODUCT_NAME = Binpack;
ZERO_LINK = NO;
};
name = Release;
@@ -182,7 +190,6 @@
GCC_VERSION = 4.0;
GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
- PREBINDING = NO;
PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
SYMROOT = "/tmp/tbb-$(USER)";
};
@@ -198,7 +205,6 @@
GCC_VERSION = 4.0;
GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
- PREBINDING = NO;
PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
SYMROOT = "/tmp/tbb-$(USER)";
};
@@ -207,21 +213,24 @@
A1F593C60B8F0E6E00073279 /* Debug64 */ = {
isa = XCBuildConfiguration;
buildSettings = {
- ARCHS = "$(ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1)";
- ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1 = x86_64;
+ ARCHS = "$(ARCHS_STANDARD_64_BIT)";
COPY_PHASE_STRIP = NO;
GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PREPROCESSOR_DEFINITIONS = _CONSOLE;
- GCC_VERSION = 4.0;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
HEADER_SEARCH_PATHS = ../../../../include;
INSTALL_PATH = "$(HOME)/bin";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
../../../../lib,
+ "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_1)",
+ "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_2)",
+ "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_3)",
);
- PRODUCT_NAME = game_of_life;
+ LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_1 = "\"$(SRCROOT)\"";
+ LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_2 = "\"$(SRCROOT)\"";
+ LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_3 = "\"$(SRCROOT)\"";
+ PRODUCT_NAME = Binpack;
ZERO_LINK = NO;
};
name = Debug64;
@@ -229,18 +238,22 @@
A1F593C70B8F0E6E00073279 /* Release64 */ = {
isa = XCBuildConfiguration;
buildSettings = {
- ARCHS = "$(ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1)";
- ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1 = x86_64;
+ ARCHS = "$(ARCHS_STANDARD_64_BIT)";
GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
- GCC_PREPROCESSOR_DEFINITIONS = _CONSOLE;
- GCC_VERSION = 4.0;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
HEADER_SEARCH_PATHS = ../../../../include;
INSTALL_PATH = "$(HOME)/bin";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
../../../../lib,
+ "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_1)",
+ "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_2)",
+ "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_3)",
);
- PRODUCT_NAME = game_of_life;
+ LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_1 = "\"$(SRCROOT)\"";
+ LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_2 = "\"$(SRCROOT)\"";
+ LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_3 = "\"$(SRCROOT)\"";
+ PRODUCT_NAME = Binpack;
ZERO_LINK = NO;
};
name = Release64;
@@ -260,7 +273,6 @@
"-m64",
);
OTHER_LDFLAGS = "-m64";
- PREBINDING = NO;
PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
SYMROOT = "/tmp/tbb-$(USER)";
};
@@ -281,7 +293,6 @@
"-m64",
);
OTHER_LDFLAGS = "-m64";
- PREBINDING = NO;
PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
SYMROOT = "/tmp/tbb-$(USER)";
};
@@ -290,7 +301,7 @@
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
- 1DEB923108733DC60010E9CD /* Build configuration list for PBXNativeTarget "game_of_life" */ = {
+ 1DEB923108733DC60010E9CD /* Build configuration list for PBXNativeTarget "Binpack" */ = {
isa = XCConfigurationList;
buildConfigurations = (
1DEB923208733DC60010E9CD /* Debug */,
@@ -301,7 +312,7 @@
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
- 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "game_of_life" */ = {
+ 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "binpack" */ = {
isa = XCConfigurationList;
buildConfigurations = (
1DEB923608733DC60010E9CD /* Debug */,
diff --git a/examples/parallel_for/game_of_life/Makefile b/examples/graph/dining_philosophers/Makefile
similarity index 85%
copy from examples/parallel_for/game_of_life/Makefile
copy to examples/graph/dining_philosophers/Makefile
index dd68eac..a80a4f9 100644
--- a/examples/parallel_for/game_of_life/Makefile
+++ b/examples/graph/dining_philosophers/Makefile
@@ -25,22 +25,31 @@
# the GNU General Public License.
# GNU Makefile that builds and runs example.
-PROG=game_of_life
-ARGS=2:4 -t 5
+PROG=dining_philosophers
+ARGS= auto 5
+LIGHT_ARGS= auto 3
+
ifneq (,$(shell which icc 2>/dev/null))
CXX=icc
endif # icc
+ifeq ($(shell uname), Linux)
+LIBS+= -lrt
+endif
+
all: release test
-release: src/Evolution.cpp src/Update_state.cpp src/Game_of_life.cpp
+release: src/dining_philosophers.cpp
$(CXX) -O2 -DNDEBUG -D_CONSOLE $(CXXFLAGS) -o $(PROG) $^ -ltbb $(LIBS)
-debug: src/Evolution.cpp src/Update_state.cpp src/Game_of_life.cpp
- $(CXX) -O0 -D_CONSOLE -g -DTBB_DO_ASSERT $(CXXFLAGS) -o $(PROG) $^ -ltbb_debug $(LIBS)
+debug: src/dining_philosophers.cpp
+ $(CXX) -O0 -D_CONSOLE -g -DTBB_USE_DEBUG $(CXXFLAGS) -o $(PROG) $^ -ltbb_debug $(LIBS)
clean:
rm -f $(PROG) *.o *.d
test:
./$(PROG) $(ARGS)
+
+light_test:
+ ./$(PROG) $(LIGHT_ARGS)
diff --git a/examples/task_group/sudoku/Makefile.windows b/examples/graph/dining_philosophers/Makefile.windows
similarity index 82%
copy from examples/task_group/sudoku/Makefile.windows
copy to examples/graph/dining_philosophers/Makefile.windows
index 246377f..a63b74a 100644
--- a/examples/task_group/sudoku/Makefile.windows
+++ b/examples/graph/dining_philosophers/Makefile.windows
@@ -27,8 +27,9 @@
# Common Makefile that builds and runs example.
# Just specify your program basename
-PROG=sudoku
-ARGS=input1 4 2 -p
+PROG=dining_philosophers
+ARGS= auto 5
+LIGHT_ARGS= auto 3
# Trying to find if icl.exe is set
CXX1 = $(TBB_CXX)-
@@ -40,13 +41,14 @@ MYCXXFLAGS = /TP /EHsc /W3 /nologo /D _CONSOLE /D _MBCS /D WIN32 /D _CRT_SECURE_
MYLDFLAGS =/INCREMENTAL:NO /NOLOGO /DEBUG /FIXED:NO $(LDFLAGS)
all: release test
-release:
- $(CXX) *.cpp /MD /O2 /D NDEBUG $(MYCXXFLAGS) /link tbb.lib $(LIBS) $(MYLDFLAGS) /OUT:$(PROG).exe
-debug:
- $(CXX) *.cpp /MDd /Od /Zi /D TBB_USE_DEBUG /D _DEBUG $(MYCXXFLAGS) /link tbb_debug.lib $(LIBS) $(MYLDFLAGS) /OUT:$(PROG).exe
+release:
+ $(CXX) ./src/dining_philosophers.cpp /MD /O2 /D NDEBUG $(MYCXXFLAGS) /link tbb.lib $(LIBS) $(MYLDFLAGS) /OUT:$(PROG).exe
+debug:
+ $(CXX) ./src/dining_philosophers.cpp /MDd /Od /Zi /D _DEBUG $(MYCXXFLAGS) /link tbb_debug.lib $(LIBS) $(MYLDFLAGS) /OUT:$(PROG).exe
clean:
@cmd.exe /C del $(PROG).exe *.obj *.?db *.manifest
test:
$(PROG) $(ARGS)
-compiler_check:
- @$(CXX) >nul 2>&1 || echo "$(CXX) command not found. Check if CXX=$(CXX) is set properly"
+light_test:
+ $(PROG) $(LIGHT_ARGS)
+
diff --git a/examples/graph/dining_philosophers/index.html b/examples/graph/dining_philosophers/index.html
new file mode 100644
index 0000000..3cd6177
--- /dev/null
+++ b/examples/graph/dining_philosophers/index.html
@@ -0,0 +1,48 @@
+<HTML>
+<BODY>
+
+<H2>Overview</H2>
+The Dining Philosophers problem demonstrates tbb::flow and the use of the reserving join node to
+solve the potential deadlock.
+<br>This program runs some number of philosophers in parallel, each thinking and then waiting for chopsticks
+to be available before eating. Eating and thinking are implemented with sleep(). The chopstick positions are represented by a queue_node with one item.
+
+<H2>Source Files</H2>
+<DL>
+<DT><A HREF="src/dining_philosophers.cpp">dining_philosophers.cpp</A>
+<DD>Source code for the example.
+<DT><A HREF="Makefile">Makefile</A>, <A HREF=Makefile.windows>Makefile.windows</A>
+<DD>Makefiles for building example.
+</DL>
+
+<H2>Directories</H2>
+<DL>
+<DT><A HREF="src">src</A>
+<DD>Contains source file mentioned above.
+<DT><A HREF="msvs">msvs</A>
+<DD>Contains Microsoft* Visual Studio* 2005 workspace for building and running the example.
+<DT><A HREF="xcode">xcode</A>
+<DD>Contains Mac OS* Xcode* workspace for building and running the example.
+</DL>
+
+<H2>To Build</H2>
+General build directions can be found <A HREF=../../index.html#build>here</A>.
+<P></P>
+
+<H2>Usage</H2>
+<DL>
+For Windows* systems, Microsoft* Visual Studio* projects are provided for each of the above versions.
+</DL>
+
+<HR>
+<A HREF="../index.html">Up to parent directory</A>
+<p></p>
+Copyright © 2005-2011 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.
+<p></p>
+* Other names and brands may be claimed as the property of others.
+</BODY>
+</HTML>
+
diff --git a/examples/graph/dining_philosophers/msvs/dining_philosophers.icproj b/examples/graph/dining_philosophers/msvs/dining_philosophers.icproj
new file mode 100644
index 0000000..c27e179
--- /dev/null
+++ b/examples/graph/dining_philosophers/msvs/dining_philosophers.icproj
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="windows-1251"?>
+<VisualStudioProject
+ ProjectType="Intel C++ Project"
+ Version="11.1"
+ Name="dining_philosophers"
+ ProjectGUID="{bbdf68ee-c8b2-4836-b3fc-385ce2265dc0}"
+ VCNestedProjectGUID="{3894d1d2-a574-4937-ad56-726758efe5b7}"
+ VCNestedProjectFileName="dining_philosophers.vcproj">
+ <Configurations/>
+ <Files/>
+</VisualStudioProject>
diff --git a/examples/parallel_do/parallel_preorder/msvs/parallel_preorder.vcproj b/examples/graph/dining_philosophers/msvs/dining_philosophers.vcproj
similarity index 74%
copy from examples/parallel_do/parallel_preorder/msvs/parallel_preorder.vcproj
copy to examples/graph/dining_philosophers/msvs/dining_philosophers.vcproj
index a8aa8af..431b47a 100644
--- a/examples/parallel_do/parallel_preorder/msvs/parallel_preorder.vcproj
+++ b/examples/graph/dining_philosophers/msvs/dining_philosophers.vcproj
@@ -2,9 +2,9 @@
<VisualStudioProject
ProjectType="Visual C++"
Version="8,00"
- Name="parallel_preorder"
- ProjectGUID="{3AA40693-F93D-4D4B-B32E-068F511A252B}"
- RootNamespace="parallel_preorder"
+ Name="dining_philosophers"
+ ProjectGUID="{3894d1d2-a574-4937-ad56-726758efe5b7}"
+ RootNamespace="dining_philosophers"
Keyword="Win32Proj"
>
<Platforms>
@@ -43,7 +43,7 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
RuntimeLibrary="3"
UsePrecompiledHeader="0"
@@ -63,7 +63,7 @@
Name="VCLinkerTool"
AdditionalDependencies="tbb_debug.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+ 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"
@@ -93,7 +93,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 debug "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 debug "$(OutDir)""
/>
</Configuration>
<Configuration
@@ -122,7 +122,7 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
RuntimeLibrary="3"
UsePrecompiledHeader="0"
@@ -141,7 +141,7 @@
Name="VCLinkerTool"
AdditionalDependencies="tbb_debug.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+ 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"
@@ -171,7 +171,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 debug "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 debug "$(OutDir)""
/>
</Configuration>
<Configuration
@@ -198,7 +198,7 @@
/>
<Tool
Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
RuntimeLibrary="2"
UsePrecompiledHeader="0"
@@ -218,7 +218,7 @@
Name="VCLinkerTool"
AdditionalDependencies="tbb.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+ 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"
@@ -250,7 +250,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 release "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 release "$(OutDir)""
/>
</Configuration>
<Configuration
@@ -278,7 +278,7 @@
/>
<Tool
Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="WIN64;NDEBUG;_CONSOLE"
RuntimeLibrary="2"
UsePrecompiledHeader="0"
@@ -297,7 +297,7 @@
Name="VCLinkerTool"
AdditionalDependencies="tbb.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+ 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"
@@ -329,7 +329,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 release "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 release "$(OutDir)""
/>
</Configuration>
</Configurations>
@@ -339,32 +339,10 @@
<Filter
Name="Source Files"
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ UniqueIdentifier="{64630469-f82d-4c18-a957-20e5b93130f8}"
>
<File
- RelativePath="..\Graph.cpp"
- >
- </File>
- <File
- RelativePath="..\main.cpp"
- >
- </File>
- <File
- RelativePath="..\parallel_preorder.cpp"
- >
- </File>
- </Filter>
- <Filter
- Name="Header Files"
- Filter="h;hpp;hxx;hm;inl;inc;xsd"
- UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
- >
- <File
- RelativePath="..\Graph.h"
- >
- </File>
- <File
- RelativePath="..\Matrix.h"
+ RelativePath="..\src\dining_philosophers.cpp"
>
</File>
</Filter>
diff --git a/examples/graph/dining_philosophers/msvs/dining_philosophers_cl.sln b/examples/graph/dining_philosophers/msvs/dining_philosophers_cl.sln
new file mode 100644
index 0000000..ed55faa
--- /dev/null
+++ b/examples/graph/dining_philosophers/msvs/dining_philosophers_cl.sln
@@ -0,0 +1,25 @@
+Microsoft Visual Studio Solution File, Format Version 9.00
+# Visual Studio 2005
+Project("{3EC5FFF9-397F-47A7-BAF9-FDD602956644}") = "dining_philosophers", "dining_philosophers.vcproj", "{3894D1D2-A574-4937-AD56-726758EFE5B7}"
+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
+ {3894D1D2-A574-4937-AD56-726758EFE5B7}.Debug|Win32.ActiveCfg = Debug|Win32
+ {3894D1D2-A574-4937-AD56-726758EFE5B7}.Debug|Win32.Build.0 = Debug|Win32
+ {3894D1D2-A574-4937-AD56-726758EFE5B7}.Debug|x64.ActiveCfg = Debug|x64
+ {3894D1D2-A574-4937-AD56-726758EFE5B7}.Debug|x64.Build.0 = Debug|x64
+ {3894D1D2-A574-4937-AD56-726758EFE5B7}.Release|Win32.ActiveCfg = Release|Win32
+ {3894D1D2-A574-4937-AD56-726758EFE5B7}.Release|Win32.Build.0 = Release|Win32
+ {3894D1D2-A574-4937-AD56-726758EFE5B7}.Release|x64.ActiveCfg = Release|x64
+ {3894D1D2-A574-4937-AD56-726758EFE5B7}.Release|x64.Build.0 = Release|x64
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/examples/graph/dining_philosophers/msvs/dining_philosophers_icl.sln b/examples/graph/dining_philosophers/msvs/dining_philosophers_icl.sln
new file mode 100644
index 0000000..d86e64b
--- /dev/null
+++ b/examples/graph/dining_philosophers/msvs/dining_philosophers_icl.sln
@@ -0,0 +1,33 @@
+Microsoft Visual Studio Solution File, Format Version 9.00
+# Visual Studio 2005
+Project("{b651a8c1-851b-4873-ab7a-428d9f15be2d}") = "dining_philosophers", "dining_philosophers.icproj", "{bbdf68ee-c8b2-4836-b3fc-385ce2265dc0}"
+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
+ {bbdf68ee-c8b2-4836-b3fc-385ce2265dc0}.Debug|Win32.ActiveCfg = Debug|Win32
+ {bbdf68ee-c8b2-4836-b3fc-385ce2265dc0}.Debug|Win32.Build.0 = Debug|Win32
+ {bbdf68ee-c8b2-4836-b3fc-385ce2265dc0}.Debug|x64.ActiveCfg = Debug|x64
+ {bbdf68ee-c8b2-4836-b3fc-385ce2265dc0}.Debug|x64.Build.0 = Debug|x64
+ {bbdf68ee-c8b2-4836-b3fc-385ce2265dc0}.Release|Win32.ActiveCfg = Release|Win32
+ {bbdf68ee-c8b2-4836-b3fc-385ce2265dc0}.Release|Win32.Build.0 = Release|Win32
+ {bbdf68ee-c8b2-4836-b3fc-385ce2265dc0}.Release|x64.ActiveCfg = Release|x64
+ {bbdf68ee-c8b2-4836-b3fc-385ce2265dc0}.Release|x64.Build.0 = Release|x64
+ {3894d1d2-a574-4937-ad56-726758efe5b7}.Release|x64.Build.0 = Release|x64
+ {3894d1d2-a574-4937-ad56-726758efe5b7}.Release|x64.ActiveCfg = Release|x64
+ {3894d1d2-a574-4937-ad56-726758efe5b7}.Release|Win32.Build.0 = Release|Win32
+ {3894d1d2-a574-4937-ad56-726758efe5b7}.Release|Win32.ActiveCfg = Release|Win32
+ {3894d1d2-a574-4937-ad56-726758efe5b7}.Debug|x64.Build.0 = Debug|x64
+ {3894d1d2-a574-4937-ad56-726758efe5b7}.Debug|x64.ActiveCfg = Debug|x64
+ {3894d1d2-a574-4937-ad56-726758efe5b7}.Debug|Win32.Build.0 = Debug|Win32
+ {3894d1d2-a574-4937-ad56-726758efe5b7}.Debug|Win32.ActiveCfg = Debug|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/examples/graph/dining_philosophers/src/dining_philosophers.cpp b/examples/graph/dining_philosophers/src/dining_philosophers.cpp
new file mode 100644
index 0000000..03d7f71
--- /dev/null
+++ b/examples/graph/dining_philosophers/src/dining_philosophers.cpp
@@ -0,0 +1,318 @@
+/*
+ Copyright 2005-2011 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 _MSC_VER
+ // Suppress "decorated name length exceeded, name was truncated" warning
+ #pragma warning (disable: 4503)
+#endif
+
+#include "tbb/flow_graph.h"
+#include "tbb/task_scheduler_init.h"
+#include "tbb/tick_count.h"
+#include "tbb/atomic.h"
+#include "tbb/spin_mutex.h"
+#include <iostream>
+#include "../../../common/utility/utility.h"
+#include <cstdlib>
+#include <cstdio>
+
+#if _WIN32 || _WIN64
+#include "windows.h"
+#define SLEEP(a) Sleep(a*1000)
+#else
+#define SLEEP(a) sleep(a)
+#endif
+
+// Each philosopher is run as a task in the graph, and its first action is to execute
+// a think(), and then call make_my_node(). make_my_node() will
+//
+// 1) allocate a join_node,
+// 2) link the left and right chopstick queues to the join,
+// 3) allocate a function_node with a node_body that calls eat_and_think().
+// 4) link the join_node to the function_node.
+//
+// While the philosopher participates in the game, it will (when eat_and_think() is invoked)
+//
+// a) eat (the funtion_node will be invoked only when both chopsticks are available)
+// b) if we are going to eventually eat again, we just try_put() the chopsticks
+// back into our queues. If not, we disconnect our join_node from the queues,
+// and then place the chopsticks back.
+// c) If we are going to eat again, we think().
+//
+// philosopher_by_ref allows us to pass an object to g.run() that can be copied, but will
+// retain a reference to our original philosopher. If this wasn't done, g.run() would store a
+// copy of philosopher, and the original wouldn't be used.
+
+const int think_time = 1;
+const int eat_time = 1;
+const int num_times = 10;
+
+tbb::tick_count t0;
+bool verbose = false;
+
+const char *names[] = { "Archimedes", "Bakunin", "Confucius", "Democritus", "Euclid"
+ , "Favorinus", "Geminus", "Heraclitus", "Ichthyas", "Jason of Nysa",
+ "Kant", "Lavrov", "Metrocles", "Nausiphanes", "Onatas", "Phaedrus",
+ "Quillot", "Russell", "Socrates", "Thales", "Udayana",
+ "Vernadsky", "Wittgenstein", "Xenophilus", "Yen Yuan", "Zenodotus"
+};
+const int NumPhilosophers = sizeof(names) / sizeof(char*);
+
+// from seismic
+int get_default_num_threads() {
+ static int threads = 0;
+ if ( threads == 0 )
+ threads = tbb::task_scheduler_init::default_num_threads();
+ return threads;
+}
+
+struct RunOptions {
+ utility::thread_number_range threads;
+ int number_of_philosophers;
+ bool silent;
+ RunOptions(utility::thread_number_range threads_, int number_of_philosophers_, bool silent_) :
+ threads(threads_), number_of_philosophers(number_of_philosophers_), silent(silent_) { }
+};
+
+RunOptions ParseCommandLine(int argc, char *argv[]) {
+ int auto_threads = get_default_num_threads();
+ utility::thread_number_range threads(get_default_num_threads, auto_threads, auto_threads);
+ int nPhilosophers = 5;
+ bool verbose = false;
+ char charbuf[100];
+ std::sprintf(charbuf, "%d", NumPhilosophers);
+ std::string pCount = "how many philosophers, from 2-";
+ 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.")
+ .positional_arg(nPhilosophers, "n-of-philosophers", pCount)
+ .arg(verbose,"verbose","verbose output");
+ utility::parse_cli_arguments(argc, argv, cli_pack);
+ if(nPhilosophers < 2 || nPhilosophers > NumPhilosophers) {
+ std::cout << "Number of philosophers (" << nPhilosophers << ") out of range [2:" << NumPhilosophers << "]\n";
+ std::cout << cli_pack.usage_string(argv[0]) << std::flush;
+ std::exit(1);
+ }
+ return RunOptions(threads, nPhilosophers,!verbose);
+}
+
+
+tbb::spin_mutex my_mutex;
+
+class chopstick {};
+
+class philosopher {
+public:
+
+ typedef tbb::flow::queue_node< chopstick > chopstick_buffer;
+ typedef tbb::flow::join_node< std::tuple<chopstick, chopstick>, tbb::flow::reserving > join_type;
+
+ philosopher( const char *name, tbb::flow::graph &the_graph, chopstick_buffer *left, chopstick_buffer *right ) :
+ my_name(name), my_graph(&the_graph), my_left_chopstick(left), my_right_chopstick(right),
+ my_join(NULL), my_function_node(NULL), my_count(num_times) { }
+
+ ~philosopher() {
+ if(my_join) delete my_join;
+ if(my_function_node) delete my_function_node;
+ }
+
+ void operator()();
+ void check();
+
+ void link_left_chopstick() { my_left_chopstick->register_successor( std::get<0>(my_join->inputs()) ); }
+ void link_right_chopstick() { my_right_chopstick->register_successor( std::get<1>(my_join->inputs()) ); }
+ const char *name() const { return my_name; }
+
+private:
+
+ friend std::ostream& operator<<(std::ostream& o, philosopher const &p);
+
+ const char *my_name;
+ tbb::flow::graph *my_graph;
+ chopstick_buffer *my_left_chopstick;
+ chopstick_buffer *my_right_chopstick;
+ join_type *my_join;
+ tbb::flow::function_node< join_type::output_type, tbb::flow::continue_msg, tbb::flow::rejecting > *my_function_node;
+ int my_count;
+
+ friend class node_body;
+
+ void eat_and_think( );
+ void eat( );
+ void think( );
+ void make_my_node();
+
+};
+
+class philosopher_by_ref {
+ philosopher &my_guy;
+public:
+ philosopher_by_ref(philosopher &_my_guy) : my_guy(_my_guy) { }
+ void operator()() {
+ my_guy();
+ };
+};
+
+std::ostream& operator<<(std::ostream& o, philosopher const &p) {
+ o << "< philosopher[" << reinterpret_cast<uintptr_t>(const_cast<philosopher *>(&p)) << "] " << p.name()
+ << ", my_count=" << p.my_count;
+ return o;
+}
+
+class node_body {
+ philosopher& my_philosopher;
+public:
+ node_body( philosopher &p ) : my_philosopher(p) { }
+ void operator()( philosopher::join_type::output_type ) {
+ my_philosopher.eat_and_think();
+ }
+};
+
+void philosopher::operator()() {
+ think();
+ make_my_node();
+}
+
+void philosopher::check() {
+ if ( my_count != 0 ) {
+ std::printf("ERROR: philosopher %s still had to run %d more times\n", name(), my_count);
+ std::exit(1);
+ } else {
+ if(verbose) std::printf("%s done.\n", name());
+ }
+}
+
+void philosopher::eat_and_think( ) {
+ eat();
+ if(my_count < 0) abort();
+ --my_count;
+
+ if (my_count > 0) {
+ my_left_chopstick->try_put( chopstick() );
+ my_right_chopstick->try_put( chopstick() );
+ think();
+ } else {
+ my_left_chopstick->remove_successor( std::get<0>(my_join->inputs()) );
+ my_right_chopstick->remove_successor( std::get<1>(my_join->inputs()) );
+ my_left_chopstick->try_put( chopstick() );
+ my_right_chopstick->try_put( chopstick() );
+ if(verbose) {
+ tbb::spin_mutex::scoped_lock lock(my_mutex);
+ std::printf("%s has left the building\n", name());
+ }
+
+ }
+}
+
+void philosopher::eat() {
+ if(verbose) {
+ tbb::spin_mutex::scoped_lock lock(my_mutex);
+ std::printf("%s eating\n", name());
+ }
+ SLEEP(eat_time);
+ if(verbose) {
+ tbb::spin_mutex::scoped_lock lock(my_mutex);
+ std::printf("%s done eating\n", name());
+ }
+}
+
+void philosopher::think() {
+ if(verbose) {
+ tbb::spin_mutex::scoped_lock lock(my_mutex);
+ std::printf("%s thinking\n", name());
+ }
+ SLEEP(think_time);
+ if(verbose) {
+ tbb::spin_mutex::scoped_lock lock(my_mutex);
+ std::printf("%s done thinking\n", name());
+ }
+}
+
+void philosopher::make_my_node() {
+ my_join = new join_type(*my_graph);
+ link_left_chopstick();
+ link_right_chopstick();
+ my_function_node =
+ new tbb::flow::function_node< join_type::output_type, tbb::flow::continue_msg , tbb::flow::rejecting >( *my_graph,
+ tbb::flow::serial,
+ node_body( *this ) );
+ tbb::flow::make_edge( *my_join, *my_function_node );
+}
+
+typedef std::vector<philosopher> p_vector;
+typedef std::vector<tbb::flow::queue_node< chopstick > > chopstick_places;
+
+int main(int argc, char *argv[]) {
+ int num_threads;
+ int num_philosophers;
+
+ RunOptions options = ParseCommandLine(argc, 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);
+
+ tbb::flow::graph g;
+
+ if(verbose) std::printf("\n%d philosophers with %d threads", num_philosophers, num_threads);
+
+ if(verbose) std::printf("\n\n");
+ t0 = tbb::tick_count::now();
+
+ // create queues of (one) chopstick
+ chopstick_places places(num_philosophers, tbb::flow::queue_node<chopstick>(g));
+ for ( int i = 0; i < num_philosophers; ++i ) {
+ places[i].try_put(chopstick());
+ }
+
+ p_vector philosophers;
+ // must reserve the vector so no reallocation occurs (we're passing references to the vector elements)
+ philosophers.reserve(num_philosophers);
+ for ( int i = 0; i < num_philosophers; ++i ) {
+ philosophers.push_back( philosopher( names[i], g, &(places[i]), &(places[(i+1)%num_philosophers]) ) );
+ if(verbose) {
+ tbb::spin_mutex::scoped_lock lock(my_mutex);
+ std::cout << "Built philosopher " << philosophers[i] << std::endl;
+ }
+ g.run( philosopher_by_ref(philosophers[i]) );
+ }
+
+ g.wait_for_all();
+
+ tbb::tick_count t1 = tbb::tick_count::now();
+ if(verbose) utility::report_elapsed_time((t1-t0).seconds());
+
+ for ( int i = 0; i < num_philosophers; ++i )
+ philosophers[i].check();
+ }
+
+ return 0;
+}
diff --git a/examples/test_all/fibonacci/xcode/fibonacci.xcodeproj/project.pbxproj b/examples/graph/dining_philosophers/xcode/dining_philosophers.xcodeproj/project.pbxproj
similarity index 77%
copy from examples/test_all/fibonacci/xcode/fibonacci.xcodeproj/project.pbxproj
copy to examples/graph/dining_philosophers/xcode/dining_philosophers.xcodeproj/project.pbxproj
index f6957d7..477fde1 100644
--- a/examples/test_all/fibonacci/xcode/fibonacci.xcodeproj/project.pbxproj
+++ b/examples/graph/dining_philosophers/xcode/dining_philosophers.xcodeproj/project.pbxproj
@@ -3,11 +3,11 @@
archiveVersion = 1;
classes = {
};
- objectVersion = 42;
+ objectVersion = 46;
objects = {
/* Begin PBXBuildFile section */
- A1F593A60B8F042A00073279 /* Fibonacci.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F593A50B8F042A00073279 /* Fibonacci.cpp */; };
+ A1F593A60B8F042A00073279 /* dining_philosophers.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F593A50B8F042A00073279 /* dining_philosophers.cpp */; };
A1F593B70B8F06F900073279 /* libtbb.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = A1F593B30B8F06F900073279 /* libtbb.dylib */; };
A1F593BB0B8F072500073279 /* libtbb.dylib in CopyFiles */ = {isa = PBXBuildFile; fileRef = A1F593B30B8F06F900073279 /* libtbb.dylib */; };
/* End PBXBuildFile section */
@@ -26,8 +26,8 @@
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
- 8DD76F6C0486A84900D96B5E /* Fibonacci */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = Fibonacci; sourceTree = BUILT_PRODUCTS_DIR; };
- A1F593A50B8F042A00073279 /* Fibonacci.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = Fibonacci.cpp; path = ../Fibonacci.cpp; sourceTree = SOURCE_ROOT; };
+ 8DD76F6C0486A84900D96B5E /* dining_philosophers */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = dining_philosophers; sourceTree = BUILT_PRODUCTS_DIR; };
+ A1F593A50B8F042A00073279 /* dining_philosophers.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = dining_philosophers.cpp; path = ../src/dining_philosophers.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 */
@@ -43,20 +43,20 @@
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
- 08FB7794FE84155DC02AAC07 /* Fibonacci */ = {
+ 08FB7794FE84155DC02AAC07 /* dining_philosophers */ = {
isa = PBXGroup;
children = (
08FB7795FE84155DC02AAC07 /* Source */,
A1F593B20B8F06F900073279 /* External Frameworks and Libraries */,
1AB674ADFE9D54B511CA2CBB /* Products */,
);
- name = Fibonacci;
+ name = dining_philosophers;
sourceTree = "<group>";
};
08FB7795FE84155DC02AAC07 /* Source */ = {
isa = PBXGroup;
children = (
- A1F593A50B8F042A00073279 /* Fibonacci.cpp */,
+ A1F593A50B8F042A00073279 /* dining_philosophers.cpp */,
);
name = Source;
sourceTree = "<group>";
@@ -64,7 +64,7 @@
1AB674ADFE9D54B511CA2CBB /* Products */ = {
isa = PBXGroup;
children = (
- 8DD76F6C0486A84900D96B5E /* Fibonacci */,
+ 8DD76F6C0486A84900D96B5E /* dining_philosophers */,
);
name = Products;
sourceTree = "<group>";
@@ -80,9 +80,9 @@
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
- 8DD76F620486A84900D96B5E /* Fibonacci */ = {
+ 8DD76F620486A84900D96B5E /* dining_philosophers */ = {
isa = PBXNativeTarget;
- buildConfigurationList = 1DEB923108733DC60010E9CD /* Build configuration list for PBXNativeTarget "Fibonacci" */;
+ buildConfigurationList = 1DEB923108733DC60010E9CD /* Build configuration list for PBXNativeTarget "dining_philosophers" */;
buildPhases = (
8DD76F640486A84900D96B5E /* Sources */,
8DD76F660486A84900D96B5E /* Frameworks */,
@@ -92,10 +92,10 @@
);
dependencies = (
);
- name = Fibonacci;
+ name = dining_philosophers;
productInstallPath = "$(HOME)/bin";
- productName = Fibonacci;
- productReference = 8DD76F6C0486A84900D96B5E /* Fibonacci */;
+ productName = dining_philosophers;
+ productReference = 8DD76F6C0486A84900D96B5E /* dining_philosophers */;
productType = "com.apple.product-type.tool";
};
/* End PBXNativeTarget section */
@@ -103,14 +103,21 @@
/* Begin PBXProject section */
08FB7793FE84155DC02AAC07 /* Project object */ = {
isa = PBXProject;
- buildConfigurationList = 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "fibonacci" */;
- compatibilityVersion = "Xcode 2.4";
+ attributes = {
+ LastUpgradeCheck = 0410;
+ };
+ buildConfigurationList = 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "dining_philosophers" */;
+ compatibilityVersion = "Xcode 3.2";
+ developmentRegion = English;
hasScannedForEncodings = 1;
- mainGroup = 08FB7794FE84155DC02AAC07 /* Fibonacci */;
+ knownRegions = (
+ en,
+ );
+ mainGroup = 08FB7794FE84155DC02AAC07 /* dining_philosophers */;
projectDirPath = "";
projectRoot = "";
targets = (
- 8DD76F620486A84900D96B5E /* Fibonacci */,
+ 8DD76F620486A84900D96B5E /* dining_philosophers */,
);
};
/* End PBXProject section */
@@ -120,7 +127,7 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
- A1F593A60B8F042A00073279 /* Fibonacci.cpp in Sources */,
+ A1F593A60B8F042A00073279 /* dining_philosophers.cpp in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -132,16 +139,15 @@
buildSettings = {
COPY_PHASE_STRIP = NO;
GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
GCC_OPTIMIZATION_LEVEL = 0;
- GCC_VERSION = 4.0;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
HEADER_SEARCH_PATHS = ../../../../include;
INSTALL_PATH = "$(HOME)/bin";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
- "../../../../lib",
+ ../../../../lib,
);
- PRODUCT_NAME = Fibonacci;
+ PRODUCT_NAME = dining_philosophers;
ZERO_LINK = NO;
};
name = Debug;
@@ -150,14 +156,14 @@
isa = XCBuildConfiguration;
buildSettings = {
GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
- GCC_VERSION = 4.0;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
HEADER_SEARCH_PATHS = ../../../../include;
INSTALL_PATH = "$(HOME)/bin";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
- "../../../../lib",
+ ../../../../lib,
);
- PRODUCT_NAME = Fibonacci;
+ PRODUCT_NAME = dining_philosophers;
ZERO_LINK = NO;
};
name = Release;
@@ -172,7 +178,6 @@
GCC_VERSION = 4.0;
GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
- PREBINDING = NO;
PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
SYMROOT = "/tmp/tbb-$(USER)";
};
@@ -188,7 +193,6 @@
GCC_VERSION = 4.0;
GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
- PREBINDING = NO;
PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
SYMROOT = "/tmp/tbb-$(USER)";
};
@@ -197,20 +201,18 @@
A1F593C60B8F0E6E00073279 /* Debug64 */ = {
isa = XCBuildConfiguration;
buildSettings = {
- ARCHS = "$(ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1)";
- ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1 = x86_64;
+ ARCHS = "$(ARCHS_STANDARD_64_BIT)";
COPY_PHASE_STRIP = NO;
GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
GCC_OPTIMIZATION_LEVEL = 0;
- GCC_VERSION = 4.0;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
HEADER_SEARCH_PATHS = ../../../../include;
INSTALL_PATH = "$(HOME)/bin";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
- "../../../../lib",
+ ../../../../lib,
);
- PRODUCT_NAME = Fibonacci;
+ PRODUCT_NAME = dining_philosophers;
ZERO_LINK = NO;
};
name = Debug64;
@@ -218,17 +220,16 @@
A1F593C70B8F0E6E00073279 /* Release64 */ = {
isa = XCBuildConfiguration;
buildSettings = {
- ARCHS = "$(ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1)";
- ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1 = x86_64;
+ ARCHS = "$(ARCHS_STANDARD_64_BIT)";
GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
- GCC_VERSION = 4.0;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
HEADER_SEARCH_PATHS = ../../../../include;
INSTALL_PATH = "$(HOME)/bin";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
- "../../../../lib",
+ ../../../../lib,
);
- PRODUCT_NAME = Fibonacci;
+ PRODUCT_NAME = dining_philosophers;
ZERO_LINK = NO;
};
name = Release64;
@@ -248,7 +249,6 @@
"-m64",
);
OTHER_LDFLAGS = "-m64";
- PREBINDING = NO;
PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
SYMROOT = "/tmp/tbb-$(USER)";
};
@@ -269,7 +269,6 @@
"-m64",
);
OTHER_LDFLAGS = "-m64";
- PREBINDING = NO;
PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
SYMROOT = "/tmp/tbb-$(USER)";
};
@@ -278,7 +277,7 @@
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
- 1DEB923108733DC60010E9CD /* Build configuration list for PBXNativeTarget "Fibonacci" */ = {
+ 1DEB923108733DC60010E9CD /* Build configuration list for PBXNativeTarget "dining_philosophers" */ = {
isa = XCConfigurationList;
buildConfigurations = (
1DEB923208733DC60010E9CD /* Debug */,
@@ -289,7 +288,7 @@
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
- 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "fibonacci" */ = {
+ 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "dining_philosophers" */ = {
isa = XCConfigurationList;
buildConfigurations = (
1DEB923608733DC60010E9CD /* Debug */,
diff --git a/examples/graph/index.html b/examples/graph/index.html
new file mode 100644
index 0000000..5b9e942
--- /dev/null
+++ b/examples/graph/index.html
@@ -0,0 +1,26 @@
+<HTML>
+<BODY>
+
+<H2>Overview</H2>
+This directory has examples of <code>tbb::flow</code>.
+
+<H2>Directories</H2>
+<DL>
+<DT><A HREF="dining_philosophers/index.html">dining_philosophers</A>
+<DD>An implementation of dining philosophers in graph using the reserving join node.
+<DT><A HREF="binpack/index.html">binpack</A>
+<DD>A solution to the binpacking problem using a queue_node, a buffer_node and function_nodes.
+</DL>
+
+<HR>
+<A HREF="../index.html">Up to parent directory</A>
+<p></p>
+Copyright © 2005-2011 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.
+<p></p>
+* Other names and brands may be claimed as the property of others.
+</BODY>
+</HTML>
+
diff --git a/examples/index.html b/examples/index.html
index c7efb78..e4d1cc0 100644
--- a/examples/index.html
+++ b/examples/index.html
@@ -10,6 +10,10 @@ This directory has example usages of Threading Building Blocks.
<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>
+<DD>Examples using <CODE>concurrent_priority_queue</CODE>.
+<DT><A HREF="graph/index.html">graph</A>
+<DD>Examples using <CODE>tbb::flow graph</CODE>.
<DT><A HREF="parallel_do/index.html">parallel_do</A>
<DD>Examples using <CODE>parallel_do</CODE>.
<DT><A HREF="parallel_for/index.html">parallel_for</A>
@@ -169,10 +173,9 @@ The environment may be set up, for a given type of shell window, by using one of
<A HREF="../index.html">Up to parent directory</A>
<p></p>
Copyright © 2005-2011 Intel Corporation. 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>
+Intel is a registered trademark or trademark 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.
</BODY>
diff --git a/examples/parallel_do/index.html b/examples/parallel_do/index.html
index 55572f2..1bb68b3 100644
--- a/examples/parallel_do/index.html
+++ b/examples/parallel_do/index.html
@@ -14,10 +14,9 @@ This directory has examples of the template <code>parallel_do</code>.
<A HREF="../index.html">Up to parent directory</A>
<p></p>
Copyright © 2005-2011 Intel Corporation. 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>
+Intel is a registered trademark or trademark 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.
</BODY>
diff --git a/examples/parallel_do/parallel_preorder/Makefile b/examples/parallel_do/parallel_preorder/Makefile
index 1aca995..5eea72c 100644
--- a/examples/parallel_do/parallel_preorder/Makefile
+++ b/examples/parallel_do/parallel_preorder/Makefile
@@ -34,6 +34,10 @@ ifneq (,$(shell which icc 2>/dev/null))
CXX=icc
endif # icc
+ifeq ($(shell uname), Linux)
+LIBS+= -lrt
+endif
+
all: release test
release: *.cpp
diff --git a/examples/parallel_do/parallel_preorder/index.html b/examples/parallel_do/parallel_preorder/index.html
index 31744ce..f1a059c 100644
--- a/examples/parallel_do/parallel_preorder/index.html
+++ b/examples/parallel_do/parallel_preorder/index.html
@@ -84,10 +84,9 @@ General build directions can be found <A HREF=../../index.html#build>here</A>.
<A HREF="../index.html">Up to parent directory</A>
<p></p>
Copyright © 2005-2011 Intel Corporation. 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>
+Intel is a registered trademark or trademark 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.
</BODY>
diff --git a/examples/parallel_do/parallel_preorder/msvs/parallel_preorder.vcproj b/examples/parallel_do/parallel_preorder/msvs/parallel_preorder.vcproj
index a8aa8af..2a0d923 100644
--- a/examples/parallel_do/parallel_preorder/msvs/parallel_preorder.vcproj
+++ b/examples/parallel_do/parallel_preorder/msvs/parallel_preorder.vcproj
@@ -43,7 +43,7 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
RuntimeLibrary="3"
UsePrecompiledHeader="0"
@@ -63,7 +63,7 @@
Name="VCLinkerTool"
AdditionalDependencies="tbb_debug.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+ 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"
@@ -93,7 +93,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 debug "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 debug "$(OutDir)""
/>
</Configuration>
<Configuration
@@ -122,7 +122,7 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
RuntimeLibrary="3"
UsePrecompiledHeader="0"
@@ -141,7 +141,7 @@
Name="VCLinkerTool"
AdditionalDependencies="tbb_debug.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+ 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"
@@ -171,7 +171,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 debug "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 debug "$(OutDir)""
/>
</Configuration>
<Configuration
@@ -198,7 +198,7 @@
/>
<Tool
Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
RuntimeLibrary="2"
UsePrecompiledHeader="0"
@@ -218,7 +218,7 @@
Name="VCLinkerTool"
AdditionalDependencies="tbb.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+ 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"
@@ -250,7 +250,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 release "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 release "$(OutDir)""
/>
</Configuration>
<Configuration
@@ -278,7 +278,7 @@
/>
<Tool
Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="WIN64;NDEBUG;_CONSOLE"
RuntimeLibrary="2"
UsePrecompiledHeader="0"
@@ -297,7 +297,7 @@
Name="VCLinkerTool"
AdditionalDependencies="tbb.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+ 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"
@@ -329,7 +329,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 release "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 release "$(OutDir)""
/>
</Configuration>
</Configurations>
diff --git a/examples/parallel_do/parallel_preorder/xcode/parallel_preorder.xcodeproj/project.pbxproj b/examples/parallel_do/parallel_preorder/xcode/parallel_preorder.xcodeproj/project.pbxproj
index 3c39a52..6773133 100644
--- a/examples/parallel_do/parallel_preorder/xcode/parallel_preorder.xcodeproj/project.pbxproj
+++ b/examples/parallel_do/parallel_preorder/xcode/parallel_preorder.xcodeproj/project.pbxproj
@@ -3,7 +3,7 @@
archiveVersion = 1;
classes = {
};
- objectVersion = 42;
+ objectVersion = 46;
objects = {
/* Begin PBXBuildFile section */
@@ -113,9 +113,16 @@
/* Begin PBXProject section */
08FB7793FE84155DC02AAC07 /* Project object */ = {
isa = PBXProject;
+ attributes = {
+ LastUpgradeCheck = 0410;
+ };
buildConfigurationList = 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "parallel_preorder" */;
- compatibilityVersion = "Xcode 2.4";
+ compatibilityVersion = "Xcode 3.2";
+ developmentRegion = English;
hasScannedForEncodings = 1;
+ knownRegions = (
+ en,
+ );
mainGroup = 08FB7794FE84155DC02AAC07 /* parallel_preorder */;
projectDirPath = "";
projectRoot = "";
@@ -144,14 +151,13 @@
buildSettings = {
COPY_PHASE_STRIP = NO;
GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
GCC_OPTIMIZATION_LEVEL = 0;
- GCC_VERSION = 4.0;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
HEADER_SEARCH_PATHS = ../../../../include;
INSTALL_PATH = "$(HOME)/bin";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
- "../../../../lib",
+ ../../../../lib,
);
PRODUCT_NAME = parallel_preorder;
ZERO_LINK = NO;
@@ -162,12 +168,12 @@
isa = XCBuildConfiguration;
buildSettings = {
GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
- GCC_VERSION = 4.0;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
HEADER_SEARCH_PATHS = ../../../../include;
INSTALL_PATH = "$(HOME)/bin";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
- "../../../../lib",
+ ../../../../lib,
);
PRODUCT_NAME = parallel_preorder;
ZERO_LINK = NO;
@@ -184,7 +190,6 @@
GCC_VERSION = 4.0;
GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
- PREBINDING = NO;
PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
SYMROOT = "/tmp/tbb-$(USER)";
};
@@ -200,7 +205,6 @@
GCC_VERSION = 4.0;
GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
- PREBINDING = NO;
PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
SYMROOT = "/tmp/tbb-$(USER)";
};
@@ -209,18 +213,16 @@
A1F593C60B8F0E6E00073279 /* Debug64 */ = {
isa = XCBuildConfiguration;
buildSettings = {
- ARCHS = "$(ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1)";
- ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1 = x86_64;
+ ARCHS = "$(ARCHS_STANDARD_64_BIT)";
COPY_PHASE_STRIP = NO;
GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
GCC_OPTIMIZATION_LEVEL = 0;
- GCC_VERSION = 4.0;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
HEADER_SEARCH_PATHS = ../../../../include;
INSTALL_PATH = "$(HOME)/bin";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
- "../../../../lib",
+ ../../../../lib,
);
PRODUCT_NAME = parallel_preorder;
ZERO_LINK = NO;
@@ -230,15 +232,14 @@
A1F593C70B8F0E6E00073279 /* Release64 */ = {
isa = XCBuildConfiguration;
buildSettings = {
- ARCHS = "$(ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1)";
- ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1 = x86_64;
+ ARCHS = "$(ARCHS_STANDARD_64_BIT)";
GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
- GCC_VERSION = 4.0;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
HEADER_SEARCH_PATHS = ../../../../include;
INSTALL_PATH = "$(HOME)/bin";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
- "../../../../lib",
+ ../../../../lib,
);
PRODUCT_NAME = parallel_preorder;
ZERO_LINK = NO;
@@ -260,7 +261,6 @@
"-m64",
);
OTHER_LDFLAGS = "-m64";
- PREBINDING = NO;
PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
SYMROOT = "/tmp/tbb-$(USER)";
};
@@ -281,7 +281,6 @@
"-m64",
);
OTHER_LDFLAGS = "-m64";
- PREBINDING = NO;
PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
SYMROOT = "/tmp/tbb-$(USER)";
};
diff --git a/examples/parallel_for/game_of_life/Makefile b/examples/parallel_for/game_of_life/Makefile
index dd68eac..39091c2 100644
--- a/examples/parallel_for/game_of_life/Makefile
+++ b/examples/parallel_for/game_of_life/Makefile
@@ -27,20 +27,27 @@
# GNU Makefile that builds and runs example.
PROG=game_of_life
ARGS=2:4 -t 5
+LIGHT_ARGS=1:2 -t 5
ifneq (,$(shell which icc 2>/dev/null))
CXX=icc
endif # icc
+ifeq ($(shell uname), Linux)
+LIBS+= -lrt
+endif
+
all: release test
release: src/Evolution.cpp src/Update_state.cpp src/Game_of_life.cpp
$(CXX) -O2 -DNDEBUG -D_CONSOLE $(CXXFLAGS) -o $(PROG) $^ -ltbb $(LIBS)
debug: src/Evolution.cpp src/Update_state.cpp src/Game_of_life.cpp
- $(CXX) -O0 -D_CONSOLE -g -DTBB_DO_ASSERT $(CXXFLAGS) -o $(PROG) $^ -ltbb_debug $(LIBS)
+ $(CXX) -O0 -D_CONSOLE -g -DTBB_USE_DEBUG $(CXXFLAGS) -o $(PROG) $^ -ltbb_debug $(LIBS)
clean:
rm -f $(PROG) *.o *.d
test:
./$(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 6a5ad9a..d6c81ac 100644
--- a/examples/parallel_for/game_of_life/Makefile.windows
+++ b/examples/parallel_for/game_of_life/Makefile.windows
@@ -29,9 +29,12 @@
# Just specify your program basename
PROG=game_of_life
ARGS=2:4 -t 5
+LIGHT_ARGS=1:2 -t 5
# Trying to find if icl.exe is set
-CXX = cl.exe
+CXX1 = $(TBB_CXX)-
+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 /D _CRT_SECURE_NO_DEPRECATE $(CXXFLAGS)
@@ -46,4 +49,6 @@ clean:
@cmd.exe /C del $(PROG).exe *.obj *.?db *.manifest
test:
$(PROG) $(ARGS)
+light_test:
+ $(PROG) $(LIGHT_ARGS)
diff --git a/examples/parallel_for/game_of_life/index.html b/examples/parallel_for/game_of_life/index.html
index cbb1d00..ebf0c86 100644
--- a/examples/parallel_for/game_of_life/index.html
+++ b/examples/parallel_for/game_of_life/index.html
@@ -44,10 +44,9 @@ For Windows* systems, Microsoft* Visual Studio* projects are provided for each o
<A HREF="../index.html">Up to parent directory</A>
<p></p>
Copyright © 2005-2011 Intel Corporation. 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>
+Intel is a registered trademark or trademark 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.
</BODY>
diff --git a/examples/parallel_for/game_of_life/msvs/Game_of_life.vcproj b/examples/parallel_for/game_of_life/msvs/Game_of_life.vcproj
index 0d976a8..554055a 100644
--- a/examples/parallel_for/game_of_life/msvs/Game_of_life.vcproj
+++ b/examples/parallel_for/game_of_life/msvs/Game_of_life.vcproj
@@ -45,7 +45,7 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="WIN32;_WINDOWS;_DEBUG;USE_SSE"
RuntimeLibrary="3"
UsePrecompiledHeader="0"
@@ -67,7 +67,7 @@
IgnoreImportLibrary="false"
AdditionalDependencies="tbb_debug.lib user32.lib $(NOINHERIT)"
LinkIncremental="2"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8;"
+ AdditionalLibraryDirectories="$(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc8;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc8;"
GenerateDebugInformation="true"
AssemblyDebug="1"
SubSystem="2"
@@ -98,7 +98,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 debug "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 debug "$(OutDir)""
/>
</Configuration>
<Configuration
@@ -129,7 +129,7 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="WIN64;_WINDOWS;_DEBUG"
RuntimeLibrary="3"
UsePrecompiledHeader="0"
@@ -152,7 +152,7 @@
IgnoreImportLibrary="false"
AdditionalDependencies="tbb_debug.lib user32.lib $(NOINHERIT)"
LinkIncremental="2"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+ AdditionalLibraryDirectories="$(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc8;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc8"
GenerateDebugInformation="true"
AssemblyDebug="1"
SubSystem="2"
@@ -183,7 +183,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 debug "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 debug "$(OutDir)""
/>
</Configuration>
<Configuration
@@ -213,7 +213,7 @@
<Tool
Name="VCCLCompilerTool"
AdditionalOptions="-S -03
"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="WIN32;_WINDOWS;NDEBUG"
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"
@@ -235,7 +235,7 @@
IgnoreImportLibrary="false"
AdditionalDependencies="tbb.lib user32.lib $(NOINHERIT)"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8;"
+ AdditionalLibraryDirectories="$(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc8;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc8;"
GenerateDebugInformation="true"
SubSystem="2"
OptimizeReferences="2"
@@ -267,7 +267,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 release "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 release "$(OutDir)""
/>
</Configuration>
<Configuration
@@ -298,7 +298,7 @@
<Tool
Name="VCCLCompilerTool"
AdditionalOptions="-S -03
"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="WIN64;_WINDOWS;NDEBUG"
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"
@@ -320,7 +320,7 @@
IgnoreImportLibrary="false"
AdditionalDependencies="tbb.lib user32.lib $(NOINHERIT)"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8;"
+ AdditionalLibraryDirectories="$(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc8;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc8;"
GenerateDebugInformation="true"
SubSystem="2"
OptimizeReferences="2"
@@ -352,7 +352,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 release "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 release "$(OutDir)""
/>
</Configuration>
<Configuration
@@ -382,7 +382,7 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE;USE_SSE"
ExceptionHandling="1"
RuntimeLibrary="3"
@@ -402,7 +402,7 @@
Name="VCLinkerTool"
AdditionalDependencies="tbb_debug.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8;"
+ AdditionalLibraryDirectories="$(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc8;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc8;"
GenerateDebugInformation="true"
ProgramDatabaseFile="$(TargetDir)$(TargetName).pdb"
SubSystem="1"
@@ -432,7 +432,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 debug "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 debug "$(OutDir)""
/>
</Configuration>
<Configuration
@@ -463,7 +463,7 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="WIN64;_DEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE"
ExceptionHandling="1"
RuntimeLibrary="3"
@@ -483,7 +483,7 @@
Name="VCLinkerTool"
AdditionalDependencies="tbb_debug.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8;"
+ AdditionalLibraryDirectories="$(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc8;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc8;"
GenerateDebugInformation="true"
ProgramDatabaseFile="$(TargetDir)$(TargetName).pdb"
SubSystem="1"
@@ -514,7 +514,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 debug "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 debug "$(OutDir)""
/>
</Configuration>
<Configuration
@@ -543,7 +543,7 @@
/>
<Tool
Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE;USE_SSE"
RuntimeLibrary="2"
Detect64BitPortabilityProblems="true"
@@ -562,7 +562,7 @@
Name="VCLinkerTool"
AdditionalDependencies="tbb.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+ 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"
@@ -594,7 +594,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 release "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 release "$(OutDir)""
/>
</Configuration>
<Configuration
@@ -624,7 +624,7 @@
/>
<Tool
Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="WIN64;NDEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE;USE_SSE"
RuntimeLibrary="2"
Detect64BitPortabilityProblems="false"
@@ -643,7 +643,7 @@
Name="VCLinkerTool"
AdditionalDependencies="tbb.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+ 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"
@@ -675,7 +675,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 release "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 release "$(OutDir)""
/>
</Configuration>
</Configurations>
diff --git a/examples/parallel_for/game_of_life/xcode/game_of_life.xcodeproj/project.pbxproj b/examples/parallel_for/game_of_life/xcode/game_of_life.xcodeproj/project.pbxproj
index 7eed01d..1c1cd6a 100644
--- a/examples/parallel_for/game_of_life/xcode/game_of_life.xcodeproj/project.pbxproj
+++ b/examples/parallel_for/game_of_life/xcode/game_of_life.xcodeproj/project.pbxproj
@@ -3,7 +3,7 @@
archiveVersion = 1;
classes = {
};
- objectVersion = 42;
+ objectVersion = 46;
objects = {
/* Begin PBXBuildFile section */
@@ -109,9 +109,16 @@
/* Begin PBXProject section */
08FB7793FE84155DC02AAC07 /* Project object */ = {
isa = PBXProject;
+ attributes = {
+ LastUpgradeCheck = 0410;
+ };
buildConfigurationList = 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "game_of_life" */;
- compatibilityVersion = "Xcode 2.4";
+ compatibilityVersion = "Xcode 3.2";
+ developmentRegion = English;
hasScannedForEncodings = 1;
+ knownRegions = (
+ en,
+ );
mainGroup = 08FB7794FE84155DC02AAC07 /* game_of_life */;
projectDirPath = "";
projectRoot = "";
@@ -140,10 +147,9 @@
buildSettings = {
COPY_PHASE_STRIP = NO;
GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = _CONSOLE;
- GCC_VERSION = 4.0;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
HEADER_SEARCH_PATHS = ../../../../include;
INSTALL_PATH = "$(HOME)/bin";
LIBRARY_SEARCH_PATHS = (
@@ -160,7 +166,7 @@
buildSettings = {
GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
GCC_PREPROCESSOR_DEFINITIONS = _CONSOLE;
- GCC_VERSION = 4.0;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
HEADER_SEARCH_PATHS = ../../../../include;
INSTALL_PATH = "$(HOME)/bin";
LIBRARY_SEARCH_PATHS = (
@@ -182,7 +188,6 @@
GCC_VERSION = 4.0;
GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
- PREBINDING = NO;
PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
SYMROOT = "/tmp/tbb-$(USER)";
};
@@ -198,7 +203,6 @@
GCC_VERSION = 4.0;
GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
- PREBINDING = NO;
PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
SYMROOT = "/tmp/tbb-$(USER)";
};
@@ -207,14 +211,12 @@
A1F593C60B8F0E6E00073279 /* Debug64 */ = {
isa = XCBuildConfiguration;
buildSettings = {
- ARCHS = "$(ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1)";
- ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1 = x86_64;
+ ARCHS = "$(ARCHS_STANDARD_64_BIT)";
COPY_PHASE_STRIP = NO;
GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = _CONSOLE;
- GCC_VERSION = 4.0;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
HEADER_SEARCH_PATHS = ../../../../include;
INSTALL_PATH = "$(HOME)/bin";
LIBRARY_SEARCH_PATHS = (
@@ -229,11 +231,10 @@
A1F593C70B8F0E6E00073279 /* Release64 */ = {
isa = XCBuildConfiguration;
buildSettings = {
- ARCHS = "$(ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1)";
- ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1 = x86_64;
+ ARCHS = "$(ARCHS_STANDARD_64_BIT)";
GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
GCC_PREPROCESSOR_DEFINITIONS = _CONSOLE;
- GCC_VERSION = 4.0;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
HEADER_SEARCH_PATHS = ../../../../include;
INSTALL_PATH = "$(HOME)/bin";
LIBRARY_SEARCH_PATHS = (
@@ -260,7 +261,6 @@
"-m64",
);
OTHER_LDFLAGS = "-m64";
- PREBINDING = NO;
PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
SYMROOT = "/tmp/tbb-$(USER)";
};
@@ -281,7 +281,6 @@
"-m64",
);
OTHER_LDFLAGS = "-m64";
- PREBINDING = NO;
PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
SYMROOT = "/tmp/tbb-$(USER)";
};
diff --git a/examples/parallel_for/index.html b/examples/parallel_for/index.html
index 86e978d..95f226c 100644
--- a/examples/parallel_for/index.html
+++ b/examples/parallel_for/index.html
@@ -20,10 +20,9 @@ This directory has examples of the template <code>parallel_for</code>.
<A HREF="../index.html">Up to parent directory</A>
<p></p>
Copyright © 2005-2011 Intel Corporation. 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>
+Intel is a registered trademark or trademark 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.
</BODY>
diff --git a/examples/parallel_for/polygon_overlay/Makefile b/examples/parallel_for/polygon_overlay/Makefile
index ae18695..2c4061d 100644
--- a/examples/parallel_for/polygon_overlay/Makefile
+++ b/examples/parallel_for/polygon_overlay/Makefile
@@ -27,6 +27,7 @@
# GNU Makefile that builds and runs example.
NAME=pover
ARGS=
+LIGHT_ARGS= --polys 10 --size 5x5
# The C++ compiler
ifneq (,$(shell which icc 2>/dev/null))
@@ -36,11 +37,17 @@ endif # icc
include ../../common/gui/Makefile.gmake
ifeq ($(UI),x)
-CXXFLAGS += -DX_FULLSYNC # TODO: is this necessary? -DUSE_SCALABLE_ALLOC=0
+UI_CXXFLAGS += -DX_FULLSYNC
endif # X
+override CXXFLAGS += $(UI_CXXFLAGS)
+
SRCFILES = ../../common/gui/$(UI)video.cpp pover_video.cpp polymain.cpp polyover.cpp
+ifeq ($(shell uname), Linux)
+LIBS+= -lrt
+endif
+
all: release test
resources:
@@ -51,7 +58,12 @@ ifeq ($(UI),mac)
endif
release: $(SRCFILES) resources
+ifeq ($(compiler),xl)
+ # Avoiding "1586-346 (U) An error occurred during code generation. The code generation return code was 40." with -O3.
+ $(CXX) -O2 -DNDEBUG $(CXXFLAGS) -o $(EXE) $(SRCFILES) -ltbb -ltbbmalloc $(LIBS)
+else
$(CXX) -O3 -DNDEBUG $(CXXFLAGS) -o $(EXE) $(SRCFILES) -ltbb -ltbbmalloc $(LIBS)
+endif
debug: $(SRCFILES) resources
$(CXX) -g -O0 -DTBB_USE_DEBUG -D_DEBUG $(CXXFLAGS) -o $(EXE) $(SRCFILES) -ltbb_debug -ltbbmalloc_debug $(LIBS)
@@ -68,3 +80,10 @@ ifeq ($(UI),mac)
else
./$(EXE) $(ARGS)
endif
+
+light_test:
+ifeq ($(UI),mac)
+ export DYLD_LIBRARY_PATH="$(DYLD_LIBRARY_PATH):$(TBBLIBSPATH)"; ./$(EXE) $(LIGHT_ARGS)
+else
+ ./$(EXE) $(LIGHT_ARGS)
+endif
diff --git a/examples/parallel_for/polygon_overlay/Makefile.windows b/examples/parallel_for/polygon_overlay/Makefile.windows
index a2c9707..2e5b9f6 100644
--- a/examples/parallel_for/polygon_overlay/Makefile.windows
+++ b/examples/parallel_for/polygon_overlay/Makefile.windows
@@ -29,6 +29,7 @@
# Just specify your program basename
PROG=Pover
ARGS=
+LIGHT_ARGS= --polys 10 --size 5x5
# Trying to find if icl.exe is set
CXX1 = $(TBB_CXX)-
@@ -60,6 +61,8 @@ clean:
@cmd.exe /C del $(PROG).exe *.obj *.?db *.manifest msvs\pover.res
test:
$(PROG) $(ARGS)
+light_test:
+ $(PROG) $(LIGHT_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
diff --git a/examples/parallel_for/polygon_overlay/index.html b/examples/parallel_for/polygon_overlay/index.html
index 70b8ccc..19d3f46 100644
--- a/examples/parallel_for/polygon_overlay/index.html
+++ b/examples/parallel_for/polygon_overlay/index.html
@@ -119,10 +119,9 @@ named pover.exe. To run these executables directly, use one or more of the foll
<A HREF="../index.html">Up to parent directory</A>
<p></p>
Copyright © 2005-2011 Intel Corporation. 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>
+Intel is a registered trademark or trademark 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.
</BODY>
diff --git a/examples/parallel_for/polygon_overlay/msvs/pover.vcproj b/examples/parallel_for/polygon_overlay/msvs/pover.vcproj
index 690197e..ac773e3 100644
--- a/examples/parallel_for/polygon_overlay/msvs/pover.vcproj
+++ b/examples/parallel_for/polygon_overlay/msvs/pover.vcproj
@@ -46,7 +46,7 @@
Optimization="0"
OmitFramePointers="true"
WholeProgramOptimization="true"
- AdditionalIncludeDirectories=""$(TBB30_INSTALL_DIR)\include""
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;TBB_USE_DEBUG"
RuntimeLibrary="3"
EnableFunctionLevelLinking="true"
@@ -67,7 +67,7 @@
Name="VCLinkerTool"
AdditionalDependencies="tbb_debug.lib tbbmalloc_debug.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+ AdditionalLibraryDirectories="$(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc8;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc8"
GenerateDebugInformation="true"
SubSystem="2"
TargetMachine="1"
@@ -97,7 +97,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 debug "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 debug "$(OutDir)""
/>
</Configuration>
<Configuration
@@ -129,7 +129,7 @@
Optimization="0"
OmitFramePointers="true"
WholeProgramOptimization="true"
- AdditionalIncludeDirectories=""$(TBB30_INSTALL_DIR)\include""
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="WIN64;_DEBUG;_WINDOWS;TBB_USE_DEBUG"
RuntimeLibrary="3"
EnableFunctionLevelLinking="true"
@@ -149,7 +149,7 @@
Name="VCLinkerTool"
AdditionalDependencies="tbb_debug.lib tbbmalloc_debug.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+ AdditionalLibraryDirectories="$(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc8;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc8"
GenerateDebugInformation="true"
SubSystem="2"
TargetMachine="17"
@@ -179,7 +179,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 debug "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 debug "$(OutDir)""
/>
</Configuration>
<Configuration
@@ -211,7 +211,7 @@
FavorSizeOrSpeed="1"
OmitFramePointers="true"
WholeProgramOptimization="true"
- AdditionalIncludeDirectories=""$(TBB30_INSTALL_DIR)\include""
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS"
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"
@@ -232,7 +232,7 @@
Name="VCLinkerTool"
AdditionalDependencies="tbb.lib tbbmalloc.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+ AdditionalLibraryDirectories="$(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc8;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc8"
GenerateDebugInformation="true"
SubSystem="2"
OptimizeReferences="2"
@@ -264,7 +264,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 release "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 release "$(OutDir)""
/>
</Configuration>
<Configuration
@@ -297,7 +297,7 @@
FavorSizeOrSpeed="1"
OmitFramePointers="true"
WholeProgramOptimization="true"
- AdditionalIncludeDirectories=""$(TBB30_INSTALL_DIR)\include""
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="WIN64;NDEBUG;_WINDOWS"
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"
@@ -317,7 +317,7 @@
Name="VCLinkerTool"
AdditionalDependencies="tbb.lib tbbmalloc.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+ AdditionalLibraryDirectories="$(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc8;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc8"
GenerateDebugInformation="true"
SubSystem="2"
OptimizeReferences="2"
@@ -349,7 +349,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 release "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 release "$(OutDir)""
/>
</Configuration>
<Configuration
@@ -382,7 +382,7 @@
FavorSizeOrSpeed="1"
OmitFramePointers="true"
WholeProgramOptimization="true"
- AdditionalIncludeDirectories=""$(TBB30_INSTALL_DIR)\include";"$(DXSDK_DIR)\include""
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(DXSDK_DIR)\include""
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS"
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"
@@ -403,7 +403,7 @@
Name="VCLinkerTool"
AdditionalDependencies="tbb.lib tbbmalloc.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8;$(DXSDK_DIR)\lib\x86"
+ AdditionalLibraryDirectories="$(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc8;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc8;$(DXSDK_DIR)\lib\x86"
GenerateDebugInformation="true"
SubSystem="2"
OptimizeReferences="2"
@@ -435,7 +435,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 release "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 release "$(OutDir)""
/>
</Configuration>
<Configuration
@@ -469,7 +469,7 @@
FavorSizeOrSpeed="1"
OmitFramePointers="true"
WholeProgramOptimization="true"
- AdditionalIncludeDirectories=""$(TBB30_INSTALL_DIR)\include";"$(DXSDK_DIR)\include""
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(DXSDK_DIR)\include""
PreprocessorDefinitions="WIN64;NDEBUG;_WINDOWS"
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"
@@ -489,7 +489,7 @@
Name="VCLinkerTool"
AdditionalDependencies="tbb.lib tbbmalloc.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8;$(DXSDK_DIR)\lib\x64"
+ AdditionalLibraryDirectories="$(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc8;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc8;$(DXSDK_DIR)\lib\x64"
GenerateDebugInformation="true"
SubSystem="2"
OptimizeReferences="2"
@@ -521,7 +521,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 release "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 release "$(OutDir)""
/>
</Configuration>
<Configuration
@@ -553,7 +553,7 @@
Optimization="0"
OmitFramePointers="true"
WholeProgramOptimization="true"
- AdditionalIncludeDirectories=""$(TBB30_INSTALL_DIR)\include";"$(DXSDK_DIR)\include""
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(DXSDK_DIR)\include""
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;TBB_USE_DEBUG"
RuntimeLibrary="3"
EnableFunctionLevelLinking="true"
@@ -574,7 +574,7 @@
Name="VCLinkerTool"
AdditionalDependencies="tbb_debug.lib tbbmalloc_debug.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8;"$(DXSDK_DIR)\lib\x86""
+ AdditionalLibraryDirectories="$(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc8;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc8;"$(DXSDK_DIR)\lib\x86""
GenerateDebugInformation="true"
SubSystem="2"
TargetMachine="1"
@@ -604,7 +604,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 debug "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 debug "$(OutDir)""
/>
</Configuration>
<Configuration
@@ -637,7 +637,7 @@
Optimization="0"
OmitFramePointers="true"
WholeProgramOptimization="true"
- AdditionalIncludeDirectories=""$(TBB30_INSTALL_DIR)\include";"$(DXSDK_DIR)\include""
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(DXSDK_DIR)\include""
PreprocessorDefinitions="WIN64;_DEBUG;_WINDOWS;TBB_USE_DEBUG"
RuntimeLibrary="3"
EnableFunctionLevelLinking="true"
@@ -657,7 +657,7 @@
Name="VCLinkerTool"
AdditionalDependencies="tbb_debug.lib tbbmalloc_debug.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8;"$(DXSDK_DIR)\lib\x64""
+ AdditionalLibraryDirectories="$(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc8;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc8;"$(DXSDK_DIR)\lib\x64""
GenerateDebugInformation="true"
SubSystem="2"
TargetMachine="17"
@@ -687,7 +687,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 debug "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 debug "$(OutDir)""
/>
</Configuration>
</Configurations>
diff --git a/examples/parallel_for/polygon_overlay/msvs/pover_cl.sln b/examples/parallel_for/polygon_overlay/msvs/pover_cl.sln
index bb1211d..50f9b86 100644
--- a/examples/parallel_for/polygon_overlay/msvs/pover_cl.sln
+++ b/examples/parallel_for/polygon_overlay/msvs/pover_cl.sln
@@ -10,8 +10,8 @@ Global
DD Release|x64 = DD Release|x64
GDI Debug|Win32 = GDI Debug|Win32
GDI Debug|x64 = GDI Debug|x64
- GDI Release|Win32 = GDI Release|Win32
- GDI Release|x64 = GDI Release|x64
+ _GDI Release|Win32 = _GDI Release|Win32
+ _GDI Release|x64 = _GDI Release|x64
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.DD Debug|Win32.ActiveCfg = DD Debug|Win32
@@ -26,10 +26,10 @@ Global
{4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.GDI Debug|Win32.Build.0 = Debug|Win32
{4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.GDI Debug|x64.ActiveCfg = Debug|x64
{4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.GDI Debug|x64.Build.0 = Debug|x64
- {4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.GDI Release|Win32.ActiveCfg = Release|Win32
- {4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.GDI Release|Win32.Build.0 = Release|Win32
- {4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.GDI Release|x64.ActiveCfg = Release|x64
- {4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.GDI Release|x64.Build.0 = Release|x64
+ {4BB7B455-1E09-41D3-BC89-6E67C9032F8C}._GDI Release|Win32.ActiveCfg = Release|Win32
+ {4BB7B455-1E09-41D3-BC89-6E67C9032F8C}._GDI Release|Win32.Build.0 = Release|Win32
+ {4BB7B455-1E09-41D3-BC89-6E67C9032F8C}._GDI Release|x64.ActiveCfg = Release|x64
+ {4BB7B455-1E09-41D3-BC89-6E67C9032F8C}._GDI Release|x64.Build.0 = Release|x64
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/examples/parallel_for/polygon_overlay/msvs/pover_icl.sln b/examples/parallel_for/polygon_overlay/msvs/pover_icl.sln
index 8c2c6cf..bf88dd2 100644
--- a/examples/parallel_for/polygon_overlay/msvs/pover_icl.sln
+++ b/examples/parallel_for/polygon_overlay/msvs/pover_icl.sln
@@ -10,8 +10,8 @@ Global
DD Release|x64 = DD Release|x64
GDI Debug|Win32 = GDI Debug|Win32
GDI Debug|x64 = GDI Debug|x64
- GDI Release|Win32 = GDI Release|Win32
- GDI Release|x64 = GDI Release|x64
+ _GDI Release|Win32 = _GDI Release|Win32
+ _GDI Release|x64 = _GDI Release|x64
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{B175D396-7260-45F8-9E18-842ED8A32A16}.DD Debug|Win32.ActiveCfg = DD Debug|Win32
@@ -26,14 +26,14 @@ Global
{B175D396-7260-45F8-9E18-842ED8A32A16}.GDI Debug|Win32.Build.0 = Debug|Win32
{B175D396-7260-45F8-9E18-842ED8A32A16}.GDI Debug|x64.ActiveCfg = Debug|x64
{B175D396-7260-45F8-9E18-842ED8A32A16}.GDI Debug|x64.Build.0 = Debug|x64
- {B175D396-7260-45F8-9E18-842ED8A32A16}.GDI Release|Win32.ActiveCfg = Release|Win32
- {B175D396-7260-45F8-9E18-842ED8A32A16}.GDI Release|Win32.Build.0 = Release|Win32
- {B175D396-7260-45F8-9E18-842ED8A32A16}.GDI Release|x64.ActiveCfg = Release|x64
- {B175D396-7260-45F8-9E18-842ED8A32A16}.GDI Release|x64.Build.0 = Release|x64
- {4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.GDI Release|x64.Build.0 = Release|x64
- {4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.GDI Release|x64.ActiveCfg = Release|x64
- {4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.GDI Release|Win32.Build.0 = Release|Win32
- {4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.GDI Release|Win32.ActiveCfg = Release|Win32
+ {B175D396-7260-45F8-9E18-842ED8A32A16}._GDI Release|Win32.ActiveCfg = Release|Win32
+ {B175D396-7260-45F8-9E18-842ED8A32A16}._GDI Release|Win32.Build.0 = Release|Win32
+ {B175D396-7260-45F8-9E18-842ED8A32A16}._GDI Release|x64.ActiveCfg = Release|x64
+ {B175D396-7260-45F8-9E18-842ED8A32A16}._GDI Release|x64.Build.0 = Release|x64
+ {4BB7B455-1E09-41D3-BC89-6E67C9032F8C}._GDI Release|x64.Build.0 = Release|x64
+ {4BB7B455-1E09-41D3-BC89-6E67C9032F8C}._GDI Release|x64.ActiveCfg = Release|x64
+ {4BB7B455-1E09-41D3-BC89-6E67C9032F8C}._GDI Release|Win32.Build.0 = Release|Win32
+ {4BB7B455-1E09-41D3-BC89-6E67C9032F8C}._GDI Release|Win32.ActiveCfg = Release|Win32
{4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.GDI Debug|x64.Build.0 = Debug|x64
{4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.GDI Debug|x64.ActiveCfg = Debug|x64
{4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.GDI Debug|Win32.Build.0 = Debug|Win32
diff --git a/examples/parallel_for/polygon_overlay/xcode/PolygonOverlay.xcodeproj/project.pbxproj b/examples/parallel_for/polygon_overlay/xcode/PolygonOverlay.xcodeproj/project.pbxproj
index 0d4575c..b31a8db 100644
--- a/examples/parallel_for/polygon_overlay/xcode/PolygonOverlay.xcodeproj/project.pbxproj
+++ b/examples/parallel_for/polygon_overlay/xcode/PolygonOverlay.xcodeproj/project.pbxproj
@@ -3,7 +3,7 @@
archiveVersion = 1;
classes = {
};
- objectVersion = 42;
+ objectVersion = 46;
objects = {
/* Begin PBXBuildFile section */
@@ -11,7 +11,6 @@
6A6DAA980DA2C0B3008D95BD /* polyover.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6A6DAA900DA2C0B3008D95BD /* polyover.cpp */; };
6A6DAA9B0DA2C0B3008D95BD /* pover_video.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6A6DAA930DA2C0B3008D95BD /* pover_video.cpp */; };
8D0C4E8E0486CD37000505A6 /* main.nib in Resources */ = {isa = PBXBuildFile; fileRef = 02345980000FD03B11CA0E72 /* main.nib */; };
- A12649490B8392750091D5AD /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A1E3E7BC0B3AD4EC007C3AB5 /* OpenGL.framework */; };
A126495E0B83936D0091D5AD /* Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 8D0C4E960486CD37000505A6 /* Info.plist */; };
A18D2A340B861B99007D8D2C /* libtbb.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = A18D2A330B861B99007D8D2C /* libtbb.dylib */; };
A1976ADA0DF6A6910032C3EA /* libtbbmalloc.dylib in CopyFiles */ = {isa = PBXBuildFile; fileRef = A1976AD90DF6A6910032C3EA /* libtbbmalloc.dylib */; };
@@ -65,7 +64,6 @@
buildActionMask = 2147483647;
files = (
A1E3E7BD0B3AD4EC007C3AB5 /* OpenGL.framework in Frameworks */,
- A12649490B8392750091D5AD /* OpenGL.framework in Frameworks */,
A18D2A340B861B99007D8D2C /* libtbb.dylib in Frameworks */,
A1976ADF0DF6A6E10032C3EA /* libtbbmalloc.dylib in Frameworks */,
A1A8F41E0B8B4DBE001C55B1 /* AGL.framework in Frameworks */,
@@ -161,9 +159,16 @@
/* Begin PBXProject section */
20286C28FDCF999611CA2CEA /* Project object */ = {
isa = PBXProject;
+ attributes = {
+ LastUpgradeCheck = 0410;
+ };
buildConfigurationList = C0E91AC908A95435008D54AB /* Build configuration list for PBXProject "PolygonOverlay" */;
- compatibilityVersion = "Xcode 2.4";
+ compatibilityVersion = "Xcode 3.2";
+ developmentRegion = English;
hasScannedForEncodings = 1;
+ knownRegions = (
+ en,
+ );
mainGroup = 20286C29FDCF999611CA2CEA /* PolygonOverlay */;
projectDirPath = "";
projectRoot = "";
@@ -216,17 +221,17 @@
buildSettings = {
COPY_PHASE_STRIP = NO;
GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
GCC_MODEL_TUNING = "";
GCC_OPTIMIZATION_LEVEL = 0;
- INSTALL_PATH = "$(HOME)/Applications";
+ GCC_VERSION = "";
HEADER_SEARCH_PATHS = ../../../../include;
+ IBC_STRIP_NIBS = NO;
+ INSTALL_PATH = "$(HOME)/Applications";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
../../../../lib,
);
PRODUCT_NAME = PolygonOverlay;
- GCC_VERSION = 4.0;
};
name = Debug;
};
@@ -235,31 +240,33 @@
buildSettings = {
GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
GCC_MODEL_TUNING = "";
- INSTALL_PATH = "$(HOME)/Applications";
+ GCC_VERSION = "";
HEADER_SEARCH_PATHS = ../../../../include;
+ IBC_STRIP_NIBS = NO;
+ INSTALL_PATH = "$(HOME)/Applications";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
../../../../lib,
);
PRODUCT_NAME = PolygonOverlay;
- GCC_VERSION = 4.0;
};
name = Release;
};
C0E91ACA08A95435008D54AB /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
- ARCHS = i386;
+ ARCHS = "$(ARCHS_STANDARD_32_BIT)";
GCC_AUTO_VECTORIZATION = YES;
GCC_ENABLE_CPP_RTTI = YES;
GCC_ENABLE_SSE3_EXTENSIONS = YES;
GCC_MODEL_TUNING = "";
GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_VERSION = "";
GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = NO;
+ IBC_STRIP_NIBS = NO;
MACH_O_TYPE = mh_execute;
- PREBINDING = NO;
PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
- GCC_VERSION = 4.0;
+ SDKROOT = macosx10.6;
SYMROOT = "/tmp/tbb-$(USER)";
};
name = Debug;
@@ -267,17 +274,18 @@
C0E91ACB08A95435008D54AB /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
- ARCHS = i386;
+ ARCHS = "$(ARCHS_STANDARD_32_BIT)";
GCC_AUTO_VECTORIZATION = YES;
GCC_ENABLE_CPP_RTTI = YES;
GCC_ENABLE_SSE3_EXTENSIONS = YES;
GCC_MODEL_TUNING = "";
GCC_OPTIMIZATION_LEVEL = 3;
+ GCC_VERSION = "";
GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = NO;
+ IBC_STRIP_NIBS = NO;
MACH_O_TYPE = mh_execute;
- PREBINDING = NO;
PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
- GCC_VERSION = 4.0;
+ SDKROOT = macosx10.6;
SYMROOT = "/tmp/tbb-$(USER)";
};
name = Release;
diff --git a/examples/parallel_for/seismic/Makefile b/examples/parallel_for/seismic/Makefile
index b5e700c..4f57ee6 100644
--- a/examples/parallel_for/seismic/Makefile
+++ b/examples/parallel_for/seismic/Makefile
@@ -26,7 +26,9 @@
# GNU Makefile that builds and runs example.
NAME=seismic
-ARGS=- 300
+ARGS=0:4 300
+PERF_RUN_ARGS=auto 10000 silent
+LIGHT_ARGS=1:2 100
# The C++ compiler
ifneq (,$(shell which icc 2>/dev/null))
@@ -34,6 +36,13 @@ CXX=icc
endif # icc
include ../../common/gui/Makefile.gmake
+override CXXFLAGS += $(UI_CXXFLAGS)
+
+SOURCES= ../../common/gui/$(UI)video.cpp universe.cpp seismic_video.cpp main.cpp
+
+ifeq ($(shell uname), Linux)
+LIBS+= -lrt
+endif
all: release test
@@ -44,11 +53,11 @@ ifeq ($(UI),mac)
$(PBXCP) xcode/Info.plist $(APPRES)
endif
-release: ../../common/gui/$(UI)video.cpp SeismicSimulation.cpp resources
- $(CXX) -O2 -DNDEBUG $(CXXFLAGS) -o $(EXE) $< SeismicSimulation.cpp -ltbb $(LIBS)
+release: $(SOURCES) resources
+ $(CXX) -O2 -DNDEBUG $(CXXFLAGS) -o $(EXE) $(SOURCES) -ltbb $(LIBS)
-debug: ../../common/gui/$(UI)video.cpp SeismicSimulation.cpp resources
- $(CXX) -g -O0 -DTBB_USE_DEBUG $(CXXFLAGS) -o $(EXE) $< SeismicSimulation.cpp -ltbb_debug $(LIBS)
+debug: resources
+ $(CXX) -g -O0 -DTBB_USE_DEBUG $(CXXFLAGS) -o $(EXE) $(SOURCES) -ltbb_debug $(LIBS)
clean:
$(RM) $(EXE) *.o *.d
@@ -62,3 +71,12 @@ ifeq ($(UI),mac)
else
./$(EXE) $(ARGS)
endif
+
+perf_build: resources
+ $(CXX) -O2 -msse2 -DNDEBUG $(CXXFLAGS) -o $(EXE) $(SOURCES) -ltbb $(LIBS)
+
+perf_run:
+ ./$(EXE) $(PERF_RUN_ARGS)
+
+light_test:
+ ./$(EXE) $(LIGHT_ARGS)
diff --git a/examples/parallel_for/seismic/Makefile.windows b/examples/parallel_for/seismic/Makefile.windows
index 3b00698..eb92761 100644
--- a/examples/parallel_for/seismic/Makefile.windows
+++ b/examples/parallel_for/seismic/Makefile.windows
@@ -28,7 +28,9 @@
# Just specify your program basename
PROG=Seismic
-ARGS=- 300
+ARGS=0:4 300
+PERF_RUN_ARGS=auto 10000 silent
+LIGHT_ARGS=1:2 100
# Trying ot find if icl.exe is set
CXX1 = $(TBB_CXX)-
@@ -48,16 +50,26 @@ ARCH2 = $(ARCH1:intel64-=AMD64)
XARCH = $(ARCH2:-=x86)
MAKEINC = ../../common/gui/Makefile.win
-
+SOURCES = seismic_video.cpp universe.cpp main.cpp
+
all: release test
release: compiler_check
- @$(MAKE) -f $(MAKEINC) UI=$(UI) CXX="$(CXX)" CXXFLAGS="$(CXXFLAGS)" LFLAGS="$(LDFLAGS) tbb.lib $(LIBS)" XARCH=$(XARCH) RCNAME=SeismicSimulation SOURCE=SeismicSimulation.cpp EXE=$(PROG).exe build_one
+ @$(MAKE) -f $(MAKEINC) UI=$(UI) CXX="$(CXX)" CXXFLAGS="$(CXXFLAGS)" LFLAGS="$(LDFLAGS) tbb.lib $(LIBS)" XARCH=$(XARCH) RCNAME=SeismicSimulation SOURCE="$(SOURCES)" EXE=$(PROG).exe build_one
debug: compiler_check
- @$(MAKE) -f $(MAKEINC) UI=$(UI) DEBUG=_debug CXX="$(CXX)" CXXFLAGS="$(CXXFLAGS) /D TBB_USE_DEBUG" LFLAGS="$(LDFLAGS) tbb_debug.lib $(LIBS)" XARCH=$(XARCH) RCNAME=SeismicSimulation SOURCE=SeismicSimulation.cpp EXE=$(PROG).exe build_one
+ @$(MAKE) -f $(MAKEINC) UI=$(UI) DEBUG=_debug CXX="$(CXX)" CXXFLAGS="$(CXXFLAGS) /D TBB_USE_DEBUG" LFLAGS="$(LDFLAGS) tbb_debug.lib $(LIBS)" XARCH=$(XARCH) RCNAME=SeismicSimulation SOURCE="$(SOURCES)" EXE=$(PROG).exe build_one
clean:
@cmd.exe /C del $(PROG).exe *.obj *.?db *.manifest msvs\SeismicSimulation.res >nul 2>&1
test:
- $(PROG) $(ARGS)
+ $(PROG) $(ARGS)
+
+perf_build: compiler_check
+ @$(MAKE) -f $(MAKEINC) UI=con CXX="$(CXX)" CXXFLAGS="$(CXXFLAGS)" LFLAGS="$(LDFLAGS) tbb.lib $(LIBS)" XARCH=$(XARCH) RCNAME=SeismicSimulation SOURCE="$(SOURCES) " EXE=$(PROG).exe build_one
+perf_run:
+ $(PROG) $(PERF_RUN_ARGS)
+
+light_test:
+ $(PROG) $(LIGHT_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
diff --git a/examples/parallel_for/seismic/SeismicSimulation.cpp b/examples/parallel_for/seismic/SeismicSimulation.cpp
deleted file mode 100644
index 985af68..0000000
--- a/examples/parallel_for/seismic/SeismicSimulation.cpp
+++ /dev/null
@@ -1,439 +0,0 @@
-/*
- Copyright 2005-2011 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 _CRT_SECURE_NO_DEPRECATE
-#define VIDEO_WINMAIN_ARGS
-#include "../../common/gui/video.h"
-#include <cstdlib>
-#include <cstdio>
-#include <cstring>
-#include <cctype>
-#include <cassert>
-#include <math.h>
-#include "tbb/task_scheduler_init.h"
-#include "tbb/blocked_range.h"
-#include "tbb/parallel_for.h"
-#include "tbb/tick_count.h"
-
-using namespace std;
-
-#ifdef _MSC_VER
-// warning C4068: unknown pragma
-#pragma warning(disable: 4068)
-#endif
-
-#define DEFAULT_NUMBER_OF_FRAMES 100
-int number_of_frames = -1;
-const size_t MAX_WIDTH = 1024;
-const size_t MAX_HEIGHT = 512;
-
-int UniverseHeight=MAX_HEIGHT;
-int UniverseWidth=MAX_WIDTH;
-
-typedef float value;
-
-//! Velocity at each grid point
-static value V[MAX_HEIGHT][MAX_WIDTH];
-
-//! Horizontal stress
-static value S[MAX_HEIGHT][MAX_WIDTH];
-
-//! Vertical stress
-static value T[MAX_HEIGHT][MAX_WIDTH];
-
-//! Coefficient related to modulus
-static value M[MAX_HEIGHT][MAX_WIDTH];
-
-//! Coefficient related to lightness
-static value L[MAX_HEIGHT][MAX_WIDTH];
-
-//! Damping coefficients
-static value D[MAX_HEIGHT][MAX_WIDTH];
-
-/** Affinity is an argument to parallel_for to hint that an iteration of a loop
- is best replayed on the same processor for each execution of the loop.
- It is a global object because it must remember where the iterations happened
- in previous executions. */
-static tbb::affinity_partitioner Affinity;
-
-enum MaterialType {
- WATER=0,
- SANDSTONE=1,
- SHALE=2
-};
-
-//! Values are MaterialType, cast to an unsigned char to save space.
-static unsigned char Material[MAX_HEIGHT][MAX_WIDTH];
-
-static const colorcomp_t MaterialColor[4][3] = { // BGR
- {96,0,0}, // WATER
- {0,48,48}, // SANDSTONE
- {32,32,23} // SHALE
-};
-
-static const int DamperSize = 32;
-
-static const int ColorMapSize = 1024;
-static color_t ColorMap[4][ColorMapSize];
-
-static int PulseTime = 100;
-static int PulseCounter;
-static int PulseX = UniverseWidth/3;
-static int PulseY = UniverseHeight/4;
-
-static bool InitIsParallel = true;
-const char *titles[2] = {"Seismic Simulation: Serial", "Seismic Simulation: Parallel"};
-//! It is used for console mode for test with different number of threads and also has
-//! meaning for gui: threads_low - use sepatate event/updating loop thread (>0) or not (0).
-//! threads_high - initialization value for scheduler
-int threads_low = 0, threads_high = tbb::task_scheduler_init::automatic;
-
-static void UpdatePulse() {
- if( PulseCounter>0 ) {
- value t = (PulseCounter-PulseTime/2)*0.05f;
- V[PulseY][PulseX] += 64*sqrt(M[PulseY][PulseX])*exp(-t*t);
- --PulseCounter;
- }
-}
-
-static void SerialUpdateStress() {
- drawing_area drawing(0, 0, UniverseWidth, UniverseHeight);
- for( int i=1; i<UniverseHeight-1; ++i ) {
- drawing.set_pos(1, i);
-#pragma ivdep
- for( int j=1; j<UniverseWidth-1; ++j ) {
- S[i][j] += M[i][j]*(V[i][j+1]-V[i][j]);
- T[i][j] += M[i][j]*(V[i+1][j]-V[i][j]);
- int index = (int)(V[i][j]*(ColorMapSize/2)) + ColorMapSize/2;
- if( index<0 ) index = 0;
- if( index>=ColorMapSize ) index = ColorMapSize-1;
- color_t* c = ColorMap[Material[i][j]];
- drawing.put_pixel(c[index]);
- }
- }
-}
-
-struct UpdateStressBody {
- void operator()( const tbb::blocked_range<int>& range ) const {
- drawing_area drawing(0, range.begin(), UniverseWidth, range.end()-range.begin());
- int i_end = range.end();
- for( int y = 0, i=range.begin(); i!=i_end; ++i,y++ ) {
- drawing.set_pos(1, y);
-#pragma ivdep
- for( int j=1; j<UniverseWidth-1; ++j ) {
- S[i][j] += M[i][j]*(V[i][j+1]-V[i][j]);
- T[i][j] += M[i][j]*(V[i+1][j]-V[i][j]);
- int index = (int)(V[i][j]*(ColorMapSize/2)) + ColorMapSize/2;
- if( index<0 ) index = 0;
- if( index>=ColorMapSize ) index = ColorMapSize-1;
- color_t* c = ColorMap[Material[i][j]];
- drawing.put_pixel(c[index]);
- }
- }
- }
-};
-
-static void ParallelUpdateStress() {
- tbb::parallel_for( tbb::blocked_range<int>( 1, UniverseHeight-1 ), // Index space for loop
- UpdateStressBody(), // Body of loop
- Affinity ); // Affinity hint
-}
-
-static void SerialUpdateVelocity() {
- for( int i=1; i<UniverseHeight-1; ++i )
-#pragma ivdep
- for( int j=1; j<UniverseWidth-1; ++j )
- V[i][j] = D[i][j]*(V[i][j] + L[i][j]*(S[i][j] - S[i][j-1] + T[i][j] - T[i-1][j]));
-}
-
-struct UpdateVelocityBody {
- void operator()( const tbb::blocked_range<int>& range ) const {
- int i_end = range.end();
- for( int i=range.begin(); i!=i_end; ++i )
-#pragma ivdep
- for( int j=1; j<UniverseWidth-1; ++j )
- V[i][j] = D[i][j]*(V[i][j] + L[i][j]*(S[i][j] - S[i][j-1] + T[i][j] - T[i-1][j]));
- }
-};
-
-static void ParallelUpdateVelocity() {
- tbb::parallel_for( tbb::blocked_range<int>( 1, UniverseHeight-1 ), // Index space for loop
- UpdateVelocityBody(), // Body of loop
- Affinity ); // Affinity hint
-}
-
-void SerialUpdateUniverse() {
- UpdatePulse();
- SerialUpdateStress();
- SerialUpdateVelocity();
-}
-
-void ParallelUpdateUniverse() {
- UpdatePulse();
- ParallelUpdateStress();
- ParallelUpdateVelocity();
-}
-
-class seismic_video : public video
-{
- void on_mouse(int x, int y, int key) {
- if(key == 1 && PulseCounter == 0) {
- PulseCounter = PulseTime;
- PulseX = x; PulseY = y;
- }
- }
- void on_key(int key) {
- key &= 0xff;
- if(char(key) == ' ') InitIsParallel = !InitIsParallel;
- else if(char(key) == 'p') InitIsParallel = true;
- else if(char(key) == 's') InitIsParallel = false;
- else if(char(key) == 'e') updating = true;
- else if(char(key) == 'd') updating = false;
- else if(key == 27) running = false;
- title = InitIsParallel?titles[1]:titles[0];
- }
- void on_process() {
- tbb::task_scheduler_init Init(threads_high);
- do {
- if( InitIsParallel )
- ParallelUpdateUniverse();
- else
- SerialUpdateUniverse();
- if( number_of_frames > 0 ) --number_of_frames;
- } while(next_frame() && number_of_frames);
- }
-} video;
-
-void InitializeUniverse() {
- PulseCounter = PulseTime;
- // Initialize V, S, and T to slightly non-zero values, in order to avoid denormal waves.
- for( int i=0; i<UniverseHeight; ++i )
-#pragma ivdep
- for( int j=0; j<UniverseWidth; ++j ) {
- T[i][j] = S[i][j] = V[i][j] = value(1.0E-6);
- }
- for( int i=1; i<UniverseHeight-1; ++i ) {
- for( int j=1; j<UniverseWidth-1; ++j ) {
- float x = float(j-UniverseWidth/2)/(UniverseWidth/2);
- value t = (value)i/UniverseHeight;
- MaterialType m;
- D[i][j] = 1.0;
- // Coefficient values are fictitious, and chosen to visually exaggerate
- // physical effects such as Rayleigh waves. The fabs/exp line generates
- // a shale layer with a gentle upwards slope and an anticline.
- if( t<0.3f ) {
- m = WATER;
- M[i][j] = 0.125;
- L[i][j] = 0.125;
- } else if( fabs(t-0.7+0.2*exp(-8*x*x)+0.025*x)<=0.1 ) {
- m = SHALE;
- M[i][j] = 0.5;
- L[i][j] = 0.6;
- } else {
- m = SANDSTONE;
- M[i][j] = 0.3;
- L[i][j] = 0.4;
- }
- Material[i][j] = m;
- }
- }
- value scale = 2.0f/ColorMapSize;
- for( int k=0; k<4; ++k ) {
- for( int i=0; i<ColorMapSize; ++i ) {
- colorcomp_t c[3];
- value t = (i-ColorMapSize/2)*scale;
- value r = t>0 ? t : 0;
- value b = t<0 ? -t : 0;
- value g = 0.5f*fabs(t);
- memcpy(c, MaterialColor[k], sizeof(c));
- c[2] = colorcomp_t(r*(255-c[2])+c[2]);
- c[1] = colorcomp_t(g*(255-c[1])+c[1]);
- c[0] = colorcomp_t(b*(255-c[0])+c[0]);
- ColorMap[k][i] = video.get_color(c[2], c[1], c[0]);
- }
- }
- // Set damping coefficients around border to reduce reflections from boundaries.
- value d = 1.0;
- for( int k=DamperSize-1; k>0; --k ) {
- d *= 1-1.0f/(DamperSize*DamperSize);
- for( int j=1; j<UniverseWidth-1; ++j ) {
- D[k][j] *= d;
- D[UniverseHeight-1-k][j] *= d;
- }
- for( int i=1; i<UniverseHeight-1; ++i ) {
- D[i][k] *= d;
- D[i][UniverseWidth-1-k] *= d;
- }
- }
-}
-
-//////////////////////////////// Interface ////////////////////////////////////
-#ifdef _WINDOWS
-#include "msvs/resource.h"
-#endif
-
-int main(int argc, char *argv[])
-{
- // threads number init
- if(argc > 1 && isdigit(argv[1][0])) {
- char* end; threads_high = threads_low = (int)strtol(argv[1],&end,0);
- switch( *end ) {
- case ':': threads_high = (int)strtol(end+1,0,0); break;
- case '\0': break;
- default: printf("unexpected character = %c\n",*end);
- }
- }
- if (argc > 2 && isdigit(argv[2][0])){
- number_of_frames = (int)strtol(argv[2],0,0);
- }
- // video layer init
- video.title = InitIsParallel?titles[1]:titles[0];
-#ifdef _WINDOWS
- #define MAX_LOADSTRING 100
- TCHAR szWindowClass[MAX_LOADSTRING]; // the main window class name
- LoadStringA(video::win_hInstance, IDC_SEISMICSIMULATION, szWindowClass, MAX_LOADSTRING);
- LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
- WNDCLASSEX wcex; memset(&wcex, 0, sizeof(wcex));
- wcex.lpfnWndProc = (WNDPROC)WndProc;
- wcex.hIcon = LoadIcon(video::win_hInstance, MAKEINTRESOURCE(IDI_SEISMICSIMULATION));
- wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
- wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
- wcex.lpszMenuName = LPCTSTR(IDC_SEISMICSIMULATION);
- wcex.lpszClassName = szWindowClass;
- wcex.hIconSm = LoadIcon(video::win_hInstance, MAKEINTRESOURCE(IDI_SMALL));
- video.win_set_class(wcex); // ascii convention here
- video.win_load_accelerators(IDC_SEISMICSIMULATION);
-#endif
- if(video.init_window(UniverseWidth, UniverseHeight)) {
- video.calc_fps = true;
- video.threaded = threads_low > 0;
- // video is ok, init universe
- InitializeUniverse();
- // main loop
- video.main_loop();
- }
- else if(video.init_console()) {
- // do console mode
- if(number_of_frames <= 0) number_of_frames = DEFAULT_NUMBER_OF_FRAMES;
- if(threads_high == tbb::task_scheduler_init::automatic) threads_high = 4;
- if(threads_high < threads_low) threads_high = threads_low;
- for( int p = threads_low; p <= threads_high; ++p ) {
- InitializeUniverse();
- tbb::task_scheduler_init init(tbb::task_scheduler_init::deferred);
- if( p > 0 )
- init.initialize( p );
- tbb::tick_count t0 = tbb::tick_count::now();
- if( p > 0 )
- for( int i=0; i<number_of_frames; ++i )
- ParallelUpdateUniverse();
- else
- for( int i=0; i<number_of_frames; ++i )
- SerialUpdateUniverse();
- tbb::tick_count t1 = tbb::tick_count::now();
- printf("%.1f frame per sec", number_of_frames/(t1-t0).seconds());
- if( p > 0 )
- printf(" with %d way parallelism\n",p);
- else
- printf(" with serial version\n");
- }
- }
- video.terminate();
- return 0;
-}
-
-#ifdef _WINDOWS
-//
-// FUNCTION: WndProc(HWND, unsigned, WORD, LONG)
-//
-// PURPOSE: Processes messages for the main window.
-//
-// WM_COMMAND - process the application menu
-// WM_PAINT - Paint the main window
-// WM_DESTROY - post a quit message and return
-//
-//
-LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
-{
- switch (message)
- {
- case WM_INITDIALOG: return TRUE;
- case WM_COMMAND:
- if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) {
- EndDialog(hDlg, LOWORD(wParam));
- return TRUE;
- }
- break;
- }
- return FALSE;
-}
-
-LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
-{
- int wmId, wmEvent;
- switch (message) {
- case WM_COMMAND:
- wmId = LOWORD(wParam);
- wmEvent = HIWORD(wParam);
- // Parse the menu selections:
- switch (wmId)
- {
- case IDM_ABOUT:
- DialogBox(video::win_hInstance, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, (DLGPROC)About);
- break;
- case IDM_EXIT:
- PostQuitMessage(0);
- break;
- case ID_FILE_PARALLEL:
- if( !InitIsParallel ) {
- InitIsParallel = true;
- video.title = titles[1];
- }
- break;
- case ID_FILE_SERIAL:
- if( InitIsParallel ) {
- InitIsParallel = false;
- video.title = titles[0];
- }
- break;
- case ID_FILE_ENABLEGUI:
- video.updating = true;
- break;
- case ID_FILE_DISABLEGUI:
- video.updating = false;
- break;
- default:
- return DefWindowProc(hWnd, message, wParam, lParam);
- }
- break;
- default:
- return DefWindowProc(hWnd, message, wParam, lParam);
- }
- return 0;
-}
-
-#endif
diff --git a/examples/parallel_for/seismic/index.html b/examples/parallel_for/seismic/index.html
index ff3e812..453cdad 100644
--- a/examples/parallel_for/seismic/index.html
+++ b/examples/parallel_for/seismic/index.html
@@ -2,12 +2,20 @@
<BODY>
<H2>Overview</H2>
-Parallel seismic simulation that demonstrates use of parallel_for.
+Parallel seismic wave simulation that demonstrates use of parallel_for and affinity_partitioner.
<H2>Files</H2>
<DL>
-<DT><A HREF="SeismicSimulation.cpp">SeismicSimulation.cpp</A>
-<DD>Source code that does wave propagation.
+<DT><A HREF="main.cpp">main.cpp</A>
+<DD>Main program which parses command line options and runs the algorithm with different numbers of threads.
+<DT><A HREF="universe.h">universe.h</A>
+<DD>Wave propagation methods interface.
+<DT><A HREF="universe.cpp">universe.cpp</A>
+<DD>Wave propagation methods implementation.
+<DT><A HREF="seismic_video.h">seismic_video.h</A>
+<DD>GUI mode support interface.
+<DT><A HREF="seismic_video.cpp">seismic_video.cpp</A>
+<DD>GUI mode support implementation.
<DT><A HREF="Makefile">Makefile</A>
<DD>Makefile for building example.
</DL>
@@ -26,14 +34,14 @@ The following additional options are supported:
<DL>
<DT><TT>make [(general targets: {release, debug} [test])] UI={con, gdi, dd, x, mac}</TT>
<DD>Build and run as usual, but build with the specified GUI driver: console, GDI+*, Direct Draw*, X11, or OpenGL*
- (see the description of the <A HREF=../../common/index.html>common GUI code</A>
- for more information on available graphics support).
+ (see the description of the <A HREF=../../common/index.html>common GUI code</A>
+ for more information on available graphics support).
For Linux* and Mac OS* X systems, the best available driver is detected automatically by the Makefile.
For Windows* systems, UI=gdi is the default GUI driver; compiling with UI=dd may offer superior
- performance, but can only be used if the Microsoft* Direct Draw* SDK is installed on your system
- and if overlay is supported by your graphics card.
+ performance, but can only be used if the Microsoft* Direct Draw* SDK is installed on your system
+ and if overlay is supported by your graphics card.
Use UI=con to build without the GUI for use in making performance measurements
- <I>(strongly recommended when measuring performance or scalability; see note below)</I>.
+ <I>(strongly recommended when measuring performance or scalability; see note below)</I>.
<DT><TT>make [(above options or targets)] XARCH=x64</TT>
<DD>Build and run as above, but also specify XARCH=x64
(or XARCH=AMD64 for older compilers) when building the example on Windows* as a 64-bit binary.
@@ -45,16 +53,16 @@ The following additional options are supported:
<H2>Usage</H2>
<DL>
-<DT><TT>seismic [<I>M</I>[:<I>N</I>] [<I>F</I>]]</TT>
-<DD>For non-interactive mode, <I>M</I> and <I>N</I> are a range of numbers of threads to be used.
- For interactive mode, <I>N</I> is the number of threads to use while <I>M</I> indicates if
- a separate thread will be used for the GUI (>0) or not (0). For example,
- <TT>seismic 1:3</TT> will use 3 threads for computation and a separate thread for
- processing GUI events; this option may give better visible performance on a 4-processor
- system when using GDI+ graphics.
-<DD><I>F</I> is the number of frames the example processes internally. Default value is 100;
- reduce it to shorten example run time.
-<DT>To run a short version of this example, e.g., for use with Intel® Threading Tools:
+<DT><TT>seismic <I>-h</I></TT>
+<DD>Prints the help for command line options
+<DT><TT>seismic [<I>n-of-threads</I>=value] [<I>n-of-frames</I>=value] [<I>silent</I>] [<I>serial</I>]</TT>
+<DT><TT>seismic [<I>n-of-threads</I> [<I>n-of-frames</I>]] [<I>silent</I>] [<I>serial</I>]</TT>
+<DD><I>n-of-threads</I> is the 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.<BR>
+ <I>n-of-frames</I> is a number of frames the example processes internally.<BR>
+ <I>silent</I> - no output except elapsed time.<BR>
+ <I>serial</I> - in GUI mode start with serial version of algorithm.<BR>
+
+<DT>To run a short version of this example, e.g., for use with Intel® Parallel Inspector::
<DD>Build a <I>debug</I> version of the example
(see the <A HREF=../../index.html#build>build directions</A>).
<BR>Run it with the desired number of threads and smaller number of frames, e.g., <TT>seismic 4 5</TT>.
@@ -93,10 +101,9 @@ user interface:
<A HREF="../index.html">Up to parent directory</A>
<p></p>
Copyright © 2005-2011 Intel Corporation. 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>
+Intel is a registered trademark or trademark 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.
</BODY>
diff --git a/examples/parallel_for/seismic/main.cpp b/examples/parallel_for/seismic/main.cpp
new file mode 100644
index 0000000..d9e3f92
--- /dev/null
+++ b/examples/parallel_for/seismic/main.cpp
@@ -0,0 +1,133 @@
+/*
+ Copyright 2005-2011 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 VIDEO_WINMAIN_ARGS
+
+#include <iostream>
+#include "tbb/tick_count.h"
+#include "../../common/utility/utility.h"
+
+#include "seismic_video.h"
+#include "universe.h"
+#include "tbb/task_scheduler_init.h"
+
+Universe u;
+
+struct RunOptions {
+ //! It is used for console mode for test with different number of threads and also has
+ //! meaning for GUI: threads.first - use separate event/updating loop thread (>0) or not (0).
+ //! threads.second - initialization value for scheduler
+ utility::thread_number_range threads;
+ int numberOfFrames;
+ bool silent;
+ bool parallel;
+ RunOptions(utility::thread_number_range threads_ , int number_of_frames_ , bool silent_ , bool parallel_ )
+ : threads(threads_),numberOfFrames(number_of_frames_), silent(silent_), parallel(parallel_)
+ {
+ }
+};
+
+int get_default_num_threads() {
+ static int threads = 0;
+ if ( threads == 0 )
+ threads = tbb::task_scheduler_init::default_num_threads();
+ return threads;
+}
+
+RunOptions ParseCommandLine(int argc, char *argv[]){
+ // zero number of threads means to run serial version
+ utility::thread_number_range threads(get_default_num_threads,0,get_default_num_threads());
+
+ int numberOfFrames = 1000;
+ bool silent = false;
+ bool serial = false;
+
+ 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.")
+ .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")
+ );
+ return RunOptions(threads,numberOfFrames,silent,!serial);
+}
+
+int main(int argc, char *argv[])
+{
+ try{
+ tbb::tick_count mainStartTime = tbb::tick_count::now();
+ RunOptions options = ParseCommandLine(argc,argv);
+ SeismicVideo video(u,options.numberOfFrames,options.threads.last,options.parallel);
+
+ // video layer init
+ if(video.init_window(u.UniverseWidth, u.UniverseHeight)) {
+ video.calc_fps = true;
+ video.threaded = options.threads.first > 0;
+ // video is ok, init Universe
+ u.InitializeUniverse(video);
+ // main loop
+ video.main_loop();
+ }
+ else if(video.init_console()) {
+ // do console mode
+ for(int p = options.threads.first; p <= options.threads.last; ++p ) {
+ tbb::tick_count xwayParallelismStartTime = tbb::tick_count::now();
+ u.InitializeUniverse(video);
+ int numberOfFrames = options.numberOfFrames;
+ if (p==0){
+ //run a serial version
+ for( int i=0; i<numberOfFrames; ++i ){
+ u.SerialUpdateUniverse();
+ }
+ }else{
+ tbb::task_scheduler_init init(p);
+ for( int i=0; i<numberOfFrames; ++i ){
+ u.ParallelUpdateUniverse();
+ }
+ }
+
+ if (!options.silent){
+ double fps = options.numberOfFrames/((tbb::tick_count::now()-xwayParallelismStartTime).seconds());
+ std::cout<<fps<<" frame per sec with ";
+ if (p==0){
+ std::cout<<"serial code\n";
+ }else{
+ std::cout<<p<<" way parallelism\n";
+ }
+ }
+ }
+ }
+ video.terminate();
+ utility::report_elapsed_time((tbb::tick_count::now() - mainStartTime).seconds());
+ return 0;
+ }catch(std::exception& e){
+ std::cerr<<"error occurred. error text is :\"" <<e.what()<<"\"\n";
+ return 1;
+ }
+}
diff --git a/examples/parallel_for/seismic/msvs/SeismicSimulation.icproj b/examples/parallel_for/seismic/msvs/SeismicSimulation.icproj
index 2db9709..1af37bc 100644
--- a/examples/parallel_for/seismic/msvs/SeismicSimulation.icproj
+++ b/examples/parallel_for/seismic/msvs/SeismicSimulation.icproj
@@ -3,7 +3,7 @@
ProjectType="Intel C++ Project"
Version="11.1"
Name="SeismicSimulation"
- ProjectGUID="{5C4ACAE3-8686-4046-A5FD-D0DC8755D263}"
+ ProjectGUID="{87C5A3E0-E1C8-457F-AA2F-B3E455214E76}"
VCNestedProjectGUID="{3AA40693-F93D-4D4B-B32E-068F511A2527}"
VCNestedProjectFileName="SeismicSimulation.vcproj">
<Configurations/>
diff --git a/examples/parallel_for/seismic/msvs/SeismicSimulation.vcproj b/examples/parallel_for/seismic/msvs/SeismicSimulation.vcproj
index 7980d42..61e7535 100644
--- a/examples/parallel_for/seismic/msvs/SeismicSimulation.vcproj
+++ b/examples/parallel_for/seismic/msvs/SeismicSimulation.vcproj
@@ -46,7 +46,7 @@
Optimization="0"
OmitFramePointers="true"
WholeProgramOptimization="true"
- AdditionalIncludeDirectories=""$(TBB30_INSTALL_DIR)\include""
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;TBB_USE_DEBUG"
RuntimeLibrary="3"
EnableFunctionLevelLinking="true"
@@ -67,7 +67,7 @@
Name="VCLinkerTool"
AdditionalDependencies="tbb_debug.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+ AdditionalLibraryDirectories="$(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc8;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc8"
GenerateDebugInformation="true"
SubSystem="2"
TargetMachine="1"
@@ -97,7 +97,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 debug "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 debug "$(OutDir)""
/>
</Configuration>
<Configuration
@@ -129,7 +129,7 @@
Optimization="0"
OmitFramePointers="true"
WholeProgramOptimization="true"
- AdditionalIncludeDirectories=""$(TBB30_INSTALL_DIR)\include""
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="WIN64;_DEBUG;_WINDOWS;TBB_USE_DEBUG"
RuntimeLibrary="3"
EnableFunctionLevelLinking="true"
@@ -149,7 +149,7 @@
Name="VCLinkerTool"
AdditionalDependencies="tbb_debug.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+ AdditionalLibraryDirectories="$(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc8;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc8"
GenerateDebugInformation="true"
SubSystem="2"
TargetMachine="17"
@@ -179,7 +179,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 debug "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 debug "$(OutDir)""
/>
</Configuration>
<Configuration
@@ -211,7 +211,7 @@
FavorSizeOrSpeed="1"
OmitFramePointers="true"
WholeProgramOptimization="true"
- AdditionalIncludeDirectories=""$(TBB30_INSTALL_DIR)\include""
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS"
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"
@@ -232,7 +232,7 @@
Name="VCLinkerTool"
AdditionalDependencies="tbb.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+ AdditionalLibraryDirectories="$(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc8;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc8"
GenerateDebugInformation="true"
SubSystem="2"
OptimizeReferences="2"
@@ -264,7 +264,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 release "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 release "$(OutDir)""
/>
</Configuration>
<Configuration
@@ -297,7 +297,7 @@
FavorSizeOrSpeed="1"
OmitFramePointers="true"
WholeProgramOptimization="true"
- AdditionalIncludeDirectories=""$(TBB30_INSTALL_DIR)\include""
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="WIN64;NDEBUG;_WINDOWS"
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"
@@ -317,7 +317,7 @@
Name="VCLinkerTool"
AdditionalDependencies="tbb.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+ AdditionalLibraryDirectories="$(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc8;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc8"
GenerateDebugInformation="true"
SubSystem="2"
OptimizeReferences="2"
@@ -349,11 +349,11 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 release "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 release "$(OutDir)""
/>
</Configuration>
<Configuration
- Name="DD Release|Win32"
+ Name="DDRelease|Win32"
OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
ConfigurationType="1"
@@ -382,7 +382,7 @@
FavorSizeOrSpeed="1"
OmitFramePointers="true"
WholeProgramOptimization="true"
- AdditionalIncludeDirectories=""$(TBB30_INSTALL_DIR)\include";"$(DXSDK_DIR)\include""
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(DXSDK_DIR)\include""
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS"
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"
@@ -403,7 +403,7 @@
Name="VCLinkerTool"
AdditionalDependencies="tbb.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8;$(DXSDK_DIR)\lib\x86"
+ AdditionalLibraryDirectories="$(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc8;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc8;$(DXSDK_DIR)\lib\x86"
GenerateDebugInformation="true"
SubSystem="2"
OptimizeReferences="2"
@@ -435,11 +435,11 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 release "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 release "$(OutDir)""
/>
</Configuration>
<Configuration
- Name="DD Release|x64"
+ Name="DDRelease|x64"
OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
ConfigurationType="1"
@@ -469,7 +469,7 @@
FavorSizeOrSpeed="1"
OmitFramePointers="true"
WholeProgramOptimization="true"
- AdditionalIncludeDirectories=""$(TBB30_INSTALL_DIR)\include";"$(DXSDK_DIR)\include""
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(DXSDK_DIR)\include""
PreprocessorDefinitions="WIN64;NDEBUG;_WINDOWS"
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"
@@ -489,7 +489,7 @@
Name="VCLinkerTool"
AdditionalDependencies="tbb.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8;$(DXSDK_DIR)\lib\x64"
+ AdditionalLibraryDirectories="$(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc8;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc8;$(DXSDK_DIR)\lib\x64"
GenerateDebugInformation="true"
SubSystem="2"
OptimizeReferences="2"
@@ -521,11 +521,11 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 release "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 release "$(OutDir)""
/>
</Configuration>
<Configuration
- Name="DD Debug|Win32"
+ Name="DDDebug|Win32"
OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
ConfigurationType="1"
@@ -553,7 +553,7 @@
Optimization="0"
OmitFramePointers="true"
WholeProgramOptimization="true"
- AdditionalIncludeDirectories=""$(TBB30_INSTALL_DIR)\include";"$(DXSDK_DIR)\include""
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(DXSDK_DIR)\include""
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;TBB_USE_DEBUG"
RuntimeLibrary="3"
EnableFunctionLevelLinking="true"
@@ -574,7 +574,7 @@
Name="VCLinkerTool"
AdditionalDependencies="tbb_debug.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8;$(DXSDK_DIR)\lib\x86"
+ AdditionalLibraryDirectories="$(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc8;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc8;$(DXSDK_DIR)\lib\x86"
GenerateDebugInformation="true"
SubSystem="2"
TargetMachine="1"
@@ -604,11 +604,11 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 debug "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 debug "$(OutDir)""
/>
</Configuration>
<Configuration
- Name="DD Debug|x64"
+ Name="DDDebug|x64"
OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
ConfigurationType="1"
@@ -637,7 +637,7 @@
Optimization="0"
OmitFramePointers="true"
WholeProgramOptimization="true"
- AdditionalIncludeDirectories=""$(TBB30_INSTALL_DIR)\include";"$(DXSDK_DIR)\include""
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(DXSDK_DIR)\include""
PreprocessorDefinitions="WIN64;_DEBUG;_WINDOWS;TBB_USE_DEBUG"
RuntimeLibrary="3"
EnableFunctionLevelLinking="true"
@@ -657,7 +657,7 @@
Name="VCLinkerTool"
AdditionalDependencies="tbb_debug.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8;$(DXSDK_DIR)\lib\x64"
+ AdditionalLibraryDirectories="$(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc8;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc8;$(DXSDK_DIR)\lib\x64"
GenerateDebugInformation="true"
SubSystem="2"
TargetMachine="17"
@@ -687,7 +687,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 debug "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 debug "$(OutDir)""
/>
</Configuration>
</Configurations>
@@ -700,7 +700,23 @@
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
>
<File
- RelativePath="..\SeismicSimulation.cpp"
+ RelativePath="..\main.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\seismic_video.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\seismic_video.h"
+ >
+ </File>
+ <File
+ RelativePath="..\universe.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\universe.h"
>
</File>
</Filter>
@@ -769,7 +785,7 @@
RelativePath="..\..\..\common\gui\gdivideo.cpp"
>
<FileConfiguration
- Name="DD Release|Win32"
+ Name="DDRelease|Win32"
ExcludedFromBuild="true"
>
<Tool
@@ -777,7 +793,7 @@
/>
</FileConfiguration>
<FileConfiguration
- Name="DD Release|x64"
+ Name="DDRelease|x64"
ExcludedFromBuild="true"
>
<Tool
@@ -785,7 +801,7 @@
/>
</FileConfiguration>
<FileConfiguration
- Name="DD Debug|Win32"
+ Name="DDDebug|Win32"
ExcludedFromBuild="true"
>
<Tool
@@ -793,7 +809,7 @@
/>
</FileConfiguration>
<FileConfiguration
- Name="DD Debug|x64"
+ Name="DDDebug|x64"
ExcludedFromBuild="true"
>
<Tool
diff --git a/examples/parallel_for/seismic/msvs/SeismicSimulation_cl.sln b/examples/parallel_for/seismic/msvs/SeismicSimulation_cl.sln
index 7bd1fb7..a953c4a 100644
--- a/examples/parallel_for/seismic/msvs/SeismicSimulation_cl.sln
+++ b/examples/parallel_for/seismic/msvs/SeismicSimulation_cl.sln
@@ -10,26 +10,26 @@ Global
DD Release|x64 = DD Release|x64
GDI Debug|Win32 = GDI Debug|Win32
GDI Debug|x64 = GDI Debug|x64
- GDI Release|Win32 = GDI Release|Win32
- GDI Release|x64 = GDI Release|x64
+ _GDI Release|Win32 = _GDI Release|Win32
+ _GDI Release|x64 = _GDI Release|x64
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Debug|Win32.ActiveCfg = DD Debug|Win32
- {3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Debug|Win32.Build.0 = DD Debug|Win32
- {3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Debug|x64.ActiveCfg = DD Debug|x64
- {3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Debug|x64.Build.0 = DD Debug|x64
- {3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Release|Win32.ActiveCfg = DD Release|Win32
- {3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Release|Win32.Build.0 = DD Release|Win32
- {3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Release|x64.ActiveCfg = DD Release|x64
- {3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Release|x64.Build.0 = DD Release|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Debug|Win32.ActiveCfg = DDDebug|Win32
+ {3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Debug|Win32.Build.0 = DDDebug|Win32
+ {3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Debug|x64.ActiveCfg = DDDebug|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Debug|x64.Build.0 = DDDebug|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Release|Win32.ActiveCfg = DDRelease|Win32
+ {3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Release|Win32.Build.0 = DDRelease|Win32
+ {3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Release|x64.ActiveCfg = DDRelease|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Release|x64.Build.0 = DDRelease|x64
{3AA40693-F93D-4D4B-B32E-068F511A2527}.GDI Debug|Win32.ActiveCfg = Debug|Win32
{3AA40693-F93D-4D4B-B32E-068F511A2527}.GDI Debug|Win32.Build.0 = Debug|Win32
{3AA40693-F93D-4D4B-B32E-068F511A2527}.GDI Debug|x64.ActiveCfg = Debug|x64
{3AA40693-F93D-4D4B-B32E-068F511A2527}.GDI Debug|x64.Build.0 = Debug|x64
- {3AA40693-F93D-4D4B-B32E-068F511A2527}.GDI Release|Win32.ActiveCfg = Release|Win32
- {3AA40693-F93D-4D4B-B32E-068F511A2527}.GDI Release|Win32.Build.0 = Release|Win32
- {3AA40693-F93D-4D4B-B32E-068F511A2527}.GDI Release|x64.ActiveCfg = Release|x64
- {3AA40693-F93D-4D4B-B32E-068F511A2527}.GDI Release|x64.Build.0 = Release|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A2527}._GDI Release|Win32.ActiveCfg = Release|Win32
+ {3AA40693-F93D-4D4B-B32E-068F511A2527}._GDI Release|Win32.Build.0 = Release|Win32
+ {3AA40693-F93D-4D4B-B32E-068F511A2527}._GDI Release|x64.ActiveCfg = Release|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A2527}._GDI Release|x64.Build.0 = Release|x64
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/examples/parallel_for/seismic/msvs/SeismicSimulation_icl.sln b/examples/parallel_for/seismic/msvs/SeismicSimulation_icl.sln
index 77ce9b2..6bca0c1 100644
--- a/examples/parallel_for/seismic/msvs/SeismicSimulation_icl.sln
+++ b/examples/parallel_for/seismic/msvs/SeismicSimulation_icl.sln
@@ -1,6 +1,6 @@
Microsoft Visual Studio Solution File, Format Version 9.00
# Visual Studio 2005
-Project("{EAF909A5-FA59-4C3D-9431-0FCC20D5BCF9}") = "SeismicSimulation", "SeismicSimulation.icproj", "{5C4ACAE3-8686-4046-A5FD-D0DC8755D263}"
+Project("{EAF909A5-FA59-4C3D-9431-0FCC20D5BCF9}") = "SeismicSimulation", "SeismicSimulation.icproj", "{87C5A3E0-E1C8-457F-AA2F-B3E455214E76}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -10,42 +10,42 @@ Global
DD Release|x64 = DD Release|x64
GDI Debug|Win32 = GDI Debug|Win32
GDI Debug|x64 = GDI Debug|x64
- GDI Release|Win32 = GDI Release|Win32
- GDI Release|x64 = GDI Release|x64
+ _GDI Release|Win32 = _GDI Release|Win32
+ _GDI Release|x64 = _GDI Release|x64
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {5C4ACAE3-8686-4046-A5FD-D0DC8755D263}.DD Debug|Win32.ActiveCfg = DD Debug|Win32
- {5C4ACAE3-8686-4046-A5FD-D0DC8755D263}.DD Debug|Win32.Build.0 = DD Debug|Win32
- {5C4ACAE3-8686-4046-A5FD-D0DC8755D263}.DD Debug|x64.ActiveCfg = DD Debug|x64
- {5C4ACAE3-8686-4046-A5FD-D0DC8755D263}.DD Debug|x64.Build.0 = DD Debug|x64
- {5C4ACAE3-8686-4046-A5FD-D0DC8755D263}.DD Release|Win32.ActiveCfg = DD Release|Win32
- {5C4ACAE3-8686-4046-A5FD-D0DC8755D263}.DD Release|Win32.Build.0 = DD Release|Win32
- {5C4ACAE3-8686-4046-A5FD-D0DC8755D263}.DD Release|x64.ActiveCfg = DD Release|x64
- {5C4ACAE3-8686-4046-A5FD-D0DC8755D263}.DD Release|x64.Build.0 = DD Release|x64
- {5C4ACAE3-8686-4046-A5FD-D0DC8755D263}.GDI Debug|Win32.ActiveCfg = Debug|Win32
- {5C4ACAE3-8686-4046-A5FD-D0DC8755D263}.GDI Debug|Win32.Build.0 = Debug|Win32
- {5C4ACAE3-8686-4046-A5FD-D0DC8755D263}.GDI Debug|x64.ActiveCfg = Debug|x64
- {5C4ACAE3-8686-4046-A5FD-D0DC8755D263}.GDI Debug|x64.Build.0 = Debug|x64
- {5C4ACAE3-8686-4046-A5FD-D0DC8755D263}.GDI Release|Win32.ActiveCfg = Release|Win32
- {5C4ACAE3-8686-4046-A5FD-D0DC8755D263}.GDI Release|Win32.Build.0 = Release|Win32
- {5C4ACAE3-8686-4046-A5FD-D0DC8755D263}.GDI Release|x64.ActiveCfg = Release|x64
- {5C4ACAE3-8686-4046-A5FD-D0DC8755D263}.GDI Release|x64.Build.0 = Release|x64
- {3AA40693-F93D-4D4B-B32E-068F511A2527}.GDI Release|x64.Build.0 = Release|x64
- {3AA40693-F93D-4D4B-B32E-068F511A2527}.GDI Release|x64.ActiveCfg = Release|x64
- {3AA40693-F93D-4D4B-B32E-068F511A2527}.GDI Release|Win32.Build.0 = Release|Win32
- {3AA40693-F93D-4D4B-B32E-068F511A2527}.GDI Release|Win32.ActiveCfg = Release|Win32
+ {87C5A3E0-E1C8-457F-AA2F-B3E455214E76}.DD Debug|Win32.ActiveCfg = DDDebug|Win32
+ {87C5A3E0-E1C8-457F-AA2F-B3E455214E76}.DD Debug|Win32.Build.0 = DDDebug|Win32
+ {87C5A3E0-E1C8-457F-AA2F-B3E455214E76}.DD Debug|x64.ActiveCfg = DDDebug|x64
+ {87C5A3E0-E1C8-457F-AA2F-B3E455214E76}.DD Debug|x64.Build.0 = DDDebug|x64
+ {87C5A3E0-E1C8-457F-AA2F-B3E455214E76}.DD Release|Win32.ActiveCfg = DDRelease|Win32
+ {87C5A3E0-E1C8-457F-AA2F-B3E455214E76}.DD Release|Win32.Build.0 = DDRelease|Win32
+ {87C5A3E0-E1C8-457F-AA2F-B3E455214E76}.DD Release|x64.ActiveCfg = DDRelease|x64
+ {87C5A3E0-E1C8-457F-AA2F-B3E455214E76}.DD Release|x64.Build.0 = DDRelease|x64
+ {87C5A3E0-E1C8-457F-AA2F-B3E455214E76}.GDI Debug|Win32.ActiveCfg = Debug|Win32
+ {87C5A3E0-E1C8-457F-AA2F-B3E455214E76}.GDI Debug|Win32.Build.0 = Debug|Win32
+ {87C5A3E0-E1C8-457F-AA2F-B3E455214E76}.GDI Debug|x64.ActiveCfg = Debug|x64
+ {87C5A3E0-E1C8-457F-AA2F-B3E455214E76}.GDI Debug|x64.Build.0 = Debug|x64
+ {87C5A3E0-E1C8-457F-AA2F-B3E455214E76}._GDI Release|Win32.ActiveCfg = Release|Win32
+ {87C5A3E0-E1C8-457F-AA2F-B3E455214E76}._GDI Release|Win32.Build.0 = Release|Win32
+ {87C5A3E0-E1C8-457F-AA2F-B3E455214E76}._GDI Release|x64.ActiveCfg = Release|x64
+ {87C5A3E0-E1C8-457F-AA2F-B3E455214E76}._GDI Release|x64.Build.0 = Release|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A2527}._GDI Release|x64.Build.0 = Release|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A2527}._GDI Release|x64.ActiveCfg = Release|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A2527}._GDI Release|Win32.Build.0 = Release|Win32
+ {3AA40693-F93D-4D4B-B32E-068F511A2527}._GDI Release|Win32.ActiveCfg = Release|Win32
{3AA40693-F93D-4D4B-B32E-068F511A2527}.GDI Debug|x64.Build.0 = Debug|x64
{3AA40693-F93D-4D4B-B32E-068F511A2527}.GDI Debug|x64.ActiveCfg = Debug|x64
{3AA40693-F93D-4D4B-B32E-068F511A2527}.GDI Debug|Win32.Build.0 = Debug|Win32
{3AA40693-F93D-4D4B-B32E-068F511A2527}.GDI Debug|Win32.ActiveCfg = Debug|Win32
- {3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Release|x64.Build.0 = DD Release|x64
- {3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Release|x64.ActiveCfg = DD Release|x64
- {3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Release|Win32.Build.0 = DD Release|Win32
- {3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Release|Win32.ActiveCfg = DD Release|Win32
- {3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Debug|x64.Build.0 = DD Debug|x64
- {3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Debug|x64.ActiveCfg = DD Debug|x64
- {3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Debug|Win32.Build.0 = DD Debug|Win32
- {3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Debug|Win32.ActiveCfg = DD Debug|Win32
+ {3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Release|x64.Build.0 = DDRelease|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Release|x64.ActiveCfg = DDRelease|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Release|Win32.Build.0 = DDRelease|Win32
+ {3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Release|Win32.ActiveCfg = DDRelease|Win32
+ {3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Debug|x64.Build.0 = DDDebug|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Debug|x64.ActiveCfg = DDDebug|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Debug|Win32.Build.0 = DDDebug|Win32
+ {3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Debug|Win32.ActiveCfg = DDDebug|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/examples/parallel_for/seismic/seismic_video.cpp b/examples/parallel_for/seismic/seismic_video.cpp
new file mode 100644
index 0000000..c916f85
--- /dev/null
+++ b/examples/parallel_for/seismic/seismic_video.cpp
@@ -0,0 +1,156 @@
+/*
+ Copyright 2005-2011 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 "seismic_video.h"
+#include "universe.h"
+#include "tbb/task_scheduler_init.h"
+
+const char * const SeismicVideo::titles[2] = {"Seismic Simulation: Serial", "Seismic Simulation: Parallel"};
+void SeismicVideo::on_mouse(int x, int y, int key) {
+ if(key == 1){
+ u_.TryPutNewPulseSource(x,y);
+ }
+}
+
+void SeismicVideo::on_key(int key) {
+ key &= 0xff;
+ if(char(key) == ' ') initIsParallel = !initIsParallel;
+ else if(char(key) == 'p') initIsParallel = true;
+ else if(char(key) == 's') initIsParallel = false;
+ else if(char(key) == 'e') updating = true;
+ else if(char(key) == 'd') updating = false;
+ else if(key == 27) running = false;
+ title = initIsParallel?titles[1]:titles[0];
+}
+
+void SeismicVideo::on_process() {
+ tbb::task_scheduler_init Init(threadsHigh);
+ do {
+ if( initIsParallel )
+ u_.ParallelUpdateUniverse();
+ else
+ u_.SerialUpdateUniverse();
+ if( numberOfFrames_ > 0 ) --numberOfFrames_;
+ } while(next_frame() && numberOfFrames_);
+}
+
+#ifdef _WINDOWS
+#include "msvs/resource.h"
+LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
+SeismicVideo * gVideo = NULL;
+#endif
+
+SeismicVideo::SeismicVideo( Universe &u, int number_of_frames, int threads_high, bool init_is_parallel)
+ :numberOfFrames_(number_of_frames),initIsParallel(init_is_parallel),u_(u),threadsHigh(threads_high)
+{
+ title = initIsParallel?titles[1]:titles[0];
+#ifdef _WINDOWS
+ gVideo = this;
+ LoadStringA(video::win_hInstance, IDC_SEISMICSIMULATION, szWindowClass, MAX_LOADSTRING);
+ memset(&wcex, 0, sizeof(wcex));
+ wcex.lpfnWndProc = (WNDPROC)WndProc;
+ wcex.hIcon = LoadIcon(video::win_hInstance, MAKEINTRESOURCE(IDI_SEISMICSIMULATION));
+ wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
+ wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
+ wcex.lpszMenuName = LPCTSTR(IDC_SEISMICSIMULATION);
+ wcex.lpszClassName = szWindowClass;
+ wcex.hIconSm = LoadIcon(video::win_hInstance, MAKEINTRESOURCE(IDI_SMALL));
+ win_set_class(wcex); // ascii convention here
+ win_load_accelerators(IDC_SEISMICSIMULATION);
+#endif
+
+}
+
+
+
+
+
+#ifdef _WINDOWS
+//
+// FUNCTION: WndProc(HWND, unsigned, WORD, LONG)
+//
+// PURPOSE: Processes messages for the main window.
+//
+// WM_COMMAND - process the application menu
+// WM_PAINT - Paint the main window
+// WM_DESTROY - post a quit message and return
+//
+//
+LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
+{
+ switch (message)
+ {
+ case WM_INITDIALOG: return TRUE;
+ case WM_COMMAND:
+ if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) {
+ EndDialog(hDlg, LOWORD(wParam));
+ return TRUE;
+ }
+ break;
+ }
+ return FALSE;
+}
+
+LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
+{
+ int wmId;
+ switch (message) {
+ case WM_COMMAND:
+ wmId = LOWORD(wParam);
+ // Parse the menu selections:
+ switch (wmId)
+ {
+ case IDM_ABOUT:
+ DialogBox(video::win_hInstance, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, (DLGPROC)About);
+ break;
+ case IDM_EXIT:
+ PostQuitMessage(0);
+ break;
+ case ID_FILE_PARALLEL:
+ gVideo->on_key('p');
+ break;
+ case ID_FILE_SERIAL:
+ gVideo->on_key('s');
+ break;
+ case ID_FILE_ENABLEGUI:
+ gVideo->on_key('e');
+ break;
+ case ID_FILE_DISABLEGUI:
+ gVideo->on_key('d');
+ break;
+ default:
+ return DefWindowProc(hWnd, message, wParam, lParam);
+ }
+ break;
+ default:
+ return DefWindowProc(hWnd, message, wParam, lParam);
+ }
+ return 0;
+}
+
+#endif
diff --git a/src/tbbmalloc/win-gcc-tbbmalloc-export.def b/examples/parallel_for/seismic/seismic_video.h
similarity index 66%
copy from src/tbbmalloc/win-gcc-tbbmalloc-export.def
copy to examples/parallel_for/seismic/seismic_video.h
index c6090ee..d9d2dd1 100644
--- a/src/tbbmalloc/win-gcc-tbbmalloc-export.def
+++ b/examples/parallel_for/seismic/seismic_video.h
@@ -26,20 +26,37 @@
the GNU General Public License.
*/
+#ifndef SEISMIC_VIDEO_H_
+#define SEISMIC_VIDEO_H_
+
+#include "../../common/gui/video.h"
+
+class Universe;
+
+class SeismicVideo : public video
{
-global:
-scalable_calloc;
-scalable_free;
-scalable_malloc;
-scalable_realloc;
-scalable_posix_memalign;
-scalable_aligned_malloc;
-scalable_aligned_realloc;
-scalable_aligned_free;
-safer_scalable_free;
-safer_scalable_realloc;
-scalable_msize;
-safer_scalable_msize;
-safer_scalable_aligned_realloc;
-local:*;
+#ifdef _WINDOWS
+ #define MAX_LOADSTRING 100
+ TCHAR szWindowClass[MAX_LOADSTRING]; // the main window class name
+ WNDCLASSEX wcex;
+#endif
+ static const char * const titles[2];
+
+ bool initIsParallel ;
+
+ Universe &u_;
+ int numberOfFrames_;
+ int threadsHigh;
+private:
+ void on_mouse(int x, int y, int key);
+ void on_process();
+
+#ifdef _WINDOWS
+public:
+#endif
+ void on_key(int key);
+
+public:
+ SeismicVideo( Universe &u,int numberOfFrames, int threadsHigh, bool initIsParallel=true);
};
+#endif /* SEISMIC_VIDEO_H_ */
diff --git a/examples/parallel_for/seismic/universe.cpp b/examples/parallel_for/seismic/universe.cpp
new file mode 100644
index 0000000..fcaae06
--- /dev/null
+++ b/examples/parallel_for/seismic/universe.cpp
@@ -0,0 +1,230 @@
+/*
+ Copyright 2005-2011 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 "../../common/gui/video.h"
+#include <cmath>
+#include "tbb/blocked_range.h"
+#include "tbb/parallel_for.h"
+
+
+using namespace std;
+
+#ifdef _MSC_VER
+// warning C4068: unknown pragma
+#pragma warning(disable: 4068)
+// warning C4351: new behavior: elements of array 'array' will be default initialized
+#pragma warning(disable: 4351)
+#endif
+
+#include "universe.h"
+
+const colorcomp_t MaterialColor[4][3] = { // BGR
+ {96,0,0}, // WATER
+ {0,48,48}, // SANDSTONE
+ {32,32,23} // SHALE
+};
+
+void Universe::InitializeUniverse(video const& colorizer) {
+
+ pulseCounter = pulseTime = 100;
+ pulseX = UniverseWidth/3;
+ pulseY = UniverseHeight/4;
+ // Initialize V, S, and T to slightly non-zero values, in order to avoid denormal waves.
+ for( int i=0; i<UniverseHeight; ++i )
+#pragma ivdep
+ for( int j=0; j<UniverseWidth; ++j ) {
+ T[i][j] = S[i][j] = V[i][j] = ValueType(1.0E-6);
+ }
+ for( int i=1; i<UniverseHeight-1; ++i ) {
+ for( int j=1; j<UniverseWidth-1; ++j ) {
+ float x = float(j-UniverseWidth/2)/(UniverseWidth/2);
+ ValueType t = (ValueType)i/UniverseHeight;
+ MaterialType m;
+ D[i][j] = 1.0;
+ // Coefficient values are fictitious, and chosen to visually exaggerate
+ // physical effects such as Rayleigh waves. The fabs/exp line generates
+ // a shale layer with a gentle upwards slope and an anticline.
+ if( t<0.3f ) {
+ m = WATER;
+ M[i][j] = 0.125;
+ L[i][j] = 0.125;
+ } else if( fabs(t-0.7+0.2*exp(-8*x*x)+0.025*x)<=0.1 ) {
+ m = SHALE;
+ M[i][j] = 0.5;
+ L[i][j] = 0.6;
+ } else {
+ m = SANDSTONE;
+ M[i][j] = 0.3;
+ L[i][j] = 0.4;
+ }
+ material[i][j] = m;
+ }
+ }
+ ValueType scale = 2.0f/ColorMapSize;
+ for( int k=0; k<4; ++k ) {
+ for( int i=0; i<ColorMapSize; ++i ) {
+ colorcomp_t c[3];
+ ValueType t = (i-ColorMapSize/2)*scale;
+ ValueType r = t>0 ? t : 0;
+ ValueType b = t<0 ? -t : 0;
+ ValueType g = 0.5f*fabs(t);
+ memcpy(c, MaterialColor[k], sizeof(c));
+ c[2] = colorcomp_t(r*(255-c[2])+c[2]);
+ c[1] = colorcomp_t(g*(255-c[1])+c[1]);
+ c[0] = colorcomp_t(b*(255-c[0])+c[0]);
+ ColorMap[k][i] = colorizer.get_color(c[2], c[1], c[0]);
+ }
+ }
+ // Set damping coefficients around border to reduce reflections from boundaries.
+ ValueType d = 1.0;
+ for( int k=DamperSize-1; k>0; --k ) {
+ d *= 1-1.0f/(DamperSize*DamperSize);
+ for( int j=1; j<UniverseWidth-1; ++j ) {
+ D[k][j] *= d;
+ D[UniverseHeight-1-k][j] *= d;
+ }
+ for( int i=1; i<UniverseHeight-1; ++i ) {
+ D[i][k] *= d;
+ D[i][UniverseWidth-1-k] *= d;
+ }
+ }
+ drawingMemory = colorizer.get_drawing_memory();
+}
+void Universe::UpdatePulse() {
+ if( pulseCounter>0 ) {
+ ValueType t = (pulseCounter-pulseTime/2)*0.05f;
+ V[pulseY][pulseX] += 64*sqrt(M[pulseY][pulseX])*exp(-t*t);
+ --pulseCounter;
+ }
+}
+
+struct Universe::Rectangle {
+ struct std::pair<int,int> xRange;
+ struct std::pair<int,int> yRange;
+ Rectangle (int startX, int startY, int width, int height):xRange(startX,width),yRange(startY,height){}
+ int StartX() const {return xRange.first;}
+ int StartY() const {return yRange.first;}
+ int Width() const {return xRange.second;}
+ int Height() const {return yRange.second;}
+ int EndX() const {return xRange.first + xRange.second;}
+ int EndY() const {return yRange.first + yRange.second;}
+
+};
+
+void Universe::UpdateStress(Rectangle const& r ) {
+ drawing_area drawing(r.StartX(),r.StartY(),r.Width(),r.Height(),drawingMemory);
+ for( int i=r.StartY(); i<r.EndY() ; ++i ) {
+ drawing.set_pos(1, i-r.StartY());
+#pragma ivdep
+ for( int j=r.StartX(); j<r.EndX() ; ++j ) {
+ S[i][j] += M[i][j]*(V[i][j+1]-V[i][j]);
+ T[i][j] += M[i][j]*(V[i+1][j]-V[i][j]);
+ int index = (int)(V[i][j]*(ColorMapSize/2)) + ColorMapSize/2;
+ if( index<0 ) index = 0;
+ if( index>=ColorMapSize ) index = ColorMapSize-1;
+ color_t* c = ColorMap[material[i][j]];
+ drawing.put_pixel(c[index]);
+ }
+ }
+}
+
+void Universe::SerialUpdateStress() {
+ Rectangle area(0, 0, UniverseWidth-1, UniverseHeight-1);
+ UpdateStress(area);
+}
+
+struct UpdateStressBody {
+ Universe & u_;
+ UpdateStressBody(Universe & u):u_(u){}
+ void operator()( const tbb::blocked_range<int>& range ) const {
+ Universe::Rectangle area(0, range.begin(), u_.UniverseWidth-1, range.size());
+ u_.UpdateStress(area);
+ }
+};
+
+void Universe::ParallelUpdateStress(tbb::affinity_partitioner &affinity) {
+ tbb::parallel_for( tbb::blocked_range<int>( 0, UniverseHeight-1 ), // Index space for loop
+ UpdateStressBody(*this), // Body of loop
+ affinity ); // Affinity hint
+}
+
+void Universe::UpdateVelocity(Rectangle const& r) {
+ for( int i=r.StartY(); i<r.EndY(); ++i )
+#pragma ivdep
+ for( int j=r.StartX(); j<r.EndX(); ++j )
+ V[i][j] = D[i][j]*(V[i][j] + L[i][j]*(S[i][j] - S[i][j-1] + T[i][j] - T[i-1][j]));
+}
+
+void Universe::SerialUpdateVelocity() {
+ UpdateVelocity(Rectangle(1,1,UniverseWidth-1,UniverseHeight-1));
+}
+
+struct UpdateVelocityBody {
+ Universe & u_;
+ UpdateVelocityBody(Universe & u):u_(u){}
+ void operator()( const tbb::blocked_range<int>& y_range ) const {
+ u_.UpdateVelocity(Universe::Rectangle(0,y_range.begin(),u_.UniverseWidth-1,y_range.size()));
+ }
+};
+
+void Universe::ParallelUpdateVelocity(tbb::affinity_partitioner &affinity) {
+ tbb::parallel_for( tbb::blocked_range<int>( 0, UniverseHeight-1 ), // Index space for loop
+ UpdateVelocityBody(*this), // Body of loop
+ affinity ); // Affinity hint
+}
+
+void Universe::SerialUpdateUniverse() {
+ UpdatePulse();
+ SerialUpdateStress();
+ SerialUpdateVelocity();
+}
+
+void Universe::ParallelUpdateUniverse() {
+ /** Affinity is an argument to parallel_for to hint that an iteration of a loop
+ is best replayed on the same processor for each execution of the loop.
+ It is a static object because it must remember where the iterations happened
+ in previous executions. */
+ static tbb::affinity_partitioner affinity;
+ UpdatePulse();
+ ParallelUpdateStress(affinity);
+ ParallelUpdateVelocity(affinity);
+}
+
+bool Universe::TryPutNewPulseSource(int x, int y){
+ if(pulseCounter == 0) {
+ pulseCounter = pulseTime;
+ pulseX = x; pulseY = y;
+ return true;
+ }
+ return false;
+}
+
+void Universe::SetDrawingMemory(const drawing_memory &dmem) {
+ drawingMemory = dmem;
+}
diff --git a/examples/parallel_for/seismic/universe.h b/examples/parallel_for/seismic/universe.h
new file mode 100644
index 0000000..4ebb2c1
--- /dev/null
+++ b/examples/parallel_for/seismic/universe.h
@@ -0,0 +1,120 @@
+/*
+ Copyright 2005-2011 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 UNIVERSE_H_
+#define UNIVERSE_H_
+
+#include "../../common/gui/video.h"
+#include "tbb/partitioner.h"
+
+
+class Universe {
+public:
+ enum {
+ UniverseWidth = 1024
+ ,UniverseHeight = 512
+ };
+private:
+ //in order to avoid performance degradation due to cache aliasing issue
+ //some padding is needed after each row in array, and between array themselves.
+ //the padding is achieved by adjusting number of rows and columns.
+ //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.
+ enum {
+ MaxWidth = UniverseWidth+1,
+ MaxHeight = UniverseHeight+3
+ };
+
+ typedef float ValueType;
+
+ //! Horizontal stress
+ ValueType S[MaxHeight][MaxWidth];
+
+ //! Velocity at each grid point
+ ValueType V[MaxHeight][MaxWidth];
+
+ //! Vertical stress
+ ValueType T[MaxHeight][MaxWidth];
+
+ //! Coefficient related to modulus
+ ValueType M[MaxHeight][MaxWidth];
+
+ //! Damping coefficients
+ ValueType D[MaxHeight][MaxWidth];
+
+ //! Coefficient related to lightness
+ ValueType L[MaxHeight][MaxWidth];
+
+ enum { ColorMapSize = 1024};
+ color_t ColorMap[4][ColorMapSize];
+
+ enum MaterialType {
+ WATER=0,
+ SANDSTONE=1,
+ SHALE=2
+ };
+
+ //! Values are MaterialType, cast to an unsigned char to save space.
+ unsigned char material[MaxHeight][MaxWidth];
+
+private:
+ enum { DamperSize = 32};
+
+ int pulseTime;
+ int pulseCounter;
+ int pulseX;
+ int pulseY;
+
+ drawing_memory drawingMemory;
+
+public:
+ void InitializeUniverse(video const& colorizer);
+
+ void SerialUpdateUniverse();
+ void ParallelUpdateUniverse();
+ bool TryPutNewPulseSource(int x, int y);
+ void SetDrawingMemory(const drawing_memory &dmem);
+private:
+ struct Rectangle;
+ void UpdatePulse();
+ void UpdateStress(Rectangle const& r );
+
+ void SerialUpdateStress() ;
+ friend struct UpdateStressBody;
+ friend struct UpdateVelocityBody;
+ void ParallelUpdateStress(tbb::affinity_partitioner &affinity);
+
+ void UpdateVelocity(Rectangle const& r);
+
+ void SerialUpdateVelocity() ;
+ void ParallelUpdateVelocity(tbb::affinity_partitioner &affinity);
+};
+
+#endif /* UNIVERSE_H_ */
diff --git a/examples/parallel_for/seismic/xcode/SeismicSimulation.xcodeproj/project.pbxproj b/examples/parallel_for/seismic/xcode/SeismicSimulation.xcodeproj/project.pbxproj
index 8179416..e2ddd98 100644
--- a/examples/parallel_for/seismic/xcode/SeismicSimulation.xcodeproj/project.pbxproj
+++ b/examples/parallel_for/seismic/xcode/SeismicSimulation.xcodeproj/project.pbxproj
@@ -3,19 +3,20 @@
archiveVersion = 1;
classes = {
};
- objectVersion = 42;
+ objectVersion = 46;
objects = {
/* Begin PBXBuildFile section */
+ 61C4770113CE179A0022F8F6 /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 61C4770013CE179A0022F8F6 /* main.cpp */; };
+ 61C4770813CE17B40022F8F6 /* seismic_video.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 61C4770313CE17B40022F8F6 /* seismic_video.cpp */; };
+ 61C4770A13CE17B40022F8F6 /* universe.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 61C4770613CE17B40022F8F6 /* universe.cpp */; };
8D0C4E8E0486CD37000505A6 /* main.nib in Resources */ = {isa = PBXBuildFile; fileRef = 02345980000FD03B11CA0E72 /* main.nib */; };
- A12649490B8392750091D5AD /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A1E3E7BC0B3AD4EC007C3AB5 /* OpenGL.framework */; };
A126495E0B83936D0091D5AD /* Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 8D0C4E960486CD37000505A6 /* Info.plist */; };
A18D2A340B861B99007D8D2C /* libtbb.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = A18D2A330B861B99007D8D2C /* libtbb.dylib */; };
A1A8F41E0B8B4DBE001C55B1 /* AGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A1A8F41D0B8B4DBE001C55B1 /* AGL.framework */; };
A1A8F4310B8B4EA8001C55B1 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A1A8F4300B8B4EA8001C55B1 /* Carbon.framework */; };
A1D44D9A0B861E8A0006E401 /* libtbb.dylib in CopyFiles */ = {isa = PBXBuildFile; fileRef = A18D2A330B861B99007D8D2C /* libtbb.dylib */; };
A1E3E7BD0B3AD4EC007C3AB5 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A1E3E7BC0B3AD4EC007C3AB5 /* OpenGL.framework */; };
- A1F591A90B8DFC7100073279 /* SeismicSimulation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F591A80B8DFC7100073279 /* SeismicSimulation.cpp */; };
A1F591AC0B8DFC9600073279 /* macvideo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F591AA0B8DFC9600073279 /* macvideo.cpp */; };
/* End PBXBuildFile section */
@@ -35,13 +36,17 @@
/* Begin PBXFileReference section */
1870340FFE93FCAF11CA0CD7 /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/main.nib; sourceTree = "<group>"; };
32DBCF6D0370B57F00C91783 /* SeismicSimulation.pch */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = SeismicSimulation.pch; sourceTree = "<group>"; };
+ 61C4770013CE179A0022F8F6 /* main.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = main.cpp; path = ../main.cpp; sourceTree = "<group>"; };
+ 61C4770313CE17B40022F8F6 /* seismic_video.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = seismic_video.cpp; path = ../seismic_video.cpp; sourceTree = "<group>"; };
+ 61C4770413CE17B40022F8F6 /* seismic_video.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = seismic_video.h; path = ../seismic_video.h; sourceTree = "<group>"; };
+ 61C4770613CE17B40022F8F6 /* universe.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = universe.cpp; path = ../universe.cpp; sourceTree = "<group>"; };
+ 61C4770713CE17B40022F8F6 /* universe.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = universe.h; path = ../universe.h; sourceTree = "<group>"; };
8D0C4E960486CD37000505A6 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = Info.plist; sourceTree = "<group>"; };
8D0C4E970486CD37000505A6 /* SeismicSimulation.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SeismicSimulation.app; sourceTree = BUILT_PRODUCTS_DIR; };
A18D2A330B861B99007D8D2C /* libtbb.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libtbb.dylib; path = ../../../../lib/libtbb.dylib; sourceTree = SOURCE_ROOT; };
A1A8F41D0B8B4DBE001C55B1 /* AGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AGL.framework; path = /System/Library/Frameworks/AGL.framework; sourceTree = "<absolute>"; };
A1A8F4300B8B4EA8001C55B1 /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = /System/Library/Frameworks/Carbon.framework; sourceTree = "<absolute>"; };
A1E3E7BC0B3AD4EC007C3AB5 /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = /System/Library/Frameworks/OpenGL.framework; sourceTree = "<absolute>"; };
- A1F591A80B8DFC7100073279 /* SeismicSimulation.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = SeismicSimulation.cpp; path = ../SeismicSimulation.cpp; sourceTree = SOURCE_ROOT; };
A1F591AA0B8DFC9600073279 /* macvideo.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = macvideo.cpp; path = ../../../common/gui/macvideo.cpp; sourceTree = SOURCE_ROOT; };
A1F591AB0B8DFC9600073279 /* video.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = video.h; path = ../../../common/gui/video.h; sourceTree = SOURCE_ROOT; };
/* End PBXFileReference section */
@@ -52,7 +57,6 @@
buildActionMask = 2147483647;
files = (
A1E3E7BD0B3AD4EC007C3AB5 /* OpenGL.framework in Frameworks */,
- A12649490B8392750091D5AD /* OpenGL.framework in Frameworks */,
A18D2A340B861B99007D8D2C /* libtbb.dylib in Frameworks */,
A1A8F41E0B8B4DBE001C55B1 /* AGL.framework in Frameworks */,
A1A8F4310B8B4EA8001C55B1 /* Carbon.framework in Frameworks */,
@@ -84,7 +88,11 @@
20286C2AFDCF999611CA2CEA /* Sources */ = {
isa = PBXGroup;
children = (
- A1F591A80B8DFC7100073279 /* SeismicSimulation.cpp */,
+ 61C4770313CE17B40022F8F6 /* seismic_video.cpp */,
+ 61C4770413CE17B40022F8F6 /* seismic_video.h */,
+ 61C4770613CE17B40022F8F6 /* universe.cpp */,
+ 61C4770713CE17B40022F8F6 /* universe.h */,
+ 61C4770013CE179A0022F8F6 /* main.cpp */,
A1F591AA0B8DFC9600073279 /* macvideo.cpp */,
A1F591AB0B8DFC9600073279 /* video.h */,
32DBCF6D0370B57F00C91783 /* SeismicSimulation.pch */,
@@ -139,9 +147,16 @@
/* Begin PBXProject section */
20286C28FDCF999611CA2CEA /* Project object */ = {
isa = PBXProject;
+ attributes = {
+ LastUpgradeCheck = 0410;
+ };
buildConfigurationList = C0E91AC908A95435008D54AB /* Build configuration list for PBXProject "SeismicSimulation" */;
- compatibilityVersion = "Xcode 2.4";
+ compatibilityVersion = "Xcode 3.2";
+ developmentRegion = English;
hasScannedForEncodings = 1;
+ knownRegions = (
+ en,
+ );
mainGroup = 20286C29FDCF999611CA2CEA /* SeismicSimulation */;
projectDirPath = "";
projectRoot = "";
@@ -168,8 +183,10 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
- A1F591A90B8DFC7100073279 /* SeismicSimulation.cpp in Sources */,
A1F591AC0B8DFC9600073279 /* macvideo.cpp in Sources */,
+ 61C4770113CE179A0022F8F6 /* main.cpp in Sources */,
+ 61C4770813CE17B40022F8F6 /* seismic_video.cpp in Sources */,
+ 61C4770A13CE17B40022F8F6 /* universe.cpp in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -192,17 +209,16 @@
buildSettings = {
COPY_PHASE_STRIP = NO;
GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
GCC_MODEL_TUNING = "";
GCC_OPTIMIZATION_LEVEL = 0;
- INSTALL_PATH = "$(HOME)/Applications";
+ GCC_VERSION = "";
HEADER_SEARCH_PATHS = ../../../../include;
+ INSTALL_PATH = "$(HOME)/Applications";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
../../../../lib,
);
PRODUCT_NAME = SeismicSimulation;
- GCC_VERSION = 4.0;
};
name = Debug;
};
@@ -211,14 +227,14 @@
buildSettings = {
GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
GCC_MODEL_TUNING = "";
- INSTALL_PATH = "$(HOME)/Applications";
+ GCC_VERSION = "";
HEADER_SEARCH_PATHS = ../../../../include;
+ INSTALL_PATH = "$(HOME)/Applications";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
../../../../lib,
);
PRODUCT_NAME = SeismicSimulation;
- GCC_VERSION = 4.0;
};
name = Release;
};
@@ -231,11 +247,12 @@
GCC_ENABLE_SSE3_EXTENSIONS = YES;
GCC_MODEL_TUNING = "";
GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_VERSION = "";
GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = NO;
+ IBC_STRIP_NIBS = NO;
MACH_O_TYPE = mh_execute;
- PREBINDING = NO;
PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
- GCC_VERSION = 4.0;
+ SDKROOT = macosx10.6;
SYMROOT = "/tmp/tbb-$(USER)";
};
name = Debug;
@@ -249,11 +266,12 @@
GCC_ENABLE_SSE3_EXTENSIONS = YES;
GCC_MODEL_TUNING = "";
GCC_OPTIMIZATION_LEVEL = 3;
+ GCC_VERSION = "";
GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = NO;
+ IBC_STRIP_NIBS = NO;
MACH_O_TYPE = mh_execute;
- PREBINDING = NO;
PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
- GCC_VERSION = 4.0;
+ SDKROOT = macosx10.6;
SYMROOT = "/tmp/tbb-$(USER)";
};
name = Release;
diff --git a/examples/parallel_for/tachyon/Makefile b/examples/parallel_for/tachyon/Makefile
index 848fbd4..9ab1b51 100644
--- a/examples/parallel_for/tachyon/Makefile
+++ b/examples/parallel_for/tachyon/Makefile
@@ -59,10 +59,10 @@ ifneq (,$(shell which icc 2>/dev/null))
CXX=icc
endif # icc
-# The default dataset
-export DATASET = balls
# The default runtime arguments
-export ARGS =
+export ARGS = dat/balls.dat
+export PERF_RUN_ARGS = silent dat/balls3.dat
+export LIGHT_ARGS= dat/model2.dat
# define name suffix
SUFFIX = .$(VERSION)
@@ -72,13 +72,13 @@ LIBS ?= -lm
include ../../common/gui/Makefile.gmake
ifeq ($(UI),x)
-CXXFLAGS += -DX_FULLSYNC
+UI_CXXFLAGS += -DX_FULLSYNC
ifneq (,$(findstring -lXext,$(LIBS)))
-CXXFLAGS += -DX_NOSHMPIX
+UI_CXXFLAGS += -DX_NOSHMPIX
endif
endif # X
-MYCXXFLAGS = $(CXXFLAGS)
+MYCXXFLAGS = $(CXXFLAGS) $(UI_CXXFLAGS)
all: build run
release: build
@@ -118,6 +118,15 @@ run_tbb1d:
$(MAKE) VERSION=tbb1d run_one
+perf_build:
+ $(MAKE) UI=con VERSION=tbb ADD_TBB=1 build_one
+perf_run:
+ $(MAKE) UI=con VERSION=tbb run_perf_one
+
+light_test:
+ $(MAKE) UI=con VERSION=tbb light_test_one
+
+
#
# Per-build Makefile rules (for recursive $(MAKE) calls from above)
#
@@ -127,7 +136,7 @@ SVERSION = $(VERSION)
ifeq ($(ADD_DEBUG),1)
MYCXXFLAGS += -O0 -g -D_DEBUG
else
-MYCXXFLAGS += -O2
+MYCXXFLAGS += -O2 -DNDEBUG
endif
@@ -141,17 +150,27 @@ LIBS += -ltbb
endif
endif
-SOURCE = ../../common/gui/$(UI)video.cpp src/trace.$(SVERSION).cpp src/pthread.cpp src/video.cpp src/api.cpp src/apigeom.cpp src/apitrigeom.cpp src/bndbox.cpp src/box.cpp src/camera.cpp src/coordsys.cpp src/cylinder.cpp src/extvol.cpp src/getargs.cpp src/global.cpp src/grid.cpp src/imageio.cpp src/imap.cpp src/intersect.cpp src/jpeg.cpp src/light.cpp src/objbound.cpp src/parse.cpp src/plane.cpp src/ppm.cpp src/quadric.cpp src/render.cpp src/ring.cpp src/shade.cpp src/sphere.cpp src/textu [...]
+ifeq ($(shell uname), Linux)
+LIBS += -lrt
+endif
+
+SOURCE = ../../common/gui/$(UI)video.cpp src/trace.$(SVERSION).cpp src/main.cpp src/pthread.cpp src/tachyon_video.cpp src/api.cpp src/apigeom.cpp src/apitrigeom.cpp src/bndbox.cpp src/box.cpp src/camera.cpp src/coordsys.cpp src/cylinder.cpp src/extvol.cpp src/global.cpp src/grid.cpp src/imageio.cpp src/imap.cpp src/intersect.cpp src/jpeg.cpp src/light.cpp src/objbound.cpp src/parse.cpp src/plane.cpp src/ppm.cpp src/quadric.cpp src/render.cpp src/ring.cpp src/shade.cpp src/sphere.cpp src/ [...]
build_one: $(EXE)
run_one:
ifeq ($(UI),mac)
- export DYLD_LIBRARY_PATH="$(DYLD_LIBRARY_PATH):$(TBBLIBSPATH)"; ./$(EXE) $(ARGS) dat/$(DATASET).dat
+ export DYLD_LIBRARY_PATH="$(DYLD_LIBRARY_PATH):$(TBBLIBSPATH)"; ./$(EXE) $(ARGS)
else
- ./$(EXE) $(ARGS) dat/$(DATASET).dat
+ ./$(EXE) $(ARGS)
endif
+run_perf_one:
+ ./$(EXE) $(PERF_RUN_ARGS)
+
+light_test_one:
+ ./$(EXE) $(LIGHT_ARGS)
+
$(EXE): $(SOURCE)
ifeq ($(UI),mac)
mkdir -p $(APPRES)/English.lproj $(NAME).$(VERSION).app/Contents/MacOS
diff --git a/examples/parallel_for/tachyon/Makefile.windows b/examples/parallel_for/tachyon/Makefile.windows
index cbdd2f1..7c3bad4 100644
--- a/examples/parallel_for/tachyon/Makefile.windows
+++ b/examples/parallel_for/tachyon/Makefile.windows
@@ -70,10 +70,10 @@ ARCH1 = $(ARCH0:ia32-=x86)
ARCH2 = $(ARCH1:intel64-=AMD64)
XARCH = $(ARCH2:-=x86)
-# The default dataset
-DATASET = balls
# The default runtime arguments
-ARGS =
+ARGS = dat\balls.dat
+PERF_RUN_ARGS = silent dat\balls3.dat
+LIGHT_ARGS=dat\model2.dat
# Add these for tbb/tbb1d release builds
# /GL is a workaround to prevent run-time crash when built by VS2010
@@ -86,7 +86,7 @@ LIBS_TBB_DEBUG = tbb_debug.lib $(LIBS)
MAKEINC = ../../common/gui/Makefile.win
-SOURCE = src/pthread.cpp src/video.cpp src/api.cpp src/apigeom.cpp src/apitrigeom.cpp src/bndbox.cpp src/box.cpp src/camera.cpp src/coordsys.cpp src/cylinder.cpp src/extvol.cpp src/getargs.cpp src/global.cpp src/grid.cpp src/imageio.cpp src/imap.cpp src/intersect.cpp src/jpeg.cpp src/light.cpp src/objbound.cpp src/parse.cpp src/plane.cpp src/ppm.cpp src/quadric.cpp src/render.cpp src/ring.cpp src/shade.cpp src/sphere.cpp src/texture.cpp src/tgafile.cpp src/trace_rest.cpp src/triangle.cpp [...]
+SOURCE = src/main.cpp src/pthread.cpp src/tachyon_video.cpp src/api.cpp src/apigeom.cpp src/apitrigeom.cpp src/bndbox.cpp src/box.cpp src/camera.cpp src/coordsys.cpp src/cylinder.cpp src/extvol.cpp src/global.cpp src/grid.cpp src/imageio.cpp src/imap.cpp src/intersect.cpp src/jpeg.cpp src/light.cpp src/objbound.cpp src/parse.cpp src/plane.cpp src/ppm.cpp src/quadric.cpp src/render.cpp src/ring.cpp src/shade.cpp src/sphere.cpp src/texture.cpp src/tgafile.cpp src/trace_rest.cpp src/triangl [...]
# Targets
all: build run
@@ -110,22 +110,30 @@ build_serial:
build_serial_debug:
@$(MAKE) -f $(MAKEINC) SOURCE="src/trace.serial.cpp $(SOURCE)" EXE=tachyon.serial.exe RCNAME=gui UI=$(UI) DEBUG=_debug CXX="$(CXX)" CXXFLAGS=$(CXXFLAGS) XARCH=$(XARCH) build_one
run_serial:
- -.\tachyon.serial.exe $(ARGS) dat\$(DATASET).dat
+ -.\tachyon.serial.exe $(ARGS)
build_tbb:
@$(MAKE) -f $(MAKEINC) SOURCE="src/trace.tbb.cpp $(SOURCE)" EXE=tachyon.tbb.exe RCNAME=gui UI=$(UI) CXX="$(CXX)" CXXFLAGS="$(CXXFLAGS_TBB_NDEBUG)" LFLAGS="$(LIBS_TBB_NDEBUG)" XARCH=$(XARCH) build_one
build_tbb_debug:
@$(MAKE) -f $(MAKEINC) SOURCE="src/trace.tbb.cpp $(SOURCE)" EXE=tachyon.tbb.exe RCNAME=gui UI=$(UI) DEBUG=_debug CXX="$(CXX)" CXXFLAGS="$(CXXFLAGS_TBB_DEBUG)" LFLAGS="$(LIBS_TBB_DEBUG)" XARCH=$(XARCH) build_one
run_tbb:
- -.\tachyon.tbb.exe $(ARGS) dat\$(DATASET).dat
+ -.\tachyon.tbb.exe $(ARGS)
build_tbb1d:
@$(MAKE) -f $(MAKEINC) SOURCE="src/trace.tbb1d.cpp $(SOURCE)" EXE=tachyon.tbb1d.exe RCNAME=gui UI=$(UI) CXX="$(CXX)" CXXFLAGS="$(CXXFLAGS_TBB_NDEBUG)" LFLAGS="$(LIBS_TBB_NDEBUG)" XARCH=$(XARCH) build_one
build_tbb1d_debug:
@$(MAKE) -f $(MAKEINC) SOURCE="src/trace.tbb1d.cpp $(SOURCE)" EXE=tachyon.tbb1d.exe RCNAME=gui UI=$(UI) DEBUG=_debug CXX="$(CXX)" CXXFLAGS="$(CXXFLAGS_TBB_DEBUG)" LFLAGS="$(LIBS_TBB_DEBUG)" XARCH=$(XARCH) build_one
run_tbb1d:
- -.\tachyon.tbb1d.exe $(ARGS) dat\$(DATASET).dat
+ -.\tachyon.tbb1d.exe $(ARGS)
clean:
@cmd.exe /C del tachyon.* *.manifest *.obj msvs\gui.res *.?db
+
+perf_build:
+ @$(MAKE) -f $(MAKEINC) SOURCE="src/trace.tbb.cpp $(SOURCE)" EXE=tachyon.tbb.exe RCNAME=gui UI=con CXX="$(CXX)" CXXFLAGS="$(CXXFLAGS_TBB_NDEBUG)" LFLAGS="$(LIBS_TBB_NDEBUG)" XARCH=$(XARCH) build_one
+perf_run:
+ -.\tachyon.tbb.exe $(PERF_RUN_ARGS)
+
+light_test:
+ -.\tachyon.tbb.exe $(LIGHT_ARGS)
diff --git a/examples/parallel_for/tachyon/index.html b/examples/parallel_for/tachyon/index.html
index 151255b..91caf79 100644
--- a/examples/parallel_for/tachyon/index.html
+++ b/examples/parallel_for/tachyon/index.html
@@ -49,8 +49,10 @@ The following versions of the example are provided:
<H2>Files</H2>
<DL>
-<DT><A HREF="src/video.cpp">src/video.cpp</A>
-<DD>Source code for main program and GUI interfaces.
+<DT><A HREF="src/main.cpp">src/main.cpp</A>
+<DD>Main program which parses command line options and runs the raytracer.
+<DT><A HREF="src/tachyon_video.cpp">src/tachyon_video.cpp</A>
+<DD>Source code for GUI interfaces.
<DT><A HREF="src/trace.serial.cpp">src/trace.serial.cpp</A>
<DD>Source code for original sequential version of example.
<DT><A HREF="src/trace.tbb1d.cpp">src/trace.tbb1d.cpp</A>
@@ -122,19 +124,25 @@ Here, <<I>version</I>> is one of the above versions of the example, i.e.,
<H2>Usage</H2>
Building via the above make commands, or via Visual Studio projects on Windows* systems, produces executable files
-named tachyon.<<I>version</I>>.exe. To run these executables directly, use one or more of the following commands.
+named <TT>tachyon.<<I>version</I>>.exe</TT>. To run these executables directly, use one or more of the following commands.
<DL>
-<DT><TT>tachyon.<<I>version</I>>.exe <<I>dataset</I>></TT>
-<DD>Run this version (release or debug), where <<I>dataset</I>> is the path/name of
- one of the *.dat files in the <A HREF="dat">dat</A> directory for the example.
-<DT><TT>tachyon.<<I>version</I>>.exe -D <<I>dataset</I>></TT>
+<DT><TT>tachyon.<<I>version</I>> <I>-h</I></TT>
+<DD>Prints the help for command line options
+<DT><TT>tachyon.<<I>version</I>> [<I>dataset</I>=value] [<I>boundthresh</I>=value] [<I>no-display-updating</I>] [<I>nobounding</I>] [<I>silent</I>]</TT>
+<DT><TT>tachyon.<<I>version</I>> [<I>dataset</I> [<I>boundthresh</I>]] [<I>no-display-updating</I>] [<I>nobounding</I>] [<I>silent</I>]</TT>
+<DD><I>dataset</I> is the path/name of one of the *.dat files in the <A HREF="dat">dat</A> directory for the example.<BR>
+ <I>boundthresh</I> is a bounding threshold value.<BR>
+ <I>no-display-updating</I> - disable run-time display updating.<BR>
+ <I>no-bounding</I> - disable bounding technique.<BR>
+ <I>silent</I> - no output except elapsed time.<BR>
+<DT><TT>tachyon.<<I>version</I>> [<I>dataset</I>] [<I>no-display-updating</I>]</TT>
<DD>Run this version (release or debug), but run with disabled run-time display updating
for use in making performance measurements
<I>(strongly recommended when measuring performance or scalability; see note below)</I>.
-<DT>To run a short version of this example, e.g., for use with Intel® Threading Tools:
+<DT>To run a short version of this example, e.g., for use with Intel® Parallel Inspector:
<DD>Build a <I>debug</I> version of the <TT>tbb</TT> example with the GUI turned off
(e.g., <TT>make UI=con tbb_debug</TT>; see also the build directions above).
- <BR>Run it with a small dataset, e.g., <TT>tachyon.tbb.exe -D dat/820spheres.dat</TT>.
+ <BR>Run it with a small dataset, e.g., <TT>tachyon.tbb.exe dat/820spheres.dat no-display-updating</TT>.
</DL>
<H2>Notes</H2>
@@ -152,10 +160,9 @@ named tachyon.<<I>version</I>>.exe. To run these executables directly, us
<A HREF="../index.html">Up to parent directory</A>
<p></p>
Copyright © 2005-2011 Intel Corporation. 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>
+Intel is a registered trademark or trademark 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/examples/parallel_for/tachyon/msvs/tachyon.serial.vcproj b/examples/parallel_for/tachyon/msvs/tachyon.serial.vcproj
index a81953e..e100afc 100644
--- a/examples/parallel_for/tachyon/msvs/tachyon.serial.vcproj
+++ b/examples/parallel_for/tachyon/msvs/tachyon.serial.vcproj
@@ -20,8 +20,8 @@
<Configurations>
<Configuration
Name="Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
+ OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)\serial"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)\serial"
ConfigurationType="1"
CharacterSet="2"
>
@@ -68,7 +68,6 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="$(OutDir)tachyon.common.lib"
LinkIncremental="1"
GenerateDebugInformation="true"
SubSystem="2"
@@ -103,8 +102,8 @@
</Configuration>
<Configuration
Name="Debug|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
+ OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)\serial"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)\serial"
ConfigurationType="1"
CharacterSet="2"
>
@@ -150,7 +149,6 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="$(OutDir)tachyon.common.lib"
LinkIncremental="1"
GenerateDebugInformation="true"
SubSystem="2"
@@ -185,8 +183,8 @@
</Configuration>
<Configuration
Name="Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
+ OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)\serial"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)\serial"
ConfigurationType="1"
CharacterSet="2"
WholeProgramOptimization="1"
@@ -232,7 +230,6 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="$(OutDir)tachyon.common.lib"
LinkIncremental="1"
GenerateDebugInformation="true"
SubSystem="2"
@@ -268,8 +265,8 @@
</Configuration>
<Configuration
Name="Release|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
+ OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)\serial"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)\serial"
ConfigurationType="1"
CharacterSet="2"
WholeProgramOptimization="1"
@@ -314,7 +311,6 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="$(OutDir)tachyon.common.lib"
LinkIncremental="1"
GenerateDebugInformation="true"
SubSystem="2"
@@ -349,9 +345,9 @@
/>
</Configuration>
<Configuration
- Name="DD Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
+ Name="DDRelease|Win32"
+ OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)\serial"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)\serial"
ConfigurationType="1"
CharacterSet="2"
WholeProgramOptimization="1"
@@ -397,7 +393,6 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="$(OutDir)tachyon.common.lib"
LinkIncremental="1"
AdditionalLibraryDirectories="$(DXSDK_DIR)\lib\x86"
GenerateDebugInformation="true"
@@ -433,9 +428,9 @@
/>
</Configuration>
<Configuration
- Name="DD Release|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
+ Name="DDRelease|x64"
+ OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)\serial"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)\serial"
ConfigurationType="1"
CharacterSet="2"
WholeProgramOptimization="1"
@@ -480,7 +475,6 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="$(OutDir)tachyon.common.lib"
LinkIncremental="1"
AdditionalLibraryDirectories="$(DXSDK_DIR)\lib\x64"
GenerateDebugInformation="true"
@@ -516,9 +510,9 @@
/>
</Configuration>
<Configuration
- Name="DD Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
+ Name="DDDebug|Win32"
+ OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)\serial"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)\serial"
ConfigurationType="1"
CharacterSet="2"
>
@@ -565,7 +559,6 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="$(OutDir)tachyon.common.lib"
LinkIncremental="1"
AdditionalLibraryDirectories="$(DXSDK_DIR)\lib\x86"
GenerateDebugInformation="true"
@@ -600,9 +593,9 @@
/>
</Configuration>
<Configuration
- Name="DD Debug|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
+ Name="DDDebug|x64"
+ OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)\serial"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)\serial"
ConfigurationType="1"
CharacterSet="2"
>
@@ -648,7 +641,6 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="$(OutDir)tachyon.common.lib"
LinkIncremental="1"
AdditionalLibraryDirectories="$(DXSDK_DIR)\lib\x64"
GenerateDebugInformation="true"
diff --git a/examples/parallel_for/tachyon/msvs/tachyon.tbb.vcproj b/examples/parallel_for/tachyon/msvs/tachyon.tbb.vcproj
index 96a2dda..1e104a2 100644
--- a/examples/parallel_for/tachyon/msvs/tachyon.tbb.vcproj
+++ b/examples/parallel_for/tachyon/msvs/tachyon.tbb.vcproj
@@ -20,8 +20,8 @@
<Configurations>
<Configuration
Name="Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
+ OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)\tbb"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)\tbb"
ConfigurationType="1"
CharacterSet="2"
>
@@ -47,7 +47,7 @@
FavorSizeOrSpeed="1"
OmitFramePointers="true"
WholeProgramOptimization="true"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="TBB_USE_DEBUG;_CRT_SECURE_NO_DEPRECATE;WIN32;_WINDOWS;_DEBUG"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
@@ -69,9 +69,9 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib $(OutDir)tachyon.common.lib"
+ AdditionalDependencies="tbb_debug.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+ AdditionalLibraryDirectories="$(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc8;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc8"
GenerateDebugInformation="true"
SubSystem="2"
LinkTimeCodeGeneration="1"
@@ -102,13 +102,13 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 debug "$(OutDir)""
+ 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)"
+ OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)\tbb"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)\tbb"
ConfigurationType="1"
CharacterSet="2"
>
@@ -135,7 +135,7 @@
FavorSizeOrSpeed="1"
OmitFramePointers="true"
WholeProgramOptimization="true"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="TBB_USE_DEBUG;_CRT_SECURE_NO_DEPRECATE;WIN64;_WINDOWS;_DEBUG"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
@@ -155,9 +155,9 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib $(OutDir)tachyon.common.lib"
+ AdditionalDependencies="tbb_debug.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+ AdditionalLibraryDirectories="$(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc8;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc8"
GenerateDebugInformation="true"
SubSystem="2"
LinkTimeCodeGeneration="1"
@@ -188,13 +188,13 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 debug "$(OutDir)""
+ 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)"
+ OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)\tbb"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)\tbb"
ConfigurationType="1"
CharacterSet="2"
WholeProgramOptimization="1"
@@ -220,7 +220,7 @@
FavorSizeOrSpeed="1"
OmitFramePointers="true"
WholeProgramOptimization="true"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="_CRT_SECURE_NO_DEPRECATE;WIN32;_WINDOWS;NDEBUG"
RuntimeLibrary="2"
EnableEnhancedInstructionSet="2"
@@ -241,9 +241,9 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib $(OutDir)tachyon.common.lib"
+ AdditionalDependencies="tbb.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+ AdditionalLibraryDirectories="$(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc8;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc8"
GenerateDebugInformation="true"
SubSystem="2"
OptimizeReferences="2"
@@ -275,13 +275,13 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 release "$(OutDir)""
+ 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)"
+ OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)\tbb"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)\tbb"
ConfigurationType="1"
CharacterSet="2"
WholeProgramOptimization="1"
@@ -308,7 +308,7 @@
FavorSizeOrSpeed="1"
OmitFramePointers="true"
WholeProgramOptimization="true"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="_CRT_SECURE_NO_DEPRECATE;WIN64;_WINDOWS;NDEBUG"
RuntimeLibrary="2"
UsePrecompiledHeader="0"
@@ -327,9 +327,9 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib $(OutDir)tachyon.common.lib"
+ AdditionalDependencies="tbb.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+ AdditionalLibraryDirectories="$(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc8;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc8"
GenerateDebugInformation="true"
SubSystem="2"
OptimizeReferences="2"
@@ -361,13 +361,13 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 release "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 release "$(OutDir)""
/>
</Configuration>
<Configuration
- Name="DD Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
+ Name="DDRelease|Win32"
+ OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)\tbb"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)\tbb"
ConfigurationType="1"
CharacterSet="2"
WholeProgramOptimization="1"
@@ -393,7 +393,7 @@
FavorSizeOrSpeed="1"
OmitFramePointers="true"
WholeProgramOptimization="true"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="_CRT_SECURE_NO_DEPRECATE;WIN32;_WINDOWS;NDEBUG"
RuntimeLibrary="2"
EnableEnhancedInstructionSet="2"
@@ -414,9 +414,9 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib $(OutDir)tachyon.common.lib"
+ AdditionalDependencies="tbb.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8;$(DXSDK_DIR)\lib\x86"
+ AdditionalLibraryDirectories="$(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc8;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc8;$(DXSDK_DIR)\lib\x86"
GenerateDebugInformation="true"
SubSystem="2"
OptimizeReferences="2"
@@ -448,13 +448,13 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 release "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 release "$(OutDir)""
/>
</Configuration>
<Configuration
- Name="DD Release|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
+ Name="DDRelease|x64"
+ OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)\tbb"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)\tbb"
ConfigurationType="1"
CharacterSet="2"
WholeProgramOptimization="1"
@@ -481,7 +481,7 @@
FavorSizeOrSpeed="1"
OmitFramePointers="true"
WholeProgramOptimization="true"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="_CRT_SECURE_NO_DEPRECATE;WIN64;_WINDOWS;NDEBUG"
RuntimeLibrary="2"
UsePrecompiledHeader="0"
@@ -500,9 +500,9 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib $(OutDir)tachyon.common.lib"
+ AdditionalDependencies="tbb.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8;$(DXSDK_DIR)\lib\x64"
+ AdditionalLibraryDirectories="$(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc8;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc8;$(DXSDK_DIR)\lib\x64"
GenerateDebugInformation="true"
SubSystem="2"
OptimizeReferences="2"
@@ -534,13 +534,13 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 release "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 release "$(OutDir)""
/>
</Configuration>
<Configuration
- Name="DD Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
+ Name="DDDebug|Win32"
+ OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)\tbb"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)\tbb"
ConfigurationType="1"
CharacterSet="2"
>
@@ -566,7 +566,7 @@
FavorSizeOrSpeed="1"
OmitFramePointers="true"
WholeProgramOptimization="true"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="TBB_USE_DEBUG;_CRT_SECURE_NO_DEPRECATE;WIN32;_WINDOWS;_DEBUG"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
@@ -588,9 +588,9 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib $(OutDir)tachyon.common.lib"
+ AdditionalDependencies="tbb_debug.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8;$(DXSDK_DIR)\lib\x86"
+ AdditionalLibraryDirectories="$(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc8;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc8;$(DXSDK_DIR)\lib\x86"
GenerateDebugInformation="true"
SubSystem="2"
LinkTimeCodeGeneration="1"
@@ -621,13 +621,13 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 debug "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 debug "$(OutDir)""
/>
</Configuration>
<Configuration
- Name="DD Debug|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
+ Name="DDDebug|x64"
+ OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)\tbb"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)\tbb"
ConfigurationType="1"
CharacterSet="2"
>
@@ -654,7 +654,7 @@
FavorSizeOrSpeed="1"
OmitFramePointers="true"
WholeProgramOptimization="true"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="TBB_USE_DEBUG;_CRT_SECURE_NO_DEPRECATE;WIN64;_WINDOWS;_DEBUG"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
@@ -674,9 +674,9 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib $(OutDir)tachyon.common.lib"
+ AdditionalDependencies="tbb_debug.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8;$(DXSDK_DIR)\lib\x64"
+ AdditionalLibraryDirectories="$(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc8;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc8;$(DXSDK_DIR)\lib\x64"
GenerateDebugInformation="true"
SubSystem="2"
LinkTimeCodeGeneration="1"
@@ -707,7 +707,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 debug "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 debug "$(OutDir)""
/>
</Configuration>
</Configurations>
diff --git a/examples/parallel_for/tachyon/msvs/tachyon.tbb1d.vcproj b/examples/parallel_for/tachyon/msvs/tachyon.tbb1d.vcproj
index a16037e..d30edec 100644
--- a/examples/parallel_for/tachyon/msvs/tachyon.tbb1d.vcproj
+++ b/examples/parallel_for/tachyon/msvs/tachyon.tbb1d.vcproj
@@ -20,8 +20,8 @@
<Configurations>
<Configuration
Name="Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
+ OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)\tbb1d"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)\tbb1d"
ConfigurationType="1"
CharacterSet="2"
>
@@ -47,7 +47,7 @@
FavorSizeOrSpeed="1"
OmitFramePointers="true"
WholeProgramOptimization="true"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="TBB_USE_DEBUG;_CRT_SECURE_NO_DEPRECATE;WIN32;_WINDOWS;_DEBUG"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
@@ -69,9 +69,9 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib $(OutDir)tachyon.common.lib"
+ AdditionalDependencies="tbb_debug.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+ AdditionalLibraryDirectories="$(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc8;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc8"
GenerateDebugInformation="true"
SubSystem="2"
LinkTimeCodeGeneration="1"
@@ -102,13 +102,13 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 debug "$(OutDir)""
+ 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)"
+ OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)\tbb1d"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)\tbb1d"
ConfigurationType="1"
CharacterSet="2"
>
@@ -135,7 +135,7 @@
FavorSizeOrSpeed="1"
OmitFramePointers="true"
WholeProgramOptimization="true"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="TBB_USE_DEBUG;_CRT_SECURE_NO_DEPRECATE;WIN64;_WINDOWS;_DEBUG"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
@@ -155,9 +155,9 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib $(OutDir)tachyon.common.lib"
+ AdditionalDependencies="tbb_debug.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+ AdditionalLibraryDirectories="$(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc8;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc8"
GenerateDebugInformation="true"
SubSystem="2"
LinkTimeCodeGeneration="1"
@@ -188,13 +188,13 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 debug "$(OutDir)""
+ 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)"
+ OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)\tbb1d"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)\tbb1d"
ConfigurationType="1"
CharacterSet="2"
WholeProgramOptimization="1"
@@ -220,7 +220,7 @@
FavorSizeOrSpeed="1"
OmitFramePointers="true"
WholeProgramOptimization="true"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="_CRT_SECURE_NO_DEPRECATE;WIN32;_WINDOWS;NDEBUG"
RuntimeLibrary="2"
EnableEnhancedInstructionSet="2"
@@ -241,9 +241,9 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib $(OutDir)tachyon.common.lib"
+ AdditionalDependencies="tbb.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+ AdditionalLibraryDirectories="$(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc8;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc8"
GenerateDebugInformation="true"
SubSystem="2"
OptimizeReferences="2"
@@ -275,13 +275,13 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 release "$(OutDir)""
+ 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)"
+ OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)\tbb1d"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)\tbb1d"
ConfigurationType="1"
CharacterSet="2"
WholeProgramOptimization="1"
@@ -308,7 +308,7 @@
FavorSizeOrSpeed="1"
OmitFramePointers="true"
WholeProgramOptimization="true"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="_CRT_SECURE_NO_DEPRECATE;WIN64;_WINDOWS;NDEBUG"
RuntimeLibrary="2"
UsePrecompiledHeader="0"
@@ -327,9 +327,9 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib $(OutDir)tachyon.common.lib"
+ AdditionalDependencies="tbb.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+ AdditionalLibraryDirectories="$(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc8;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc8"
GenerateDebugInformation="true"
SubSystem="2"
OptimizeReferences="2"
@@ -361,13 +361,13 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 release "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 release "$(OutDir)""
/>
</Configuration>
<Configuration
- Name="DD Release|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
+ Name="DDRelease|Win32"
+ OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)\tbb1d"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)\tbb1d"
ConfigurationType="1"
CharacterSet="2"
WholeProgramOptimization="1"
@@ -393,7 +393,7 @@
FavorSizeOrSpeed="1"
OmitFramePointers="true"
WholeProgramOptimization="true"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="_CRT_SECURE_NO_DEPRECATE;WIN32;_WINDOWS;NDEBUG"
RuntimeLibrary="2"
EnableEnhancedInstructionSet="2"
@@ -414,9 +414,9 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib $(OutDir)tachyon.common.lib"
+ AdditionalDependencies="tbb.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8;$(DXSDK_DIR)\lib\x86"
+ AdditionalLibraryDirectories="$(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc8;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc8;$(DXSDK_DIR)\lib\x86"
GenerateDebugInformation="true"
SubSystem="2"
OptimizeReferences="2"
@@ -448,13 +448,13 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 release "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 release "$(OutDir)""
/>
</Configuration>
<Configuration
- Name="DD Release|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
+ Name="DDRelease|x64"
+ OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)\tbb1d"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)\tbb1d"
ConfigurationType="1"
CharacterSet="2"
WholeProgramOptimization="1"
@@ -481,7 +481,7 @@
FavorSizeOrSpeed="1"
OmitFramePointers="true"
WholeProgramOptimization="true"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="_CRT_SECURE_NO_DEPRECATE;WIN64;_WINDOWS;NDEBUG"
RuntimeLibrary="2"
UsePrecompiledHeader="0"
@@ -500,9 +500,9 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="tbb.lib $(OutDir)tachyon.common.lib"
+ AdditionalDependencies="tbb.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8;$(DXSDK_DIR)\lib\x64"
+ AdditionalLibraryDirectories="$(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc8;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc8;$(DXSDK_DIR)\lib\x64"
GenerateDebugInformation="true"
SubSystem="2"
OptimizeReferences="2"
@@ -534,13 +534,13 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 release "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 release "$(OutDir)""
/>
</Configuration>
<Configuration
- Name="DD Debug|Win32"
- OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
+ Name="DDDebug|Win32"
+ OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)\tbb1d"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)\tbb1d"
ConfigurationType="1"
CharacterSet="2"
>
@@ -566,7 +566,7 @@
FavorSizeOrSpeed="1"
OmitFramePointers="true"
WholeProgramOptimization="true"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="TBB_USE_DEBUG;_CRT_SECURE_NO_DEPRECATE;WIN32;_WINDOWS;_DEBUG"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
@@ -588,9 +588,9 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib $(OutDir)tachyon.common.lib"
+ AdditionalDependencies="tbb_debug.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8;$(DXSDK_DIR)\lib\x86"
+ AdditionalLibraryDirectories="$(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc8;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc8;$(DXSDK_DIR)\lib\x86"
GenerateDebugInformation="true"
SubSystem="2"
LinkTimeCodeGeneration="1"
@@ -621,13 +621,13 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 debug "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 debug "$(OutDir)""
/>
</Configuration>
<Configuration
- Name="DD Debug|x64"
- OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
- IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
+ Name="DDDebug|x64"
+ OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)\tbb1d"
+ IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)\tbb1d"
ConfigurationType="1"
CharacterSet="2"
>
@@ -654,7 +654,7 @@
FavorSizeOrSpeed="1"
OmitFramePointers="true"
WholeProgramOptimization="true"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="TBB_USE_DEBUG;_CRT_SECURE_NO_DEPRECATE;WIN64;_WINDOWS;_DEBUG"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
@@ -674,9 +674,9 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="tbb_debug.lib $(OutDir)tachyon.common.lib"
+ AdditionalDependencies="tbb_debug.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8;$(DXSDK_DIR)\lib\x64"
+ AdditionalLibraryDirectories="$(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc8;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc8;$(DXSDK_DIR)\lib\x64"
GenerateDebugInformation="true"
SubSystem="2"
LinkTimeCodeGeneration="1"
@@ -707,7 +707,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 debug "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 debug "$(OutDir)""
/>
</Configuration>
</Configurations>
diff --git a/examples/parallel_for/tachyon/msvs/tachyon.vcproj b/examples/parallel_for/tachyon/msvs/tachyon.vcproj
index 8ea73b2..97da311 100644
--- a/examples/parallel_for/tachyon/msvs/tachyon.vcproj
+++ b/examples/parallel_for/tachyon/msvs/tachyon.vcproj
@@ -285,7 +285,7 @@
/>
</Configuration>
<Configuration
- Name="DD Release|Win32"
+ Name="DDRelease|Win32"
OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
ConfigurationType="4"
@@ -352,7 +352,7 @@
/>
</Configuration>
<Configuration
- Name="DD Release|x64"
+ Name="DDRelease|x64"
OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
ConfigurationType="4"
@@ -418,7 +418,7 @@
/>
</Configuration>
<Configuration
- Name="DD Debug|Win32"
+ Name="DDDebug|Win32"
OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
ConfigurationType="4"
@@ -487,7 +487,7 @@
/>
</Configuration>
<Configuration
- Name="DD Debug|x64"
+ Name="DDDebug|x64"
OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
ConfigurationType="4"
@@ -600,10 +600,6 @@
>
</File>
<File
- RelativePath="..\src\getargs.cpp"
- >
- </File>
- <File
RelativePath="..\src\global.cpp"
>
</File>
@@ -632,6 +628,10 @@
>
</File>
<File
+ RelativePath="..\src\main.cpp"
+ >
+ </File>
+ <File
RelativePath="..\src\objbound.cpp"
>
</File>
@@ -672,6 +672,10 @@
>
</File>
<File
+ RelativePath="..\src\tachyon_video.cpp"
+ >
+ </File>
+ <File
RelativePath="..\src\texture.cpp"
>
</File>
@@ -700,10 +704,6 @@
>
</File>
<File
- RelativePath="..\src\video.cpp"
- >
- </File>
- <File
RelativePath="..\src\vol.cpp"
>
</File>
@@ -746,10 +746,6 @@
>
</File>
<File
- RelativePath="..\src\getargs.h"
- >
- </File>
- <File
RelativePath="..\src\global.h"
>
</File>
@@ -830,6 +826,10 @@
>
</File>
<File
+ RelativePath="..\src\tachyon_video.h"
+ >
+ </File>
+ <File
RelativePath="..\src\texture.h"
>
</File>
@@ -862,10 +862,6 @@
>
</File>
<File
- RelativePath="..\src\video.h"
- >
- </File>
- <File
RelativePath="..\src\vol.h"
>
</File>
@@ -927,7 +923,7 @@
/>
</FileConfiguration>
<FileConfiguration
- Name="DD Release|Win32"
+ Name="DDRelease|Win32"
>
<Tool
Name="VCCLCompilerTool"
@@ -936,7 +932,7 @@
/>
</FileConfiguration>
<FileConfiguration
- Name="DD Release|x64"
+ Name="DDRelease|x64"
>
<Tool
Name="VCCLCompilerTool"
@@ -945,7 +941,7 @@
/>
</FileConfiguration>
<FileConfiguration
- Name="DD Debug|Win32"
+ Name="DDDebug|Win32"
>
<Tool
Name="VCCLCompilerTool"
@@ -954,7 +950,7 @@
/>
</FileConfiguration>
<FileConfiguration
- Name="DD Debug|x64"
+ Name="DDDebug|x64"
>
<Tool
Name="VCCLCompilerTool"
@@ -999,7 +995,7 @@
/>
</FileConfiguration>
<FileConfiguration
- Name="DD Release|Win32"
+ Name="DDRelease|Win32"
ExcludedFromBuild="true"
>
<Tool
@@ -1007,7 +1003,7 @@
/>
</FileConfiguration>
<FileConfiguration
- Name="DD Release|x64"
+ Name="DDRelease|x64"
ExcludedFromBuild="true"
>
<Tool
@@ -1015,7 +1011,7 @@
/>
</FileConfiguration>
<FileConfiguration
- Name="DD Debug|Win32"
+ Name="DDDebug|Win32"
ExcludedFromBuild="true"
>
<Tool
@@ -1023,7 +1019,7 @@
/>
</FileConfiguration>
<FileConfiguration
- Name="DD Debug|x64"
+ Name="DDDebug|x64"
ExcludedFromBuild="true"
>
<Tool
diff --git a/examples/parallel_for/tachyon/msvs/tachyon_cl.sln b/examples/parallel_for/tachyon/msvs/tachyon_cl.sln
index f298725..602c949 100644
--- a/examples/parallel_for/tachyon/msvs/tachyon_cl.sln
+++ b/examples/parallel_for/tachyon/msvs/tachyon_cl.sln
@@ -1,13 +1,13 @@
Microsoft Visual Studio Solution File, Format Version 9.00
# Visual Studio 2005
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tachyon.tbb", "tachyon.tbb.vcproj", "{6E9B1702-78E0-4D64-B771-8B274D963B58}"
+EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tachyon.common", "tachyon.vcproj", "{924517DF-2B6A-47D5-8A11-CC247CC4D810}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tachyon.serial", "tachyon.serial.vcproj", "{924517DF-2B6A-47D5-8A11-CC047CC4D8E9}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tachyon.tbb1d", "tachyon.tbb1d.vcproj", "{924517DF-2B6A-47D5-8A11-CC347CC4D8E9}"
EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tachyon.tbb", "tachyon.tbb.vcproj", "{6E9B1702-78E0-4D64-B771-8B274D963B58}"
-EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
DD Debug|Win32 = DD Debug|Win32
@@ -16,75 +16,75 @@ Global
DD Release|x64 = DD Release|x64
GDI Debug|Win32 = GDI Debug|Win32
GDI Debug|x64 = GDI Debug|x64
- GDI Release|Win32 = GDI Release|Win32
- GDI Release|x64 = GDI Release|x64
+ _GDI Release Release|Win32 = _GDI Release Release|Win32
+ _GDI Release Release|x64 = _GDI Release Release|x64
Description = Tachyon ray-tracer example
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {924517DF-2B6A-47D5-8A11-CC247CC4D810}.DD Debug|Win32.ActiveCfg = DD Debug|Win32
- {924517DF-2B6A-47D5-8A11-CC247CC4D810}.DD Debug|Win32.Build.0 = DD Debug|Win32
- {924517DF-2B6A-47D5-8A11-CC247CC4D810}.DD Debug|x64.ActiveCfg = DD Debug|x64
- {924517DF-2B6A-47D5-8A11-CC247CC4D810}.DD Debug|x64.Build.0 = DD Debug|x64
- {924517DF-2B6A-47D5-8A11-CC247CC4D810}.DD Release|Win32.ActiveCfg = DD Release|Win32
- {924517DF-2B6A-47D5-8A11-CC247CC4D810}.DD Release|Win32.Build.0 = DD Release|Win32
- {924517DF-2B6A-47D5-8A11-CC247CC4D810}.DD Release|x64.ActiveCfg = DD Release|x64
- {924517DF-2B6A-47D5-8A11-CC247CC4D810}.DD Release|x64.Build.0 = DD Release|x64
+ {924517DF-2B6A-47D5-8A11-CC247CC4D810}.DD Debug|Win32.ActiveCfg = DDDebug|Win32
+ {924517DF-2B6A-47D5-8A11-CC247CC4D810}.DD Debug|Win32.Build.0 = DDDebug|Win32
+ {924517DF-2B6A-47D5-8A11-CC247CC4D810}.DD Debug|x64.ActiveCfg = Debug|x64
+ {924517DF-2B6A-47D5-8A11-CC247CC4D810}.DD Debug|x64.Build.0 = Debug|x64
+ {924517DF-2B6A-47D5-8A11-CC247CC4D810}.DD Release|Win32.ActiveCfg = DDRelease|Win32
+ {924517DF-2B6A-47D5-8A11-CC247CC4D810}.DD Release|Win32.Build.0 = DDRelease|Win32
+ {924517DF-2B6A-47D5-8A11-CC247CC4D810}.DD Release|x64.ActiveCfg = Release|x64
+ {924517DF-2B6A-47D5-8A11-CC247CC4D810}.DD Release|x64.Build.0 = 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 = DD Debug|Win32
- {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.DD Debug|Win32.Build.0 = DD Debug|Win32
- {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.DD Debug|x64.ActiveCfg = DD Debug|x64
- {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.DD Debug|x64.Build.0 = DD Debug|x64
- {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.DD Release|Win32.ActiveCfg = DD Release|Win32
- {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.DD Release|Win32.Build.0 = DD Release|Win32
- {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.DD Release|x64.ActiveCfg = DD Release|x64
- {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.DD Release|x64.Build.0 = DD Release|x64
+ {924517DF-2B6A-47D5-8A11-CC247CC4D810}._GDI Release Release|Win32.ActiveCfg = Release|Win32
+ {924517DF-2B6A-47D5-8A11-CC247CC4D810}._GDI Release Release|Win32.Build.0 = Release|Win32
+ {924517DF-2B6A-47D5-8A11-CC247CC4D810}._GDI Release Release|x64.ActiveCfg = Release|x64
+ {924517DF-2B6A-47D5-8A11-CC247CC4D810}._GDI Release Release|x64.Build.0 = Release|x64
+ {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.DD Debug|Win32.ActiveCfg = DDDebug|Win32
+ {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.DD Debug|Win32.Build.0 = DDDebug|Win32
+ {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.DD Debug|x64.ActiveCfg = Debug|x64
+ {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.DD Debug|x64.Build.0 = Debug|x64
+ {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.DD Release|Win32.ActiveCfg = DDRelease|Win32
+ {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.DD Release|Win32.Build.0 = DDRelease|Win32
+ {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.DD Release|x64.ActiveCfg = Release|x64
+ {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.DD Release|x64.Build.0 = 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 = DD Debug|Win32
- {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.DD Debug|Win32.Build.0 = DD Debug|Win32
- {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.DD Debug|x64.ActiveCfg = DD Debug|x64
- {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.DD Debug|x64.Build.0 = DD Debug|x64
- {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.DD Release|Win32.ActiveCfg = DD Release|Win32
- {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.DD Release|Win32.Build.0 = DD Release|Win32
- {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.DD Release|x64.ActiveCfg = DD Release|x64
- {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.DD Release|x64.Build.0 = DD Release|x64
+ {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}._GDI Release Release|Win32.ActiveCfg = Release|Win32
+ {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}._GDI Release Release|Win32.Build.0 = Release|Win32
+ {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}._GDI Release Release|x64.ActiveCfg = Release|x64
+ {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}._GDI Release Release|x64.Build.0 = Release|x64
+ {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.DD Debug|Win32.ActiveCfg = DDDebug|Win32
+ {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.DD Debug|Win32.Build.0 = DDDebug|Win32
+ {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.DD Debug|x64.ActiveCfg = Debug|x64
+ {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.DD Debug|x64.Build.0 = Debug|x64
+ {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.DD Release|Win32.ActiveCfg = DDRelease|Win32
+ {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.DD Release|Win32.Build.0 = DDRelease|Win32
+ {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.DD Release|x64.ActiveCfg = Release|x64
+ {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.DD Release|x64.Build.0 = 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
- {6E9B1702-78E0-4D64-B771-8B274D963B58}.DD Debug|Win32.ActiveCfg = DD Debug|Win32
- {6E9B1702-78E0-4D64-B771-8B274D963B58}.DD Debug|Win32.Build.0 = DD Debug|Win32
- {6E9B1702-78E0-4D64-B771-8B274D963B58}.DD Debug|x64.ActiveCfg = DD Debug|x64
- {6E9B1702-78E0-4D64-B771-8B274D963B58}.DD Debug|x64.Build.0 = DD Debug|x64
- {6E9B1702-78E0-4D64-B771-8B274D963B58}.DD Release|Win32.ActiveCfg = DD Release|Win32
- {6E9B1702-78E0-4D64-B771-8B274D963B58}.DD Release|Win32.Build.0 = DD Release|Win32
- {6E9B1702-78E0-4D64-B771-8B274D963B58}.DD Release|x64.ActiveCfg = DD Release|x64
- {6E9B1702-78E0-4D64-B771-8B274D963B58}.DD Release|x64.Build.0 = DD Release|x64
+ {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}._GDI Release Release|Win32.ActiveCfg = Release|Win32
+ {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}._GDI Release Release|Win32.Build.0 = Release|Win32
+ {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}._GDI Release Release|x64.ActiveCfg = Release|x64
+ {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}._GDI Release Release|x64.Build.0 = Release|x64
+ {6E9B1702-78E0-4D64-B771-8B274D963B58}.DD Debug|Win32.ActiveCfg = DDDebug|Win32
+ {6E9B1702-78E0-4D64-B771-8B274D963B58}.DD Debug|Win32.Build.0 = DDDebug|Win32
+ {6E9B1702-78E0-4D64-B771-8B274D963B58}.DD Debug|x64.ActiveCfg = Debug|x64
+ {6E9B1702-78E0-4D64-B771-8B274D963B58}.DD Debug|x64.Build.0 = Debug|x64
+ {6E9B1702-78E0-4D64-B771-8B274D963B58}.DD Release|Win32.ActiveCfg = DDRelease|Win32
+ {6E9B1702-78E0-4D64-B771-8B274D963B58}.DD Release|Win32.Build.0 = DDRelease|Win32
+ {6E9B1702-78E0-4D64-B771-8B274D963B58}.DD Release|x64.ActiveCfg = Release|x64
+ {6E9B1702-78E0-4D64-B771-8B274D963B58}.DD Release|x64.Build.0 = 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
{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
+ {6E9B1702-78E0-4D64-B771-8B274D963B58}._GDI Release Release|Win32.ActiveCfg = Release|Win32
+ {6E9B1702-78E0-4D64-B771-8B274D963B58}._GDI Release Release|Win32.Build.0 = Release|Win32
+ {6E9B1702-78E0-4D64-B771-8B274D963B58}._GDI Release Release|x64.ActiveCfg = Release|x64
+ {6E9B1702-78E0-4D64-B771-8B274D963B58}._GDI Release Release|x64.Build.0 = Release|x64
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/examples/parallel_for/tachyon/msvs/tachyon_icl.sln b/examples/parallel_for/tachyon/msvs/tachyon_icl.sln
index 76e3a54..3f2ae66 100644
--- a/examples/parallel_for/tachyon/msvs/tachyon_icl.sln
+++ b/examples/parallel_for/tachyon/msvs/tachyon_icl.sln
@@ -1,12 +1,21 @@
Microsoft Visual Studio Solution File, Format Version 9.00
# Visual Studio 2005
+Project("{EAF909A5-FA59-4C3D-9431-0FCC20D5BCF9}") = "tachyon.tbb", "tachyon.tbb.icproj", "{2D08E05F-D0E0-48A7-9597-28B95ACE70B6}"
+ ProjectSection(ProjectDependencies) = postProject
+ {5F685DBD-9A04-4E94-A1CA-FC48FE799830} = {5F685DBD-9A04-4E94-A1CA-FC48FE799830}
+ EndProjectSection
+EndProject
Project("{EAF909A5-FA59-4C3D-9431-0FCC20D5BCF9}") = "tachyon.common", "tachyon.icproj", "{5F685DBD-9A04-4E94-A1CA-FC48FE799830}"
EndProject
Project("{EAF909A5-FA59-4C3D-9431-0FCC20D5BCF9}") = "tachyon.serial", "tachyon.serial.icproj", "{E085A8DB-75D4-4927-9631-6368E6D0EE72}"
+ ProjectSection(ProjectDependencies) = postProject
+ {5F685DBD-9A04-4E94-A1CA-FC48FE799830} = {5F685DBD-9A04-4E94-A1CA-FC48FE799830}
+ EndProjectSection
EndProject
Project("{EAF909A5-FA59-4C3D-9431-0FCC20D5BCF9}") = "tachyon.tbb1d", "tachyon.tbb1d.icproj", "{4F173D3A-AE8C-4F7E-A4D0-6527F46B8495}"
-EndProject
-Project("{EAF909A5-FA59-4C3D-9431-0FCC20D5BCF9}") = "tachyon.tbb", "tachyon.tbb.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
@@ -16,139 +25,123 @@ Global
DD Release|x64 = DD Release|x64
GDI Debug|Win32 = GDI Debug|Win32
GDI Debug|x64 = GDI Debug|x64
- GDI Release|Win32 = GDI Release|Win32
- GDI Release|x64 = GDI Release|x64
+ _GDI Release|Win32 = _GDI Release|Win32
+ _GDI Release|x64 = _GDI Release|x64
Description = Tachyon ray-tracer example
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {5F685DBD-9A04-4E94-A1CA-FC48FE799830}.DD Debug|Win32.ActiveCfg = DD Debug|Win32
- {5F685DBD-9A04-4E94-A1CA-FC48FE799830}.DD Debug|Win32.Build.0 = DD Debug|Win32
- {5F685DBD-9A04-4E94-A1CA-FC48FE799830}.DD Debug|x64.ActiveCfg = DD Debug|x64
- {5F685DBD-9A04-4E94-A1CA-FC48FE799830}.DD Debug|x64.Build.0 = DD Debug|x64
- {5F685DBD-9A04-4E94-A1CA-FC48FE799830}.DD Release|Win32.ActiveCfg = DD Release|Win32
- {5F685DBD-9A04-4E94-A1CA-FC48FE799830}.DD Release|Win32.Build.0 = DD Release|Win32
- {5F685DBD-9A04-4E94-A1CA-FC48FE799830}.DD Release|x64.ActiveCfg = DD Release|x64
- {5F685DBD-9A04-4E94-A1CA-FC48FE799830}.DD Release|x64.Build.0 = DD Release|x64
+ {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 = DD Debug|Win32
- {E085A8DB-75D4-4927-9631-6368E6D0EE72}.DD Debug|Win32.Build.0 = DD Debug|Win32
- {E085A8DB-75D4-4927-9631-6368E6D0EE72}.DD Debug|x64.ActiveCfg = DD Debug|x64
- {E085A8DB-75D4-4927-9631-6368E6D0EE72}.DD Debug|x64.Build.0 = DD Debug|x64
- {E085A8DB-75D4-4927-9631-6368E6D0EE72}.DD Release|Win32.ActiveCfg = DD Release|Win32
- {E085A8DB-75D4-4927-9631-6368E6D0EE72}.DD Release|Win32.Build.0 = DD Release|Win32
- {E085A8DB-75D4-4927-9631-6368E6D0EE72}.DD Release|x64.ActiveCfg = DD Release|x64
- {E085A8DB-75D4-4927-9631-6368E6D0EE72}.DD Release|x64.Build.0 = DD Release|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 = DD Debug|Win32
- {4F173D3A-AE8C-4F7E-A4D0-6527F46B8495}.DD Debug|Win32.Build.0 = DD Debug|Win32
- {4F173D3A-AE8C-4F7E-A4D0-6527F46B8495}.DD Debug|x64.ActiveCfg = DD Debug|x64
- {4F173D3A-AE8C-4F7E-A4D0-6527F46B8495}.DD Debug|x64.Build.0 = DD Debug|x64
- {4F173D3A-AE8C-4F7E-A4D0-6527F46B8495}.DD Release|Win32.ActiveCfg = DD Release|Win32
- {4F173D3A-AE8C-4F7E-A4D0-6527F46B8495}.DD Release|Win32.Build.0 = DD Release|Win32
- {4F173D3A-AE8C-4F7E-A4D0-6527F46B8495}.DD Release|x64.ActiveCfg = DD Release|x64
- {4F173D3A-AE8C-4F7E-A4D0-6527F46B8495}.DD Release|x64.Build.0 = DD Release|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
- {2D08E05F-D0E0-48A7-9597-28B95ACE70B6}.DD Debug|Win32.ActiveCfg = DD Debug|Win32
- {2D08E05F-D0E0-48A7-9597-28B95ACE70B6}.DD Debug|Win32.Build.0 = DD Debug|Win32
- {2D08E05F-D0E0-48A7-9597-28B95ACE70B6}.DD Debug|x64.ActiveCfg = DD Debug|x64
- {2D08E05F-D0E0-48A7-9597-28B95ACE70B6}.DD Debug|x64.Build.0 = DD Debug|x64
- {2D08E05F-D0E0-48A7-9597-28B95ACE70B6}.DD Release|Win32.ActiveCfg = DD Release|Win32
- {2D08E05F-D0E0-48A7-9597-28B95ACE70B6}.DD Release|Win32.Build.0 = DD Release|Win32
- {2D08E05F-D0E0-48A7-9597-28B95ACE70B6}.DD Release|x64.ActiveCfg = DD Release|x64
- {2D08E05F-D0E0-48A7-9597-28B95ACE70B6}.DD Release|x64.Build.0 = DD Release|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
- {924517DF-2B6A-47D5-8A11-CC247CC4D810}.GDI Release|x64.Build.0 = Release|x64
- {924517DF-2B6A-47D5-8A11-CC247CC4D810}.GDI Release|x64.ActiveCfg = Release|x64
- {924517DF-2B6A-47D5-8A11-CC247CC4D810}.GDI Release|Win32.Build.0 = Release|Win32
- {924517DF-2B6A-47D5-8A11-CC247CC4D810}.GDI Release|Win32.ActiveCfg = Release|Win32
- {924517DF-2B6A-47D5-8A11-CC247CC4D810}.GDI Debug|x64.Build.0 = Debug|x64
- {924517DF-2B6A-47D5-8A11-CC247CC4D810}.GDI Debug|x64.ActiveCfg = Debug|x64
- {924517DF-2B6A-47D5-8A11-CC247CC4D810}.GDI Debug|Win32.Build.0 = Debug|Win32
+ {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
+ {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}.DD Release|x64.Build.0 = DD Release|x64
- {924517DF-2B6A-47D5-8A11-CC247CC4D810}.DD Release|x64.ActiveCfg = DD Release|x64
- {924517DF-2B6A-47D5-8A11-CC247CC4D810}.DD Release|Win32.Build.0 = DD Release|Win32
- {924517DF-2B6A-47D5-8A11-CC247CC4D810}.DD Release|Win32.ActiveCfg = DD Release|Win32
- {924517DF-2B6A-47D5-8A11-CC247CC4D810}.DD Debug|x64.Build.0 = DD Debug|x64
- {924517DF-2B6A-47D5-8A11-CC247CC4D810}.DD Debug|x64.ActiveCfg = DD Debug|x64
- {924517DF-2B6A-47D5-8A11-CC247CC4D810}.DD Debug|Win32.Build.0 = DD Debug|Win32
- {924517DF-2B6A-47D5-8A11-CC247CC4D810}.DD Debug|Win32.ActiveCfg = DD Debug|Win32
- {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.GDI Release|x64.Build.0 = Release|x64
- {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.GDI Release|x64.ActiveCfg = Release|x64
- {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.GDI Release|Win32.Build.0 = Release|Win32
- {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.GDI Release|Win32.ActiveCfg = Release|Win32
- {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.GDI Debug|x64.Build.0 = Debug|x64
- {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.GDI Debug|x64.ActiveCfg = Debug|x64
- {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.GDI Debug|Win32.Build.0 = 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}.DD Release|x64.Build.0 = DD Release|x64
- {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.DD Release|x64.ActiveCfg = DD Release|x64
- {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.DD Release|Win32.Build.0 = DD Release|Win32
- {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.DD Release|Win32.ActiveCfg = DD Release|Win32
- {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.DD Debug|x64.Build.0 = DD Debug|x64
- {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.DD Debug|x64.ActiveCfg = DD Debug|x64
- {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.DD Debug|Win32.Build.0 = DD Debug|Win32
- {924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.DD Debug|Win32.ActiveCfg = DD Debug|Win32
- {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.GDI Release|x64.Build.0 = Release|x64
- {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.GDI Release|x64.ActiveCfg = Release|x64
- {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.GDI Release|Win32.Build.0 = Release|Win32
- {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.GDI Release|Win32.ActiveCfg = Release|Win32
- {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.GDI Debug|x64.Build.0 = Debug|x64
- {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.GDI Debug|x64.ActiveCfg = Debug|x64
- {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.GDI Debug|Win32.Build.0 = 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}.DD Release|x64.Build.0 = DD Release|x64
- {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.DD Release|x64.ActiveCfg = DD Release|x64
- {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.DD Release|Win32.Build.0 = DD Release|Win32
- {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.DD Release|Win32.ActiveCfg = DD Release|Win32
- {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.DD Debug|x64.Build.0 = DD Debug|x64
- {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.DD Debug|x64.ActiveCfg = DD Debug|x64
- {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.DD Debug|Win32.Build.0 = DD Debug|Win32
- {924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.DD Debug|Win32.ActiveCfg = DD Debug|Win32
- {6E9B1702-78E0-4D64-B771-8B274D963B58}.GDI Release|x64.Build.0 = Release|x64
- {6E9B1702-78E0-4D64-B771-8B274D963B58}.GDI Release|x64.ActiveCfg = Release|x64
- {6E9B1702-78E0-4D64-B771-8B274D963B58}.GDI Release|Win32.Build.0 = Release|Win32
- {6E9B1702-78E0-4D64-B771-8B274D963B58}.GDI Release|Win32.ActiveCfg = Release|Win32
- {6E9B1702-78E0-4D64-B771-8B274D963B58}.GDI Debug|x64.Build.0 = Debug|x64
- {6E9B1702-78E0-4D64-B771-8B274D963B58}.GDI Debug|x64.ActiveCfg = Debug|x64
- {6E9B1702-78E0-4D64-B771-8B274D963B58}.GDI Debug|Win32.Build.0 = Debug|Win32
- {6E9B1702-78E0-4D64-B771-8B274D963B58}.GDI Debug|Win32.ActiveCfg = Debug|Win32
- {6E9B1702-78E0-4D64-B771-8B274D963B58}.DD Release|x64.Build.0 = DD Release|x64
- {6E9B1702-78E0-4D64-B771-8B274D963B58}.DD Release|x64.ActiveCfg = DD Release|x64
- {6E9B1702-78E0-4D64-B771-8B274D963B58}.DD Release|Win32.Build.0 = DD Release|Win32
- {6E9B1702-78E0-4D64-B771-8B274D963B58}.DD Release|Win32.ActiveCfg = DD Release|Win32
- {6E9B1702-78E0-4D64-B771-8B274D963B58}.DD Debug|x64.Build.0 = DD Debug|x64
- {6E9B1702-78E0-4D64-B771-8B274D963B58}.DD Debug|x64.ActiveCfg = DD Debug|x64
- {6E9B1702-78E0-4D64-B771-8B274D963B58}.DD Debug|Win32.Build.0 = DD Debug|Win32
- {6E9B1702-78E0-4D64-B771-8B274D963B58}.DD Debug|Win32.ActiveCfg = DD 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
diff --git a/examples/parallel_for/tachyon/src/api.cpp b/examples/parallel_for/tachyon/src/api.cpp
index 127d019..e59b5fb 100644
--- a/examples/parallel_for/tachyon/src/api.cpp
+++ b/examples/parallel_for/tachyon/src/api.cpp
@@ -87,7 +87,7 @@
#include "imap.h"
#include "global.h"
-#include "video.h"
+#include "tachyon_video.h"
typedef void * SceneHandle;
#include "api.h"
@@ -113,7 +113,7 @@ color rt_color(apiflt r, apiflt g, apiflt b) {
return c;
}
-void rt_initialize(int * argc, char ***argv) {
+void rt_initialize() {
rpcmsg msg;
reset_object();
diff --git a/examples/parallel_for/tachyon/src/api.h b/examples/parallel_for/tachyon/src/api.h
index 8bed972..f68068c 100644
--- a/examples/parallel_for/tachyon/src/api.h
+++ b/examples/parallel_for/tachyon/src/api.h
@@ -122,7 +122,7 @@ typedef struct {
vector rt_vector(apiflt x, apiflt y, apiflt z); /* helper to make vectors */
color rt_color(apiflt r, apiflt g, apiflt b); /* helper to make colors */
-void rt_initialize(int *, char ***);/* reset raytracer, memory deallocation */
+void rt_initialize();/* reset raytracer, memory deallocation */
void rt_finalize(void); /* close down for good.. */
SceneHandle rt_newscene(void); /* allocate new scene */
diff --git a/examples/parallel_for/tachyon/src/getargs.cpp b/examples/parallel_for/tachyon/src/getargs.cpp
deleted file mode 100644
index 16379ad..0000000
--- a/examples/parallel_for/tachyon/src/getargs.cpp
+++ /dev/null
@@ -1,204 +0,0 @@
-/*
- Copyright 2005-2011 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 <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include "types.h"
-#include "api.h"
-#include "getargs.h"
-
-void printusage(char **argv) {
- fprintf(stderr, "Usage: \n");
- fprintf(stderr, " %s modelfile [options] \n", argv[0]);
- fprintf(stderr, "\n");
- fprintf(stderr, "Model file formats supported:\n");
- fprintf(stderr, " filename.dat -- The model files originated with this package.\n");
- fprintf(stderr, " filaname.ac -- AC3D model files.\n");
- fprintf(stderr, " filename.nff -- The NFF scene format used by Eric Haines' SPD.\n");
- fprintf(stderr, "\n");
- fprintf(stderr, "Valid options: (** denotes default behaviour)\n");
- fprintf(stderr, " +D enable run-time display updating (if build supports it) **\n");
- fprintf(stderr, " -D disable run-time display updating\n");
- fprintf(stderr, " -nobounding\n");
- fprintf(stderr, " -boundthresh XXX (** default threshold is 25)\n");
- fprintf(stderr, "\n");
-}
-
-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 useoptions(argoptions * opt, SceneHandle scene) {
- if (opt->useoutfilename == 1) {
- rt_outputfile(scene, opt->outfilename);
- }
-
- if (opt->verbosemode == 1) {
- rt_verbose(scene, 1);
- }
-
- if (opt->antialiasing != -1) {
- /* need new api code for this */
- }
-
- if (opt->displaymode != -1) {
- rt_displaymode(scene, opt->displaymode);
- }
-
- if (opt->boundmode != -1) {
- rt_boundmode(scene, opt->boundmode);
- }
-
- if (opt->boundthresh != -1) {
- rt_boundthresh(scene, opt->boundthresh);
- }
-
- return 0;
-}
-
-int getparm(int argc, char **argv, int num, argoptions * opt) {
- if (!strcmp(argv[num], "+D")) {
- /* turn video on */
- opt->displaymode = RT_DISPLAY_ENABLED;
- return 1;
- }
- if (!strcmp(argv[num], "-D")) {
- /* turn video off */
- opt->displaymode = RT_DISPLAY_DISABLED;
- return 1;
- }
- if (!strcmp(argv[num], "-nobounding")) {
- /* disable automatic spatial subdivision optimizations */
- opt->boundmode = RT_BOUNDING_DISABLED;
- return 1;
- }
- if (!strcmp(argv[num], "-boundthresh")) {
- /* set automatic bounding threshold control value */
- sscanf(argv[num + 1], "%d", &opt->boundthresh);
- return 2;
- }
-
- /* unknown parameter setting */
- fprintf(stderr, "Unrecognized parameter/option flag: %s\n", argv[num]);
- return -1;
-}
-
-int getargs(int argc, char **argv, argoptions * opt) {
- int i, rc, unknowncnt;
-
- if (opt == NULL)
- return -1;
-
- initoptions(opt);
-
- if (argc < 2) {
- printusage(argv);
-#ifndef DEFAULT_MODELFILE
- return -1;
-#else
- return 0;
-#endif//DEFAULT_MODELFILE
- }
-
- i = 1;
- unknowncnt = 0;
- while (i < argc) {
- if (argv[i][0] == '-' || argv[i][0] == '+') {
- rc = getparm(argc, argv, i, opt);
- if (rc != -1) {
- i += rc;
- }
- else {
- printusage(argv);
- return -1;
- }
- }
- else {
- unknowncnt++;
- if (unknowncnt > 1) {
- fprintf(stderr, "Too many model file names found!\n");
- printusage(argv);
- return -1;
- }
- else {
- strcpy(opt->filename, argv[i]);
- opt->foundfilename = 1;
- i++;
- }
- }
- }
-
- if (opt->foundfilename == -1) {
- fprintf(stderr, "Missing model file name!\n");
- printusage(argv);
- return -1;
- }
-
- return 0;
-}
-
-
-
diff --git a/examples/parallel_for/tachyon/src/grid.cpp b/examples/parallel_for/tachyon/src/grid.cpp
index c614975..1d733d3 100644
--- a/examples/parallel_for/tachyon/src/grid.cpp
+++ b/examples/parallel_for/tachyon/src/grid.cpp
@@ -88,6 +88,8 @@ static object_methods grid_methods = {
grid_free
};
+extern bool silent_mode;
+
object * newgrid(int xsize, int ysize, int zsize, vector min, vector max) {
grid * g;
@@ -283,7 +285,8 @@ int engrid_scene(object ** list) {
numobj = countobj(*list);
-fprintf(stderr, "Scene contains %d bounded objects.\n", numobj);
+ if ( !silent_mode )
+ fprintf(stderr, "Scene contains %d bounded objects.\n", numobj);
if (numobj > 16) {
numcbrt = (int) cbrt(4*numobj);
@@ -635,7 +638,7 @@ static void voxel_intersect(grid * g, ray * ry, int voxindex) {
}
}
-static int grid_bounds_intersect(grid * g, ray * ry, flt *near, flt *far) {
+static int grid_bounds_intersect(grid * g, ray * ry, flt *nr, flt *fr) {
flt a, tx1, tx2, ty1, ty2, tz1, tz2;
flt tnear, tfar;
@@ -681,7 +684,7 @@ static int grid_bounds_intersect(grid * g, ray * ry, flt *near, flt *far) {
if (tnear > tfar) return 0;
if (tfar < 0.0) return 0;
- *near = tnear;
- *far = tfar;
+ *nr = tnear;
+ *fr = tfar;
return 1;
}
diff --git a/examples/parallel_for/tachyon/src/video.cpp b/examples/parallel_for/tachyon/src/main.cpp
similarity index 54%
rename from examples/parallel_for/tachyon/src/video.cpp
rename to examples/parallel_for/tachyon/src/main.cpp
index 113c1b1..54b1a01 100644
--- a/examples/parallel_for/tachyon/src/video.cpp
+++ b/examples/parallel_for/tachyon/src/main.cpp
@@ -55,12 +55,6 @@
SUCH DAMAGE.
*/
-/*
- * video.c - routines for putting pixels on a screen if one is available.
- *
- * $Id: video.cpp,v 1.20 2007-02-28 18:35:22 amalakho Exp $
- */
-
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -68,21 +62,39 @@
#define VIDEO_WINMAIN_ARGS
#include "types.h"
#include "api.h" /* The ray tracing library API */
-#include "getargs.h" /* command line argument/option parsing */
#include "parse.h" /* Support for my own file format */
#include "ui.h"
#include "util.h"
-#include "video.h"
+#include "tachyon_video.h"
+#include "../../../common/utility/utility.h"
-static SceneHandle global_scene;
-static int global_xsize; /* size of graphic image rendered in window (from hres, vres) */
-static int global_ysize;
-static int global_xwinsize; /* size of window (may be larger than above) */
-static int global_ywinsize;
-static char *global_window_title;
-static bool global_usegraphics;
+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;
+char *global_window_title;
+bool global_usegraphics;
-static char *window_title_string (int argc, char **argv)
+bool silent_mode = false; /* silent mode */
+
+class 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;
+
+static char *window_title_string (int argc, const char **argv)
{
int i;
char *name;
@@ -102,24 +114,92 @@ static char *window_title_string (int argc, char **argv)
return name;
}
-static int main_init_parts (int argc, char **argv)
-{
- int rc;
+void rt_finalize(void) {
+ timer t0, t1;
+ t0 = gettimer();
+ if(global_usegraphics)
+ do { rt_sleep(10); t1 = gettimer(); }
+ while(timertime(t0, t1) < 10 && video->next_frame());
+#ifdef _WINDOWS
+ else rt_sleep(10000);
+#endif
+}
+
+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 useoptions(argoptions * opt, SceneHandle scene) {
+ if (opt->useoutfilename == 1) {
+ rt_outputfile(scene, opt->outfilename);
+ }
+
+ if (opt->verbosemode == 1) {
+ rt_verbose(scene, 1);
+ }
+
+ if (opt->antialiasing != -1) {
+ /* need new api code for this */
+ }
+
+ if (opt->displaymode != -1) {
+ rt_displaymode(scene, opt->displaymode);
+ }
+
+ if (opt->boundmode != -1) {
+ rt_boundmode(scene, opt->boundmode);
+ }
+
+ if (opt->boundthresh != -1) {
+ rt_boundthresh(scene, opt->boundthresh);
+ }
+
+ return 0;
+}
+
+argoptions ParseCommandLine(int argc, const char *argv[]) {
argoptions opt;
- char * filename;
- global_window_title = window_title_string (argc, argv);
+ initoptions(&opt);
- global_scene = rt_newscene();
+ bool nobounding = false;
+ bool nodisp = false;
- rt_initialize(&argc, &argv);
+ string filename;
- if ((rc = getargs(argc, argv, &opt)) == -1) {
-#if _WIN32||_WIN64
- rt_sleep(10000);
-#endif
- exit(rc);
- }
+ utility::parse_cli_arguments(argc,argv,
+ utility::cli_argument_pack()
+ .positional_arg(filename,"dataset", "Model file")
+ .positional_arg(opt.boundthresh,"boundthresh","bounding threshold value")
+ .arg(nodisp,"no-display-updating","disable run-time display updating")
+ .arg(nobounding,"no-bounding","disable bounding technique")
+ .arg(silent_mode,"silent","no output except elapsed time")
+ );
+
+ strcpy(opt.filename, filename.c_str());
+
+ opt.displaymode = nodisp ? RT_DISPLAY_DISABLED : RT_DISPLAY_ENABLED;
+ opt.boundmode = nobounding ? RT_BOUNDING_DISABLED : RT_BOUNDING_ENABLED;
+
+ return opt;
+}
+
+int CreateScene(argoptions &opt) {
+ char *filename;
+
+ global_scene = rt_newscene();
+ rt_initialize();
+
+ /* process command line overrides */
+ useoptions(&opt, global_scene);
#ifdef DEFAULT_MODELFILE
#if _WIN32||_WIN64
@@ -134,18 +214,13 @@ static int main_init_parts (int argc, char **argv)
#endif//DEFAULT_MODELFILE
filename = opt.filename;
- rc = readmodel(filename, global_scene);
-
- if (rc != 0) {
+ if ( readmodel(filename, global_scene) != 0 ) {
fprintf(stderr, "Parser returned a non-zero error code reading %s\n", filename);
fprintf(stderr, "Aborting Render...\n");
rt_finalize();
return -1;
}
- /* process command line overrides */
- useoptions(&opt, global_scene);
-
// need these early for create_graphics_window() so grab these here...
scenedef *scene = (scenedef *) global_scene;
global_xsize = scene->hres;
@@ -157,60 +232,36 @@ static int main_init_parts (int argc, char **argv)
return 0;
}
-class tachyon_video : public video
-{
- void on_process()
- {
- char buf[128];
- flt runtime;
- timerstart();
- rt_renderscene(global_scene);
- timerstop();
- runtime=timertime();
- sprintf(buf, "\nCPU Time: %.3f seconds.", runtime);
- rt_ui_message(MSG_0, buf); buf[0] = ' ';
- strcat(global_window_title, buf);
- title = global_window_title; updating = true;
- show_title();
- rt_finalize();
- }
- void on_key(int key) {
- key &= 0xff; if(key == 27) running = false;
- }
-};
-class video *video = 0;
+int main (int argc, char *argv[]) {
+ try {
+ timer mainStartTime = gettimer();
-void rt_finalize(void) {
- timerstart();
- if(global_usegraphics)
- do { rt_sleep(10); timerstop(); }
- while(timertime() < 10 && video->next_frame());
-#ifdef _WINDOWS
- else rt_sleep(10000);
-#endif
-}
+ global_window_title = window_title_string (argc, (const char**)argv);
-int main (int argc, char **argv)
-{
- int rc;
+ argoptions opt = ParseCommandLine(argc, (const char**)argv);
- tachyon_video tachyon;
- tachyon.threaded = true;
- tachyon.init_console();
+ if ( CreateScene(opt) != 0 )
+ return -1;
- rc = main_init_parts (argc, argv);
- if (rc) return rc;
+ tachyon_video tachyon;
+ tachyon.threaded = true;
+ tachyon.init_console();
- tachyon.title = global_window_title;
- tachyon.updating = global_usegraphics;
- // always using window even if(!global_usegraphics)
- global_usegraphics =
- tachyon.init_window(global_xwinsize, global_ywinsize);
- if(!tachyon.running)
- return -1;
+ tachyon.title = global_window_title;
+ tachyon.updating = global_usegraphics;
+ // always using window even if(!global_usegraphics)
+ global_usegraphics =
+ tachyon.init_window(global_xwinsize, global_ywinsize);
+ if(!tachyon.running)
+ return -1;
- video = &tachyon;
- tachyon.main_loop();
+ video = &tachyon;
+ tachyon.main_loop();
- return 0;
+ utility::report_elapsed_time(timertime(mainStartTime, gettimer()));
+ return 0;
+ } catch ( std::exception& e ) {
+ std::cerr<<"error occurred. error text is :\"" <<e.what()<<"\"\n";
+ return 1;
+ }
}
diff --git a/examples/parallel_for/tachyon/src/render.cpp b/examples/parallel_for/tachyon/src/render.cpp
index 0f15846..a1c2bd8 100644
--- a/examples/parallel_for/tachyon/src/render.cpp
+++ b/examples/parallel_for/tachyon/src/render.cpp
@@ -71,7 +71,7 @@
#include "light.h"
#include "global.h"
#include "ui.h"
-#include "video.h"
+#include "tachyon_video.h"
#include "objbound.h"
#include "grid.h"
@@ -96,8 +96,6 @@ void renderscene(scenedef scene) {
outfile = opentgafile(scene.outfilename);
*/
- timerstart();
-
trace_region (scene, 0/*outfile*/, 0, 0, scene.hres, scene.vres);
//fclose((FILE *)outfile);
} /* end of renderscene() */
diff --git a/examples/parallel_for/tachyon/src/getargs.h b/examples/parallel_for/tachyon/src/tachyon_video.cpp
similarity index 77%
rename from examples/parallel_for/tachyon/src/getargs.h
rename to examples/parallel_for/tachyon/src/tachyon_video.cpp
index bcf5d7f..f04923a 100644
--- a/examples/parallel_for/tachyon/src/getargs.h
+++ b/examples/parallel_for/tachyon/src/tachyon_video.cpp
@@ -55,20 +55,35 @@
SUCH DAMAGE.
*/
-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;
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "types.h"
+#include "api.h" /* The ray tracing library API */
+#include "ui.h"
+#include "util.h"
+#include "tachyon_video.h"
-int getargs(int argc, char **argv, argoptions * opt);
-int useoptions(argoptions * opt, SceneHandle scene);
+extern SceneHandle global_scene;
+extern char *global_window_title;
+extern bool global_usegraphics;
+
+void tachyon_video::on_process() {
+ char buf[128];
+ flt runtime;
+ timer start_timer = gettimer();
+ rt_renderscene(global_scene);
+ timer end_timer = gettimer();
+ runtime=timertime(start_timer, end_timer);
+ sprintf(buf, "\nCPU Time: %.3f seconds.", runtime);
+ rt_ui_message(MSG_0, buf); buf[0] = ' ';
+ strcat(global_window_title, buf);
+ title = global_window_title; updating = true;
+ show_title();
+ rt_finalize();
+}
+
+void tachyon_video::on_key(int key) {
+ key &= 0xff; if(key == 27) running = false;
+}
diff --git a/examples/parallel_for/tachyon/src/video.h b/examples/parallel_for/tachyon/src/tachyon_video.h
similarity index 97%
rename from examples/parallel_for/tachyon/src/video.h
rename to examples/parallel_for/tachyon/src/tachyon_video.h
index 67a721c..94370ac 100644
--- a/examples/parallel_for/tachyon/src/video.h
+++ b/examples/parallel_for/tachyon/src/tachyon_video.h
@@ -57,3 +57,9 @@
#include "../../../common/gui/video.h"
extern class video *video;
+
+class tachyon_video : public video
+{
+ void on_process();
+ void on_key(int key);
+};
diff --git a/examples/parallel_for/tachyon/src/trace.serial.cpp b/examples/parallel_for/tachyon/src/trace.serial.cpp
index bb3f743..e4ffb47 100644
--- a/examples/parallel_for/tachyon/src/trace.serial.cpp
+++ b/examples/parallel_for/tachyon/src/trace.serial.cpp
@@ -68,7 +68,7 @@
#include "intersect.h"
#include "global.h"
#include "ui.h"
-#include "video.h"
+#include "tachyon_video.h"
// shared but read-only so could be private too
static thr_parms *all_parms;
diff --git a/examples/parallel_for/tachyon/src/trace.tbb.cpp b/examples/parallel_for/tachyon/src/trace.tbb.cpp
index e3f832b..dab32f3 100644
--- a/examples/parallel_for/tachyon/src/trace.tbb.cpp
+++ b/examples/parallel_for/tachyon/src/trace.tbb.cpp
@@ -68,7 +68,7 @@
#include "intersect.h"
#include "global.h"
#include "ui.h"
-#include "video.h"
+#include "tachyon_video.h"
// shared but read-only so could be private too
static thr_parms *all_parms;
diff --git a/examples/parallel_for/tachyon/src/trace.tbb1d.cpp b/examples/parallel_for/tachyon/src/trace.tbb1d.cpp
index 701ff44..dd1e787 100644
--- a/examples/parallel_for/tachyon/src/trace.tbb1d.cpp
+++ b/examples/parallel_for/tachyon/src/trace.tbb1d.cpp
@@ -68,7 +68,7 @@
#include "intersect.h"
#include "global.h"
#include "ui.h"
-#include "video.h"
+#include "tachyon_video.h"
// shared but read-only so could be private too
static thr_parms *all_parms;
diff --git a/examples/parallel_for/tachyon/src/trace_rest.cpp b/examples/parallel_for/tachyon/src/trace_rest.cpp
index d3c43c5..ec27cb5 100644
--- a/examples/parallel_for/tachyon/src/trace_rest.cpp
+++ b/examples/parallel_for/tachyon/src/trace_rest.cpp
@@ -75,7 +75,7 @@
#include "intersect.h"
#include "global.h"
#include "ui.h"
-#include "video.h"
+#include "tachyon_video.h"
color trace(ray * primary) {
if (primary->depth > 0) {
diff --git a/examples/parallel_for/tachyon/src/types.h b/examples/parallel_for/tachyon/src/types.h
index ec9457c..52a5991 100644
--- a/examples/parallel_for/tachyon/src/types.h
+++ b/examples/parallel_for/tachyon/src/types.h
@@ -60,7 +60,7 @@
#elif _WIN32
#include <malloc.h>
#define alloca _alloca
-#elif __FreeBSD__
+#elif __FreeBSD__||__NetBSD__
#include <stdlib.h>
#else
#include <alloca.h>
diff --git a/examples/parallel_for/tachyon/src/ui.cpp b/examples/parallel_for/tachyon/src/ui.cpp
index 8826c75..7b272a2 100644
--- a/examples/parallel_for/tachyon/src/ui.cpp
+++ b/examples/parallel_for/tachyon/src/ui.cpp
@@ -71,6 +71,8 @@ static void (* rt_static_ui_message) (int, const char *) = NULL;
static void (* rt_static_ui_progress) (int) = NULL;
static int (* rt_static_ui_checkaction) (void) = NULL;
+extern bool silent_mode;
+
void set_rt_ui_message(void (* func) (int, const char *)) {
rt_static_ui_message = func;
}
@@ -81,8 +83,10 @@ void set_rt_ui_progress(void (* func) (int)) {
void rt_ui_message(int level, const char * msg) {
if (rt_static_ui_message == NULL) {
- fprintf(stderr, "%s\n", msg);
- fflush (stderr);
+ if ( !silent_mode ) {
+ fprintf(stderr, "%s\n", msg);
+ fflush (stderr);
+ }
} else {
rt_static_ui_message(level, msg);
}
@@ -92,8 +96,10 @@ void rt_ui_progress(int percent) {
if (rt_static_ui_progress != NULL)
rt_static_ui_progress(percent);
else {
- fprintf(stderr, "\r %3d%% Complete \r", percent);
- fflush(stderr);
+ if ( !silent_mode ) {
+ fprintf(stderr, "\r %3d%% Complete \r", percent);
+ fflush(stderr);
+ }
}
}
diff --git a/examples/parallel_for/tachyon/src/util.cpp b/examples/parallel_for/tachyon/src/util.cpp
index 1c70d28..cb9f5c1 100644
--- a/examples/parallel_for/tachyon/src/util.cpp
+++ b/examples/parallel_for/tachyon/src/util.cpp
@@ -71,7 +71,7 @@
void rt_finalize(void);
-#ifndef _WIN32
+#if !defined( _WIN32 )
#include <sys/time.h>
#include <unistd.h>
@@ -90,22 +90,15 @@ void rt_sleep(int msec) {
Sleep(msec);
}
-DWORD starttime;
-DWORD stoptime;
-
-void timerstart(void) {
- starttime = GetTickCount ();
-}
-
-void timerstop(void) {
- stoptime = GetTickCount ();
+timer gettimer(void) {
+ return GetTickCount ();
}
-flt timertime(void) {
+flt timertime(timer st, timer fn) {
double ttime, start, end;
- start = ((double) starttime) / ((double) 1000.00);
- end = ((double) stoptime) / ((double) 1000.00);
+ start = ((double) st) / ((double) 1000.00);
+ end = ((double) fn) / ((double) 1000.00);
ttime = end - start;
return ttime;
@@ -113,23 +106,20 @@ flt timertime(void) {
#endif /* _WIN32 */
/* if we're on a Unix with gettimeofday() we'll use newer timers */
-#ifdef STDTIME
- struct timeval starttime, endtime;
+#if defined( STDTIME )
struct timezone tz;
-
-void timerstart(void) {
- gettimeofday(&starttime, &tz);
-}
-
-void timerstop(void) {
- gettimeofday(&endtime, &tz);
+
+timer gettimer(void) {
+ timer t;
+ gettimeofday(&t, &tz);
+ return t;
}
-flt timertime(void) {
+flt timertime(timer st, timer fn) {
double ttime, start, end;
- start = (starttime.tv_sec+1.0*starttime.tv_usec / 1000000.0);
- end = (endtime.tv_sec+1.0*endtime.tv_usec / 1000000.0);
+ start = (st.tv_sec+1.0*st.tv_usec / 1000000.0);
+ end = (fn.tv_sec+1.0*fn.tv_usec / 1000000.0);
ttime = end - start;
return ttime;
@@ -139,22 +129,13 @@ flt timertime(void) {
/* use the old fashioned Unix time functions */
-#ifdef OLDUNIXTIME
-time_t starttime;
-time_t stoptime;
-
-void timerstart(void) {
- starttime=time(NULL);
-}
-
-void timerstop(void) {
- stoptime=time(NULL);
+#if defined( OLDUNIXTIME )
+timer gettimer(void) {
+ return time(NULL);
}
-flt timertime(void) {
- flt a;
- a = difftime(stoptime, starttime);
- return a;
+flt timertime(timer st, timer fn) {
+ return difftime(fn, st);;
}
#endif /* OLDUNIXTIME */
diff --git a/examples/parallel_for/tachyon/src/util.h b/examples/parallel_for/tachyon/src/util.h
index ad71b14..4f2a989 100644
--- a/examples/parallel_for/tachyon/src/util.h
+++ b/examples/parallel_for/tachyon/src/util.h
@@ -61,9 +61,23 @@
* $Id: util.h,v 1.3 2007-02-22 17:54:17 dpoulsen Exp $
*/
-void timerstart(void);
-void timerstop(void);
-flt timertime(void);
+#include "machine.h"
+
+#if defined( _WIN32 )
+ #include <windows.h>
+ typedef DWORD timer;
+#else
+ #include <sys/time.h>
+ #include <unistd.h>
+ #if defined( STDTIME )
+ typedef timeval timer;
+ #elif defined ( OLDUNIXTIME )
+ typedef time_t timer;
+ #endif /* OLDUNIXTIME */ /* STDTIME */
+ #endif /* _WIN32 */
+
+timer gettimer(void);
+flt timertime(timer st, timer fn);
void rt_sleep(int);
int rt_meminuse(void);
void * rt_getmem(unsigned int);
diff --git a/examples/parallel_for/tachyon/xcode/tachyon.xcodeproj/project.pbxproj b/examples/parallel_for/tachyon/xcode/tachyon.xcodeproj/project.pbxproj
index 4842dde..b9386b7 100644
--- a/examples/parallel_for/tachyon/xcode/tachyon.xcodeproj/project.pbxproj
+++ b/examples/parallel_for/tachyon/xcode/tachyon.xcodeproj/project.pbxproj
@@ -3,7 +3,7 @@
archiveVersion = 1;
classes = {
};
- objectVersion = 42;
+ objectVersion = 46;
objects = {
/* Begin PBXBuildFile section */
@@ -38,7 +38,6 @@
A1F590C90B8DF81800073279 /* coordsys.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F590A40B8DF81800073279 /* coordsys.cpp */; };
A1F590CA0B8DF81800073279 /* cylinder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F590A50B8DF81800073279 /* cylinder.cpp */; };
A1F590CB0B8DF81800073279 /* extvol.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F590A60B8DF81800073279 /* extvol.cpp */; };
- A1F590CC0B8DF81800073279 /* getargs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F590A70B8DF81800073279 /* getargs.cpp */; };
A1F590CD0B8DF81800073279 /* global.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F590A80B8DF81800073279 /* global.cpp */; };
A1F590CE0B8DF81800073279 /* grid.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F590A90B8DF81800073279 /* grid.cpp */; };
A1F590CF0B8DF81800073279 /* imageio.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F590AA0B8DF81800073279 /* imageio.cpp */; };
@@ -62,7 +61,6 @@
A1F590E30B8DF81800073279 /* ui.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F590BE0B8DF81800073279 /* ui.cpp */; };
A1F590E40B8DF81800073279 /* util.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F590BF0B8DF81800073279 /* util.cpp */; };
A1F590E50B8DF81800073279 /* vector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F590C00B8DF81800073279 /* vector.cpp */; };
- A1F590E60B8DF81800073279 /* video.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F590C10B8DF81800073279 /* video.cpp */; };
A1F590E70B8DF81800073279 /* vol.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F590C20B8DF81800073279 /* vol.cpp */; };
A1F5910D0B8DF81800073279 /* api.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F5909E0B8DF81800073279 /* api.cpp */; };
A1F5910E0B8DF81800073279 /* apigeom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F5909F0B8DF81800073279 /* apigeom.cpp */; };
@@ -73,7 +71,6 @@
A1F591130B8DF81800073279 /* coordsys.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F590A40B8DF81800073279 /* coordsys.cpp */; };
A1F591140B8DF81800073279 /* cylinder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F590A50B8DF81800073279 /* cylinder.cpp */; };
A1F591150B8DF81800073279 /* extvol.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F590A60B8DF81800073279 /* extvol.cpp */; };
- A1F591160B8DF81800073279 /* getargs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F590A70B8DF81800073279 /* getargs.cpp */; };
A1F591170B8DF81800073279 /* global.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F590A80B8DF81800073279 /* global.cpp */; };
A1F591180B8DF81800073279 /* grid.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F590A90B8DF81800073279 /* grid.cpp */; };
A1F591190B8DF81800073279 /* imageio.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F590AA0B8DF81800073279 /* imageio.cpp */; };
@@ -97,7 +94,6 @@
A1F5912D0B8DF81800073279 /* ui.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F590BE0B8DF81800073279 /* ui.cpp */; };
A1F5912E0B8DF81800073279 /* util.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F590BF0B8DF81800073279 /* util.cpp */; };
A1F5912F0B8DF81800073279 /* vector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F590C00B8DF81800073279 /* vector.cpp */; };
- A1F591300B8DF81800073279 /* video.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F590C10B8DF81800073279 /* video.cpp */; };
A1F591310B8DF81800073279 /* vol.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F590C20B8DF81800073279 /* vol.cpp */; };
A1F591320B8DF81800073279 /* api.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F5909E0B8DF81800073279 /* api.cpp */; };
A1F591330B8DF81800073279 /* apigeom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F5909F0B8DF81800073279 /* apigeom.cpp */; };
@@ -108,7 +104,6 @@
A1F591380B8DF81800073279 /* coordsys.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F590A40B8DF81800073279 /* coordsys.cpp */; };
A1F591390B8DF81800073279 /* cylinder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F590A50B8DF81800073279 /* cylinder.cpp */; };
A1F5913A0B8DF81800073279 /* extvol.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F590A60B8DF81800073279 /* extvol.cpp */; };
- A1F5913B0B8DF81800073279 /* getargs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F590A70B8DF81800073279 /* getargs.cpp */; };
A1F5913C0B8DF81800073279 /* global.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F590A80B8DF81800073279 /* global.cpp */; };
A1F5913D0B8DF81800073279 /* grid.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F590A90B8DF81800073279 /* grid.cpp */; };
A1F5913E0B8DF81800073279 /* imageio.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F590AA0B8DF81800073279 /* imageio.cpp */; };
@@ -132,11 +127,16 @@
A1F591520B8DF81800073279 /* ui.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F590BE0B8DF81800073279 /* ui.cpp */; };
A1F591530B8DF81800073279 /* util.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F590BF0B8DF81800073279 /* util.cpp */; };
A1F591540B8DF81800073279 /* vector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F590C00B8DF81800073279 /* vector.cpp */; };
- A1F591550B8DF81800073279 /* video.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F590C10B8DF81800073279 /* video.cpp */; };
A1F591560B8DF81800073279 /* vol.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F590C20B8DF81800073279 /* vol.cpp */; };
A1F5915D0B8DF94400073279 /* macvideo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F5915C0B8DF94400073279 /* macvideo.cpp */; };
A1F5915E0B8DF94400073279 /* macvideo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F5915C0B8DF94400073279 /* macvideo.cpp */; };
A1F591600B8DF94400073279 /* macvideo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F5915C0B8DF94400073279 /* macvideo.cpp */; };
+ EA135ECB13123E2200807847 /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EA135EC813123E2200807847 /* main.cpp */; };
+ EA135ECC13123E2200807847 /* tachyon_video.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EA135EC913123E2200807847 /* tachyon_video.cpp */; };
+ EA135ECD13123E2200807847 /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EA135EC813123E2200807847 /* main.cpp */; };
+ EA135ECE13123E2200807847 /* tachyon_video.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EA135EC913123E2200807847 /* tachyon_video.cpp */; };
+ EA135ECF13123E2200807847 /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EA135EC813123E2200807847 /* main.cpp */; };
+ EA135ED013123E2200807847 /* tachyon_video.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EA135EC913123E2200807847 /* tachyon_video.cpp */; };
/* End PBXBuildFile section */
/* Begin PBXCopyFilesBuildPhase section */
@@ -187,7 +187,6 @@
A1F590370B8DF7D100073279 /* coordsys.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = coordsys.h; path = ../src/coordsys.h; sourceTree = SOURCE_ROOT; };
A1F590380B8DF7D100073279 /* cylinder.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = cylinder.h; path = ../src/cylinder.h; sourceTree = SOURCE_ROOT; };
A1F590390B8DF7D100073279 /* extvol.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = extvol.h; path = ../src/extvol.h; sourceTree = SOURCE_ROOT; };
- A1F5903A0B8DF7D100073279 /* getargs.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = getargs.h; path = ../src/getargs.h; sourceTree = SOURCE_ROOT; };
A1F5903B0B8DF7D100073279 /* global.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = global.h; path = ../src/global.h; sourceTree = SOURCE_ROOT; };
A1F5903C0B8DF7D100073279 /* grid.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = grid.h; path = ../src/grid.h; sourceTree = SOURCE_ROOT; };
A1F5903D0B8DF7D100073279 /* imageio.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = imageio.h; path = ../src/imageio.h; sourceTree = SOURCE_ROOT; };
@@ -213,7 +212,6 @@
A1F590510B8DF7D100073279 /* ui.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = ui.h; path = ../src/ui.h; sourceTree = SOURCE_ROOT; };
A1F590520B8DF7D100073279 /* util.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = util.h; path = ../src/util.h; sourceTree = SOURCE_ROOT; };
A1F590530B8DF7D100073279 /* vector.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = vector.h; path = ../src/vector.h; sourceTree = SOURCE_ROOT; };
- A1F590540B8DF7D100073279 /* video.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = video.h; path = ../src/video.h; sourceTree = SOURCE_ROOT; };
A1F590550B8DF7D100073279 /* vol.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = vol.h; path = ../src/vol.h; sourceTree = SOURCE_ROOT; };
A1F5909E0B8DF81800073279 /* api.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = api.cpp; path = ../src/api.cpp; sourceTree = SOURCE_ROOT; };
A1F5909F0B8DF81800073279 /* apigeom.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = apigeom.cpp; path = ../src/apigeom.cpp; sourceTree = SOURCE_ROOT; };
@@ -224,7 +222,6 @@
A1F590A40B8DF81800073279 /* coordsys.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = coordsys.cpp; path = ../src/coordsys.cpp; sourceTree = SOURCE_ROOT; };
A1F590A50B8DF81800073279 /* cylinder.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = cylinder.cpp; path = ../src/cylinder.cpp; sourceTree = SOURCE_ROOT; };
A1F590A60B8DF81800073279 /* extvol.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = extvol.cpp; path = ../src/extvol.cpp; sourceTree = SOURCE_ROOT; };
- A1F590A70B8DF81800073279 /* getargs.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = getargs.cpp; path = ../src/getargs.cpp; sourceTree = SOURCE_ROOT; };
A1F590A80B8DF81800073279 /* global.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = global.cpp; path = ../src/global.cpp; sourceTree = SOURCE_ROOT; };
A1F590A90B8DF81800073279 /* grid.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = grid.cpp; path = ../src/grid.cpp; sourceTree = SOURCE_ROOT; };
A1F590AA0B8DF81800073279 /* imageio.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = imageio.cpp; path = ../src/imageio.cpp; sourceTree = SOURCE_ROOT; };
@@ -248,11 +245,13 @@
A1F590BE0B8DF81800073279 /* ui.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = ui.cpp; path = ../src/ui.cpp; sourceTree = SOURCE_ROOT; };
A1F590BF0B8DF81800073279 /* util.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = util.cpp; path = ../src/util.cpp; sourceTree = SOURCE_ROOT; };
A1F590C00B8DF81800073279 /* vector.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = vector.cpp; path = ../src/vector.cpp; sourceTree = SOURCE_ROOT; };
- A1F590C10B8DF81800073279 /* video.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = video.cpp; path = ../src/video.cpp; sourceTree = SOURCE_ROOT; };
A1F590C20B8DF81800073279 /* vol.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = vol.cpp; path = ../src/vol.cpp; sourceTree = SOURCE_ROOT; };
A1F5915A0B8DF8FA00073279 /* triangle.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = triangle.h; path = ../src/triangle.h; sourceTree = SOURCE_ROOT; };
A1F5915C0B8DF94400073279 /* macvideo.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = macvideo.cpp; path = ../../../common/gui/macvideo.cpp; sourceTree = SOURCE_ROOT; };
A1F591610B8DF96500073279 /* video.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = video.h; path = ../../../common/gui/video.h; sourceTree = SOURCE_ROOT; };
+ EA135EC813123E2200807847 /* main.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = main.cpp; path = ../src/main.cpp; sourceTree = SOURCE_ROOT; };
+ EA135EC913123E2200807847 /* tachyon_video.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = tachyon_video.cpp; path = ../src/tachyon_video.cpp; sourceTree = SOURCE_ROOT; };
+ EA135ECA13123E2200807847 /* tachyon_video.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = tachyon_video.h; path = ../src/tachyon_video.h; sourceTree = SOURCE_ROOT; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -353,6 +352,7 @@
A1F5902E0B8DF71200073279 /* Sources */ = {
isa = PBXGroup;
children = (
+ EA135EC913123E2200807847 /* tachyon_video.cpp */,
A1F5915C0B8DF94400073279 /* macvideo.cpp */,
A1F5909E0B8DF81800073279 /* api.cpp */,
A1F5909F0B8DF81800073279 /* apigeom.cpp */,
@@ -363,7 +363,6 @@
A1F590A40B8DF81800073279 /* coordsys.cpp */,
A1F590A50B8DF81800073279 /* cylinder.cpp */,
A1F590A60B8DF81800073279 /* extvol.cpp */,
- A1F590A70B8DF81800073279 /* getargs.cpp */,
A1F590A80B8DF81800073279 /* global.cpp */,
A1F590A90B8DF81800073279 /* grid.cpp */,
A1F590AA0B8DF81800073279 /* imageio.cpp */,
@@ -387,7 +386,6 @@
A1F590BE0B8DF81800073279 /* ui.cpp */,
A1F590BF0B8DF81800073279 /* util.cpp */,
A1F590C00B8DF81800073279 /* vector.cpp */,
- A1F590C10B8DF81800073279 /* video.cpp */,
A1F590C20B8DF81800073279 /* vol.cpp */,
);
name = Sources;
@@ -399,6 +397,7 @@
A1F591610B8DF96500073279 /* video.h */,
A1F5915A0B8DF8FA00073279 /* triangle.h */,
A1F590320B8DF7D100073279 /* api.h */,
+ EA135ECA13123E2200807847 /* tachyon_video.h */,
A1F590330B8DF7D100073279 /* apitrigeom.h */,
A1F590340B8DF7D100073279 /* bndbox.h */,
A1F590350B8DF7D100073279 /* box.h */,
@@ -406,7 +405,6 @@
A1F590370B8DF7D100073279 /* coordsys.h */,
A1F590380B8DF7D100073279 /* cylinder.h */,
A1F590390B8DF7D100073279 /* extvol.h */,
- A1F5903A0B8DF7D100073279 /* getargs.h */,
A1F5903B0B8DF7D100073279 /* global.h */,
A1F5903C0B8DF7D100073279 /* grid.h */,
A1F5903D0B8DF7D100073279 /* imageio.h */,
@@ -432,7 +430,6 @@
A1F590510B8DF7D100073279 /* ui.h */,
A1F590520B8DF7D100073279 /* util.h */,
A1F590530B8DF7D100073279 /* vector.h */,
- A1F590540B8DF7D100073279 /* video.h */,
A1F590550B8DF7D100073279 /* vol.h */,
);
name = Headers;
@@ -441,6 +438,7 @@
A1F590310B8DF75E00073279 /* Tachyon */ = {
isa = PBXGroup;
children = (
+ EA135EC813123E2200807847 /* main.cpp */,
A1F58D8C0B8DEFE900073279 /* trace.serial.cpp */,
A1F58D3D0B8DEB8E00073279 /* trace.threads.cpp */,
A1F58D8B0B8DEFD900073279 /* trace.tbb1d.cpp */,
@@ -512,9 +510,16 @@
/* Begin PBXProject section */
20286C28FDCF999611CA2CEA /* Project object */ = {
isa = PBXProject;
+ attributes = {
+ LastUpgradeCheck = 0410;
+ };
buildConfigurationList = C0E91AC908A95435008D54AB /* Build configuration list for PBXProject "tachyon" */;
- compatibilityVersion = "Xcode 2.4";
+ compatibilityVersion = "Xcode 3.2";
+ developmentRegion = English;
hasScannedForEncodings = 1;
+ knownRegions = (
+ en,
+ );
mainGroup = 20286C29FDCF999611CA2CEA /* tachyon */;
productRefGroup = A1F58CD30B8DE85300073279 /* Products */;
projectDirPath = "";
@@ -572,7 +577,6 @@
A1F591380B8DF81800073279 /* coordsys.cpp in Sources */,
A1F591390B8DF81800073279 /* cylinder.cpp in Sources */,
A1F5913A0B8DF81800073279 /* extvol.cpp in Sources */,
- A1F5913B0B8DF81800073279 /* getargs.cpp in Sources */,
A1F5913C0B8DF81800073279 /* global.cpp in Sources */,
A1F5913D0B8DF81800073279 /* grid.cpp in Sources */,
A1F5913E0B8DF81800073279 /* imageio.cpp in Sources */,
@@ -596,9 +600,10 @@
A1F591520B8DF81800073279 /* ui.cpp in Sources */,
A1F591530B8DF81800073279 /* util.cpp in Sources */,
A1F591540B8DF81800073279 /* vector.cpp in Sources */,
- A1F591550B8DF81800073279 /* video.cpp in Sources */,
A1F591560B8DF81800073279 /* vol.cpp in Sources */,
A1F5915D0B8DF94400073279 /* macvideo.cpp in Sources */,
+ EA135ECF13123E2200807847 /* main.cpp in Sources */,
+ EA135ED013123E2200807847 /* tachyon_video.cpp in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -616,7 +621,6 @@
A1F591130B8DF81800073279 /* coordsys.cpp in Sources */,
A1F591140B8DF81800073279 /* cylinder.cpp in Sources */,
A1F591150B8DF81800073279 /* extvol.cpp in Sources */,
- A1F591160B8DF81800073279 /* getargs.cpp in Sources */,
A1F591170B8DF81800073279 /* global.cpp in Sources */,
A1F591180B8DF81800073279 /* grid.cpp in Sources */,
A1F591190B8DF81800073279 /* imageio.cpp in Sources */,
@@ -640,9 +644,10 @@
A1F5912D0B8DF81800073279 /* ui.cpp in Sources */,
A1F5912E0B8DF81800073279 /* util.cpp in Sources */,
A1F5912F0B8DF81800073279 /* vector.cpp in Sources */,
- A1F591300B8DF81800073279 /* video.cpp in Sources */,
A1F591310B8DF81800073279 /* vol.cpp in Sources */,
A1F5915E0B8DF94400073279 /* macvideo.cpp in Sources */,
+ EA135ECD13123E2200807847 /* main.cpp in Sources */,
+ EA135ECE13123E2200807847 /* tachyon_video.cpp in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -660,7 +665,6 @@
A1F590C90B8DF81800073279 /* coordsys.cpp in Sources */,
A1F590CA0B8DF81800073279 /* cylinder.cpp in Sources */,
A1F590CB0B8DF81800073279 /* extvol.cpp in Sources */,
- A1F590CC0B8DF81800073279 /* getargs.cpp in Sources */,
A1F590CD0B8DF81800073279 /* global.cpp in Sources */,
A1F590CE0B8DF81800073279 /* grid.cpp in Sources */,
A1F590CF0B8DF81800073279 /* imageio.cpp in Sources */,
@@ -684,9 +688,10 @@
A1F590E30B8DF81800073279 /* ui.cpp in Sources */,
A1F590E40B8DF81800073279 /* util.cpp in Sources */,
A1F590E50B8DF81800073279 /* vector.cpp in Sources */,
- A1F590E60B8DF81800073279 /* video.cpp in Sources */,
A1F590E70B8DF81800073279 /* vol.cpp in Sources */,
A1F591600B8DF94400073279 /* macvideo.cpp in Sources */,
+ EA135ECB13123E2200807847 /* main.cpp in Sources */,
+ EA135ECC13123E2200807847 /* tachyon_video.cpp in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -708,24 +713,25 @@
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
+ ARCHS = "$(ARCHS_STANDARD_32_BIT)";
COPY_PHASE_STRIP = NO;
GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
GCC_GENERATE_DEBUGGING_SYMBOLS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/Carbon.framework/Headers/Carbon.h";
GCC_PREPROCESSOR_DEFINITIONS = "DEFAULT_MODELFILE=\"$(SOURCE_ROOT)/../dat/balls.dat\"";
- GCC_VERSION = 4.0;
+ GCC_VERSION = "";
HEADER_SEARCH_PATHS = ../../../../include;
+ IBC_STRIP_NIBS = NO;
INFOPLIST_FILE = Info.plist;
INSTALL_PATH = "$(HOME)/Applications";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
../../../../lib,
);
- PREBINDING = NO;
PRODUCT_NAME = "tachyon-tbb1d";
+ SDKROOT = macosx10.6;
WRAPPER_EXTENSION = app;
ZERO_LINK = NO;
};
@@ -735,22 +741,23 @@
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
+ ARCHS = "$(ARCHS_STANDARD_32_BIT)";
COPY_PHASE_STRIP = YES;
- GCC_ENABLE_FIX_AND_CONTINUE = NO;
GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/Carbon.framework/Headers/Carbon.h";
GCC_PREPROCESSOR_DEFINITIONS = "DEFAULT_MODELFILE=\"$(SOURCE_ROOT)/../dat/balls.dat\"";
- GCC_VERSION = 4.0;
+ GCC_VERSION = "";
HEADER_SEARCH_PATHS = ../../../../include;
+ IBC_STRIP_NIBS = NO;
INFOPLIST_FILE = Info.plist;
INSTALL_PATH = "$(HOME)/Applications";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
../../../../lib,
);
- PREBINDING = NO;
PRODUCT_NAME = "tachyon-tbb1d";
+ SDKROOT = macosx10.6;
WRAPPER_EXTENSION = app;
ZERO_LINK = NO;
};
@@ -760,19 +767,20 @@
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
+ ARCHS = "$(ARCHS_STANDARD_32_BIT)";
COPY_PHASE_STRIP = NO;
GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
GCC_GENERATE_DEBUGGING_SYMBOLS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/Carbon.framework/Headers/Carbon.h";
GCC_PREPROCESSOR_DEFINITIONS = "DEFAULT_MODELFILE=\"$(SOURCE_ROOT)/../dat/balls.dat\"";
- GCC_VERSION = 4.0;
+ GCC_VERSION = "";
+ IBC_STRIP_NIBS = NO;
INFOPLIST_FILE = Info.plist;
INSTALL_PATH = "$(HOME)/Applications";
- PREBINDING = NO;
PRODUCT_NAME = "tachyon-serial";
+ SDKROOT = macosx10.6;
WRAPPER_EXTENSION = app;
ZERO_LINK = NO;
};
@@ -782,17 +790,18 @@
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
+ ARCHS = "$(ARCHS_STANDARD_32_BIT)";
COPY_PHASE_STRIP = YES;
- GCC_ENABLE_FIX_AND_CONTINUE = NO;
GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/Carbon.framework/Headers/Carbon.h";
GCC_PREPROCESSOR_DEFINITIONS = "DEFAULT_MODELFILE=\"$(SOURCE_ROOT)/../dat/balls.dat\"";
- GCC_VERSION = 4.0;
+ GCC_VERSION = "";
+ IBC_STRIP_NIBS = NO;
INFOPLIST_FILE = Info.plist;
INSTALL_PATH = "$(HOME)/Applications";
- PREBINDING = NO;
PRODUCT_NAME = "tachyon-serial";
+ SDKROOT = macosx10.6;
WRAPPER_EXTENSION = app;
ZERO_LINK = NO;
};
@@ -805,13 +814,13 @@
ARCHS = i386;
COPY_PHASE_STRIP = NO;
GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
GCC_MODEL_TUNING = "";
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = tachyon.pch;
- GCC_VERSION = 4.0;
+ GCC_VERSION = "";
HEADER_SEARCH_PATHS = ../../../../include;
+ IBC_STRIP_NIBS = NO;
INFOPLIST_FILE = Info.plist;
INSTALL_PATH = "$(HOME)/Applications";
LIBRARY_SEARCH_PATHS = (
@@ -819,6 +828,7 @@
../../../../lib,
);
PRODUCT_NAME = "tachyon-tbb";
+ SDKROOT = macosx10.6;
WRAPPER_EXTENSION = app;
ZERO_LINK = NO;
};
@@ -833,8 +843,9 @@
GCC_MODEL_TUNING = "";
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = tachyon.pch;
- GCC_VERSION = 4.0;
+ GCC_VERSION = "";
HEADER_SEARCH_PATHS = ../../../../include;
+ IBC_STRIP_NIBS = NO;
INFOPLIST_FILE = Info.plist;
INSTALL_PATH = "$(HOME)/Applications";
LIBRARY_SEARCH_PATHS = (
@@ -842,6 +853,7 @@
../../../../lib,
);
PRODUCT_NAME = "tachyon-tbb";
+ SDKROOT = macosx10.6;
WRAPPER_EXTENSION = app;
ZERO_LINK = NO;
};
@@ -855,11 +867,13 @@
GCC_ENABLE_SSE3_EXTENSIONS = YES;
GCC_MODEL_TUNING = "";
GCC_PREPROCESSOR_DEFINITIONS = "DEFAULT_MODELFILE=\"$(SOURCE_ROOT)/../dat/balls.dat\"";
- GCC_VERSION = 4.0;
+ GCC_VERSION = "";
GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = NO;
GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
- PREBINDING = NO;
+ IBC_STRIP_NIBS = NO;
+ MACOSX_DEPLOYMENT_TARGET = 10.6;
+ SDKROOT = macosx10.6;
SYMROOT = "/tmp/tbb-$(USER)";
};
name = Debug;
@@ -872,11 +886,13 @@
GCC_ENABLE_SSE3_EXTENSIONS = YES;
GCC_MODEL_TUNING = "";
GCC_PREPROCESSOR_DEFINITIONS = "DEFAULT_MODELFILE=\"$(SOURCE_ROOT)/../dat/balls.dat\"";
- GCC_VERSION = 4.0;
+ GCC_VERSION = "";
GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = NO;
GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
- PREBINDING = NO;
+ IBC_STRIP_NIBS = NO;
+ MACOSX_DEPLOYMENT_TARGET = 10.6;
+ SDKROOT = macosx10.6;
SYMROOT = "/tmp/tbb-$(USER)";
};
name = Release;
diff --git a/examples/parallel_reduce/convex_hull/Makefile b/examples/parallel_reduce/convex_hull/Makefile
index 7ea2ca5..5ac16c2 100644
--- a/examples/parallel_reduce/convex_hull/Makefile
+++ b/examples/parallel_reduce/convex_hull/Makefile
@@ -27,12 +27,18 @@
# GNU Makefile that builds and runs example.
PROG=convex_hull_bench
ARGS=
+PERF_RUN_ARGS = silent auto 40000000
+LIGHT_ARGS = 4 400
# The C++ compiler
ifneq (,$(shell which icc 2>/dev/null))
CXX=icc
endif # icc
+ifeq ($(shell uname), Linux)
+LIBS+= -lrt
+endif
+
all: release test
release: *.cpp
@@ -46,5 +52,13 @@ debug: *.cpp
clean:
$(RM) convex_hull_bench convex_hull_sample *.o *.d
+perf_build: release
+
+perf_run:
+ ./convex_hull_sample $(PERF_RUN_ARGS)
+
test:
./$(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 586e946..9abcb07 100644
--- a/examples/parallel_reduce/convex_hull/Makefile.windows
+++ b/examples/parallel_reduce/convex_hull/Makefile.windows
@@ -27,6 +27,8 @@
# Common Makefile that builds and runs example.
PROG=convex_hull_bench
ARGS=
+PERF_RUN_ARGS = silent auto 40000000
+LIGHT_ARGS = 4 400
# Trying to find if icl.exe is set
CXX1 = $(TBB_CXX)-
@@ -34,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 /D _SCL_SECURE_NO_DEPRECATE $(CXXFLAGS)
+MYCXXFLAGS = /TP /EHsc /W3 /nologo $(TBB_SECURITY_SWITCH) /D _CONSOLE /D _MBCS /D WIN32 /D _SCL_SECURE_NO_DEPRECATE /D _SECURE_SCL=0 $(CXXFLAGS)
MYLDFLAGS =/INCREMENTAL:NO /NOLOGO /DEBUG /FIXED:NO $(LDFLAGS)
all: release test
@@ -48,6 +50,14 @@ clean:
@cmd.exe /C del convex_hull*.exe *.obj *.?db *.manifest
test:
$(PROG) $(ARGS)
+perf_build: release
+
+perf_run:
+ ./convex_hull_sample $(PERF_RUN_ARGS)
+
+light_test:
+ ./$(PROG) $(LIGHT_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
diff --git a/examples/parallel_reduce/convex_hull/convex_hull.h b/examples/parallel_reduce/convex_hull/convex_hull.h
index b58f2c9..cd49cba 100644
--- a/examples/parallel_reduce/convex_hull/convex_hull.h
+++ b/examples/parallel_reduce/convex_hull/convex_hull.h
@@ -38,128 +38,87 @@
#include <cstring>
#include <algorithm>
#include <functional>
-#include <assert.h>
+#include <cassert>
+#include <climits>
#include "tbb/tick_count.h"
+#include "tbb/task_scheduler_init.h"
+#include "../../common/utility/utility.h"
+#include "../../common/utility/fast_random.h"
+#include "tbb/blocked_range.h"
using namespace std;
namespace cfg {
- // convex hull problem parameter defaults
- const long NP = 5000000; // problem size
- const int SNT = 1; // minimal number of threads
- const int ENT = 8; // maximal number of threads
-
// convex hull problem user set parameters
- long MAXPOINTS = NP;
- int NUM_THREADS_START = SNT;
- int NUM_THREADS_END = ENT;
+ long numberOfPoints = 5000000; // problem size
+ utility::thread_number_range threads(tbb::task_scheduler_init::default_num_threads);
// convex hull grain sizes for 3 subproblems. Be sure 16*GS < 512Kb
- const size_t GENERATE_GS = 25000;
- const size_t FINDEXT_GS = 25000;
- const size_t DIVIDE_GS = 25000;
+ const size_t generateGrainSize = 25000;
+ const size_t findExtremumGrainSize = 25000;
+ const size_t divideGrainSize = 25000;
};
namespace util {
- bool VERBOSE = false;
+ bool silent = false;
+ bool verbose = false;
vector<string> OUTPUT;
// utility functionality
void ParseInputArgs(int argc, char* argv[]) {
- int numArgs = 1;
- if(argc>numArgs) {
- char delim = ':';
- if(!strcmp(argv[numArgs], "-h")) {
- cout << " Program usage is:" << endl
- << " " << argv[0] << " [NP] [SNT" << delim << "ENT] [-v]"
- << endl << endl
- << " where:" << endl
- << " NP - number of points" << endl
- << " SNT - start with this number of threads" << endl
- << " ENT - end with this number of threads" << endl
- << " -v - turns verbose ON" << endl;
- exit(0);
- } else {
- while(argc>numArgs) {
- char* endptr;
- if(!strcmp(argv[numArgs], "-v")) {
- VERBOSE = true;
- } else if(!strchr(argv[numArgs], delim)) {
- cfg::MAXPOINTS = strtol(argv[numArgs], &endptr, 0);
- if(*endptr!='\0') {
- cout << " wrong parameter format for Number of Points" << endl;
- exit(1);
- }
- if(cfg::MAXPOINTS<=0) {
- cout
- << " wrong value set for Number of Points" << endl
- << " using default value: " << endl
- << " Number of Points = " << cfg::NP << endl;
- cfg::MAXPOINTS = cfg::NP;
- }
- } else {
- cfg::NUM_THREADS_START=(int)strtol(argv[numArgs], &endptr, 0);
- if(*endptr==delim) {
- cfg::NUM_THREADS_END = (int)strtol(endptr+1, &endptr, 0);
- } else {
- cout << " wrong parameter format for Number of Threads" << endl;
- exit(1);
- }
- if(*endptr!='\0') {
- cout << " wrong parameter format for Number of Threads" << endl;
- exit(1);
- }
- if((cfg::NUM_THREADS_START<=0)
- || (cfg::NUM_THREADS_END<cfg::NUM_THREADS_START)) {
- cout
- << " wrong values set for Number of Threads" << endl
- << " using default values: " << endl
- << " start NT = " << cfg::SNT << endl
- << " end NT = " << cfg::ENT << endl;
- cfg::NUM_THREADS_START=cfg::SNT;
- cfg::NUM_THREADS_END =cfg::ENT;
- }
- }
- ++numArgs;
- }
- }
- }
+ 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")
+ .positional_arg(cfg::numberOfPoints,"n-of-points","number of points")
+ .arg(silent,"silent","no output except elapsed time")
+ .arg(verbose,"verbose","turns verbose ON")
+ );
+ //disabling verbose if silent is specified
+ if (silent) verbose = false;;
}
template <typename T>
struct point {
T x;
T y;
- point() : x(T()), y(T()) {}
+ //According to subparagraph 4 of paragraph 12.6.2 "Initializing bases and members" [class.base.init]
+ //of ANSI-ISO-IEC C++ 2003 standard, POD members will _not_ be initialized if they are not mentioned
+ //in the base-member initializer list.
+
+ //For more details why this needed please see comment in FillRNDPointsVector_buf
+ point() {}
point(T _x, T _y) : x(_x), y(_y) {}
- //why do we need below line? it fails to compile with suncc
- //point(const point<T>& _P) : x(_P.x), y(_P.y) {}
};
- int random(unsigned int& rseed) {
-#if __linux__ || __APPLE__ || __FreeBSD__ || __NetBSD__
- return rand_r(&rseed);
-#elif _WIN32 || __sun
- return rand();
-#else
-#error Unknown/unsupported OS?
-#endif // OS selection
+ std::ostream& operator<< (std::ostream& o, point<double> const& p) {
+ return o << "(" << p.x << "," << p.y << ")";
}
- template < typename T >
- point<T> GenerateRNDPoint(size_t& count, unsigned int& rseed) {
+ struct rng {
+ static const size_t max_rand = USHRT_MAX;
+ utility::FastRandom my_fast_random;
+ rng (size_t seed):my_fast_random(seed) {}
+ unsigned short operator()(){return my_fast_random.get();}
+ unsigned short operator()(size_t& seed){return my_fast_random.get(seed);}
+ };
+
+
+ template < typename T ,typename rng_functor_type>
+ point<T> GenerateRNDPoint(size_t& count, rng_functor_type random, size_t rand_max) {
/* generates random points on 2D plane so that the cluster
is somewhat circle shaped */
const size_t maxsize=500;
- T x = random(rseed)*2.0/(double)RAND_MAX - 1;
- T y = random(rseed)*2.0/(double)RAND_MAX - 1;
+ T x = random()*2.0/(double)rand_max - 1;
+ T y = random()*2.0/(double)rand_max - 1;
T r = (x*x + y*y);
if(r>1) {
count++;
if(count>10) {
- if (random(rseed)/(double)RAND_MAX > 0.5)
+ if (random()/(double)rand_max > 0.5)
x /= r;
- if (random(rseed)/(double)RAND_MAX > 0.5)
+ if (random()/(double)rand_max > 0.5)
y /= r;
count = 0;
}
@@ -219,18 +178,19 @@ namespace util {
}
void WriteResults(int nthreads, double initTime, double calcTime) {
- if(VERBOSE) {
+ if(verbose) {
cout << " Step by step hull construction:" << endl;
for(size_t i = 0; i < OUTPUT.size(); ++i)
cout << OUTPUT[i] << endl;
}
-
- cout
- << " Number of nodes:" << cfg::MAXPOINTS
- << " Number of threads:" << nthreads
- << " Initialization time:" << setw(10) << setprecision(3) << initTime
- << " Calculation time:" << setw(10) << setprecision(3) << calcTime
- << endl;
+ if (!silent){
+ cout
+ << " Number of nodes:" << cfg::numberOfPoints
+ << " Number of threads:" << nthreads
+ << " Initialization time:" << setw(10) << setprecision(3) << initTime
+ << " Calculation time:" << setw(10) << setprecision(3) << calcTime
+ << endl;
+ }
}
};
diff --git a/examples/parallel_reduce/convex_hull/convex_hull_bench.cpp b/examples/parallel_reduce/convex_hull/convex_hull_bench.cpp
index 118a5ad..d8a8959 100644
--- a/examples/parallel_reduce/convex_hull/convex_hull_bench.cpp
+++ b/examples/parallel_reduce/convex_hull/convex_hull_bench.cpp
@@ -35,9 +35,12 @@
typedef util::point<double> point_t;
-#define USETBB 1
-#define USECONCVEC 1
-#define INIT_ONCE 1
+#ifndef USETBB
+ #define USETBB 1
+#endif
+#ifndef USECONCVEC
+ #define USECONCVEC 1
+#endif
#if !USETBB // Serial implementation of Quick Hull algorithm
@@ -119,7 +122,7 @@ point_t divide(const pointVec_t &P, pointVec_t &P_reduced, const point_t &p1, co
SplitByCP splitByCP(p1, p2, P_reduced);
point_t farPoint = std::for_each(P.begin(), P.end(), splitByCP);
- if(util::VERBOSE) {
+ if(util::verbose) {
std::stringstream ss;
ss << P.size() << " nodes in bucket"<< ", "
<< "dividing by: [ " << p1 << ", " << p2 << " ], "
@@ -205,6 +208,9 @@ void appendVector(const pointVec_t& src, pointVec_t& dest) {
std::copy(src.begin(), src.end(), dest.grow_by(src.size()));
}
+void grow_vector_to_at_least(pointVec_t& vect, size_t size) {
+ vect.grow_to_at_least(size);
+}
#else // USE STD::VECTOR - include spin_mutex.h and lock vector operations
#include "tbb/spin_mutex.h"
@@ -222,67 +228,67 @@ void appendVector(mutex_t& insertMutex, const point_t* src, size_t srcSize,
dest.insert(dest.end(), src, src + srcSize);
}
+void grow_vector_to_at_least(mutex_t& mutex, pointVec_t& vect, size_t size) {
+ mutex_t::scoped_lock lock(mutex);
+ if (vect.size()< size){
+ vect.resize(size);
+ }
+}
#endif // USECONCVEC
-void serial_initialize(pointVec_t &points);
-
class FillRNDPointsVector {
pointVec_t &points;
- mutable unsigned int rseed;
public:
- static const size_t grainSize = cfg::GENERATE_GS;
+ static const size_t grainSize = cfg::generateGrainSize;
#if !USECONCVEC
static mutex_t pushBackMutex;
#endif // USECONCVEC
- FillRNDPointsVector(pointVec_t& _points)
- : points(_points), rseed(1) {}
- FillRNDPointsVector(const FillRNDPointsVector& other)
- : points(other.points), rseed(other.rseed+1) {}
+ explicit FillRNDPointsVector(pointVec_t& _points)
+ : points(_points){}
void operator()(const range_t& range) const {
+ util::rng the_rng(range.begin());
const size_t i_end = range.end();
size_t count = 0;
- for(size_t i = range.begin(); i != i_end; ++i) {
#if USECONCVEC
- points.push_back(util::GenerateRNDPoint<double>(count, rseed));
-#else // Locked push_back to a not thread-safe STD::VECTOR
- {
- mutex_t::scoped_lock lock(pushBackMutex);
- points.push_back(util::GenerateRNDPoint<double>(count, rseed));
- }
+ points.grow_to_at_least(i_end);
+#else // Locked enlarge to a not thread-safe STD::VECTOR
+ grow_vector_to_at_least(pushBackMutex,points,i_end);
#endif // USECONCVEC
+
+ for(size_t i = range.begin(); i != i_end; ++i) {
+ points[i]=util::GenerateRNDPoint<double>(count,the_rng,util::rng::max_rand);
}
}
};
class FillRNDPointsVector_buf {
pointVec_t &points;
- mutable unsigned int rseed;
public:
- static const size_t grainSize = cfg::GENERATE_GS;
+ static const size_t grainSize = cfg::generateGrainSize;
#if !USECONCVEC
static mutex_t insertMutex;
#endif // USECONCVEC
- FillRNDPointsVector_buf(pointVec_t& _points)
- : points(_points), rseed(1) {}
-
- FillRNDPointsVector_buf(const FillRNDPointsVector_buf& other)
- : points(other.points), rseed(other.rseed+1) {}
+ explicit FillRNDPointsVector_buf(pointVec_t& _points)
+ : points(_points){}
void operator()(const range_t& range) const {
+ util::rng the_rng(range.begin());
const size_t i_end = range.end();
size_t count = 0, j = 0;
point_t tmp_vec[grainSize];
+
for(size_t i=range.begin(); i!=i_end; ++i) {
- tmp_vec[j++] = util::GenerateRNDPoint<double>(count, rseed);
+ tmp_vec[j++] = util::GenerateRNDPoint<double>(count,the_rng,util::rng::max_rand);
}
#if USECONCVEC
- appendVector(tmp_vec, j, points);
+ grow_vector_to_at_least(points,range.end());
#else // USE STD::VECTOR
- appendVector(insertMutex, tmp_vec, j, points);
+ grow_vector_to_at_least(insertMutex,points,range.end());
#endif // USECONCVEC
+ std::copy(tmp_vec, tmp_vec+j,points.begin()+range.begin());
}
};
@@ -293,11 +299,22 @@ mutex_t FillRNDPointsVector_buf::insertMutex = mutex_t();
template<typename BodyType>
void initialize(pointVec_t &points) {
+ //This function generate the same series of point on every call.
+ //Reproducibility is needed for benchmarking to produce reliable results.
+ //It is achieved through the following points:
+ // - FillRNDPointsVector_buf instance has its own local instance
+ // of random number generator, which in turn does not use any global data
+ // - tbb::simple_partitioner produce the same set of ranges on every call to
+ // tbb::parallel_for
+ // - local RNG instances are seeded by the starting indexes of corresponding ranges
+ // - grow_to_at_least() enables putting points into the resulting vector in deterministic order
+ // (unlike concurrent push_back or grow_by).
+
// In the buffered version, a temporary storage for as much as grainSize elements
// is allocated inside the body. Since auto_partitioner may increase effective
// range size which would cause a crash, simple partitioner has to be used.
- tbb::parallel_for(range_t(0, cfg::MAXPOINTS, BodyType::grainSize),
+ tbb::parallel_for(range_t(0, cfg::numberOfPoints, BodyType::grainSize),
BodyType(points), tbb::simple_partitioner());
}
@@ -307,7 +324,7 @@ public:
minX, maxX
} extremumType;
- static const size_t grainSize = cfg::FINDEXT_GS;
+ static const size_t grainSize = cfg::findExtremumGrainSize;
FindXExtremum(const pointVec_t& points_, extremumType exType_)
: points(points_), exType(exType_), extrXPoint(points[0]) {}
@@ -365,7 +382,7 @@ class SplitByCP {
point_t farPoint;
double howFar;
public:
- static const size_t grainSize = cfg::DIVIDE_GS;
+ static const size_t grainSize = cfg::divideGrainSize;
#if !USECONCVEC
static mutex_t pushBackMutex;
#endif // USECONCVEC
@@ -425,7 +442,7 @@ class SplitByCP_buf {
point_t farPoint;
double howFar;
public:
- static const size_t grainSize = cfg::DIVIDE_GS;
+ static const size_t grainSize = cfg::divideGrainSize;
#if !USECONCVEC
static mutex_t insertMutex;
#endif // USECONCVEC
@@ -491,7 +508,7 @@ point_t divide(const pointVec_t &P, pointVec_t &P_reduced,
tbb::parallel_reduce(range_t(0, P.size(), BodyType::grainSize),
body, tbb::simple_partitioner() );
- if(util::VERBOSE) {
+ if(util::verbose) {
std::stringstream ss;
ss << P.size() << " nodes in bucket"<< ", "
<< "dividing by: [ " << p1 << ", " << p2 << " ], "
@@ -564,8 +581,6 @@ void quickhull(const pointVec_t &points, pointVec_t &hull, bool buffered) {
int main(int argc, char* argv[]) {
util::ParseInputArgs(argc, argv);
- pointVec_t points;
- pointVec_t hull;
int nthreads;
util::my_time_t tm_init, tm_start, tm_end;
@@ -575,29 +590,21 @@ int main(int argc, char* argv[]) {
std::cout << "Starting STL locked unbuffered push_back version of QUICK HULL algorithm" << std::endl;
#endif // USECONCVEC
-#if INIT_ONCE
- tm_init = util::gettime();
- serial_initialize(points);
- tm_start = util::gettime();
- std::cout << "Serial init time: " << util::time_diff(tm_init, tm_start) << " Points in input: " << points.size() << "\n";
-
-#endif
-
- for(nthreads=cfg::NUM_THREADS_START; nthreads<=cfg::NUM_THREADS_END;
+ for(nthreads=cfg::threads.first; nthreads<=cfg::threads.last;
++nthreads) {
+ pointVec_t points;
+ pointVec_t hull;
+
tbb::task_scheduler_init init(nthreads);
-#if !INIT_ONCE
- points.clear();
tm_init = util::gettime();
initialize<FillRNDPointsVector>(points);
tm_start = util::gettime();
std::cout << "Parallel init time on " << nthreads << " threads: " << util::time_diff(tm_init, tm_start) << " Points in input: " << points.size() << "\n";
-#endif // !INIT_ONCE
+
tm_start = util::gettime();
quickhull(points, hull, false);
tm_end = util::gettime();
std::cout << "Time on " << nthreads << " threads: " << util::time_diff(tm_start, tm_end) << " Points in hull: " << hull.size() << "\n";
- hull.clear();
}
#if USECONCVEC
@@ -606,21 +613,22 @@ int main(int argc, char* argv[]) {
std::cout << "Starting STL locked buffered version of QUICK HULL algorithm" << std::endl;
#endif
- for(nthreads=cfg::NUM_THREADS_START; nthreads<=cfg::NUM_THREADS_END;
+ for(nthreads=cfg::threads.first; nthreads<=cfg::threads.last;
++nthreads) {
+ pointVec_t points;
+ pointVec_t hull;
+
tbb::task_scheduler_init init(nthreads);
-#if !INIT_ONCE
- points.clear();
+
tm_init = util::gettime();
initialize<FillRNDPointsVector_buf>(points);
tm_start = util::gettime();
std::cout << "Init time on " << nthreads << " threads: " << util::time_diff(tm_init, tm_start) << " Points in input: " << points.size() << "\n";
-#endif // !INIT_ONCE
+
tm_start = util::gettime();
quickhull(points, hull, true);
tm_end = util::gettime();
std::cout << "Time on " << nthreads << " threads: " << util::time_diff(tm_start, tm_end) << " Points in hull: " << hull.size() << "\n";
- hull.clear();
}
return 0;
@@ -629,10 +637,10 @@ int main(int argc, char* argv[]) {
#endif // USETBB
void serial_initialize(pointVec_t &points) {
- points.resize(cfg::MAXPOINTS);
+ points.reserve(cfg::numberOfPoints);
unsigned int rseed=1;
- for(size_t i=0, count=0; long(i)<cfg::MAXPOINTS; ++i) {
- points[i] = util::GenerateRNDPoint<double>(count, rseed);
+ for(size_t i=0, count=0; long(i)<cfg::numberOfPoints; ++i) {
+ points.push_back(util::GenerateRNDPoint<double>(count,&std::rand,RAND_MAX ));
}
}
diff --git a/examples/parallel_reduce/convex_hull/convex_hull_sample.cpp b/examples/parallel_reduce/convex_hull/convex_hull_sample.cpp
index 44e2774..ec46c44 100644
--- a/examples/parallel_reduce/convex_hull/convex_hull_sample.cpp
+++ b/examples/parallel_reduce/convex_hull/convex_hull_sample.cpp
@@ -35,6 +35,7 @@
- only buffered version is used
*/
#include <cassert>
+#include <algorithm>
#include "convex_hull.h"
#include "tbb/task_scheduler_init.h"
@@ -44,8 +45,6 @@
#include "tbb/tick_count.h"
#include "tbb/concurrent_vector.h"
-#define INIT_ONCE 1
-
typedef util::point<double> point_t;
typedef tbb::concurrent_vector< point_t > pointVec_t;
typedef tbb::blocked_range<size_t> range_t;
@@ -57,44 +56,49 @@ void appendVector(const point_t* src, size_t srcSize, pointVec_t& dest) {
void appendVector(const pointVec_t& src, pointVec_t& dest) {
std::copy(src.begin(), src.end(), dest.grow_by(src.size()));
}
-
class FillRNDPointsVector_buf {
pointVec_t &points;
- mutable unsigned int rseed;
public:
- static const size_t grainSize = cfg::GENERATE_GS;
-
- FillRNDPointsVector_buf(pointVec_t& _points)
- : points(_points), rseed(1) {}
+ static const size_t grainSize = cfg::generateGrainSize;
- FillRNDPointsVector_buf(const FillRNDPointsVector_buf& other)
- : points(other.points), rseed(other.rseed+1) {}
+ explicit FillRNDPointsVector_buf(pointVec_t& _points)
+ : points(_points) {}
void operator()(const range_t& range) const {
+ util::rng the_rng(range.begin());
const size_t i_end = range.end();
size_t count = 0, j = 0;
point_t tmp_vec[grainSize];
+
for(size_t i=range.begin(); i!=i_end; ++i) {
- tmp_vec[j++] = util::GenerateRNDPoint<double>(count, rseed);
+ tmp_vec[j++] = util::GenerateRNDPoint<double>(count, the_rng, util::rng::max_rand);
}
- appendVector(tmp_vec, j, points);
+ //Here we have race condition. Elements being written to may be still under construction.
+ //For C++ 2003 it is workarounded by vector element type which default constructor does not touch memory,
+ //it being constructed on. See comments near default ctor of point class for more details.
+ //Strictly speaking it is UB.
+ //TODO: need to find more reliable/correct way
+ points.grow_to_at_least(range.end());
+ std::copy(tmp_vec, tmp_vec+j,points.begin()+range.begin());
}
};
-void serial_initialize(pointVec_t &points) {
- points.resize(cfg::MAXPOINTS);
-
- unsigned int rseed=1;
- for(size_t i=0, count=0; long(i)<cfg::MAXPOINTS; ++i) {
- points[i] = util::GenerateRNDPoint<double>(count, rseed);
- }
-}
-
void initialize(pointVec_t &points) {
+ //This function generate the same series of point on every call.
+ //Reproducibility is needed for benchmarking to produce reliable results.
+ //It is achieved through the following points:
+ // - FillRNDPointsVector_buf instance has its own local instance
+ // of random number generator, which in turn does not use any global data
+ // - tbb::simple_partitioner produce the same set of ranges on every call to
+ // tbb::parallel_for
+ // - local RNG instances are seeded by the starting indexes of corresponding ranges
+ // - grow_to_at_least() enables putting points into the resulting vector in deterministic order
+ // (unlike concurrent push_back or grow_by).
+
// In the buffered version, a temporary storage for as much as grainSize elements
// is allocated inside the body. Since auto_partitioner may increase effective
// range size which would cause a crash, simple partitioner has to be used.
- tbb::parallel_for(range_t(0, cfg::MAXPOINTS, FillRNDPointsVector_buf::grainSize),
+ tbb::parallel_for(range_t(0, cfg::numberOfPoints, FillRNDPointsVector_buf::grainSize),
FillRNDPointsVector_buf(points), tbb::simple_partitioner());
}
@@ -104,7 +108,7 @@ public:
minX, maxX
} extremumType;
- static const size_t grainSize = cfg::FINDEXT_GS;
+ static const size_t grainSize = cfg::findExtremumGrainSize;
FindXExtremum(const pointVec_t& points_, extremumType exType_)
: points(points_), exType(exType_), extrXPoint(points[0]) {}
@@ -164,7 +168,7 @@ class SplitByCP_buf {
point_t farPoint;
double howFar;
public:
- static const size_t grainSize = cfg::DIVIDE_GS;
+ static const size_t grainSize = cfg::divideGrainSize;
SplitByCP_buf( point_t _p1, point_t _p2,
const pointVec_t &_initialSet, pointVec_t &_reducedSet)
@@ -217,7 +221,7 @@ point_t divide(const pointVec_t &P, pointVec_t &P_reduced,
tbb::parallel_reduce(range_t(0, P.size(), SplitByCP_buf::grainSize),
sbcpb, tbb::simple_partitioner());
- if(util::VERBOSE) {
+ if(util::verbose) {
std::stringstream ss;
ss << P.size() << " nodes in bucket"<< ", "
<< "dividing by: [ " << p1 << ", " << p2 << " ], "
@@ -265,36 +269,41 @@ void quickhull(const pointVec_t &points, pointVec_t &hull) {
}
int main(int argc, char* argv[]) {
+ util::my_time_t tm_main_begin = util::gettime();
+
util::ParseInputArgs(argc, argv);
- pointVec_t points, tmp_points;
+ pointVec_t points;
pointVec_t hull;
int nthreads;
- util::my_time_t tm_init, tm_start, tm_end;
- std::cout << "Starting TBB-buffered version of QUICK HULL algorithm" << std::endl;
+ points.reserve(cfg::numberOfPoints);
+
+ if(!util::silent) {
+ std::cout << "Starting TBB-buffered version of QUICK HULL algorithm" << std::endl;
+ }
- tm_init = util::gettime();
- serial_initialize(points);
- tm_start = util::gettime();
- std::cout << "Serial init time: " << util::time_diff(tm_init, tm_start) << " Points in input: " << points.size() << "\n";
- for(nthreads=cfg::NUM_THREADS_START; nthreads<=cfg::NUM_THREADS_END;
+ for(nthreads=cfg::threads.first; nthreads<=cfg::threads.last;
++nthreads) {
tbb::task_scheduler_init init(nthreads);
-#if !INIT_ONCE
- tmp_points.clear();
- tm_init = util::gettime();
- initialize(tmp_points);
- tm_start = util::gettime();
- std::cout << "Init time on " << nthreads << " threads: " << util::time_diff(tm_init, tm_start) << " Points in input: " << points.size() << "\n";
-#endif
+
+ points.clear();
+ util::my_time_t tm_init = util::gettime();
+ initialize(points);
+ util::my_time_t tm_start = util::gettime();
+ if(!util::silent) {
+ std::cout <<"Init time on "<<nthreads<<" threads: "<<util::time_diff(tm_init, tm_start)<<" Points in input: "<<points.size()<<std::endl;
+ }
+
tm_start = util::gettime();
quickhull(points, hull);
- tm_end = util::gettime();
- std::cout << "Time on " << nthreads << " threads: " << util::time_diff(tm_start, tm_end) << " Points in hull: " << hull.size() << "\n";
+ util::my_time_t tm_end = util::gettime();
+ if(!util::silent) {
+ std::cout <<"Time on "<<nthreads<<" threads: "<<util::time_diff(tm_start, tm_end)<<" Points in hull: "<<hull.size()<<std::endl;
+ }
hull.clear();
}
-
+ utility::report_elapsed_time(util::time_diff(tm_main_begin, util::gettime()));
return 0;
}
diff --git a/examples/parallel_reduce/convex_hull/index.html b/examples/parallel_reduce/convex_hull/index.html
index 10e9a5e..eb39b12 100644
--- a/examples/parallel_reduce/convex_hull/index.html
+++ b/examples/parallel_reduce/convex_hull/index.html
@@ -43,10 +43,9 @@ General build directions can be found <A HREF=../../index.html#build>here</A>.
<A HREF="../index.html">Up to parent directory</A>
<p></p>
Copyright © 2005-2011 Intel Corporation. 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>
+Intel is a registered trademark or trademark 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.
</BODY>
diff --git a/examples/parallel_reduce/convex_hull/msvs/convex_hull_benchmark.vcproj b/examples/parallel_reduce/convex_hull/msvs/convex_hull_benchmark.vcproj
index 3f43cd2..f6b9c06 100644
--- a/examples/parallel_reduce/convex_hull/msvs/convex_hull_benchmark.vcproj
+++ b/examples/parallel_reduce/convex_hull/msvs/convex_hull_benchmark.vcproj
@@ -43,7 +43,7 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
RuntimeLibrary="3"
UsePrecompiledHeader="0"
@@ -63,7 +63,7 @@
Name="VCLinkerTool"
AdditionalDependencies="tbb_debug.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+ 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"
@@ -93,7 +93,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 debug "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 debug "$(OutDir)""
/>
</Configuration>
<Configuration
@@ -122,7 +122,7 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
RuntimeLibrary="3"
UsePrecompiledHeader="0"
@@ -141,7 +141,7 @@
Name="VCLinkerTool"
AdditionalDependencies="tbb_debug.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+ 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"
@@ -171,7 +171,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 debug "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 debug "$(OutDir)""
/>
</Configuration>
<Configuration
@@ -199,7 +199,7 @@
<Tool
Name="VCCLCompilerTool"
Optimization="3"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
RuntimeLibrary="2"
UsePrecompiledHeader="0"
@@ -219,7 +219,7 @@
Name="VCLinkerTool"
AdditionalDependencies="tbb.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+ 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"
@@ -251,7 +251,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 release "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 release "$(OutDir)""
/>
</Configuration>
<Configuration
@@ -280,7 +280,7 @@
<Tool
Name="VCCLCompilerTool"
Optimization="3"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="WIN64;NDEBUG;_CONSOLE"
RuntimeLibrary="2"
UsePrecompiledHeader="0"
@@ -299,7 +299,7 @@
Name="VCLinkerTool"
AdditionalDependencies="tbb.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+ 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"
@@ -331,7 +331,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 release "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 release "$(OutDir)""
/>
</Configuration>
</Configurations>
diff --git a/examples/parallel_reduce/convex_hull/msvs/convex_hull_sample.vcproj b/examples/parallel_reduce/convex_hull/msvs/convex_hull_sample.vcproj
index 160cece..10f0eae 100644
--- a/examples/parallel_reduce/convex_hull/msvs/convex_hull_sample.vcproj
+++ b/examples/parallel_reduce/convex_hull/msvs/convex_hull_sample.vcproj
@@ -43,7 +43,7 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
RuntimeLibrary="3"
UsePrecompiledHeader="0"
@@ -63,7 +63,7 @@
Name="VCLinkerTool"
AdditionalDependencies="tbb_debug.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+ 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"
@@ -93,7 +93,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 debug "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 debug "$(OutDir)""
/>
</Configuration>
<Configuration
@@ -122,7 +122,7 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
RuntimeLibrary="3"
UsePrecompiledHeader="0"
@@ -141,7 +141,7 @@
Name="VCLinkerTool"
AdditionalDependencies="tbb_debug.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+ 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"
@@ -171,7 +171,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 debug "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 debug "$(OutDir)""
/>
</Configuration>
<Configuration
@@ -199,7 +199,7 @@
<Tool
Name="VCCLCompilerTool"
Optimization="3"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
RuntimeLibrary="2"
UsePrecompiledHeader="0"
@@ -219,7 +219,7 @@
Name="VCLinkerTool"
AdditionalDependencies="tbb.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+ 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"
@@ -251,7 +251,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 release "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 release "$(OutDir)""
/>
</Configuration>
<Configuration
@@ -280,7 +280,7 @@
<Tool
Name="VCCLCompilerTool"
Optimization="3"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="WIN64;NDEBUG;_CONSOLE"
RuntimeLibrary="2"
UsePrecompiledHeader="0"
@@ -299,7 +299,7 @@
Name="VCLinkerTool"
AdditionalDependencies="tbb.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+ 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"
@@ -331,7 +331,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 release "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 release "$(OutDir)""
/>
</Configuration>
</Configurations>
diff --git a/examples/parallel_reduce/convex_hull/xcode/convex_hull.xcodeproj/project.pbxproj b/examples/parallel_reduce/convex_hull/xcode/convex_hull.xcodeproj/project.pbxproj
index 2f168e9..6b35ba1 100644
--- a/examples/parallel_reduce/convex_hull/xcode/convex_hull.xcodeproj/project.pbxproj
+++ b/examples/parallel_reduce/convex_hull/xcode/convex_hull.xcodeproj/project.pbxproj
@@ -3,7 +3,7 @@
archiveVersion = 1;
classes = {
};
- objectVersion = 42;
+ objectVersion = 46;
objects = {
/* Begin PBXBuildFile section */
@@ -147,9 +147,16 @@
/* Begin PBXProject section */
08FB7793FE84155DC02AAC07 /* Project object */ = {
isa = PBXProject;
+ attributes = {
+ LastUpgradeCheck = 0410;
+ };
buildConfigurationList = 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "convex_hull" */;
- compatibilityVersion = "Xcode 2.4";
+ compatibilityVersion = "Xcode 3.2";
+ developmentRegion = English;
hasScannedForEncodings = 1;
+ knownRegions = (
+ en,
+ );
mainGroup = 08FB7794FE84155DC02AAC07 /* convex_hull */;
projectDirPath = "";
projectRoot = "";
@@ -185,14 +192,13 @@
buildSettings = {
COPY_PHASE_STRIP = NO;
GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
GCC_OPTIMIZATION_LEVEL = 0;
- GCC_VERSION = 4.0;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
HEADER_SEARCH_PATHS = ../../../../include;
INSTALL_PATH = "$(HOME)/bin";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
- "../../../../lib",
+ ../../../../lib,
);
PRODUCT_NAME = convex_hull_sample;
ZERO_LINK = NO;
@@ -203,12 +209,12 @@
isa = XCBuildConfiguration;
buildSettings = {
GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
- GCC_VERSION = 4.0;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
HEADER_SEARCH_PATHS = ../../../../include;
INSTALL_PATH = "$(HOME)/bin";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
- "../../../../lib",
+ ../../../../lib,
);
PRODUCT_NAME = convex_hull_sample;
ZERO_LINK = NO;
@@ -225,7 +231,6 @@
GCC_VERSION = 4.0;
GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
- PREBINDING = NO;
PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
SYMROOT = "/tmp/tbb-$(USER)";
};
@@ -241,7 +246,6 @@
GCC_VERSION = 4.0;
GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
- PREBINDING = NO;
PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
SYMROOT = "/tmp/tbb-$(USER)";
};
@@ -250,18 +254,16 @@
A1F593C60B8F0E6E00073279 /* Debug64 */ = {
isa = XCBuildConfiguration;
buildSettings = {
- ARCHS = "$(ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1)";
- ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1 = x86_64;
+ ARCHS = "$(ARCHS_STANDARD_64_BIT)";
COPY_PHASE_STRIP = NO;
GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
GCC_OPTIMIZATION_LEVEL = 0;
- GCC_VERSION = 4.0;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
HEADER_SEARCH_PATHS = ../../../../include;
INSTALL_PATH = "$(HOME)/bin";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
- "../../../../lib",
+ ../../../../lib,
);
PRODUCT_NAME = convex_hull_sample;
ZERO_LINK = NO;
@@ -271,15 +273,14 @@
A1F593C70B8F0E6E00073279 /* Release64 */ = {
isa = XCBuildConfiguration;
buildSettings = {
- ARCHS = "$(ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1)";
- ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1 = x86_64;
+ ARCHS = "$(ARCHS_STANDARD_64_BIT)";
GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
- GCC_VERSION = 4.0;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
HEADER_SEARCH_PATHS = ../../../../include;
INSTALL_PATH = "$(HOME)/bin";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
- "../../../../lib",
+ ../../../../lib,
);
PRODUCT_NAME = convex_hull_sample;
ZERO_LINK = NO;
@@ -301,7 +302,6 @@
"-m64",
);
OTHER_LDFLAGS = "-m64";
- PREBINDING = NO;
PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
SYMROOT = "/tmp/tbb-$(USER)";
};
@@ -322,7 +322,6 @@
"-m64",
);
OTHER_LDFLAGS = "-m64";
- PREBINDING = NO;
PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
SYMROOT = "/tmp/tbb-$(USER)";
};
@@ -333,17 +332,15 @@
buildSettings = {
COPY_PHASE_STRIP = NO;
GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
GCC_GENERATE_DEBUGGING_SYMBOLS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
- GCC_VERSION = 4.0;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
HEADER_SEARCH_PATHS = ../../../../include;
INSTALL_PATH = "$(HOME)/bin";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
- "../../../../lib",
+ ../../../../lib,
);
- PREBINDING = NO;
PRODUCT_NAME = convex_hull_bench;
ZERO_LINK = NO;
};
@@ -352,20 +349,17 @@
A1F594F00B8F4B8200073279 /* Debug64 */ = {
isa = XCBuildConfiguration;
buildSettings = {
- ARCHS = "$(ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1)";
- ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1 = x86_64;
+ ARCHS = "$(ARCHS_STANDARD_64_BIT)";
COPY_PHASE_STRIP = NO;
GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
GCC_OPTIMIZATION_LEVEL = 0;
- GCC_VERSION = 4.0;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
HEADER_SEARCH_PATHS = ../../../../include;
INSTALL_PATH = "$(HOME)/bin";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
- "../../../../lib",
+ ../../../../lib,
);
- PREBINDING = NO;
PRODUCT_NAME = convex_hull_bench;
ZERO_LINK = NO;
};
@@ -375,16 +369,14 @@
isa = XCBuildConfiguration;
buildSettings = {
COPY_PHASE_STRIP = YES;
- GCC_ENABLE_FIX_AND_CONTINUE = NO;
GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
- GCC_VERSION = 4.0;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
HEADER_SEARCH_PATHS = ../../../../include;
INSTALL_PATH = "$(HOME)/bin";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
- "../../../../lib",
+ ../../../../lib,
);
- PREBINDING = NO;
PRODUCT_NAME = convex_hull_bench;
ZERO_LINK = NO;
};
@@ -393,18 +385,15 @@
A1F594F20B8F4B8200073279 /* Release64 */ = {
isa = XCBuildConfiguration;
buildSettings = {
- ARCHS = "$(ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1)";
- ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1 = x86_64;
- GCC_ENABLE_FIX_AND_CONTINUE = NO;
+ ARCHS = "$(ARCHS_STANDARD_64_BIT)";
GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
- GCC_VERSION = 4.0;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
HEADER_SEARCH_PATHS = ../../../../include;
INSTALL_PATH = "$(HOME)/bin";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
- "../../../../lib",
+ ../../../../lib,
);
- PREBINDING = NO;
PRODUCT_NAME = convex_hull_bench;
ZERO_LINK = NO;
};
diff --git a/examples/parallel_reduce/index.html b/examples/parallel_reduce/index.html
index 0104b53..f484c4e 100644
--- a/examples/parallel_reduce/index.html
+++ b/examples/parallel_reduce/index.html
@@ -16,10 +16,9 @@ This directory has examples of the template <code>parallel_reduce</code>.
<A HREF="../index.html">Up to parent directory</A>
<p></p>
Copyright © 2005-2011 Intel Corporation. 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>
+Intel is a registered trademark or trademark 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.
</BODY>
diff --git a/examples/parallel_reduce/primes/Makefile b/examples/parallel_reduce/primes/Makefile
index f0a0eca..5d7730f 100644
--- a/examples/parallel_reduce/primes/Makefile
+++ b/examples/parallel_reduce/primes/Makefile
@@ -34,6 +34,10 @@ ifneq (,$(shell which icc 2>/dev/null))
CXX=icc
endif # icc
+ifeq ($(shell uname), Linux)
+LIBS+= -lrt
+endif
+
all: release test
release: main.cpp primes.cpp
diff --git a/examples/parallel_reduce/primes/index.html b/examples/parallel_reduce/primes/index.html
index b346129..2967b0d 100644
--- a/examples/parallel_reduce/primes/index.html
+++ b/examples/parallel_reduce/primes/index.html
@@ -49,10 +49,9 @@ General build directions can be found <A HREF=../../index.html#build>here</A>.
<A HREF="../index.html">Up to parent directory</A>
<p></p>
Copyright © 2005-2011 Intel Corporation. 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>
+Intel is a registered trademark or trademark 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.
</BODY>
diff --git a/examples/parallel_reduce/primes/msvs/primes.vcproj b/examples/parallel_reduce/primes/msvs/primes.vcproj
index 9fa0671..74d2ef2 100644
--- a/examples/parallel_reduce/primes/msvs/primes.vcproj
+++ b/examples/parallel_reduce/primes/msvs/primes.vcproj
@@ -43,7 +43,7 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
RuntimeLibrary="3"
UsePrecompiledHeader="0"
@@ -63,7 +63,7 @@
Name="VCLinkerTool"
AdditionalDependencies="tbb_debug.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+ 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"
@@ -93,7 +93,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 debug "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 debug "$(OutDir)""
/>
</Configuration>
<Configuration
@@ -122,7 +122,7 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
RuntimeLibrary="3"
UsePrecompiledHeader="0"
@@ -141,7 +141,7 @@
Name="VCLinkerTool"
AdditionalDependencies="tbb_debug.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+ 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"
@@ -171,7 +171,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 debug "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 debug "$(OutDir)""
/>
</Configuration>
<Configuration
@@ -198,7 +198,7 @@
/>
<Tool
Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
RuntimeLibrary="2"
UsePrecompiledHeader="0"
@@ -218,7 +218,7 @@
Name="VCLinkerTool"
AdditionalDependencies="tbb.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+ 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"
@@ -250,7 +250,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 release "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 release "$(OutDir)""
/>
</Configuration>
<Configuration
@@ -278,7 +278,7 @@
/>
<Tool
Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="WIN64;NDEBUG;_CONSOLE"
RuntimeLibrary="2"
UsePrecompiledHeader="0"
@@ -297,7 +297,7 @@
Name="VCLinkerTool"
AdditionalDependencies="tbb.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+ 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"
@@ -329,7 +329,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 release "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 release "$(OutDir)""
/>
</Configuration>
</Configurations>
diff --git a/examples/parallel_reduce/primes/xcode/primes.xcodeproj/project.pbxproj b/examples/parallel_reduce/primes/xcode/primes.xcodeproj/project.pbxproj
index b0e86a9..2202d31 100644
--- a/examples/parallel_reduce/primes/xcode/primes.xcodeproj/project.pbxproj
+++ b/examples/parallel_reduce/primes/xcode/primes.xcodeproj/project.pbxproj
@@ -3,7 +3,7 @@
archiveVersion = 1;
classes = {
};
- objectVersion = 42;
+ objectVersion = 46;
objects = {
/* Begin PBXBuildFile section */
@@ -108,9 +108,16 @@
/* Begin PBXProject section */
08FB7793FE84155DC02AAC07 /* Project object */ = {
isa = PBXProject;
+ attributes = {
+ LastUpgradeCheck = 0410;
+ };
buildConfigurationList = 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "primes" */;
- compatibilityVersion = "Xcode 2.4";
+ compatibilityVersion = "Xcode 3.2";
+ developmentRegion = English;
hasScannedForEncodings = 1;
+ knownRegions = (
+ en,
+ );
mainGroup = 08FB7794FE84155DC02AAC07 /* primes */;
projectDirPath = "";
projectRoot = "";
@@ -138,14 +145,13 @@
buildSettings = {
COPY_PHASE_STRIP = NO;
GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
GCC_OPTIMIZATION_LEVEL = 0;
- GCC_VERSION = 4.0;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
HEADER_SEARCH_PATHS = ../../../../include;
INSTALL_PATH = "$(HOME)/bin";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
- "../../../../lib",
+ ../../../../lib,
);
PRODUCT_NAME = primes;
ZERO_LINK = NO;
@@ -156,12 +162,12 @@
isa = XCBuildConfiguration;
buildSettings = {
GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
- GCC_VERSION = 4.0;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
HEADER_SEARCH_PATHS = ../../../../include;
INSTALL_PATH = "$(HOME)/bin";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
- "../../../../lib",
+ ../../../../lib,
);
PRODUCT_NAME = primes;
ZERO_LINK = NO;
@@ -178,7 +184,6 @@
GCC_VERSION = 4.0;
GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
- PREBINDING = NO;
PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
SYMROOT = "/tmp/tbb-$(USER)";
};
@@ -194,7 +199,6 @@
GCC_VERSION = 4.0;
GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
- PREBINDING = NO;
PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
SYMROOT = "/tmp/tbb-$(USER)";
};
@@ -203,18 +207,16 @@
A1F593C60B8F0E6E00073279 /* Debug64 */ = {
isa = XCBuildConfiguration;
buildSettings = {
- ARCHS = "$(ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1)";
- ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1 = x86_64;
+ ARCHS = "$(ARCHS_STANDARD_64_BIT)";
COPY_PHASE_STRIP = NO;
GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
GCC_OPTIMIZATION_LEVEL = 0;
- GCC_VERSION = 4.0;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
HEADER_SEARCH_PATHS = ../../../../include;
INSTALL_PATH = "$(HOME)/bin";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
- "../../../../lib",
+ ../../../../lib,
);
PRODUCT_NAME = primes;
ZERO_LINK = NO;
@@ -224,15 +226,14 @@
A1F593C70B8F0E6E00073279 /* Release64 */ = {
isa = XCBuildConfiguration;
buildSettings = {
- ARCHS = "$(ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1)";
- ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1 = x86_64;
+ ARCHS = "$(ARCHS_STANDARD_64_BIT)";
GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
- GCC_VERSION = 4.0;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
HEADER_SEARCH_PATHS = ../../../../include;
INSTALL_PATH = "$(HOME)/bin";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
- "../../../../lib",
+ ../../../../lib,
);
PRODUCT_NAME = primes;
ZERO_LINK = NO;
@@ -254,7 +255,6 @@
"-m64",
);
OTHER_LDFLAGS = "-m64";
- PREBINDING = NO;
PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
SYMROOT = "/tmp/tbb-$(USER)";
};
@@ -275,7 +275,6 @@
"-m64",
);
OTHER_LDFLAGS = "-m64";
- PREBINDING = NO;
PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
SYMROOT = "/tmp/tbb-$(USER)";
};
diff --git a/examples/pipeline/index.html b/examples/pipeline/index.html
index c268b91..d5079c9 100644
--- a/examples/pipeline/index.html
+++ b/examples/pipeline/index.html
@@ -14,10 +14,9 @@ This directory has examples of the template <code>pipeline</code>.
<A HREF="../index.html">Up to parent directory</A>
<p></p>
Copyright © 2005-2011 Intel Corporation. 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>
+Intel is a registered trademark or trademark 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.
</BODY>
diff --git a/examples/pipeline/square/Makefile b/examples/pipeline/square/Makefile
index fde2bb6..67f2fe5 100644
--- a/examples/pipeline/square/Makefile
+++ b/examples/pipeline/square/Makefile
@@ -26,7 +26,8 @@
# GNU Makefile that builds and runs example.
PROG=square
-ARGS=input.txt output.txt
+ARGS=0 input.txt output.txt
+PERF_RUN_ARGS=auto input.txt output.txt silent
GEN=gen_input
# The C++ compiler
@@ -36,6 +37,10 @@ endif # icc
SQUARE = square.cpp
+ifeq ($(shell uname), Linux)
+LIBS+= -lrt
+endif
+
all: release test
release: $(SQUARE) input.txt
@@ -55,3 +60,9 @@ input.txt: $(GEN)
test: input.txt
./$(PROG) $(ARGS)
+
+perf_build: $(SQUARE) input.txt
+ $(CXX) -O2 -msse2 -DNDEBUG $(CXXFLAGS) -o $(PROG) $(SQUARE) -ltbb $(LIBS)
+
+perf_run: input.txt
+ ./$(PROG) $(PERF_RUN_ARGS)
diff --git a/examples/pipeline/square/Makefile.windows b/examples/pipeline/square/Makefile.windows
index 0f804ad..5a11a82 100644
--- a/examples/pipeline/square/Makefile.windows
+++ b/examples/pipeline/square/Makefile.windows
@@ -28,7 +28,8 @@
# Just specify your program basename
PROG=square
-ARGS=input.txt output.txt
+ARGS=0 input.txt output.txt
+PERF_RUN_ARGS=auto input.txt output.txt silent
# Trying to find if icl.exe is set
CXX1 = $(TBB_CXX)-
@@ -36,7 +37,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) /D _CRT_SECURE_NO_DEPRECATE
+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
@@ -56,3 +57,6 @@ test: input.txt
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
+ $(PROG) $(PERF_RUN_ARGS)
diff --git a/examples/pipeline/square/index.html b/examples/pipeline/square/index.html
index 8f3d5bc..32ce6ab 100644
--- a/examples/pipeline/square/index.html
+++ b/examples/pipeline/square/index.html
@@ -37,32 +37,35 @@ Two additional targets for this example:
<H2>Usage</H2>
<DL>
-<DT><TT>square <I>inputfile</I> <I>outputfile</I> <I>N</I></TT>
-<DD>Run the example on the named <I>inputfile</I> (optional, default value is "input.txt") and produce the named <I>outputfile</I> (optional, default value is "output.txt").
- <I>N</I> is the number of threads to be used (optional).
-
+<DT><TT>square <I>-h</I></TT>
+<DD>Prints the help for command line options
+<DT><TT>square [<I>n-of-threads</I>=value] [<I>input-file</I>=value] [<I>output-file</I>=value] [<I>max-slice-size</I>=value] [<I>silent</I>]</TT>
+<DT><TT>square [<I>n-of-threads</I> [<I>input-file</I> [<I>output-file</I> [<I>max-slice-size</I>]]]] [<I>silent</I>]</TT>
+<DD><I>n-of-threads</I> is the number of threads to use; a range of the form <I>low</I>[:<I>high</I>], where low and optional high are non-negative integers or 'auto' for the TBB default.<BR>
+ <I>input-file</I> is an input file name.<BR>
+ <I>output-file</I> is an output file name. <BR>
+ <I>max-slice-size</I> is the maximum number of characters in one slice.<BR>
+ <I>silent</I> - no output except elapsed time.<BR>
<DT><TT>gen_input [<I>LN</I>] > <I>inputfile</I></TT>
<DD>Generate a file named <I>inputfile</I> consisting of <I>LN</I> lines each containing one integer.
If not specified, <I>LN</I> is assumed to be 1000000.
-
-<DT>To run a short version of this example, e.g., for use with Intel® Threading Tools:
+
+<DT>To run a short version of this example, e.g., for use with Intel® Parallel Inspector:
<DD>Build a <I>debug</I> version of the example
(see the <A HREF=../../index.html#build>build directions</A>).
<BR>Prepare an <I>inputfile</I> with about 5,000 lines of text (see the instruction above).
<BR>Run it with this <I>inputfile</I> and the desired number of threads,
- e.g., <TT>square <I>inputfile</I> <I>outputfile</I> 4</TT>.
+ e.g., <TT>square 4 <I>inputfile</I> <I>outputfile</I></TT>.
</DL>
<HR>
<A HREF="../index.html">Up to parent directory</A>
<p></p>
Copyright © 2005-2011 Intel Corporation. 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>
+Intel is a registered trademark or trademark 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.
</BODY>
</HTML>
-
diff --git a/examples/pipeline/square/msvs/square.vcproj b/examples/pipeline/square/msvs/square.vcproj
index 1311ee6..3632731 100644
--- a/examples/pipeline/square/msvs/square.vcproj
+++ b/examples/pipeline/square/msvs/square.vcproj
@@ -47,7 +47,7 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG;_CRT_SECURE_NO_DEPRECATE"
RuntimeLibrary="3"
UsePrecompiledHeader="0"
@@ -67,7 +67,7 @@
Name="VCLinkerTool"
AdditionalDependencies="tbb_debug.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+ 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"
@@ -97,7 +97,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 debug "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 debug "$(OutDir)""
/>
</Configuration>
<Configuration
@@ -130,7 +130,7 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG;_CRT_SECURE_NO_DEPRECATE"
RuntimeLibrary="3"
UsePrecompiledHeader="0"
@@ -149,7 +149,7 @@
Name="VCLinkerTool"
AdditionalDependencies="tbb_debug.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+ 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"
@@ -179,7 +179,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 debug "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 debug "$(OutDir)""
/>
</Configuration>
<Configuration
@@ -210,7 +210,7 @@
/>
<Tool
Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE"
RuntimeLibrary="2"
UsePrecompiledHeader="0"
@@ -230,7 +230,7 @@
Name="VCLinkerTool"
AdditionalDependencies="tbb.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+ 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"
@@ -262,7 +262,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 release "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 release "$(OutDir)""
/>
</Configuration>
<Configuration
@@ -294,7 +294,7 @@
/>
<Tool
Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="WIN64;NDEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE"
RuntimeLibrary="2"
UsePrecompiledHeader="0"
@@ -313,7 +313,7 @@
Name="VCLinkerTool"
AdditionalDependencies="tbb.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+ 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"
@@ -345,7 +345,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 release "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 release "$(OutDir)""
/>
</Configuration>
</Configurations>
@@ -374,6 +374,10 @@
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
>
</Filter>
+ <File
+ RelativePath="..\index.html"
+ >
+ </File>
</Files>
<Globals>
</Globals>
diff --git a/examples/pipeline/square/square.cpp b/examples/pipeline/square/square.cpp
index fe7f48c..176b80d 100644
--- a/examples/pipeline/square/square.cpp
+++ b/examples/pipeline/square/square.cpp
@@ -38,6 +38,7 @@
#include <cstdlib>
#include <cstdio>
#include <cctype>
+#include "../../common/utility/utility.h"
using namespace std;
@@ -79,9 +80,9 @@ public:
void set_end( char* p ) {logical_end=p;}
};
-const size_t MAX_CHAR_PER_INPUT_SLICE = 4000;
-static const char* InputFileName = "input.txt";
-static const char* OutputFileName = "output.txt";
+size_t MAX_CHAR_PER_INPUT_SLICE = 4000;
+string InputFileName = "input.txt";
+string OutputFileName = "output.txt";
class MyInputFilter: public tbb::filter {
public:
@@ -181,51 +182,25 @@ void* MyOutputFilter::operator()( void* item ) {
TextSlice& out = *static_cast<TextSlice*>(item);
size_t n = fwrite( out.begin(), 1, out.size(), my_output_file );
if( n!=out.size() ) {
- fprintf(stderr,"Can't write into file '%s'\n", OutputFileName);
+ fprintf(stderr,"Can't write into file '%s'\n", OutputFileName.c_str());
exit(1);
}
out.free();
return NULL;
}
-static int NThread = tbb::task_scheduler_init::automatic;
-static bool is_number_of_threads_set = false;
-
-void Usage()
-{
- fprintf( stderr, "Usage:\tsquare [input-file [output-file [nthread]]]\n");
-}
-
-int ParseCommandLine( int argc, char* argv[] ) {
- // Parse command line
- if( argc> 4 ){
- Usage();
- return 0;
- }
- if( argc>=2 ) InputFileName = argv[1];
- if( argc>=3 ) OutputFileName = argv[2];
- if( argc>=4 ) {
- NThread = strtol(argv[3],0,0);
- if( NThread<1 ) {
- fprintf(stderr,"nthread set to %d, but must be at least 1\n",NThread);
- return 0;
- }
- is_number_of_threads_set = true; //Number of threads is set explicitly
- }
- return 1;
-}
+bool silent = false;
int run_pipeline( int nthreads )
{
- FILE* input_file = fopen(InputFileName,"r");
+ FILE* input_file = fopen( InputFileName.c_str(), "r" );
if( !input_file ) {
- perror( InputFileName );
- Usage();
+ throw std::invalid_argument( ("Invalid input file name: "+InputFileName).c_str() );
return 0;
}
- FILE* output_file = fopen(OutputFileName,"w");
+ FILE* output_file = fopen( OutputFileName.c_str(), "w" );
if( !output_file ) {
- perror( OutputFileName );
+ throw std::invalid_argument( ("Invalid output file name: "+OutputFileName).c_str() );
return 0;
}
@@ -254,37 +229,56 @@ int run_pipeline( int nthreads )
fclose( output_file );
fclose( input_file );
- if (is_number_of_threads_set) {
- printf("threads = %d time = %g\n", nthreads, (t1-t0).seconds());
- } else {
- if ( nthreads == 1 ){
- printf("serial run time = %g\n", (t1-t0).seconds());
- } else {
- printf("parallel run time = %g\n", (t1-t0).seconds());
- }
- }
+ if ( !silent ) printf("time = %g\n", (t1-t0).seconds());
+
return 1;
}
int main( int argc, char* argv[] ) {
- if(!ParseCommandLine( argc, argv ))
- return 1;
- if (is_number_of_threads_set) {
- // Start task scheduler
- tbb::task_scheduler_init init( NThread );
- if(!run_pipeline (NThread))
- return 1;
- } else { // Number of threads wasn't set explicitly. Run serial and parallel version
- { // serial run
- tbb::task_scheduler_init init_serial(1);
- if(!run_pipeline (1))
- return 1;
- }
- { // parallel run (number of threads is selected automatically)
- tbb::task_scheduler_init init_parallel;
- if(!run_pipeline (init_parallel.default_num_threads()))
- return 1;
+ try {
+ tbb::tick_count mainStartTime = tbb::tick_count::now();
+
+ // The 1st argument is the function to obtain 'auto' value; the 2nd is the default value
+ // The example interprets 0 threads as "run serially, then fully subscribed"
+ utility::thread_number_range threads( tbb::task_scheduler_init::default_num_threads, 0 );
+
+ 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.")
+ .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")
+ );
+
+ if ( threads.first ) {
+ for(int p = threads.first; p <= threads.last; ++p ) {
+ if ( !silent ) printf("threads = %d ", p);
+ tbb::task_scheduler_init init(p);
+ if(!run_pipeline (p))
+ return 1;
+ }
+ } else { // Number of threads wasn't set explicitly. Run serial and parallel version
+ { // serial run
+ if ( !silent ) printf("serial run ");
+ tbb::task_scheduler_init init_serial(1);
+ if(!run_pipeline (1))
+ return 1;
+ }
+ { // parallel run (number of threads is selected automatically)
+ if ( !silent ) printf("parallel run ");
+ tbb::task_scheduler_init init_parallel;
+ if(!run_pipeline (init_parallel.default_num_threads()))
+ return 1;
+ }
}
+
+ utility::report_elapsed_time((tbb::tick_count::now() - mainStartTime).seconds());
+
+ return 0;
+ } catch(std::exception& e) {
+ std::cerr<<"error occurred. error text is :\"" <<e.what()<<"\"\n";
+ return 1;
}
- return 0;
}
diff --git a/examples/pipeline/square/xcode/square.xcodeproj/project.pbxproj b/examples/pipeline/square/xcode/square.xcodeproj/project.pbxproj
index fe4eff4..6ef82ba 100644
--- a/examples/pipeline/square/xcode/square.xcodeproj/project.pbxproj
+++ b/examples/pipeline/square/xcode/square.xcodeproj/project.pbxproj
@@ -3,7 +3,7 @@
archiveVersion = 1;
classes = {
};
- objectVersion = 42;
+ objectVersion = 46;
objects = {
/* Begin PBXBuildFile section */
@@ -143,9 +143,16 @@
/* Begin PBXProject section */
08FB7793FE84155DC02AAC07 /* Project object */ = {
isa = PBXProject;
+ attributes = {
+ LastUpgradeCheck = 0410;
+ };
buildConfigurationList = 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "square" */;
- compatibilityVersion = "Xcode 2.4";
+ compatibilityVersion = "Xcode 3.2";
+ developmentRegion = English;
hasScannedForEncodings = 1;
+ knownRegions = (
+ en,
+ );
mainGroup = 08FB7794FE84155DC02AAC07 /* square */;
projectDirPath = "";
projectRoot = "";
@@ -206,14 +213,13 @@
buildSettings = {
COPY_PHASE_STRIP = NO;
GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
GCC_OPTIMIZATION_LEVEL = 0;
- GCC_VERSION = 4.0;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
HEADER_SEARCH_PATHS = ../../../../include;
INSTALL_PATH = "$(HOME)/bin";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
- "../../../../lib",
+ ../../../../lib,
);
PRODUCT_NAME = square;
ZERO_LINK = NO;
@@ -224,12 +230,12 @@
isa = XCBuildConfiguration;
buildSettings = {
GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
- GCC_VERSION = 4.0;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
HEADER_SEARCH_PATHS = ../../../../include;
INSTALL_PATH = "$(HOME)/bin";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
- "../../../../lib",
+ ../../../../lib,
);
PRODUCT_NAME = square;
ZERO_LINK = NO;
@@ -246,7 +252,6 @@
GCC_VERSION = 4.0;
GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
- PREBINDING = NO;
PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
SYMROOT = "/tmp/tbb-$(USER)";
};
@@ -262,7 +267,6 @@
GCC_VERSION = 4.0;
GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
- PREBINDING = NO;
PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
SYMROOT = "/tmp/tbb-$(USER)";
};
@@ -273,13 +277,11 @@
buildSettings = {
COPY_PHASE_STRIP = NO;
GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
GCC_GENERATE_DEBUGGING_SYMBOLS = YES;
GCC_MODEL_TUNING = G5;
GCC_OPTIMIZATION_LEVEL = 0;
- GCC_VERSION = 4.0;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
INSTALL_PATH = "$(HOME)/bin";
- PREBINDING = NO;
PRODUCT_NAME = "gen-input";
ZERO_LINK = YES;
};
@@ -288,13 +290,10 @@
6DA3F3E60DE5D36B0039CADE /* Debug64 */ = {
isa = XCBuildConfiguration;
buildSettings = {
- ARCHS = "$(ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1)";
- ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1 = x86_64;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
+ ARCHS = "$(ARCHS_STANDARD_64_BIT)";
GCC_MODEL_TUNING = G5;
- GCC_VERSION = 4.0;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
INSTALL_PATH = "$(HOME)/bin";
- PREBINDING = NO;
PRODUCT_NAME = "gen-input";
ZERO_LINK = YES;
};
@@ -304,12 +303,10 @@
isa = XCBuildConfiguration;
buildSettings = {
COPY_PHASE_STRIP = YES;
- GCC_ENABLE_FIX_AND_CONTINUE = NO;
GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
GCC_MODEL_TUNING = G5;
- GCC_VERSION = 4.0;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
INSTALL_PATH = "$(HOME)/bin";
- PREBINDING = NO;
PRODUCT_NAME = "gen-input";
ZERO_LINK = NO;
};
@@ -318,13 +315,10 @@
6DA3F3E80DE5D36B0039CADE /* Release64 */ = {
isa = XCBuildConfiguration;
buildSettings = {
- ARCHS = "$(ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1)";
- ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1 = x86_64;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
+ ARCHS = "$(ARCHS_STANDARD_64_BIT)";
GCC_MODEL_TUNING = G5;
- GCC_VERSION = 4.0;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
INSTALL_PATH = "$(HOME)/bin";
- PREBINDING = NO;
PRODUCT_NAME = "gen-input";
ZERO_LINK = YES;
};
@@ -333,18 +327,16 @@
A1F593C60B8F0E6E00073279 /* Debug64 */ = {
isa = XCBuildConfiguration;
buildSettings = {
- ARCHS = "$(ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1)";
- ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1 = x86_64;
+ ARCHS = "$(ARCHS_STANDARD_64_BIT)";
COPY_PHASE_STRIP = NO;
GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
GCC_OPTIMIZATION_LEVEL = 0;
- GCC_VERSION = 4.0;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
HEADER_SEARCH_PATHS = ../../../../include;
INSTALL_PATH = "$(HOME)/bin";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
- "../../../../lib",
+ ../../../../lib,
);
PRODUCT_NAME = square;
ZERO_LINK = NO;
@@ -354,15 +346,14 @@
A1F593C70B8F0E6E00073279 /* Release64 */ = {
isa = XCBuildConfiguration;
buildSettings = {
- ARCHS = "$(ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1)";
- ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1 = x86_64;
+ ARCHS = "$(ARCHS_STANDARD_64_BIT)";
GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
- GCC_VERSION = 4.0;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
HEADER_SEARCH_PATHS = ../../../../include;
INSTALL_PATH = "$(HOME)/bin";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
- "../../../../lib",
+ ../../../../lib,
);
PRODUCT_NAME = square;
ZERO_LINK = NO;
@@ -384,7 +375,6 @@
"-m64",
);
OTHER_LDFLAGS = "-m64";
- PREBINDING = NO;
PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
SYMROOT = "/tmp/tbb-$(USER)";
};
@@ -405,7 +395,6 @@
"-m64",
);
OTHER_LDFLAGS = "-m64";
- PREBINDING = NO;
PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
SYMROOT = "/tmp/tbb-$(USER)";
};
diff --git a/examples/task/index.html b/examples/task/index.html
index 6e10299..3acdd99 100644
--- a/examples/task/index.html
+++ b/examples/task/index.html
@@ -14,10 +14,9 @@ This directory has examples of how to use the raw task scheduler.
<A HREF="../index.html">Up to parent directory</A>
<p></p>
Copyright © 2005-2011 Intel Corporation. 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>
+Intel is a registered trademark or trademark 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.
</BODY>
diff --git a/examples/task/tree_sum/Makefile b/examples/task/tree_sum/Makefile
index 5ad6b80..18fcb50 100644
--- a/examples/task/tree_sum/Makefile
+++ b/examples/task/tree_sum/Makefile
@@ -27,12 +27,17 @@
# GNU Makefile that builds and runs example.
PROG=tree_sum
ARGS=
+PERF_RUN_ARGS=auto 100000000 silent
# The C++ compiler
ifneq (,$(shell which icc 2>/dev/null))
CXX=icc
endif # icc
+ifeq ($(shell uname), Linux)
+LIBS+= -lrt
+endif
+
all: release test
release: *.cpp
@@ -46,4 +51,9 @@ clean:
test:
./$(PROG) $(ARGS)
- ./$(PROG) -stdmalloc $(ARGS)
+ ./$(PROG) stdmalloc $(ARGS)
+
+perf_build: release
+
+perf_run:
+ ./$(PROG) $(PERF_RUN_ARGS)
diff --git a/examples/task/tree_sum/Makefile.windows b/examples/task/tree_sum/Makefile.windows
index fd3b482..f9f97be 100644
--- a/examples/task/tree_sum/Makefile.windows
+++ b/examples/task/tree_sum/Makefile.windows
@@ -29,6 +29,7 @@
# Just specify your program basename
PROG=Tree_sum
ARGS=
+PERF_RUN_ARGS=auto 100000000 silent
# Trying to find if icl.exe is set
CXX1 = $(TBB_CXX)-
@@ -48,7 +49,12 @@ clean:
@cmd.exe /C del $(PROG).exe *.obj *.?db *.manifest
test:
$(PROG) $(ARGS)
- $(PROG) -stdmalloc $(ARGS)
+ $(PROG) stdmalloc $(ARGS)
+perf_build: release
+
+perf_run:
+ $(PROG) $(PERF_RUN_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
diff --git a/examples/task/tree_sum/main.cpp b/examples/task/tree_sum/TreeMaker.h
similarity index 60%
copy from examples/task/tree_sum/main.cpp
copy to examples/task/tree_sum/TreeMaker.h
index ac9b06a..64fc448 100644
--- a/examples/task/tree_sum/main.cpp
+++ b/examples/task/tree_sum/TreeMaker.h
@@ -26,28 +26,11 @@
the GNU General Public License.
*/
-#include "common.h"
+#ifndef TREE_MAKER_H_
+#define TREE_MAKER_H_
+
#include "tbb/tick_count.h"
#include "tbb/task.h"
-#include "tbb/task_scheduler_init.h"
-#include <cstdlib>
-#include <cstdio>
-#include <cstring>
-
-// The performance of this example can be significantly better when
-// the objects are allocated by the scalable_allocator instead of the
-// default "operator new". The reason is that the scalable_allocator
-// typically packs small objects more tightly than the default "operator new",
-// resulting in a smaller memory footprint, and thus more efficient use of
-// cache and virtual memory. Also the scalable_allocator works faster for
-// multi-threaded allocations.
-//
-// Pass -stdmalloc as the 1st command line parameter to use the default "operator new"
-// and see the performance difference.
-
-#include "tbb/scalable_allocator.h"
-
-using namespace std;
static double Pi = 3.14159265358979;
@@ -117,7 +100,7 @@ public:
return root_node;
}
- static TreeNode* create_and_time( long number_of_nodes ) {
+ static TreeNode* create_and_time( long number_of_nodes, bool silent=false ) {
tbb::tick_count t0, t1;
TreeNode* root = allocate_node();
root->node_count = number_of_nodes;
@@ -127,67 +110,15 @@ public:
t0 = tbb::tick_count::now();
root->left = do_in_one_thread( number_of_nodes/2 );
t1 = tbb::tick_count::now();
- printf ("%24s: time = %.1f msec\n", "half created serially", (t1-t0).seconds()*1000);
+ if ( !silent ) printf ("%24s: time = %.1f msec\n", "half created serially", (t1-t0).seconds()*1000);
t0 = tbb::tick_count::now();
root->right = do_in_parallel( number_of_nodes - number_of_nodes/2 );
t1 = tbb::tick_count::now();
- printf ("%24s: time = %.1f msec\n", "half done in parallel", (t1-t0).seconds()*1000);
+ if ( !silent ) printf ("%24s: time = %.1f msec\n", "half done in parallel", (t1-t0).seconds()*1000);
return root;
}
};
-int main( int argc, char *argv[] ) {
- // Parse command line parameters
- // The format is: <exe_name> [-stdmalloc] [num_of_nodes [num_of_threads]]
- bool use_tbbmalloc = true;
- int arg_idx = 1;
- if( argc>1 && strcmp(argv[1], "-stdmalloc")==0 ) {
- use_tbbmalloc = false;
- arg_idx = 2;
- }
- long number_of_nodes = argc>arg_idx ? strtol(argv[arg_idx],0,0) : 10000000;
- ++arg_idx;
- int nthread = argc>arg_idx ? strtol(argv[arg_idx],0,0) : tbb::task_scheduler_init::automatic;
-
- // Start up scheduler
- // For production, no argument should be provided to the constructor, so that
- // the application gets the number of threads that are physically available.
- tbb::task_scheduler_init init(nthread);
-
- TreeNode* root;
- if( use_tbbmalloc ) {
- printf("Tree creation using TBB scalable allocator\n");
- root = TreeMaker<tbbmalloc>::create_and_time( number_of_nodes );
- } else {
- printf("Tree creation using standard operator new\n");
- root = TreeMaker<stdmalloc>::create_and_time( number_of_nodes );
- }
-
- // Warm up caches
- SerialSumTree(root);
- printf("Calculations:\n");
- const char* which;
- for( int i=0; i<3; ++i ) {
- tbb::tick_count t0 = tbb::tick_count::now();
- Value result;
- switch( i ) {
- case 0:
- which = "SerialSumTree";
- result = SerialSumTree(root);
- break;
- case 1:
- which = "SimpleParallelSumTree";
- result = SimpleParallelSumTree(root);
- break;
- case 2:
- which = "OptimizedParallelSumTree";
- result = OptimizedParallelSumTree(root);
- break;
- }
- tbb::tick_count t1 = tbb::tick_count::now();
- printf ("%24s: time = %.1f msec, sum=%g\n", which, (t1-t0).seconds()*1000, result);
- }
- return 0;
-}
+#endif // TREE_MAKER_H_
diff --git a/examples/task/tree_sum/index.html b/examples/task/tree_sum/index.html
index 52eb389..0c7d5ff 100644
--- a/examples/task/tree_sum/index.html
+++ b/examples/task/tree_sum/index.html
@@ -24,11 +24,11 @@ In addition, the scalable_allocator performs better for multi-threaded allocatio
<DD>Sums in parallel without any fancy tricks.
<DT><A HREF="OptimizedParallelSumTree.cpp">OptimizedParallelSumTree.cpp</A><DT>
<DD>Sums in parallel, using "recycling" and "continuation-passing" tricks.
- In this case, it is only slightly faster than the simple version.
+ In this case, it is only slightly faster than the simple version.
<DT><A HREF="common.h">common.h</A>
<DD>Shared declarations.
<DT><A HREF="main.cpp">main.cpp</A>
-<DD>Driver.
+<DD>Main program which parses command line options and runs the algorithm.
<DT><A HREF="Makefile">Makefile</A>
<DD>Makefile for building example.
</DL>
@@ -47,27 +47,28 @@ General build directions can be found <A HREF=../../index.html#build>here</A>.
<H2>Usage</H2>
<DL>
-<DT><TT>tree_sum [-stdmalloc] <I>S</I> <I>N</I></TT>
-<DD><I>S</I> is the problem size (the number of nodes in the tree).
- <I>N</I> is the number of threads to be used.
- <BR>
- Passing "-stdmalloc" as the 1st parameter causes the default "operator new"
- to be used for memory allocations instead of the TBB scalable_allocator.
+<DT><TT>tree_sum <I>-h</I></TT>
+<DD>Prints the help for command line options
+<DT><TT>tree_sum [<I>n-of-threads</I>=value] [<I>number-of-nodes</I>=value] [<I>silent</I>] [<I>stdmalloc</I>]</TT>
+<DT><TT>tree_sum [<I>n-of-threads</I> [<I>number-of-nodes</I>]] [<I>silent</I>] [<I>stdmalloc</I>]</TT>
+<DD><I>n-of-threads</I> is the number of threads to use; a range of the form <I>low</I>[:<I>high</I>], where low and optional high are non-negative integers or 'auto' for the TBB default.<BR>
+ <I>number-of-nodes</I> is the number of nodes in the tree.<BR>
+ <I>silent</I> - no output except elapsed time.<BR>
+ <I>stdmalloc</I> - causes the default "operator new" to be used for memory allocations instead of the TBB scalable_allocator.<BR>
-<DT>To run a short version of this example, e.g., for use with Intel® Threading Tools:
+<DT>To run a short version of this example, e.g., for use with Intel® Parallel Inspector:
<DD>Build a <I>debug</I> version of the example
(see the <A HREF=../../index.html#build>build directions</A>).
- <BR>Run it with a small problem size and the desired number of threads, e.g., <TT>tree_sum 100000 4</TT>.
+ <BR>Run it with a small problem size and the desired number of threads, e.g., <TT>tree_sum 4 100000</TT>.
</DL>
<HR>
<A HREF="../index.html">Up to parent directory</A>
<p></p>
Copyright © 2005-2011 Intel Corporation. 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>
+Intel is a registered trademark or trademark 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.
</BODY>
diff --git a/examples/task/tree_sum/main.cpp b/examples/task/tree_sum/main.cpp
index ac9b06a..f7c4d5d 100644
--- a/examples/task/tree_sum/main.cpp
+++ b/examples/task/tree_sum/main.cpp
@@ -27,9 +27,7 @@
*/
#include "common.h"
-#include "tbb/tick_count.h"
-#include "tbb/task.h"
-#include "tbb/task_scheduler_init.h"
+
#include <cstdlib>
#include <cstdio>
#include <cstring>
@@ -42,152 +40,77 @@
// cache and virtual memory. Also the scalable_allocator works faster for
// multi-threaded allocations.
//
-// Pass -stdmalloc as the 1st command line parameter to use the default "operator new"
+// Pass stdmalloc as the 1st command line parameter to use the default "operator new"
// and see the performance difference.
-
#include "tbb/scalable_allocator.h"
+#include "TreeMaker.h"
+#include "tbb/tick_count.h"
+#include "tbb/task_scheduler_init.h"
-using namespace std;
-
-static double Pi = 3.14159265358979;
-
-const bool tbbmalloc = true;
-const bool stdmalloc = false;
-
-template<bool use_tbbmalloc>
-class TreeMaker {
-
- class SubTreeCreationTask: public tbb::task {
- TreeNode*& my_root;
- bool is_continuation;
- typedef TreeMaker<use_tbbmalloc> MyTreeMaker;
-
- public:
- SubTreeCreationTask( TreeNode*& root, long number_of_nodes ) : my_root(root), is_continuation(false) {
- my_root = MyTreeMaker::allocate_node();
- my_root->node_count = number_of_nodes;
- my_root->value = Value(Pi*number_of_nodes);
- }
+#include "../../common/utility/utility.h"
- tbb::task* execute() {
- tbb::task* next = NULL;
- if( !is_continuation ) {
- long subtree_size = my_root->node_count - 1;
- if( subtree_size<1000 ) { /* grainsize */
- my_root->left = MyTreeMaker::do_in_one_thread(subtree_size/2);
- my_root->right = MyTreeMaker::do_in_one_thread(subtree_size - subtree_size/2);
- } else {
- // Create tasks before spawning any of them.
- tbb::task* a = new( allocate_child() ) SubTreeCreationTask(my_root->left,subtree_size/2);
- tbb::task* b = new( allocate_child() ) SubTreeCreationTask(my_root->right,subtree_size - subtree_size/2);
- recycle_as_continuation();
- is_continuation = true;
- set_ref_count(2);
- spawn(*b);
- next = a;
- }
- }
- return next;
- }
- };
+using namespace std;
-public:
- static TreeNode* allocate_node() {
- return use_tbbmalloc? tbb::scalable_allocator<TreeNode>().allocate(1) : new TreeNode;
- }
+void Run( const char* which, Value(*SumTree)(TreeNode*), TreeNode* root, bool silent) {
+ tbb::tick_count t0;
+ if ( !silent ) t0 = tbb::tick_count::now();
+ Value result = SumTree(root);
+ if ( !silent ) printf ("%24s: time = %.1f msec, sum=%g\n", which, (tbb::tick_count::now()-t0).seconds()*1000, result);
+}
- static TreeNode* do_in_one_thread( long number_of_nodes ) {
- if( number_of_nodes==0 ) {
- return NULL;
- } else {
- TreeNode* n = allocate_node();
- n->node_count = number_of_nodes;
- n->value = Value(Pi*number_of_nodes);
- --number_of_nodes;
- n->left = do_in_one_thread( number_of_nodes/2 );
- n->right = do_in_one_thread( number_of_nodes - number_of_nodes/2 );
- return n;
+int main( int argc, const char *argv[] ) {
+ try{
+ tbb::tick_count mainStartTime = tbb::tick_count::now();
+
+ // The 1st argument is the function to obtain 'auto' value; the 2nd is the default value
+ // The example interprets 0 threads as "run serially, then fully subscribed"
+ utility::thread_number_range threads( tbb::task_scheduler_init::default_num_threads, 0 );
+ long number_of_nodes = 10000000;
+ bool silent = false;
+ bool use_stdmalloc = false;
+
+ 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")
+ .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")
+ );
+
+ TreeNode* root;
+ { // In this scope, TBB will use default number of threads for tree creation
+ tbb::task_scheduler_init init;
+
+ if( use_stdmalloc ) {
+ if ( !silent ) printf("Tree creation using standard operator new\n");
+ root = TreeMaker<stdmalloc>::create_and_time( number_of_nodes, silent );
+ } else {
+ if ( !silent ) printf("Tree creation using TBB scalable allocator\n");
+ root = TreeMaker<tbbmalloc>::create_and_time( number_of_nodes, silent );
+ }
}
- }
-
- static TreeNode* do_in_parallel( long number_of_nodes ) {
- TreeNode* root_node;
- SubTreeCreationTask& a = *new(tbb::task::allocate_root()) SubTreeCreationTask(root_node, number_of_nodes);
- tbb::task::spawn_root_and_wait(a);
- return root_node;
- }
-
- static TreeNode* create_and_time( long number_of_nodes ) {
- tbb::tick_count t0, t1;
- TreeNode* root = allocate_node();
- root->node_count = number_of_nodes;
- root->value = Value(Pi*number_of_nodes);
- --number_of_nodes;
-
- t0 = tbb::tick_count::now();
- root->left = do_in_one_thread( number_of_nodes/2 );
- t1 = tbb::tick_count::now();
- printf ("%24s: time = %.1f msec\n", "half created serially", (t1-t0).seconds()*1000);
-
- t0 = tbb::tick_count::now();
- root->right = do_in_parallel( number_of_nodes - number_of_nodes/2 );
- t1 = tbb::tick_count::now();
- printf ("%24s: time = %.1f msec\n", "half done in parallel", (t1-t0).seconds()*1000);
-
- return root;
- }
-};
-
-int main( int argc, char *argv[] ) {
- // Parse command line parameters
- // The format is: <exe_name> [-stdmalloc] [num_of_nodes [num_of_threads]]
- bool use_tbbmalloc = true;
- int arg_idx = 1;
- if( argc>1 && strcmp(argv[1], "-stdmalloc")==0 ) {
- use_tbbmalloc = false;
- arg_idx = 2;
- }
- long number_of_nodes = argc>arg_idx ? strtol(argv[arg_idx],0,0) : 10000000;
- ++arg_idx;
- int nthread = argc>arg_idx ? strtol(argv[arg_idx],0,0) : tbb::task_scheduler_init::automatic;
-
- // Start up scheduler
- // For production, no argument should be provided to the constructor, so that
- // the application gets the number of threads that are physically available.
- tbb::task_scheduler_init init(nthread);
-
- TreeNode* root;
- if( use_tbbmalloc ) {
- printf("Tree creation using TBB scalable allocator\n");
- root = TreeMaker<tbbmalloc>::create_and_time( number_of_nodes );
- } else {
- printf("Tree creation using standard operator new\n");
- root = TreeMaker<stdmalloc>::create_and_time( number_of_nodes );
- }
- // Warm up caches
- SerialSumTree(root);
- printf("Calculations:\n");
- const char* which;
- for( int i=0; i<3; ++i ) {
- tbb::tick_count t0 = tbb::tick_count::now();
- Value result;
- switch( i ) {
- case 0:
- which = "SerialSumTree";
- result = SerialSumTree(root);
- break;
- case 1:
- which = "SimpleParallelSumTree";
- result = SimpleParallelSumTree(root);
- break;
- case 2:
- which = "OptimizedParallelSumTree";
- result = OptimizedParallelSumTree(root);
- break;
+ // Warm up caches
+ SerialSumTree(root);
+ if ( !silent ) printf("Calculations:\n");
+ if ( threads.first ) {
+ for(int p = threads.first; p <= threads.last; ++p ) {
+ if ( !silent ) printf("threads = %d\n", p );
+ tbb::task_scheduler_init init( p );
+ Run ( "SimpleParallelSumTree", SimpleParallelSumTree, root, silent );
+ Run ( "OptimizedParallelSumTree", OptimizedParallelSumTree, root, silent );
+ }
+ } else { // Number of threads wasn't set explicitly. Run serial and two parallel versions
+ Run ( "SerialSumTree", SerialSumTree, root, silent );
+ tbb::task_scheduler_init init;
+ Run ( "SimpleParallelSumTree", SimpleParallelSumTree, root, silent );
+ Run ( "OptimizedParallelSumTree", OptimizedParallelSumTree, root, silent );
}
- tbb::tick_count t1 = tbb::tick_count::now();
- printf ("%24s: time = %.1f msec, sum=%g\n", which, (t1-t0).seconds()*1000, result);
+ utility::report_elapsed_time((tbb::tick_count::now() - mainStartTime).seconds());
+ return 0;
+ }catch(std::exception& e){
+ std::cerr<<"error occurred. error text is :\"" <<e.what()<<"\"\n";
+ return 1;
}
- return 0;
}
diff --git a/examples/task/tree_sum/msvs/tree_sum.vcproj b/examples/task/tree_sum/msvs/tree_sum.vcproj
index 4f85ec3..ffe61c6 100644
--- a/examples/task/tree_sum/msvs/tree_sum.vcproj
+++ b/examples/task/tree_sum/msvs/tree_sum.vcproj
@@ -43,7 +43,7 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
RuntimeLibrary="3"
UsePrecompiledHeader="0"
@@ -63,7 +63,7 @@
Name="VCLinkerTool"
AdditionalDependencies="tbb_debug.lib tbbmalloc_debug.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+ 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"
@@ -93,7 +93,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 debug "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 debug "$(OutDir)""
/>
</Configuration>
<Configuration
@@ -122,7 +122,7 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
RuntimeLibrary="3"
UsePrecompiledHeader="0"
@@ -141,7 +141,7 @@
Name="VCLinkerTool"
AdditionalDependencies="tbb_debug.lib tbbmalloc_debug.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+ 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"
@@ -171,7 +171,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 debug "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 debug "$(OutDir)""
/>
</Configuration>
<Configuration
@@ -198,7 +198,7 @@
/>
<Tool
Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
RuntimeLibrary="2"
UsePrecompiledHeader="0"
@@ -218,7 +218,7 @@
Name="VCLinkerTool"
AdditionalDependencies="tbb.lib tbbmalloc.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+ 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"
@@ -250,7 +250,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 release "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 release "$(OutDir)""
/>
</Configuration>
<Configuration
@@ -278,7 +278,7 @@
/>
<Tool
Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="WIN64;NDEBUG;_CONSOLE"
RuntimeLibrary="2"
UsePrecompiledHeader="0"
@@ -297,7 +297,7 @@
Name="VCLinkerTool"
AdditionalDependencies="tbb.lib tbbmalloc.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+ 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"
@@ -329,7 +329,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 release "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 release "$(OutDir)""
/>
</Configuration>
</Configurations>
@@ -361,6 +361,10 @@
RelativePath="..\SimpleParallelSumTree.cpp"
>
</File>
+ <File
+ RelativePath="..\TreeMaker.h"
+ >
+ </File>
</Filter>
<File
RelativePath="..\index.html"
diff --git a/examples/task/tree_sum/xcode/tree_sum.xcodeproj/project.pbxproj b/examples/task/tree_sum/xcode/tree_sum.xcodeproj/project.pbxproj
index e2600b9..02843a4 100644
--- a/examples/task/tree_sum/xcode/tree_sum.xcodeproj/project.pbxproj
+++ b/examples/task/tree_sum/xcode/tree_sum.xcodeproj/project.pbxproj
@@ -3,7 +3,7 @@
archiveVersion = 1;
classes = {
};
- objectVersion = 42;
+ objectVersion = 46;
objects = {
/* Begin PBXBuildFile section */
@@ -120,9 +120,16 @@
/* Begin PBXProject section */
08FB7793FE84155DC02AAC07 /* Project object */ = {
isa = PBXProject;
+ attributes = {
+ LastUpgradeCheck = 0410;
+ };
buildConfigurationList = 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "tree_sum" */;
- compatibilityVersion = "Xcode 2.4";
+ compatibilityVersion = "Xcode 3.2";
+ developmentRegion = English;
hasScannedForEncodings = 1;
+ knownRegions = (
+ en,
+ );
mainGroup = 08FB7794FE84155DC02AAC07 /* tree_sum */;
projectDirPath = "";
projectRoot = "";
@@ -152,14 +159,13 @@
buildSettings = {
COPY_PHASE_STRIP = NO;
GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
GCC_OPTIMIZATION_LEVEL = 0;
- GCC_VERSION = 4.0;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
HEADER_SEARCH_PATHS = ../../../../include;
INSTALL_PATH = "$(HOME)/bin";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
- "../../../../lib",
+ ../../../../lib,
);
PRODUCT_NAME = tree_sum;
ZERO_LINK = NO;
@@ -170,12 +176,12 @@
isa = XCBuildConfiguration;
buildSettings = {
GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
- GCC_VERSION = 4.0;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
HEADER_SEARCH_PATHS = ../../../../include;
INSTALL_PATH = "$(HOME)/bin";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
- "../../../../lib",
+ ../../../../lib,
);
PRODUCT_NAME = tree_sum;
ZERO_LINK = NO;
@@ -192,7 +198,6 @@
GCC_VERSION = 4.0;
GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
- PREBINDING = NO;
PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
SYMROOT = "/tmp/tbb-$(USER)";
};
@@ -208,7 +213,6 @@
GCC_VERSION = 4.0;
GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
- PREBINDING = NO;
PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
SYMROOT = "/tmp/tbb-$(USER)";
};
@@ -217,18 +221,16 @@
A1F593C60B8F0E6E00073279 /* Debug64 */ = {
isa = XCBuildConfiguration;
buildSettings = {
- ARCHS = "$(ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1)";
- ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1 = x86_64;
+ ARCHS = "$(ARCHS_STANDARD_64_BIT)";
COPY_PHASE_STRIP = NO;
GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
GCC_OPTIMIZATION_LEVEL = 0;
- GCC_VERSION = 4.0;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
HEADER_SEARCH_PATHS = ../../../../include;
INSTALL_PATH = "$(HOME)/bin";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
- "../../../../lib",
+ ../../../../lib,
);
PRODUCT_NAME = tree_sum;
ZERO_LINK = NO;
@@ -238,15 +240,14 @@
A1F593C70B8F0E6E00073279 /* Release64 */ = {
isa = XCBuildConfiguration;
buildSettings = {
- ARCHS = "$(ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1)";
- ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1 = x86_64;
+ ARCHS = "$(ARCHS_STANDARD_64_BIT)";
GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
- GCC_VERSION = 4.0;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
HEADER_SEARCH_PATHS = ../../../../include;
INSTALL_PATH = "$(HOME)/bin";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
- "../../../../lib",
+ ../../../../lib,
);
PRODUCT_NAME = tree_sum;
ZERO_LINK = NO;
@@ -268,7 +269,6 @@
"-m64",
);
OTHER_LDFLAGS = "-m64";
- PREBINDING = NO;
PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
SYMROOT = "/tmp/tbb-$(USER)";
};
@@ -289,7 +289,6 @@
"-m64",
);
OTHER_LDFLAGS = "-m64";
- PREBINDING = NO;
PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
SYMROOT = "/tmp/tbb-$(USER)";
};
diff --git a/examples/task_group/index.html b/examples/task_group/index.html
index 7656b53..7f3ec4e 100644
--- a/examples/task_group/index.html
+++ b/examples/task_group/index.html
@@ -14,10 +14,9 @@ This directory has examples of how to use task_groups.
<A HREF="../index.html">Up to parent directory</A>
<p></p>
Copyright © 2005-2011 Intel Corporation. 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>
+Intel is a registered trademark or trademark 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.
</BODY>
diff --git a/examples/task_group/sudoku/Makefile b/examples/task_group/sudoku/Makefile
index 180d19f..5c45df4 100644
--- a/examples/task_group/sudoku/Makefile
+++ b/examples/task_group/sudoku/Makefile
@@ -26,7 +26,8 @@
# GNU Makefile that builds and runs example.
PROG=sudoku
-ARGS=input1 4 0 -p
+ARGS=4 input1 verbose
+PERF_RUN_ARGS=auto input1 silent
# The C++ compiler
ifneq (,$(shell which icc 2>/dev/null))
@@ -36,6 +37,10 @@ ifeq ($(CXX),icc)
CXX0XFLAGS=-std=c++0x -D_TBB_CPP0X
endif # icc
+ifeq ($(shell uname), Linux)
+LIBS+= -lrt
+endif
+
all: release test
release: *.cpp
@@ -49,3 +54,9 @@ clean:
test:
./$(PROG) $(ARGS)
+
+perf_build: release
+
+perf_run:
+ ./$(PROG) $(PERF_RUN_ARGS)
+
diff --git a/examples/task_group/sudoku/Makefile.windows b/examples/task_group/sudoku/Makefile.windows
index 246377f..0a2d2c6 100644
--- a/examples/task_group/sudoku/Makefile.windows
+++ b/examples/task_group/sudoku/Makefile.windows
@@ -28,7 +28,8 @@
# Just specify your program basename
PROG=sudoku
-ARGS=input1 4 2 -p
+ARGS= 4 input1 verbose
+PERF_RUN_ARGS=auto input1 silent
# Trying to find if icl.exe is set
CXX1 = $(TBB_CXX)-
@@ -50,3 +51,8 @@ test:
$(PROG) $(ARGS)
compiler_check:
@$(CXX) >nul 2>&1 || echo "$(CXX) command not found. Check if CXX=$(CXX) is set properly"
+
+perf_build: release
+
+perf_run:
+ $(PROG) $(PERF_RUN_ARGS)
diff --git a/examples/task_group/sudoku/index.html b/examples/task_group/sudoku/index.html
index 4067e3c..4967344 100644
--- a/examples/task_group/sudoku/index.html
+++ b/examples/task_group/sudoku/index.html
@@ -43,26 +43,30 @@ General build directions can be found <A HREF=../../index.html#build>here</A>.
<H2>Usage</H2>
<DL>
-<DT><TT>sudoku [<I>N</I>]</TT>
-<DT><TT>sudoku <I>inputfile</I> <I>N</I> <I>S</I> [<I>-p</I>]</TT>
-<DD><I>N</I> is the number of threads to be used.
- <I>S</I> is the number of solutions to find: 1 finds the first, any other number will find all solutions.
- <I>-p</I> prints the first solution (optional argument)
-<DT>To run a short version of this example, e.g., for use with Intel® Threading Tools:
+<DT><TT>sudoku <I>-h</I></TT>
+<DD>Prints the help for command line options
+<DT><TT>sudoku [<I>n-of-threads</I>=value] [<I>filename</I>=value] [<I>verbose</I>] [<I>silent</I>] [<I>find-one</I>]</TT>
+<DT><TT>sudoku [n-of-threads [filename]] [<I>verbose</I>] [<I>silent</I>] [<I>find-one</I>]</TT>
+<DD><I>n-of-threads</I> is the number of threads to use; a range of the form <I>low</I>[:<I>high</I>], where low and optional high are non-negative integers or 'auto' for the TBB default.<BR>
+ <I>filename</I> is an input filename.<BR>
+ <I>verbose</I> - prints the first solution.<BR>
+ <I>silent</I> - no output except elapsed time.<BR>
+ <I>find-one</I> - stops after finding first solution.<BR>
+
+<DT>To run a short version of this example, e.g., for use with Intel® Parallel Inspector:
<DD>Build a <I>debug</I> version of the example
(see the <A HREF=../../index.html#build>build directions</A>).
- <BR>Run it with a small problem size and the desired number of threads, e.g., <TT>sudoku input2 4</TT>.
+ <BR>Run it with a small problem size and the desired number of threads, e.g., <TT>sudoku 4 input2</TT>.
</DL>
<HR>
<A HREF="../index.html">Up to parent directory</A>
<p></p>
Copyright © 2005-2011 Intel Corporation. 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>
+Intel is a registered trademark or trademark 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.
</BODY>
diff --git a/examples/task_group/sudoku/msvs/sudoku.vcproj b/examples/task_group/sudoku/msvs/sudoku.vcproj
index 9aa1f53..a84ca15 100644
--- a/examples/task_group/sudoku/msvs/sudoku.vcproj
+++ b/examples/task_group/sudoku/msvs/sudoku.vcproj
@@ -43,7 +43,7 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
RuntimeLibrary="3"
UsePrecompiledHeader="0"
@@ -63,7 +63,7 @@
Name="VCLinkerTool"
AdditionalDependencies="tbb_debug.lib tbbmalloc_debug.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+ 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"
@@ -93,7 +93,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 debug "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 debug "$(OutDir)""
/>
</Configuration>
<Configuration
@@ -122,7 +122,7 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
RuntimeLibrary="3"
UsePrecompiledHeader="0"
@@ -141,7 +141,7 @@
Name="VCLinkerTool"
AdditionalDependencies="tbb_debug.lib tbbmalloc_debug.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+ 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"
@@ -171,7 +171,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 debug "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 debug "$(OutDir)""
/>
</Configuration>
<Configuration
@@ -198,7 +198,7 @@
/>
<Tool
Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
RuntimeLibrary="2"
UsePrecompiledHeader="0"
@@ -218,7 +218,7 @@
Name="VCLinkerTool"
AdditionalDependencies="tbb.lib tbbmalloc.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+ 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"
@@ -250,7 +250,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 release "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 release "$(OutDir)""
/>
</Configuration>
<Configuration
@@ -278,7 +278,7 @@
/>
<Tool
Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="WIN64;NDEBUG;_CONSOLE"
RuntimeLibrary="2"
UsePrecompiledHeader="0"
@@ -297,7 +297,7 @@
Name="VCLinkerTool"
AdditionalDependencies="tbb.lib tbbmalloc.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+ 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"
@@ -329,7 +329,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 release "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 release "$(OutDir)""
/>
</Configuration>
</Configurations>
diff --git a/examples/task_group/sudoku/sudoku.cpp b/examples/task_group/sudoku/sudoku.cpp
index 4640c4e..5e71923 100644
--- a/examples/task_group/sudoku/sudoku.cpp
+++ b/examples/task_group/sudoku/sudoku.cpp
@@ -26,12 +26,15 @@
the GNU General Public License.
*/
+
#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"
+#include "../../common/utility/utility.h"
#pragma warning(disable: 4996)
@@ -44,17 +47,18 @@ using namespace tbb;
using namespace std;
atomic<unsigned> nSols;
-unsigned NThreads, NSolutions;
-bool Verbose=false;
+bool find_one = false;
+bool verbose = false;
unsigned short init_values[BOARD_SIZE] = {1,0,0,9,0,0,0,8,0,0,8,0,2,0,0,0,0,0,0,0,5,0,0,0,7,0,0,0,5,2,1,0,0,4,0,0,0,0,0,0,0,5,0,0,7,4,0,0,7,0,0,0,3,0,0,3,0,0,0,2,0,0,5,0,0,0,0,0,0,1,0,0,5,0,0,0,1,0,0,0,0};
task_group *g;
+double solve_time;
typedef struct {
unsigned short solved_element;
unsigned potential_set;
} board_element;
-void read_board(char *filename) {
+void read_board(const char *filename) {
FILE *fp;
int input;
fp = fopen(filename, "r");
@@ -211,9 +215,9 @@ public:
void partial_solve(board_element *b, unsigned first_potential_set) {
if (fixed_board(b)) {
- if (NSolutions == 1)
+ if ( find_one )
g->cancel();
- if (++nSols==1 && Verbose) {
+ if (++nSols==1 && verbose) {
print_board(b);
}
free(b);
@@ -246,50 +250,72 @@ void partial_solve(board_element *b, unsigned first_potential_set) {
}
}
-void ParseCommandLine(int argc, char *argv[]) {
- NThreads = 4;
- Verbose = true;
- NSolutions = 2;
- if (argc != 4 && argc != 5 && argc != 2 && argc != 1) {
- fprintf(stderr,
- "Usage: sudoku [<nthreads>]\n"
- " sudoku <inputfilename> <nthreads> <nSolutions> [-p]\n"
- " where: nSolutions=1 stops after finding first solution\n"
- " and any other value finds all solutions; \n"
- " -p prints the first solution.\n");
- exit(1);
- }
- if (argc == 2) {
- sscanf(argv[1], "%d", &NThreads);
- }
- else if (argc > 3) {
- sscanf(argv[2], "%d", &NThreads);
- sscanf(argv[3], "%d", &NSolutions);
- if (argc!=5) Verbose = false;
- read_board(argv[1]);
- }
-}
-
-int main(int argc, char *argv[]) {
- board_element *start_board;
- start_board = (board_element *)malloc(BOARD_SIZE*sizeof(board_element));
- NThreads = 1;
+unsigned solve(int p) {
+ task_scheduler_init init(p);
nSols = 0;
- ParseCommandLine(argc, argv);
+ board_element *start_board = (board_element *)malloc(BOARD_SIZE*sizeof(board_element));
init_board(start_board, init_values);
- task_scheduler_init init(NThreads);
g = new task_group;
tick_count t0 = tick_count::now();
partial_solve(start_board, 0);
g->wait();
- tick_count t1 = tick_count::now();
+ solve_time = (tick_count::now() - t0).seconds();
delete g;
+ return nSols;
+}
- if (NSolutions == 1) {
- printf("Sudoku: Time to find first solution on %d threads: %6.6f seconds.\n", NThreads, (t1 - t0).seconds());
+
+int get_default_num_threads() {
+ static int threads = 0;
+ if ( threads == 0 )
+ threads = tbb::task_scheduler_init::default_num_threads();
+ return threads;
+}
+
+int main(int argc, char *argv[]) {
+ try {
+ tbb::tick_count mainStartTime = tbb::tick_count::now();
+
+ utility::thread_number_range threads(get_default_num_threads);
+ string filename = "";
+ bool silent = false;
+
+ 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.")
+ .positional_arg(filename,"filename","input filename")
+
+ .arg(verbose,"verbose","prints the first solution")
+ .arg(silent,"silent","no output except elapsed time")
+ .arg(find_one,"find-one","stops after finding first solution\n")
+ );
+
+ if ( silent ) verbose = false;
+
+ 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 ) {
+ unsigned number;
+ number = solve(p);
+
+ if ( !silent ) {
+ if ( find_one ) {
+ printf("Sudoku: Time to find first solution on %d threads: %6.6f seconds.\n", p, solve_time);
+ }
+ else {
+ printf("Sudoku: Time to find all %u solutions on %d threads: %6.6f seconds.\n", number, p, solve_time);
+ }
+ }
+ }
+
+ utility::report_elapsed_time((tbb::tick_count::now() - mainStartTime).seconds());
+
+ return 0;
+ } catch(std::exception& e) {
+ std::cerr<<"error occurred. error text is :\"" <<e.what()<<"\"\n";
+ return 1;
}
- else {
- printf("Sudoku: Time to find all %d solutions on %d threads: %6.6f seconds.\n", (int)nSols, NThreads, (t1 - t0).seconds());
- }
};
diff --git a/examples/task_group/sudoku/xcode/sudoku.xcodeproj/project.pbxproj b/examples/task_group/sudoku/xcode/sudoku.xcodeproj/project.pbxproj
index a333167..1139c62 100644
--- a/examples/task_group/sudoku/xcode/sudoku.xcodeproj/project.pbxproj
+++ b/examples/task_group/sudoku/xcode/sudoku.xcodeproj/project.pbxproj
@@ -3,7 +3,7 @@
archiveVersion = 1;
classes = {
};
- objectVersion = 42;
+ objectVersion = 46;
objects = {
/* Begin PBXBuildFile section */
@@ -103,9 +103,16 @@
/* Begin PBXProject section */
08FB7793FE84155DC02AAC07 /* Project object */ = {
isa = PBXProject;
- buildConfigurationList = 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "Sudoku" */;
- compatibilityVersion = "Xcode 2.4";
+ attributes = {
+ LastUpgradeCheck = 0410;
+ };
+ buildConfigurationList = 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "sudoku" */;
+ compatibilityVersion = "Xcode 3.2";
+ developmentRegion = English;
hasScannedForEncodings = 1;
+ knownRegions = (
+ en,
+ );
mainGroup = 08FB7794FE84155DC02AAC07 /* Sudoku */;
projectDirPath = "";
projectRoot = "";
@@ -132,14 +139,13 @@
buildSettings = {
COPY_PHASE_STRIP = NO;
GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
GCC_OPTIMIZATION_LEVEL = 0;
- GCC_VERSION = 4.0;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
HEADER_SEARCH_PATHS = ../../../../include;
INSTALL_PATH = "$(HOME)/bin";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
- "../../../../lib",
+ ../../../../lib,
);
PRODUCT_NAME = Sudoku;
ZERO_LINK = NO;
@@ -150,12 +156,12 @@
isa = XCBuildConfiguration;
buildSettings = {
GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
- GCC_VERSION = 4.0;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
HEADER_SEARCH_PATHS = ../../../../include;
INSTALL_PATH = "$(HOME)/bin";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
- "../../../../lib",
+ ../../../../lib,
);
PRODUCT_NAME = Sudoku;
ZERO_LINK = NO;
@@ -172,7 +178,6 @@
GCC_VERSION = 4.0;
GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
- PREBINDING = NO;
PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
SYMROOT = "/tmp/tbb-$(USER)";
};
@@ -188,7 +193,6 @@
GCC_VERSION = 4.0;
GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
- PREBINDING = NO;
PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
SYMROOT = "/tmp/tbb-$(USER)";
};
@@ -197,18 +201,16 @@
A1F593C60B8F0E6E00073279 /* Debug64 */ = {
isa = XCBuildConfiguration;
buildSettings = {
- ARCHS = "$(ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1)";
- ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1 = x86_64;
+ ARCHS = "$(ARCHS_STANDARD_64_BIT)";
COPY_PHASE_STRIP = NO;
GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
GCC_OPTIMIZATION_LEVEL = 0;
- GCC_VERSION = 4.0;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
HEADER_SEARCH_PATHS = ../../../../include;
INSTALL_PATH = "$(HOME)/bin";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
- "../../../../lib",
+ ../../../../lib,
);
PRODUCT_NAME = Sudoku;
ZERO_LINK = NO;
@@ -218,15 +220,14 @@
A1F593C70B8F0E6E00073279 /* Release64 */ = {
isa = XCBuildConfiguration;
buildSettings = {
- ARCHS = "$(ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1)";
- ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1 = x86_64;
+ ARCHS = "$(ARCHS_STANDARD_64_BIT)";
GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
- GCC_VERSION = 4.0;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
HEADER_SEARCH_PATHS = ../../../../include;
INSTALL_PATH = "$(HOME)/bin";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
- "../../../../lib",
+ ../../../../lib,
);
PRODUCT_NAME = Sudoku;
ZERO_LINK = NO;
@@ -248,7 +249,6 @@
"-m64",
);
OTHER_LDFLAGS = "-m64";
- PREBINDING = NO;
PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
SYMROOT = "/tmp/tbb-$(USER)";
};
@@ -269,7 +269,6 @@
"-m64",
);
OTHER_LDFLAGS = "-m64";
- PREBINDING = NO;
PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
SYMROOT = "/tmp/tbb-$(USER)";
};
@@ -289,7 +288,7 @@
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
- 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "Sudoku" */ = {
+ 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "sudoku" */ = {
isa = XCConfigurationList;
buildConfigurations = (
1DEB923608733DC60010E9CD /* Debug */,
diff --git a/examples/task_priority/fractal/Makefile b/examples/task_priority/fractal/Makefile
index 227ee71..a3fa126 100644
--- a/examples/task_priority/fractal/Makefile
+++ b/examples/task_priority/fractal/Makefile
@@ -28,17 +28,22 @@
NAME=Fractal
ARGS=auto
PERF_RUN_ARGS=auto 1 1000000 silent
+LIGHT_ARGS=auto 1 1000
# The C++ compiler
ifneq (,$(shell which icc 2>/dev/null))
CXX=icc
endif # icc
+ifeq ($(shell uname), Linux)
+LIBS+= -lrt
+endif
+
include ../../common/gui/Makefile.gmake
SOURCES= ../../common/gui/$(UI)video.cpp fractal.cpp main.cpp
-CXXFLAGS += -DTBB_PREVIEW_TASK_PRIORITY
+override CXXFLAGS += $(UI_CXXFLAGS)
all: release test
@@ -50,10 +55,10 @@ ifeq ($(UI),mac)
endif
release: $(SOURCES) resources
- $(CXX) -O2 -DNDEBUG $(CXXFLAGS) -o $(EXE) $(SOURCES) -ltbb_preview $(LIBS)
+ $(CXX) -O2 -DNDEBUG $(CXXFLAGS) -o $(EXE) $(SOURCES) -ltbb $(LIBS)
debug: resources
- $(CXX) -g -O0 -DTBB_USE_DEBUG $(CXXFLAGS) -o $(EXE) $(SOURCES) -ltbb_preview_debug $(LIBS)
+ $(CXX) -g -O0 -DTBB_USE_DEBUG $(CXXFLAGS) -o $(EXE) $(SOURCES) -ltbb_debug $(LIBS)
clean:
$(RM) $(EXE) *.o *.d
@@ -68,6 +73,14 @@ else
./$(EXE) $(ARGS)
endif
+light_test:
+ifeq ($(UI),mac)
+ export DYLD_LIBRARY_PATH="$(DYLD_LIBRARY_PATH):$(TBBLIBSPATH)"; ./$(EXE) $(LIGHT_ARGS)
+else
+ ./$(EXE) $(LIGHT_ARGS)
+endif
+
perf_build: release
perf_run:
+ ./$(EXE) $(PERF_RUN_ARGS)
diff --git a/examples/task_priority/fractal/Makefile.windows b/examples/task_priority/fractal/Makefile.windows
index 88764a7..335036a 100644
--- a/examples/task_priority/fractal/Makefile.windows
+++ b/examples/task_priority/fractal/Makefile.windows
@@ -30,6 +30,7 @@
PROG=Fractal
ARGS=auto
PERF_RUN_ARGS=auto 1 1000000 silent
+LIGHT_ARGS=auto 1 1000
# Trying to find if icl.exe is set
CXX1 = $(TBB_CXX)-
@@ -50,20 +51,20 @@ XARCH = $(ARCH2:-=x86)
MAKEINC = ../../common/gui/Makefile.win
SOURCES = fractal.cpp main.cpp
-CXXFLAGS += /DTBB_PREVIEW_TASK_PRIORITY
-
all: release test
release: compiler_check
- @$(MAKE) -f $(MAKEINC) UI=$(UI) CXX="$(CXX)" CXXFLAGS="$(CXXFLAGS)" LFLAGS="$(LDFLAGS) tbb_preview.lib $(LIBS)" XARCH=$(XARCH) RCNAME=gui SOURCE="$(SOURCES)" EXE=$(PROG).exe build_one
+ @$(MAKE) -f $(MAKEINC) UI=$(UI) CXX="$(CXX)" CXXFLAGS="$(CXXFLAGS)" LFLAGS="$(LDFLAGS) tbb.lib $(LIBS)" XARCH=$(XARCH) RCNAME=gui SOURCE="$(SOURCES)" EXE=$(PROG).exe build_one
debug: compiler_check
- @$(MAKE) -f $(MAKEINC) UI=$(UI) DEBUG=_debug CXX="$(CXX)" CXXFLAGS="$(CXXFLAGS) /D TBB_USE_DEBUG" LFLAGS="$(LDFLAGS) tbb_preview_debug.lib $(LIBS)" XARCH=$(XARCH) RCNAME=gui SOURCE="$(SOURCES)" EXE=$(PROG).exe build_one
+ @$(MAKE) -f $(MAKEINC) UI=$(UI) DEBUG=_debug CXX="$(CXX)" CXXFLAGS="$(CXXFLAGS) /D TBB_USE_DEBUG" LFLAGS="$(LDFLAGS) tbb_debug.lib $(LIBS)" XARCH=$(XARCH) RCNAME=gui SOURCE="$(SOURCES)" EXE=$(PROG).exe build_one
clean:
@cmd.exe /C del $(PROG).exe *.obj *.?db *.manifest msvs\gui.res
test:
$(PROG) $(ARGS)
+light_test:
+ $(PROG) $(LIGHT_ARGS)
perf_build: compiler_check
- @$(MAKE) -f $(MAKEINC) UI=con CXX="$(CXX)" CXXFLAGS="$(CXXFLAGS)" LFLAGS="$(LDFLAGS) tbb_preview.lib $(LIBS)" XARCH=$(XARCH) RCNAME=gui SOURCE="$(SOURCES) " EXE=$(PROG).exe build_one
+ @$(MAKE) -f $(MAKEINC) UI=con CXX="$(CXX)" CXXFLAGS="$(CXXFLAGS)" LFLAGS="$(LDFLAGS) tbb.lib $(LIBS)" XARCH=$(XARCH) RCNAME=gui SOURCE="$(SOURCES) " EXE=$(PROG).exe build_one
perf_run:
$(PROG) $(PERF_RUN_ARGS)
diff --git a/examples/task_priority/fractal/fractal.cpp b/examples/task_priority/fractal/fractal.cpp
index 36c0dd8..33a4a86 100644
--- a/examples/task_priority/fractal/fractal.cpp
+++ b/examples/task_priority/fractal/fractal.cpp
@@ -79,7 +79,7 @@ color_t fractal::calc_one_pixel(int x0, int y0) {
iter++;
}
- int b = 256*mu;
+ int b = (int)(256*mu);
int g = (b/8);
int r = (g/16);
@@ -193,6 +193,18 @@ void fractal_group::set_priorities() {
context[active^1].set_priority( tbb::priority_normal );
}
+void fractal_group::switch_priorities( int new_active ) {
+ if( new_active!=-1 ) active = new_active;
+ else active = 1-active; // assumes 'active' is only 0 or 1
+ set_priorities();
+ draw_borders();
+}
+
+void fractal_group::set_num_frames_at_least(int n) {
+ if ( num_frames[0]<n ) num_frames[0] = n;
+ if ( num_frames[1]<n ) num_frames[1] = n;
+}
+
void fractal_group::run( bool create_second_fractal ) {
// initialize task scheduler
tbb::task_scheduler_init init( num_threads );
@@ -243,23 +255,18 @@ fractal_group::fractal_group( const drawing_memory &_dm, int _num_threads, int _
}
void fractal_group::mouse_click(int x, int y) {
- // assumption that the point is not inside any fratal area
+ // assumption that the point is not inside any fractal area
int new_active = -1;
- // check if the point is inside the first fractal area
if ( f0.check_point( x, y ) ) {
+ // the point is inside the first fractal area
new_active = 0;
- } else {
- // check if the point is inside the second fractal area
- if ( f1.check_point( x, y ) ) {
- new_active = 1;
- }
+ } else if ( f1.check_point( x, y ) ) {
+ // the point is inside the second fractal area
+ new_active = 1;
}
if ( new_active != -1 && new_active != active ) {
- // change the priorities
- active = new_active;
- set_priorities();
- draw_borders();
+ switch_priorities( new_active );
}
}
diff --git a/examples/task_priority/fractal/fractal.h b/examples/task_priority/fractal/fractal.h
index e3ea789..de81875 100644
--- a/examples/task_priority/fractal/fractal.h
+++ b/examples/task_priority/fractal/fractal.h
@@ -33,6 +33,7 @@
#include "tbb/task.h"
#include "tbb/task_scheduler_init.h"
+#include "tbb/atomic.h"
//! Fractal class
class fractal {
@@ -62,7 +63,12 @@ class fractal {
public:
//! Constructor
- fractal( const drawing_memory &dm ) : dm(dm) {}
+ fractal( const drawing_memory &dm ) : dm(dm) {
+#if _MSC_VER && _WIN64 && !__INTEL_COMPILER
+ // Workaround for MSVC x64 compiler issue
+ volatile int i=0;
+#endif
+ }
//! Runs the fractal calculation
void run( tbb::task_group_context &context );
//! Renders the fractal rectangular area
@@ -76,7 +82,7 @@ class fractal_group {
//! Fractals defenition
fractal f0, f1;
//! Number of frames to calculate
- int num_frames[2];
+ tbb::atomic<int> num_frames[2];
//! Task group contexts to manage prioroties
tbb::task_group_context *context;
@@ -105,8 +111,12 @@ public:
void mouse_click(int x, int y);
//! Fractal calculation routine
void calc_fractal( int num );
- //! Get number of threads
+ //! Get number of threads
int get_num_threads() const { return num_threads; }
+ //! Reset the number of frames to be not less than the given value
+ void set_num_frames_at_least(int n);
+ //! Switches the priorities of two fractals
+ void switch_priorities( int new_active=-1 );
};
#endif /* FRACTAL_H_ */
diff --git a/examples/task_priority/fractal/fractal_video.h b/examples/task_priority/fractal/fractal_video.h
index 6608ba9..2815afb 100644
--- a/examples/task_priority/fractal/fractal_video.h
+++ b/examples/task_priority/fractal/fractal_video.h
@@ -43,6 +43,7 @@ private:
void on_mouse( int x, int y, int key ) {
if( key == 1 ) {
if ( fg ) {
+ fg->set_num_frames_at_least(20);
fg->mouse_click( x, y );
}
}
@@ -50,7 +51,12 @@ private:
void on_key( int key ) {
switch ( key&0xff ) {
- case 27: running = false;
+ case 27:
+ running = false; break;
+ case ' ': // space
+ if( fg ) fg->switch_priorities();
+ default:
+ if( fg ) fg->set_num_frames_at_least(20);
}
}
@@ -62,7 +68,7 @@ private:
public:
fractal_video() :fg(0) {
- title = "Fractal Example";
+ title = "Dynamic Priorities in TBB: Fractal Example";
v = this;
}
diff --git a/examples/task_priority/fractal/index.html b/examples/task_priority/fractal/index.html
index ed194c1..10bd955 100644
--- a/examples/task_priority/fractal/index.html
+++ b/examples/task_priority/fractal/index.html
@@ -55,10 +55,9 @@ General build directions can be found <A HREF=../../index.html#build>here</A>.
<A HREF="../index.html">Up to parent directory</A>
<p></p>
Copyright © 2005-2011 Intel Corporation. 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>
+Intel is a registered trademark or trademark 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.
</BODY>
diff --git a/examples/task_priority/fractal/msvs/fractal.icproj b/examples/task_priority/fractal/msvs/fractal.icproj
index 00085e0..37993ba 100644
--- a/examples/task_priority/fractal/msvs/fractal.icproj
+++ b/examples/task_priority/fractal/msvs/fractal.icproj
@@ -3,7 +3,7 @@
ProjectType="Intel C++ Project"
Version="11.1"
Name="fractal"
- ProjectGUID="{5C4ACAE3-8686-4046-A5FD-D0DC8755D263}"
+ ProjectGUID="{BF088DF5-BAEA-4EB2-8EA5-1E8DFBC75E5C}"
VCNestedProjectGUID="{3AA40693-F93D-4D4B-B32E-068F511A2527}"
VCNestedProjectFileName="fractal.vcproj">
<Configurations/>
diff --git a/examples/task_priority/fractal/msvs/fractal.vcproj b/examples/task_priority/fractal/msvs/fractal.vcproj
index ad51ac6..2c10b70 100644
--- a/examples/task_priority/fractal/msvs/fractal.vcproj
+++ b/examples/task_priority/fractal/msvs/fractal.vcproj
@@ -19,7 +19,7 @@
</ToolFiles>
<Configurations>
<Configuration
- Name="Debug|Win32"
+ Name="GDIDebug|Win32"
OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
ConfigurationType="1"
@@ -46,8 +46,8 @@
Optimization="0"
OmitFramePointers="true"
WholeProgramOptimization="true"
- AdditionalIncludeDirectories=""$(TBB30_INSTALL_DIR)\include""
- PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;TBB_USE_DEBUG;TBB_PREVIEW_TASK_PRIORITY"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;TBB_USE_DEBUG"
RuntimeLibrary="3"
EnableFunctionLevelLinking="true"
UsePrecompiledHeader="0"
@@ -65,9 +65,9 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="tbb_preview_debug.lib"
+ AdditionalDependencies="tbb_debug.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+ AdditionalLibraryDirectories="$(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc8;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc8"
GenerateDebugInformation="true"
SubSystem="2"
TargetMachine="1"
@@ -97,11 +97,11 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 debug "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 debug "$(OutDir)""
/>
</Configuration>
<Configuration
- Name="Debug|x64"
+ Name="GDIDebug|x64"
OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
ConfigurationType="1"
@@ -129,8 +129,8 @@
Optimization="0"
OmitFramePointers="true"
WholeProgramOptimization="true"
- AdditionalIncludeDirectories=""$(TBB30_INSTALL_DIR)\include""
- PreprocessorDefinitions="WIN64;_DEBUG;_WINDOWS;TBB_USE_DEBUG;TBB_PREVIEW_TASK_PRIORITY"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
+ PreprocessorDefinitions="WIN64;_DEBUG;_WINDOWS;TBB_USE_DEBUG"
RuntimeLibrary="3"
EnableFunctionLevelLinking="true"
UsePrecompiledHeader="0"
@@ -147,9 +147,9 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="tbb_preview_debug.lib"
+ AdditionalDependencies="tbb_debug.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+ AdditionalLibraryDirectories="$(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc8;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc8"
GenerateDebugInformation="true"
SubSystem="2"
TargetMachine="17"
@@ -179,11 +179,11 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 debug "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 debug "$(OutDir)""
/>
</Configuration>
<Configuration
- Name="Release|Win32"
+ Name="GDIRelease|Win32"
OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
ConfigurationType="1"
@@ -211,8 +211,8 @@
FavorSizeOrSpeed="1"
OmitFramePointers="true"
WholeProgramOptimization="true"
- AdditionalIncludeDirectories=""$(TBB30_INSTALL_DIR)\include""
- PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;TBB_PREVIEW_TASK_PRIORITY"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
+ PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS"
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"
UsePrecompiledHeader="0"
@@ -230,9 +230,9 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="tbb_preview.lib"
+ AdditionalDependencies="tbb.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+ AdditionalLibraryDirectories="$(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc8;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc8"
GenerateDebugInformation="true"
SubSystem="2"
OptimizeReferences="2"
@@ -264,11 +264,11 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 release "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 release "$(OutDir)""
/>
</Configuration>
<Configuration
- Name="Release|x64"
+ Name="GDIRelease|x64"
OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
ConfigurationType="1"
@@ -297,8 +297,8 @@
FavorSizeOrSpeed="1"
OmitFramePointers="true"
WholeProgramOptimization="true"
- AdditionalIncludeDirectories=""$(TBB30_INSTALL_DIR)\include""
- PreprocessorDefinitions="WIN64;NDEBUG;_WINDOWS;TBB_PREVIEW_TASK_PRIORITY"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
+ PreprocessorDefinitions="WIN64;NDEBUG;_WINDOWS"
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"
UsePrecompiledHeader="0"
@@ -315,9 +315,9 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="tbb_preview.lib"
+ AdditionalDependencies="tbb.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+ AdditionalLibraryDirectories="$(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc8;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc8"
GenerateDebugInformation="true"
SubSystem="2"
OptimizeReferences="2"
@@ -349,7 +349,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 release "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 release "$(OutDir)""
/>
</Configuration>
<Configuration
@@ -382,8 +382,8 @@
FavorSizeOrSpeed="1"
OmitFramePointers="true"
WholeProgramOptimization="true"
- AdditionalIncludeDirectories=""$(TBB30_INSTALL_DIR)\include";"$(DXSDK_DIR)\include""
- PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;TBB_PREVIEW_TASK_PRIORITY"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(DXSDK_DIR)\include""
+ PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS"
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"
UsePrecompiledHeader="0"
@@ -401,9 +401,9 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="tbb_preview.lib"
+ AdditionalDependencies="tbb.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8;$(DXSDK_DIR)\lib\x86"
+ AdditionalLibraryDirectories="$(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc8;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc8;$(DXSDK_DIR)\lib\x86"
GenerateDebugInformation="true"
SubSystem="2"
OptimizeReferences="2"
@@ -435,7 +435,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 release "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 release "$(OutDir)""
/>
</Configuration>
<Configuration
@@ -469,8 +469,8 @@
FavorSizeOrSpeed="1"
OmitFramePointers="true"
WholeProgramOptimization="true"
- AdditionalIncludeDirectories=""$(TBB30_INSTALL_DIR)\include";"$(DXSDK_DIR)\include""
- PreprocessorDefinitions="WIN64;NDEBUG;_WINDOWS;TBB_PREVIEW_TASK_PRIORITY"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(DXSDK_DIR)\include""
+ PreprocessorDefinitions="WIN64;NDEBUG;_WINDOWS"
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"
UsePrecompiledHeader="0"
@@ -487,9 +487,9 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="tbb_preview.lib"
+ AdditionalDependencies="tbb.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8;$(DXSDK_DIR)\lib\x64"
+ AdditionalLibraryDirectories="$(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc8;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc8;$(DXSDK_DIR)\lib\x64"
GenerateDebugInformation="true"
SubSystem="2"
OptimizeReferences="2"
@@ -521,7 +521,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 release "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 release "$(OutDir)""
/>
</Configuration>
<Configuration
@@ -553,8 +553,8 @@
Optimization="0"
OmitFramePointers="true"
WholeProgramOptimization="true"
- AdditionalIncludeDirectories=""$(TBB30_INSTALL_DIR)\include";"$(DXSDK_DIR)\include""
- PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;TBB_USE_DEBUG;TBB_PREVIEW_TASK_PRIORITY"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(DXSDK_DIR)\include""
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;TBB_USE_DEBUG"
RuntimeLibrary="3"
EnableFunctionLevelLinking="true"
UsePrecompiledHeader="0"
@@ -572,9 +572,9 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="tbb_preview_debug.lib"
+ AdditionalDependencies="tbb_debug.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8;$(DXSDK_DIR)\lib\x86"
+ AdditionalLibraryDirectories="$(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc8;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc8;$(DXSDK_DIR)\lib\x86"
GenerateDebugInformation="true"
SubSystem="2"
TargetMachine="1"
@@ -604,7 +604,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 debug "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 debug "$(OutDir)""
/>
</Configuration>
<Configuration
@@ -637,8 +637,8 @@
Optimization="0"
OmitFramePointers="true"
WholeProgramOptimization="true"
- AdditionalIncludeDirectories=""$(TBB30_INSTALL_DIR)\include";"$(DXSDK_DIR)\include""
- PreprocessorDefinitions="WIN64;_DEBUG;_WINDOWS;TBB_USE_DEBUG;TBB_PREVIEW_TASK_PRIORITY"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(DXSDK_DIR)\include""
+ PreprocessorDefinitions="WIN64;_DEBUG;_WINDOWS;TBB_USE_DEBUG"
RuntimeLibrary="3"
EnableFunctionLevelLinking="true"
UsePrecompiledHeader="0"
@@ -655,9 +655,9 @@
/>
<Tool
Name="VCLinkerTool"
- AdditionalDependencies="tbb_preview_debug.lib"
+ AdditionalDependencies="tbb_debug.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8;$(DXSDK_DIR)\lib\x64"
+ AdditionalLibraryDirectories="$(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc8;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc8;$(DXSDK_DIR)\lib\x64"
GenerateDebugInformation="true"
SubSystem="2"
TargetMachine="17"
@@ -687,7 +687,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 debug "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 debug "$(OutDir)""
/>
</Configuration>
</Configurations>
@@ -745,7 +745,7 @@
RelativePath="..\..\..\common\gui\ddvideo.cpp"
>
<FileConfiguration
- Name="Debug|Win32"
+ Name="GDIDebug|Win32"
ExcludedFromBuild="true"
>
<Tool
@@ -753,7 +753,7 @@
/>
</FileConfiguration>
<FileConfiguration
- Name="Debug|x64"
+ Name="GDIDebug|x64"
ExcludedFromBuild="true"
>
<Tool
@@ -761,7 +761,7 @@
/>
</FileConfiguration>
<FileConfiguration
- Name="Release|Win32"
+ Name="GDIRelease|Win32"
ExcludedFromBuild="true"
>
<Tool
@@ -769,18 +769,39 @@
/>
</FileConfiguration>
<FileConfiguration
- Name="Release|x64"
+ Name="GDIRelease|x64"
ExcludedFromBuild="true"
>
<Tool
Name="VCCLCompilerTool"
/>
</FileConfiguration>
+ <FileConfiguration
+ Name="DDDebug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ />
+ </FileConfiguration>
</File>
<File
RelativePath="..\..\..\common\gui\gdivideo.cpp"
>
<FileConfiguration
+ Name="GDIDebug|x64"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="GDIRelease|x64"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ />
+ </FileConfiguration>
+ <FileConfiguration
Name="DDRelease|Win32"
ExcludedFromBuild="true"
>
diff --git a/examples/task_priority/fractal/msvs/fractal_cl.sln b/examples/task_priority/fractal/msvs/fractal_cl.sln
index f63faf4..7ded9c9 100644
--- a/examples/task_priority/fractal/msvs/fractal_cl.sln
+++ b/examples/task_priority/fractal/msvs/fractal_cl.sln
@@ -10,26 +10,24 @@ Global
DD Release|x64 = DD Release|x64
GDI Debug|Win32 = GDI Debug|Win32
GDI Debug|x64 = GDI Debug|x64
- GDI Release|Win32 = GDI Release|Win32
- GDI Release|x64 = GDI Release|x64
+ _GDI Release|Win32 = _GDI Release|Win32
+ _GDI Release|x64 = _GDI Release|x64
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Debug|Win32.ActiveCfg = DDDebug|Win32
{3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Debug|Win32.Build.0 = DDDebug|Win32
- {3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Debug|x64.ActiveCfg = Debug|x64
- {3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Debug|x64.Build.0 = Debug|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Debug|x64.ActiveCfg = DDDebug|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Debug|x64.Build.0 = DDDebug|x64
{3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Release|Win32.ActiveCfg = DDRelease|Win32
{3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Release|Win32.Build.0 = DDRelease|Win32
- {3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Release|x64.ActiveCfg = Release|x64
- {3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Release|x64.Build.0 = Release|x64
- {3AA40693-F93D-4D4B-B32E-068F511A2527}.GDI Debug|Win32.ActiveCfg = Debug|Win32
- {3AA40693-F93D-4D4B-B32E-068F511A2527}.GDI Debug|Win32.Build.0 = Debug|Win32
- {3AA40693-F93D-4D4B-B32E-068F511A2527}.GDI Debug|x64.ActiveCfg = Debug|x64
- {3AA40693-F93D-4D4B-B32E-068F511A2527}.GDI Debug|x64.Build.0 = Debug|x64
- {3AA40693-F93D-4D4B-B32E-068F511A2527}.GDI Release|Win32.ActiveCfg = Release|Win32
- {3AA40693-F93D-4D4B-B32E-068F511A2527}.GDI Release|Win32.Build.0 = Release|Win32
- {3AA40693-F93D-4D4B-B32E-068F511A2527}.GDI Release|x64.ActiveCfg = Release|x64
- {3AA40693-F93D-4D4B-B32E-068F511A2527}.GDI Release|x64.Build.0 = Release|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Release|x64.ActiveCfg = DDRelease|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Release|x64.Build.0 = DDRelease|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A2527}.GDI Debug|Win32.ActiveCfg = GDIDebug|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A2527}.GDI Debug|x64.ActiveCfg = GDIRelease|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A2527}.GDI Debug|x64.Build.0 = GDIRelease|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A2527}._GDI Release|Win32.ActiveCfg = GDIRelease|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A2527}._GDI Release|x64.ActiveCfg = GDIRelease|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A2527}._GDI Release|x64.Build.0 = GDIRelease|x64
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/examples/task_priority/fractal/msvs/fractal_icl.sln b/examples/task_priority/fractal/msvs/fractal_icl.sln
index 100bb4e..600a1da 100644
--- a/examples/task_priority/fractal/msvs/fractal_icl.sln
+++ b/examples/task_priority/fractal/msvs/fractal_icl.sln
@@ -1,6 +1,6 @@
Microsoft Visual Studio Solution File, Format Version 9.00
# Visual Studio 2005
-Project("{EAF909A5-FA59-4C3D-9431-0FCC20D5BCF9}") = "fractal", "fractal.icproj", "{5C4ACAE3-8686-4046-A5FD-D0DC8755D263}"
+Project("{EAF909A5-FA59-4C3D-9431-0FCC20D5BCF9}") = "fractal", "fractal.icproj", "{BF088DF5-BAEA-4EB2-8EA5-1E8DFBC75E5C}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -10,34 +10,38 @@ Global
DD Release|x64 = DD Release|x64
GDI Debug|Win32 = GDI Debug|Win32
GDI Debug|x64 = GDI Debug|x64
- GDI Release|Win32 = GDI Release|Win32
- GDI Release|x64 = GDI Release|x64
+ _GDI Release|Win32 = _GDI Release|Win32
+ _GDI Release|x64 = _GDI Release|x64
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {5C4ACAE3-8686-4046-A5FD-D0DC8755D263}.DD Debug|Win32.ActiveCfg = DDDebug|Win32
- {5C4ACAE3-8686-4046-A5FD-D0DC8755D263}.DD Debug|Win32.Build.0 = DDDebug|Win32
- {5C4ACAE3-8686-4046-A5FD-D0DC8755D263}.DD Debug|x64.ActiveCfg = DDDebug|x64
- {5C4ACAE3-8686-4046-A5FD-D0DC8755D263}.DD Debug|x64.Build.0 = DDDebug|x64
- {5C4ACAE3-8686-4046-A5FD-D0DC8755D263}.DD Release|Win32.ActiveCfg = DDRelease|Win32
- {5C4ACAE3-8686-4046-A5FD-D0DC8755D263}.DD Release|Win32.Build.0 = DDRelease|Win32
- {5C4ACAE3-8686-4046-A5FD-D0DC8755D263}.DD Release|x64.ActiveCfg = DDRelease|x64
- {5C4ACAE3-8686-4046-A5FD-D0DC8755D263}.DD Release|x64.Build.0 = DDRelease|x64
- {5C4ACAE3-8686-4046-A5FD-D0DC8755D263}.GDI Debug|Win32.ActiveCfg = Debug|Win32
- {5C4ACAE3-8686-4046-A5FD-D0DC8755D263}.GDI Debug|Win32.Build.0 = Debug|Win32
- {5C4ACAE3-8686-4046-A5FD-D0DC8755D263}.GDI Debug|x64.ActiveCfg = Debug|x64
- {5C4ACAE3-8686-4046-A5FD-D0DC8755D263}.GDI Debug|x64.Build.0 = Debug|x64
- {5C4ACAE3-8686-4046-A5FD-D0DC8755D263}.GDI Release|Win32.ActiveCfg = Release|Win32
- {5C4ACAE3-8686-4046-A5FD-D0DC8755D263}.GDI Release|Win32.Build.0 = Release|Win32
- {5C4ACAE3-8686-4046-A5FD-D0DC8755D263}.GDI Release|x64.ActiveCfg = Release|x64
- {5C4ACAE3-8686-4046-A5FD-D0DC8755D263}.GDI Release|x64.Build.0 = Release|x64
- {3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Debug|Win32.ActiveCfg = Debug|Win32
- {3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Debug|x64.ActiveCfg = Debug|x64
- {3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Release|Win32.ActiveCfg = Release|Win32
- {3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Release|x64.ActiveCfg = Release|x64
- {3AA40693-F93D-4D4B-B32E-068F511A2527}.GDI Debug|Win32.ActiveCfg = Debug|Win32
- {3AA40693-F93D-4D4B-B32E-068F511A2527}.GDI Debug|x64.ActiveCfg = Debug|x64
- {3AA40693-F93D-4D4B-B32E-068F511A2527}.GDI Release|Win32.ActiveCfg = Release|Win32
- {3AA40693-F93D-4D4B-B32E-068F511A2527}.GDI Release|x64.ActiveCfg = Release|x64
+ {BF088DF5-BAEA-4EB2-8EA5-1E8DFBC75E5C}.DD Debug|Win32.ActiveCfg = DDDebug|Win32
+ {BF088DF5-BAEA-4EB2-8EA5-1E8DFBC75E5C}.DD Debug|Win32.Build.0 = DDDebug|Win32
+ {BF088DF5-BAEA-4EB2-8EA5-1E8DFBC75E5C}.DD Debug|x64.ActiveCfg = DDDebug|x64
+ {BF088DF5-BAEA-4EB2-8EA5-1E8DFBC75E5C}.DD Debug|x64.Build.0 = DDDebug|x64
+ {BF088DF5-BAEA-4EB2-8EA5-1E8DFBC75E5C}.DD Release|Win32.ActiveCfg = DDRelease|Win32
+ {BF088DF5-BAEA-4EB2-8EA5-1E8DFBC75E5C}.DD Release|Win32.Build.0 = DDRelease|Win32
+ {BF088DF5-BAEA-4EB2-8EA5-1E8DFBC75E5C}.DD Release|x64.ActiveCfg = DDRelease|x64
+ {BF088DF5-BAEA-4EB2-8EA5-1E8DFBC75E5C}.DD Release|x64.Build.0 = DDRelease|x64
+ {BF088DF5-BAEA-4EB2-8EA5-1E8DFBC75E5C}.GDI Debug|Win32.ActiveCfg = GDIDebug|x64
+ {BF088DF5-BAEA-4EB2-8EA5-1E8DFBC75E5C}.GDI Debug|x64.ActiveCfg = GDIRelease|x64
+ {BF088DF5-BAEA-4EB2-8EA5-1E8DFBC75E5C}.GDI Debug|x64.Build.0 = GDIRelease|x64
+ {BF088DF5-BAEA-4EB2-8EA5-1E8DFBC75E5C}._GDI Release|Win32.ActiveCfg = GDIRelease|x64
+ {BF088DF5-BAEA-4EB2-8EA5-1E8DFBC75E5C}._GDI Release|x64.ActiveCfg = GDIRelease|x64
+ {BF088DF5-BAEA-4EB2-8EA5-1E8DFBC75E5C}._GDI Release|x64.Build.0 = GDIRelease|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A2527}._GDI Release|x64.Build.0 = GDIRelease|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A2527}._GDI Release|x64.ActiveCfg = GDIRelease|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A2527}._GDI Release|Win32.ActiveCfg = GDIRelease|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A2527}.GDI Debug|x64.Build.0 = GDIRelease|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A2527}.GDI Debug|x64.ActiveCfg = GDIRelease|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A2527}.GDI Debug|Win32.ActiveCfg = GDIDebug|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Release|x64.Build.0 = DDRelease|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Release|x64.ActiveCfg = DDRelease|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Release|Win32.Build.0 = DDRelease|Win32
+ {3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Release|Win32.ActiveCfg = DDRelease|Win32
+ {3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Debug|x64.Build.0 = DDDebug|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Debug|x64.ActiveCfg = DDDebug|x64
+ {3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Debug|Win32.Build.0 = DDDebug|Win32
+ {3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Debug|Win32.ActiveCfg = DDDebug|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/examples/task_priority/fractal/xcode/fractal.xcodeproj/project.pbxproj b/examples/task_priority/fractal/xcode/fractal.xcodeproj/project.pbxproj
index a2cccaf..a3ed810 100644
--- a/examples/task_priority/fractal/xcode/fractal.xcodeproj/project.pbxproj
+++ b/examples/task_priority/fractal/xcode/fractal.xcodeproj/project.pbxproj
@@ -3,16 +3,15 @@
archiveVersion = 1;
classes = {
};
- objectVersion = 42;
+ objectVersion = 46;
objects = {
/* Begin PBXBuildFile section */
- A12649490B8392750091D5AD /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A1E3E7BC0B3AD4EC007C3AB5 /* OpenGL.framework */; };
A126495E0B83936D0091D5AD /* Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 8D0C4E960486CD37000505A6 /* Info.plist */; };
- A18D2A340B861B99007D8D2C /* libtbb_preview.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = A18D2A330B861B99007D8D2C /* libtbb_preview.dylib */; };
+ A18D2A340B861B99007D8D2C /* libtbb.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = A18D2A330B861B99007D8D2C /* libtbb.dylib */; };
A1A8F41E0B8B4DBE001C55B1 /* AGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A1A8F41D0B8B4DBE001C55B1 /* AGL.framework */; };
A1A8F4310B8B4EA8001C55B1 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A1A8F4300B8B4EA8001C55B1 /* Carbon.framework */; };
- A1D44D9A0B861E8A0006E401 /* libtbb_preview.dylib in CopyFiles */ = {isa = PBXBuildFile; fileRef = A18D2A330B861B99007D8D2C /* libtbb_preview.dylib */; };
+ A1D44D9A0B861E8A0006E401 /* libtbb.dylib in CopyFiles */ = {isa = PBXBuildFile; fileRef = A18D2A330B861B99007D8D2C /* libtbb.dylib */; };
A1E3E7BD0B3AD4EC007C3AB5 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A1E3E7BC0B3AD4EC007C3AB5 /* OpenGL.framework */; };
A1F591AC0B8DFC9600073279 /* macvideo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F591AA0B8DFC9600073279 /* macvideo.cpp */; };
EA135CEA130D076D00807847 /* fractal.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EA135CE6130D076D00807847 /* fractal.cpp */; };
@@ -27,7 +26,7 @@
dstPath = "";
dstSubfolderSpec = 16;
files = (
- A1D44D9A0B861E8A0006E401 /* libtbb_preview.dylib in CopyFiles */,
+ A1D44D9A0B861E8A0006E401 /* libtbb.dylib in CopyFiles */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -36,7 +35,7 @@
/* Begin PBXFileReference section */
8D0C4E960486CD37000505A6 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = Info.plist; sourceTree = "<group>"; };
8D0C4E970486CD37000505A6 /* fractal.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = fractal.app; sourceTree = BUILT_PRODUCTS_DIR; };
- A18D2A330B861B99007D8D2C /* libtbb_preview.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libtbb_preview.dylib; path = ../../../../lib/libtbb_preview.dylib; sourceTree = SOURCE_ROOT; };
+ A18D2A330B861B99007D8D2C /* libtbb.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libtbb.dylib; path = ../../../../lib/libtbb.dylib; sourceTree = SOURCE_ROOT; };
A1A8F41D0B8B4DBE001C55B1 /* AGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AGL.framework; path = /System/Library/Frameworks/AGL.framework; sourceTree = "<absolute>"; };
A1A8F4300B8B4EA8001C55B1 /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = /System/Library/Frameworks/Carbon.framework; sourceTree = "<absolute>"; };
A1E3E7BC0B3AD4EC007C3AB5 /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = /System/Library/Frameworks/OpenGL.framework; sourceTree = "<absolute>"; };
@@ -56,8 +55,7 @@
buildActionMask = 2147483647;
files = (
A1E3E7BD0B3AD4EC007C3AB5 /* OpenGL.framework in Frameworks */,
- A12649490B8392750091D5AD /* OpenGL.framework in Frameworks */,
- A18D2A340B861B99007D8D2C /* libtbb_preview.dylib in Frameworks */,
+ A18D2A340B861B99007D8D2C /* libtbb.dylib in Frameworks */,
A1A8F41E0B8B4DBE001C55B1 /* AGL.framework in Frameworks */,
A1A8F4310B8B4EA8001C55B1 /* Carbon.framework in Frameworks */,
);
@@ -111,7 +109,7 @@
20286C32FDCF999611CA2CEA /* External Frameworks and Libraries */ = {
isa = PBXGroup;
children = (
- A18D2A330B861B99007D8D2C /* libtbb_preview.dylib */,
+ A18D2A330B861B99007D8D2C /* libtbb.dylib */,
A1A8F4300B8B4EA8001C55B1 /* Carbon.framework */,
A1A8F41D0B8B4DBE001C55B1 /* AGL.framework */,
A1E3E7BC0B3AD4EC007C3AB5 /* OpenGL.framework */,
@@ -146,9 +144,16 @@
/* Begin PBXProject section */
20286C28FDCF999611CA2CEA /* Project object */ = {
isa = PBXProject;
+ attributes = {
+ LastUpgradeCheck = 0410;
+ };
buildConfigurationList = C0E91AC908A95435008D54AB /* Build configuration list for PBXProject "fractal" */;
- compatibilityVersion = "Xcode 2.4";
+ compatibilityVersion = "Xcode 3.2";
+ developmentRegion = English;
hasScannedForEncodings = 1;
+ knownRegions = (
+ en,
+ );
mainGroup = 20286C29FDCF999611CA2CEA /* fractal */;
projectDirPath = "";
projectRoot = "";
@@ -200,20 +205,20 @@
buildSettings = {
COPY_PHASE_STRIP = NO;
GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
GCC_MODEL_TUNING = "";
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = fractal.pch;
- GCC_PREPROCESSOR_DEFINITIONS = TBB_PREVIEW_TASK_PRIORITY;
- GCC_VERSION = 4.0;
+ GCC_VERSION = "";
HEADER_SEARCH_PATHS = ../../../../include;
+ IBC_STRIP_NIBS = NO;
INSTALL_PATH = "$(HOME)/Applications";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
../../../../lib,
);
PRODUCT_NAME = fractal;
+ SDKROOT = macosx10.6;
};
name = Debug;
};
@@ -224,9 +229,9 @@
GCC_MODEL_TUNING = "";
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = fractal.pch;
- GCC_PREPROCESSOR_DEFINITIONS = TBB_PREVIEW_TASK_PRIORITY;
- GCC_VERSION = 4.0;
+ GCC_VERSION = "";
HEADER_SEARCH_PATHS = ../../../../include;
+ IBC_STRIP_NIBS = NO;
INSTALL_PATH = "$(HOME)/Applications";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
@@ -235,6 +240,7 @@
OTHER_CPLUSPLUSFLAGS = "";
PRODUCT_NAME = fractal;
PUBLIC_HEADERS_FOLDER_PATH = "$(CONTENTS_FOLDER_PATH)/Headers";
+ SDKROOT = macosx10.6;
STRIPFLAGS = "";
};
name = Release;
@@ -248,11 +254,13 @@
GCC_ENABLE_SSE3_EXTENSIONS = YES;
GCC_MODEL_TUNING = "";
GCC_OPTIMIZATION_LEVEL = 0;
- GCC_VERSION = 4.0;
+ GCC_VERSION = "";
GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = NO;
+ IBC_STRIP_NIBS = NO;
MACH_O_TYPE = mh_execute;
- PREBINDING = NO;
+ MACOSX_DEPLOYMENT_TARGET = 10.6;
PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
+ SDKROOT = macosx10.6;
SYMROOT = "/tmp/tbb-$(USER)";
};
name = Debug;
@@ -266,11 +274,13 @@
GCC_ENABLE_SSE3_EXTENSIONS = YES;
GCC_MODEL_TUNING = "";
GCC_OPTIMIZATION_LEVEL = 3;
- GCC_VERSION = 4.0;
+ GCC_VERSION = "";
GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = NO;
+ IBC_STRIP_NIBS = NO;
MACH_O_TYPE = mh_execute;
- PREBINDING = NO;
+ MACOSX_DEPLOYMENT_TARGET = 10.6;
PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
+ SDKROOT = macosx10.6;
SYMROOT = "/tmp/tbb-$(USER)";
};
name = Release;
diff --git a/examples/task_priority/index.html b/examples/task_priority/index.html
index 69277bf..922f443 100644
--- a/examples/task_priority/index.html
+++ b/examples/task_priority/index.html
@@ -14,10 +14,9 @@ This directory has examples of how to use the task priority feature.
<A HREF="../index.html">Up to parent directory</A>
<p></p>
Copyright © 2005-2011 Intel Corporation. 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>
+Intel is a registered trademark or trademark 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.
</BODY>
diff --git a/examples/test_all/fibonacci/Makefile b/examples/test_all/fibonacci/Makefile
index 63e90bc..ce27a70 100644
--- a/examples/test_all/fibonacci/Makefile
+++ b/examples/test_all/fibonacci/Makefile
@@ -33,6 +33,10 @@ ifneq (,$(shell which icc 2>/dev/null))
CXX=icc
endif # icc
+ifeq ($(shell uname), Linux)
+LIBS+= -lrt
+endif
+
all: release test
release: *.cpp
diff --git a/examples/test_all/fibonacci/index.html b/examples/test_all/fibonacci/index.html
index 8c0ead6..af931c0 100644
--- a/examples/test_all/fibonacci/index.html
+++ b/examples/test_all/fibonacci/index.html
@@ -42,10 +42,9 @@ General build directions can be found <A HREF=../../index.html#build>here</A>.
<A HREF="../index.html">Up to parent directory</A>
<p></p>
Copyright © 2005-2011 Intel Corporation. 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>
+Intel is a registered trademark or trademark 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.
</BODY>
diff --git a/examples/test_all/fibonacci/msvs/fibonacci.vcproj b/examples/test_all/fibonacci/msvs/fibonacci.vcproj
index b9955ca..7d38fd0 100644
--- a/examples/test_all/fibonacci/msvs/fibonacci.vcproj
+++ b/examples/test_all/fibonacci/msvs/fibonacci.vcproj
@@ -43,7 +43,7 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
RuntimeLibrary="3"
UsePrecompiledHeader="0"
@@ -63,7 +63,7 @@
Name="VCLinkerTool"
AdditionalDependencies="tbb_debug.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+ 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"
@@ -93,7 +93,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 debug "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 debug "$(OutDir)""
/>
</Configuration>
<Configuration
@@ -122,7 +122,7 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
RuntimeLibrary="3"
UsePrecompiledHeader="0"
@@ -141,7 +141,7 @@
Name="VCLinkerTool"
AdditionalDependencies="tbb_debug.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+ 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"
@@ -171,7 +171,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 debug "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 debug "$(OutDir)""
/>
</Configuration>
<Configuration
@@ -198,7 +198,7 @@
/>
<Tool
Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
RuntimeLibrary="2"
UsePrecompiledHeader="0"
@@ -218,7 +218,7 @@
Name="VCLinkerTool"
AdditionalDependencies="tbb.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+ 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"
@@ -250,7 +250,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 release "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 release "$(OutDir)""
/>
</Configuration>
<Configuration
@@ -278,7 +278,7 @@
/>
<Tool
Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+ AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
PreprocessorDefinitions="WIN64;NDEBUG;_CONSOLE"
RuntimeLibrary="2"
UsePrecompiledHeader="0"
@@ -297,7 +297,7 @@
Name="VCLinkerTool"
AdditionalDependencies="tbb.lib"
LinkIncremental="1"
- AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+ 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"
@@ -329,7 +329,7 @@
<Tool
Name="VCPostBuildEventTool"
Description="Copying DLLs and PDBs"
- CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" intel64 release "$(OutDir)""
+ CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" intel64 release "$(OutDir)""
/>
</Configuration>
</Configurations>
diff --git a/examples/test_all/fibonacci/xcode/fibonacci.xcodeproj/project.pbxproj b/examples/test_all/fibonacci/xcode/fibonacci.xcodeproj/project.pbxproj
index f6957d7..0a08617 100644
--- a/examples/test_all/fibonacci/xcode/fibonacci.xcodeproj/project.pbxproj
+++ b/examples/test_all/fibonacci/xcode/fibonacci.xcodeproj/project.pbxproj
@@ -3,7 +3,7 @@
archiveVersion = 1;
classes = {
};
- objectVersion = 42;
+ objectVersion = 46;
objects = {
/* Begin PBXBuildFile section */
@@ -103,9 +103,16 @@
/* Begin PBXProject section */
08FB7793FE84155DC02AAC07 /* Project object */ = {
isa = PBXProject;
+ attributes = {
+ LastUpgradeCheck = 0410;
+ };
buildConfigurationList = 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "fibonacci" */;
- compatibilityVersion = "Xcode 2.4";
+ compatibilityVersion = "Xcode 3.2";
+ developmentRegion = English;
hasScannedForEncodings = 1;
+ knownRegions = (
+ en,
+ );
mainGroup = 08FB7794FE84155DC02AAC07 /* Fibonacci */;
projectDirPath = "";
projectRoot = "";
@@ -132,14 +139,13 @@
buildSettings = {
COPY_PHASE_STRIP = NO;
GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
GCC_OPTIMIZATION_LEVEL = 0;
- GCC_VERSION = 4.0;
+ GCC_VERSION = "";
HEADER_SEARCH_PATHS = ../../../../include;
INSTALL_PATH = "$(HOME)/bin";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
- "../../../../lib",
+ ../../../../lib,
);
PRODUCT_NAME = Fibonacci;
ZERO_LINK = NO;
@@ -150,12 +156,12 @@
isa = XCBuildConfiguration;
buildSettings = {
GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
- GCC_VERSION = 4.0;
+ GCC_VERSION = "";
HEADER_SEARCH_PATHS = ../../../../include;
INSTALL_PATH = "$(HOME)/bin";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
- "../../../../lib",
+ ../../../../lib,
);
PRODUCT_NAME = Fibonacci;
ZERO_LINK = NO;
@@ -172,7 +178,6 @@
GCC_VERSION = 4.0;
GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
- PREBINDING = NO;
PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
SYMROOT = "/tmp/tbb-$(USER)";
};
@@ -188,7 +193,6 @@
GCC_VERSION = 4.0;
GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
- PREBINDING = NO;
PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
SYMROOT = "/tmp/tbb-$(USER)";
};
@@ -197,18 +201,16 @@
A1F593C60B8F0E6E00073279 /* Debug64 */ = {
isa = XCBuildConfiguration;
buildSettings = {
- ARCHS = "$(ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1)";
- ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1 = x86_64;
+ ARCHS = "$(ARCHS_STANDARD_64_BIT)";
COPY_PHASE_STRIP = NO;
GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
GCC_OPTIMIZATION_LEVEL = 0;
- GCC_VERSION = 4.0;
+ GCC_VERSION = "";
HEADER_SEARCH_PATHS = ../../../../include;
INSTALL_PATH = "$(HOME)/bin";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
- "../../../../lib",
+ ../../../../lib,
);
PRODUCT_NAME = Fibonacci;
ZERO_LINK = NO;
@@ -218,15 +220,14 @@
A1F593C70B8F0E6E00073279 /* Release64 */ = {
isa = XCBuildConfiguration;
buildSettings = {
- ARCHS = "$(ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1)";
- ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1 = x86_64;
+ ARCHS = "$(ARCHS_STANDARD_64_BIT)";
GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
- GCC_VERSION = 4.0;
+ GCC_VERSION = "";
HEADER_SEARCH_PATHS = ../../../../include;
INSTALL_PATH = "$(HOME)/bin";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
- "../../../../lib",
+ ../../../../lib,
);
PRODUCT_NAME = Fibonacci;
ZERO_LINK = NO;
@@ -248,7 +249,6 @@
"-m64",
);
OTHER_LDFLAGS = "-m64";
- PREBINDING = NO;
PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
SYMROOT = "/tmp/tbb-$(USER)";
};
@@ -269,7 +269,6 @@
"-m64",
);
OTHER_LDFLAGS = "-m64";
- PREBINDING = NO;
PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
SYMROOT = "/tmp/tbb-$(USER)";
};
diff --git a/examples/test_all/index.html b/examples/test_all/index.html
index 527650c..86c1e27 100644
--- a/examples/test_all/index.html
+++ b/examples/test_all/index.html
@@ -14,10 +14,9 @@ This directory contains programs that exercise all the components of Threading B
<A HREF="../index.html">Up to parent directory</A>
<p></p>
Copyright © 2005-2011 Intel Corporation. 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>
+Intel is a registered trademark or trademark 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.
</BODY>
diff --git a/include/index.html b/include/index.html
index 98353f0..ee08489 100644
--- a/include/index.html
+++ b/include/index.html
@@ -14,10 +14,9 @@ Include files for Threading Building Blocks.
<A HREF="../index.html">Up to parent directory</A>
<p></p>
Copyright © 2005-2011 Intel Corporation. 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>
+Intel is a registered trademark or trademark 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.
</BODY>
diff --git a/include/serial/tbb/parallel_for.h b/include/serial/tbb/parallel_for.h
new file mode 100644
index 0000000..e953cf0
--- /dev/null
+++ b/include/serial/tbb/parallel_for.h
@@ -0,0 +1,173 @@
+/*
+ Copyright 2005-2011 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_SERIAL_parallel_for_H
+#define __TBB_SERIAL_parallel_for_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>
+#include <string> // required to construct std exception classes
+
+#if !TBB_USE_EXCEPTIONS && _MSC_VER
+ #pragma warning (pop)
+#endif
+
+#include "tbb_annotate.h"
+
+#ifndef __TBB_NORMAL_EXECUTION
+#include "tbb/blocked_range.h"
+#include "tbb/partitioner.h"
+#endif
+
+namespace tbb {
+namespace serial {
+namespace interface6 {
+
+// parallel_for serial annotated implementation
+
+template< typename Range, typename Body, typename Partitioner >
+class start_for : tbb::internal::no_copy {
+ Range my_range;
+ const Body my_body;
+ typename Partitioner::task_partition_type my_partition;
+ void execute();
+
+ //! Constructor for root task.
+ start_for( const Range& range, const Body& body, Partitioner& partitioner ) :
+ my_range( range ),
+ my_body( body ),
+ my_partition( partitioner )
+ {
+ }
+
+ //! Splitting constructor used to generate children.
+ /** this becomes left child. Newly constructed object is right child. */
+ start_for( start_for& parent_, split ) :
+ my_range( parent_.my_range, split() ),
+ my_body( parent_.my_body ),
+ my_partition( parent_.my_partition, split() )
+ {
+ }
+
+public:
+ static void run( const Range& range, const Body& body, const Partitioner& partitioner ) {
+ if( !range.empty() ) {
+ ANNOTATE_SITE_BEGIN( tbb_parallel_for );
+ {
+ start_for a( range, body, const_cast< Partitioner& >( partitioner ) );
+ a.execute();
+ }
+ ANNOTATE_SITE_END( tbb_parallel_for );
+ }
+ }
+};
+
+template< typename Range, typename Body, typename Partitioner >
+void start_for< Range, Body, Partitioner >::execute() {
+ if( !my_range.is_divisible() || !my_partition.divisions_left() ) {
+ ANNOTATE_TASK_BEGIN( tbb_parallel_for_range );
+ {
+ my_body( my_range );
+ }
+ ANNOTATE_TASK_END( tbb_parallel_for_range );
+ } else {
+ start_for b( *this, split() );
+ this->execute(); // Execute the left interval first to keep the serial order.
+ b.execute(); // Execute the right interval then.
+ }
+}
+
+//! 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());
+}
+
+//! 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);
+}
+
+//! 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);
+}
+
+//! Parallel iteration over range with affinity_partitioner.
+/** @ingroup algorithms **/
+template<typename Range, typename Body>
+void parallel_for( const Range& range, const Body& body, affinity_partitioner& partitioner ) {
+ 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) {
+ if (step <= 0 )
+ throw std::invalid_argument( "nonpositive_step" );
+ else if (last > first) {
+ // Above "else" avoids "potential divide by zero" warning on some platforms
+ ANNOTATE_SITE_BEGIN( tbb_parallel_for );
+ for( Index i = first; i < last; i = i + step ) {
+ ANNOTATE_TASK_BEGIN( tbb_parallel_for_iteration );
+ { f( i ); }
+ ANNOTATE_TASK_END( tbb_parallel_for_iteration );
+ }
+ ANNOTATE_SITE_END( tbb_parallel_for );
+ }
+}
+
+//! Parallel iteration over a range of integers with a default step value
+template <typename Index, typename Function>
+void parallel_for(Index first, Index last, const Function& f) {
+ parallel_for(first, last, static_cast<Index>(1), f);
+}
+
+} // namespace interface6
+
+using interface6::parallel_for;
+
+} // namespace serial
+
+#ifndef __TBB_NORMAL_EXECUTION
+using serial::interface6::parallel_for;
+#endif
+
+} // namespace tbb
+
+#endif /* __TBB_SERIAL_parallel_for_H */
diff --git a/src/test/test_ScalableAllocator_STL.cpp b/include/serial/tbb/tbb_annotate.h
similarity index 75%
copy from src/test/test_ScalableAllocator_STL.cpp
copy to include/serial/tbb/tbb_annotate.h
index 3d89a3e..5aeb6ea 100644
--- a/src/test/test_ScalableAllocator_STL.cpp
+++ b/include/serial/tbb/tbb_annotate.h
@@ -26,15 +26,19 @@
the GNU General Public License.
*/
-// Test whether scalable_allocator works with some of the host's STL containers.
-
-#define HARNESS_NO_PARSE_COMMAND_LINE 1
-#include "tbb/scalable_allocator.h"
-
-// The actual body of the test is there:
-#include "test_allocator_STL.h"
-
-int TestMain () {
- TestAllocatorWithSTL<tbb::scalable_allocator<void> >();
- return Harness::Done;
-}
+#ifndef __TBB_annotate_H
+#define __TBB_annotate_H
+
+// Macros used by the Intel(R) Parallel Advisor.
+#ifdef __TBB_NORMAL_EXECUTION
+ #define ANNOTATE_SITE_BEGIN( site )
+ #define ANNOTATE_SITE_END( site )
+ #define ANNOTATE_TASK_BEGIN( task )
+ #define ANNOTATE_TASK_END( task )
+ #define ANNOTATE_LOCK_ACQUIRE( lock )
+ #define ANNOTATE_LOCK_RELEASE( lock )
+#else
+ #include <advisor-annotate.h>
+#endif
+
+#endif /* __TBB_annotate_H */
diff --git a/include/tbb/atomic.h b/include/tbb/atomic.h
index d360089..5257ff5 100644
--- a/include/tbb/atomic.h
+++ b/include/tbb/atomic.h
@@ -50,24 +50,26 @@ namespace tbb {
//! Specifies memory fencing.
enum memory_semantics {
- //! For internal use only.
- __TBB_full_fence,
+ //! Sequentially consistent fence.
+ full_fence,
//! Acquire fence
acquire,
//! Release fence
- release
+ release,
+ //! No ordering
+ relaxed
};
//! @cond INTERNAL
namespace internal {
-#if __GNUC__ || __SUNPRO_CC || __IBMCPP__
-#define __TBB_DECL_ATOMIC_FIELD(t,f,a) t f __attribute__ ((aligned(a)));
-#elif defined(__INTEL_COMPILER)||_MSC_VER >= 1300
-#define __TBB_DECL_ATOMIC_FIELD(t,f,a) __declspec(align(a)) t f;
+#if __TBB_ATTRIBUTE_ALIGNED_PRESENT
+ #define __TBB_DECL_ATOMIC_FIELD(t,f,a) t f __attribute__ ((aligned(a)));
+#elif __TBB_DECLSPEC_ALIGN_PRESENT
+ #define __TBB_DECL_ATOMIC_FIELD(t,f,a) __declspec(align(a)) t f;
#else
-#error Do not know syntax for forcing alignment.
-#endif /* __GNUC__ */
+ #error Do not know syntax for forcing alignment.
+#endif
template<size_t S>
struct atomic_rep; // Primary template declared, but never defined.
@@ -103,58 +105,82 @@ struct atomic_rep<8> { // Specialization
template<size_t Size, memory_semantics M>
struct atomic_traits; // Primary template declared, but not defined.
-#define __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(S,M) \
- template<> struct atomic_traits<S,M> { \
- typedef atomic_rep<S>::word word; \
- inline static word compare_and_swap( volatile void* location, word new_value, word comparand ) {\
- return __TBB_CompareAndSwap##S##M(location,new_value,comparand); \
- } \
- inline static word fetch_and_add( volatile void* location, word addend ) { \
- return __TBB_FetchAndAdd##S##M(location,addend); \
- } \
- inline static word fetch_and_store( volatile void* location, word value ) {\
- return __TBB_FetchAndStore##S##M(location,value); \
- } \
+#define __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(S,M) \
+ template<> struct atomic_traits<S,M> { \
+ typedef atomic_rep<S>::word word; \
+ inline static word compare_and_swap( volatile void* location, word new_value, word comparand ) { \
+ return __TBB_machine_cmpswp##S##M(location,new_value,comparand); \
+ } \
+ inline static word fetch_and_add( volatile void* location, word addend ) { \
+ return __TBB_machine_fetchadd##S##M(location,addend); \
+ } \
+ inline static word fetch_and_store( volatile void* location, word value ) { \
+ return __TBB_machine_fetchstore##S##M(location,value); \
+ } \
};
-#define __TBB_DECL_ATOMIC_PRIMITIVES(S) \
- template<memory_semantics M> \
- struct atomic_traits<S,M> { \
- typedef atomic_rep<S>::word word; \
- inline static word compare_and_swap( volatile void* location, word new_value, word comparand ) {\
- return __TBB_CompareAndSwap##S(location,new_value,comparand); \
- } \
- inline static word fetch_and_add( volatile void* location, word addend ) { \
- return __TBB_FetchAndAdd##S(location,addend); \
- } \
- inline static word fetch_and_store( volatile void* location, word value ) {\
- return __TBB_FetchAndStore##S(location,value); \
- } \
+#define __TBB_DECL_ATOMIC_PRIMITIVES(S) \
+ template<memory_semantics M> \
+ struct atomic_traits<S,M> { \
+ typedef atomic_rep<S>::word word; \
+ inline static word compare_and_swap( volatile void* location, word new_value, word comparand ) { \
+ return __TBB_machine_cmpswp##S(location,new_value,comparand); \
+ } \
+ inline static word fetch_and_add( volatile void* location, word addend ) { \
+ return __TBB_machine_fetchadd##S(location,addend); \
+ } \
+ inline static word fetch_and_store( volatile void* location, word value ) { \
+ return __TBB_machine_fetchstore##S(location,value); \
+ } \
};
-#if __TBB_DECL_FENCED_ATOMICS
-__TBB_DECL_FENCED_ATOMIC_PRIMITIVES(1,__TBB_full_fence)
-__TBB_DECL_FENCED_ATOMIC_PRIMITIVES(2,__TBB_full_fence)
-__TBB_DECL_FENCED_ATOMIC_PRIMITIVES(4,__TBB_full_fence)
-__TBB_DECL_FENCED_ATOMIC_PRIMITIVES(8,__TBB_full_fence)
+template<memory_semantics M>
+struct atomic_load_store_traits; // Primary template declaration
+
+#define __TBB_DECL_ATOMIC_LOAD_STORE_PRIMITIVES(M) \
+ template<> struct atomic_load_store_traits<M> { \
+ template <typename T> \
+ inline static T load( const volatile T& location ) { \
+ return __TBB_load_##M( location ); \
+ } \
+ template <typename T> \
+ inline static void store( volatile T& location, T value ) { \
+ __TBB_store_##M( location, value ); \
+ } \
+ }
+
+#if __TBB_USE_FENCED_ATOMICS
+__TBB_DECL_FENCED_ATOMIC_PRIMITIVES(1,full_fence)
+__TBB_DECL_FENCED_ATOMIC_PRIMITIVES(2,full_fence)
+__TBB_DECL_FENCED_ATOMIC_PRIMITIVES(4,full_fence)
__TBB_DECL_FENCED_ATOMIC_PRIMITIVES(1,acquire)
__TBB_DECL_FENCED_ATOMIC_PRIMITIVES(2,acquire)
__TBB_DECL_FENCED_ATOMIC_PRIMITIVES(4,acquire)
__TBB_DECL_FENCED_ATOMIC_PRIMITIVES(1,release)
__TBB_DECL_FENCED_ATOMIC_PRIMITIVES(2,release)
__TBB_DECL_FENCED_ATOMIC_PRIMITIVES(4,release)
+__TBB_DECL_FENCED_ATOMIC_PRIMITIVES(1,relaxed)
+__TBB_DECL_FENCED_ATOMIC_PRIMITIVES(2,relaxed)
+__TBB_DECL_FENCED_ATOMIC_PRIMITIVES(4,relaxed)
#if __TBB_64BIT_ATOMICS
+__TBB_DECL_FENCED_ATOMIC_PRIMITIVES(8,full_fence)
__TBB_DECL_FENCED_ATOMIC_PRIMITIVES(8,acquire)
__TBB_DECL_FENCED_ATOMIC_PRIMITIVES(8,release)
+__TBB_DECL_FENCED_ATOMIC_PRIMITIVES(8,relaxed)
#endif
-#else
+#else /* !__TBB_USE_FENCED_ATOMICS */
__TBB_DECL_ATOMIC_PRIMITIVES(1)
__TBB_DECL_ATOMIC_PRIMITIVES(2)
__TBB_DECL_ATOMIC_PRIMITIVES(4)
#if __TBB_64BIT_ATOMICS
__TBB_DECL_ATOMIC_PRIMITIVES(8)
#endif
-#endif
+#endif /* !__TBB_USE_FENCED_ATOMICS */
+
+__TBB_DECL_ATOMIC_LOAD_STORE_PRIMITIVES(full_fence);
+__TBB_DECL_ATOMIC_LOAD_STORE_PRIMITIVES(acquire);
+__TBB_DECL_ATOMIC_LOAD_STORE_PRIMITIVES(release);
+__TBB_DECL_ATOMIC_LOAD_STORE_PRIMITIVES(relaxed);
//! Additive inverse of 1 for type T.
/** Various compilers issue various warnings if -1 is used with various integer types.
@@ -186,7 +212,7 @@ public:
}
value_type fetch_and_store( value_type value ) {
- return fetch_and_store<__TBB_full_fence>(value);
+ return fetch_and_store<full_fence>(value);
}
template<memory_semantics M>
@@ -199,7 +225,7 @@ public:
}
value_type compare_and_swap( value_type value, value_type comparand ) {
- return compare_and_swap<__TBB_full_fence>(value,comparand);
+ return compare_and_swap<full_fence>(value,comparand);
}
operator value_type() const volatile { // volatile qualifier here for backwards compatibility
@@ -208,6 +234,28 @@ public:
return w.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;
+ }
+
+ value_type load () const {
+ return load<acquire>();
+ }
+
+ 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 );
+ }
+
+ void store ( value_type value ) {
+ store<release>( value );
+ }
+
protected:
value_type store_with_release( value_type rhs ) {
converter u;
@@ -232,7 +280,7 @@ public:
}
value_type fetch_and_add( D addend ) {
- return fetch_and_add<__TBB_full_fence>(addend);
+ return fetch_and_add<full_fence>(addend);
}
template<memory_semantics M>
@@ -303,9 +351,10 @@ struct atomic: internal::atomic_impl<T> {
};
#if __TBB_64BIT_ATOMICS
-// otherwise size is verified by test_atomic
__TBB_DECL_ATOMIC(__TBB_LONG_LONG)
__TBB_DECL_ATOMIC(unsigned __TBB_LONG_LONG)
+#else
+// test_atomic will verify that sizeof(long long)==8
#endif
__TBB_DECL_ATOMIC(long)
__TBB_DECL_ATOMIC(unsigned long)
@@ -363,6 +412,15 @@ template<> struct atomic<void*>: internal::atomic_impl<void*> {
}
};
+// Helpers to workaround ugly syntax of calling template member function of a
+// template class with template argument dependent on template parameters.
+
+template <memory_semantics M, typename T>
+T load ( const atomic<T>& a ) { return a.template load<M>(); }
+
+template <memory_semantics M, typename T>
+void store ( atomic<T>& a, T value ) { return a.template store<M>(value); }
+
} // namespace tbb
#if defined(_MSC_VER) && !defined(__INTEL_COMPILER)
diff --git a/include/tbb/blocked_range2d.h b/include/tbb/blocked_range2d.h
index 9bd0509..5fb182f 100644
--- a/include/tbb/blocked_range2d.h
+++ b/include/tbb/blocked_range2d.h
@@ -39,7 +39,7 @@ namespace tbb {
template<typename RowValue, typename ColValue=RowValue>
class blocked_range2d {
public:
- //! Type for size of an iteation range
+ //! Type for size of an iteration range
typedef blocked_range<RowValue> row_range_type;
typedef blocked_range<ColValue> col_range_type;
diff --git a/include/tbb/blocked_range3d.h b/include/tbb/blocked_range3d.h
index 85a66f1..f6f58de 100644
--- a/include/tbb/blocked_range3d.h
+++ b/include/tbb/blocked_range3d.h
@@ -39,7 +39,7 @@ namespace tbb {
template<typename PageValue, typename RowValue=PageValue, typename ColValue=RowValue>
class blocked_range3d {
public:
- //! Type for size of an iteation range
+ //! Type for size of an iteration range
typedef blocked_range<PageValue> page_range_type;
typedef blocked_range<RowValue> row_range_type;
typedef blocked_range<ColValue> col_range_type;
diff --git a/include/tbb/compat/ppl.h b/include/tbb/compat/ppl.h
index a474b73..6f93148 100644
--- a/include/tbb/compat/ppl.h
+++ b/include/tbb/compat/ppl.h
@@ -40,6 +40,7 @@
namespace Concurrency {
+#if __TBB_TASK_GROUP_CONTEXT
using tbb::task_handle;
using tbb::task_group_status;
using tbb::task_group;
@@ -53,6 +54,7 @@ namespace Concurrency {
using tbb::canceled;
using tbb::is_current_task_group_canceling;
+#endif /* __TBB_TASK_GROUP_CONTEXT */
using tbb::parallel_invoke;
using tbb::strict_ppl::parallel_for;
diff --git a/include/tbb/compat/tuple b/include/tbb/compat/tuple
index 4a4f5f2..3177a14 100644
--- a/include/tbb/compat/tuple
+++ b/include/tbb/compat/tuple
@@ -386,6 +386,11 @@ struct tuple_element {
template<int N, class T>
inline static typename tuple_element<N,T>::type& get(T &t) { return t.get<N>(); }
+template<int N, class T>
+inline static typename tuple_element<N,T>::type const& get(T const &t) { return
+ const_cast<typename tuple_element<N,T>::type const &>
+ (const_cast<T &>(t).get<N>()); }
+
} // interface5
} // tbb
diff --git a/include/tbb/concurrent_hash_map.h b/include/tbb/concurrent_hash_map.h
index 39cc308..ce589c9 100644
--- a/include/tbb/concurrent_hash_map.h
+++ b/include/tbb/concurrent_hash_map.h
@@ -52,7 +52,7 @@
#include "aligned_space.h"
#include "tbb_exception.h"
#include "tbb_profiling.h"
-#include "_concurrent_unordered_internal.h" // Need tbb_hasher
+#include "internal/_concurrent_unordered_impl.h" // Need tbb_hasher
#if TBB_USE_PERFORMANCE_WARNINGS || __TBB_STATISTICS
#include <typeinfo>
#endif
diff --git a/include/tbb/concurrent_priority_queue.h b/include/tbb/concurrent_priority_queue.h
index 6c06831..b5601f1 100644
--- a/include/tbb/concurrent_priority_queue.h
+++ b/include/tbb/concurrent_priority_queue.h
@@ -29,16 +29,12 @@
#ifndef __TBB_concurrent_priority_queue_H
#define __TBB_concurrent_priority_queue_H
-#if !TBB_PREVIEW_CONCURRENT_PRIORITY_QUEUE
-#error Set TBB_PREVIEW_CONCURRENT_PRIORITY_QUEUE to include concurrent_priority_queue.h
-#endif
-
#include "atomic.h"
#include "cache_aligned_allocator.h"
#include "tbb_exception.h"
#include "tbb_stddef.h"
#include "tbb_profiling.h"
-#include "_aggregator_internal.h"
+#include "internal/_aggregator_impl.h"
#include <vector>
#include <iterator>
#include <functional>
@@ -71,64 +67,71 @@ class concurrent_priority_queue {
typedef A allocator_type;
//! Constructs a new concurrent_priority_queue with default capacity
- explicit concurrent_priority_queue(const allocator_type& a = allocator_type()) : mark(0), data(a) {
+ explicit concurrent_priority_queue(const allocator_type& a = allocator_type()) : mark(0), my_size(0), data(a)
+ {
my_aggregator.initialize_handler(my_functor_t(this));
}
//! Constructs a new concurrent_priority_queue with init_sz capacity
- explicit concurrent_priority_queue(size_type init_capacity, const allocator_type& a = allocator_type()) : mark(0), data(a) {
+ explicit concurrent_priority_queue(size_type init_capacity, const allocator_type& a = allocator_type()) :
+ mark(0), my_size(0), data(a)
+ {
data.reserve(init_capacity);
my_aggregator.initialize_handler(my_functor_t(this));
}
//! [begin,end) constructor
template<typename InputIterator>
- concurrent_priority_queue(InputIterator begin, InputIterator end, const allocator_type& a = allocator_type()) : data(begin, end, a)
+ concurrent_priority_queue(InputIterator begin, InputIterator end, const allocator_type& a = allocator_type()) :
+ data(begin, end, a)
{
- mark = data.size();
+ mark = 0;
my_aggregator.initialize_handler(my_functor_t(this));
heapify();
+ my_size = data.size();
}
//! Copy constructor
- /** State of this queue may not reflect results of pending
- operations on the copied queue. */
- explicit concurrent_priority_queue(const concurrent_priority_queue& src) : mark(src.mark), data(src.data.begin(), src.data.end(), src.data.get_allocator())
+ /** This operation is unsafe if there are pending concurrent operations on the src queue. */
+ explicit concurrent_priority_queue(const concurrent_priority_queue& src) : mark(src.mark),
+ my_size(src.my_size), data(src.data.begin(), src.data.end(), src.data.get_allocator())
{
my_aggregator.initialize_handler(my_functor_t(this));
heapify();
}
- concurrent_priority_queue(const concurrent_priority_queue& src, const allocator_type& a) : mark(src.mark), data(src.data.begin(), src.data.end(), a)
+ //! Copy constructor with specific allocator
+ /** This operation is unsafe if there are pending concurrent operations on the src queue. */
+ concurrent_priority_queue(const concurrent_priority_queue& src, const allocator_type& a) : mark(src.mark),
+ my_size(src.my_size), data(src.data.begin(), src.data.end(), a)
{
my_aggregator.initialize_handler(my_functor_t(this));
heapify();
}
//! Assignment operator
- /** State of this queue may not reflect results of pending
- operations on the copied queue. */
+ /** This operation is unsafe if there are pending concurrent operations on the src queue. */
concurrent_priority_queue& operator=(const concurrent_priority_queue& src) {
if (this != &src) {
std::vector<value_type, allocator_type>(src.data.begin(), src.data.end(), src.data.get_allocator()).swap(data);
mark = src.mark;
+ my_size = src.my_size;
}
return *this;
}
//! Returns true if empty, false otherwise
- /** Returned value may not reflect results of pending operations. */
- bool empty() const { return data.empty(); }
+ /** Returned value may not reflect results of pending operations.
+ This operation reads shared data and will trigger a race condition. */
+ bool empty() const { return size()==0; }
//! Returns the current number of elements contained in the queue
- /** Returned value may not reflect results of pending operations. */
- size_type size() const { return data.size(); }
-
- //! Returns the current capacity (i.e. allocated storage) of the queue
- /** Returned value may not reflect results of pending operations. */
- size_type capacity() const { return data.capacity(); }
+ /** Returned value may not reflect results of pending operations.
+ This operation reads shared data and will trigger a race condition. */
+ size_type size() const { return __TBB_load_with_acquire(my_size); }
//! Pushes elem onto the queue, increasing capacity of queue if necessary
+ /** This operation can be safely used concurrently with other push, try_pop or reserve operations. */
void push(const_reference elem) {
cpq_operation op_data(elem, PUSH_OP);
my_aggregator.execute(&op_data);
@@ -138,7 +141,8 @@ class concurrent_priority_queue {
//! Gets a reference to and removes highest priority element
/** If a highest priority element was found, sets elem and returns true,
- otherwise returns false. */
+ otherwise returns false.
+ This operation can be safely used concurrently with other push, try_pop or reserve operations. */
bool try_pop(reference elem) {
cpq_operation op_data(POP_OP);
op_data.elem = &elem;
@@ -146,39 +150,29 @@ class concurrent_priority_queue {
return op_data.status==SUCCEEDED;
}
- //! If current capacity is less than new_cap, increases capacity to new_cap
- void reserve(size_type new_cap) {
- cpq_operation op_data(RESERVE_OP);
- op_data.sz = new_cap;
- my_aggregator.execute(&op_data);
- if (op_data.status == FAILED) // exception thrown
- throw_exception(eid_bad_alloc);
- }
-
//! Clear the queue; not thread-safe
- /** Resets size, effectively emptying queue; does not free space.
+ /** 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. */
void clear() {
data.clear();
mark = 0;
- }
-
- //! Shrink queue capacity to current contents; not thread-safe
- void shrink_to_fit() {
- std::vector<value_type, allocator_type>(data.begin(), data.end(), data.get_allocator()).swap(data);
+ my_size = 0;
}
//! Swap this queue with another; not thread-safe
+ /** This operation is unsafe if there are pending concurrent operations on the queue. */
void swap(concurrent_priority_queue& q) {
data.swap(q.data);
std::swap(mark, q.mark);
+ std::swap(my_size, q.my_size);
}
//! Return allocator object
allocator_type get_allocator() const { return data.get_allocator(); }
private:
- enum operation_type {INVALID_OP, PUSH_OP, POP_OP, RESERVE_OP};
+ enum operation_type {INVALID_OP, PUSH_OP, POP_OP};
enum operation_status { WAIT=0, SUCCEEDED, FAILED };
class cpq_operation : public aggregated_operation<cpq_operation> {
@@ -208,9 +202,10 @@ class concurrent_priority_queue {
char padding1[NFS_MaxLineSize - sizeof(aggregator< my_functor_t, cpq_operation >)];
//! The point at which unsorted elements begin
size_type mark;
+ __TBB_atomic size_type my_size;
Compare compare;
//! Padding added to avoid false sharing
- char padding2[NFS_MaxLineSize - sizeof(size_type) - sizeof(Compare)];
+ char padding2[NFS_MaxLineSize - (2*sizeof(size_type)) - sizeof(Compare)];
//! Storage for the heap of elements in queue, plus unheapified elements
/** data has the following structure:
@@ -222,14 +217,13 @@ class concurrent_priority_queue {
[_|...|_|_|...|_| |...| ]
0 ^ ^ ^
| | |__capacity
- | |__size
+ | |__my_size
|__mark
-
Thus, data stores the binary heap starting at position 0 through
- mark-1 (it may be empty). Then there are 0 or more elements
- that have not yet been inserted into the heap, in positions
- mark through size-1. */
+ mark-1 (it may be empty). Then there are 0 or more elements
+ that have not yet been inserted into the heap, in positions
+ mark through my_size-1. */
std::vector<value_type, allocator_type> data;
void handle_operations(cpq_operation *op_list) {
@@ -254,17 +248,20 @@ class concurrent_priority_queue {
if (tmp->type == PUSH_OP) {
__TBB_TRY {
data.push_back(*(tmp->elem));
+ __TBB_store_with_release(my_size, my_size+1);
itt_store_word_with_release(tmp->status, uintptr_t(SUCCEEDED));
} __TBB_CATCH(...) {
itt_store_word_with_release(tmp->status, uintptr_t(FAILED));
}
}
- else if (tmp->type == POP_OP) {
+ else { // tmp->type == POP_OP
+ __TBB_ASSERT(tmp->type == POP_OP, NULL);
if (mark < data.size() &&
compare(data[0], data[data.size()-1])) {
// there are newly pushed elems and the last one
// is higher than top
*(tmp->elem) = data[data.size()-1]; // copy the data
+ __TBB_store_with_release(my_size, my_size-1);
itt_store_word_with_release(tmp->status, uintptr_t(SUCCEEDED));
data.pop_back();
__TBB_ASSERT(mark<=data.size(), NULL);
@@ -274,15 +271,6 @@ class concurrent_priority_queue {
pop_list = tmp;
}
}
- else {
- __TBB_ASSERT(tmp->type == RESERVE_OP, NULL);
- __TBB_TRY {
- data.reserve(tmp->sz);
- itt_store_word_with_release(tmp->status, uintptr_t(SUCCEEDED));
- } __TBB_CATCH(...) {
- itt_store_word_with_release(tmp->status, uintptr_t(FAILED));
- }
- }
}
// second pass processes pop operations
@@ -300,11 +288,13 @@ class concurrent_priority_queue {
// there are newly pushed elems and the last one is
// higher than top
*(tmp->elem) = data[data.size()-1]; // copy the data
+ __TBB_store_with_release(my_size, my_size-1);
itt_store_word_with_release(tmp->status, uintptr_t(SUCCEEDED));
data.pop_back();
}
else { // extract top and push last element down heap
*(tmp->elem) = data[0]; // copy the data
+ __TBB_store_with_release(my_size, my_size-1);
itt_store_word_with_release(tmp->status, uintptr_t(SUCCEEDED));
reheap();
}
@@ -319,7 +309,7 @@ class concurrent_priority_queue {
//! Merge unsorted elements into heap
void heapify() {
- if (!mark) mark = 1;
+ if (!mark && data.size()>0) mark = 1;
for (; mark<data.size(); ++mark) {
// for each unheapified element under size
size_type cur_pos = mark;
diff --git a/include/tbb/concurrent_queue.h b/include/tbb/concurrent_queue.h
index 5ea6909..cc7ac33 100644
--- a/include/tbb/concurrent_queue.h
+++ b/include/tbb/concurrent_queue.h
@@ -29,7 +29,7 @@
#ifndef __TBB_concurrent_queue_H
#define __TBB_concurrent_queue_H
-#include "_concurrent_queue_internal.h"
+#include "internal/_concurrent_queue_impl.h"
namespace tbb {
@@ -48,7 +48,7 @@ class concurrent_queue: public internal::concurrent_queue_base_v3<T> {
page_allocator_type my_allocator;
//! Allocates a block of size n (bytes)
- /*overide*/ virtual void *allocate_block( size_t n ) {
+ /*override*/ virtual void *allocate_block( size_t n ) {
void *b = reinterpret_cast<void*>(my_allocator.allocate( n ));
if( !b )
internal::throw_exception(internal::eid_bad_alloc);
@@ -199,7 +199,7 @@ class concurrent_bounded_queue: public internal::concurrent_queue_base_v3 {
*static_cast<T*>(dst) = from;
}
- /*overide*/ virtual page *allocate_page() {
+ /*override*/ virtual page *allocate_page() {
size_t n = sizeof(padded_page) + (items_per_page-1)*sizeof(T);
page *p = reinterpret_cast<page*>(my_allocator.allocate( n ));
if( !p )
@@ -208,7 +208,7 @@ class concurrent_bounded_queue: public internal::concurrent_queue_base_v3 {
}
/*override*/ virtual void deallocate_page( page *p ) {
- size_t n = sizeof(padded_page) + items_per_page*sizeof(T);
+ size_t n = sizeof(padded_page) + (items_per_page-1)*sizeof(T);
my_allocator.deallocate( reinterpret_cast<char*>(p), n );
}
diff --git a/include/tbb/concurrent_unordered_map.h b/include/tbb/concurrent_unordered_map.h
index ff13c2a..e14fad0 100644
--- a/include/tbb/concurrent_unordered_map.h
+++ b/include/tbb/concurrent_unordered_map.h
@@ -32,24 +32,11 @@
#ifndef __TBB_concurrent_unordered_map_H
#define __TBB_concurrent_unordered_map_H
-#include "_concurrent_unordered_internal.h"
+#include "internal/_concurrent_unordered_impl.h"
namespace tbb
{
-// Template class for hash compare
-template<typename Key>
-class tbb_hash
-{
-public:
- tbb_hash() {}
-
- size_t operator()(const Key& key) const
- {
- return tbb_hasher(key);
- }
-};
-
namespace interface5 {
// Template class for hash map traits
@@ -90,7 +77,7 @@ protected:
hash_compare my_hash_compare; // the comparator predicate for keys
};
-template <typename Key, typename T, typename Hasher = tbb_hash<Key>, typename Key_equality = std::equal_to<Key>, typename Allocator = tbb::tbb_allocator<std::pair<const Key, T> > >
+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
diff --git a/include/tbb/concurrent_unordered_map.h b/include/tbb/concurrent_unordered_set.h
similarity index 58%
copy from include/tbb/concurrent_unordered_map.h
copy to include/tbb/concurrent_unordered_set.h
index ff13c2a..45b550e 100644
--- a/include/tbb/concurrent_unordered_map.h
+++ b/include/tbb/concurrent_unordered_set.h
@@ -29,74 +29,46 @@
/* Container implementations in this header are based on PPL implementations
provided by Microsoft. */
-#ifndef __TBB_concurrent_unordered_map_H
-#define __TBB_concurrent_unordered_map_H
+#ifndef __TBB_concurrent_unordered_set_H
+#define __TBB_concurrent_unordered_set_H
-#include "_concurrent_unordered_internal.h"
+#include "internal/_concurrent_unordered_impl.h"
namespace tbb
{
-// Template class for hash compare
-template<typename Key>
-class tbb_hash
-{
-public:
- tbb_hash() {}
-
- size_t operator()(const Key& key) const
- {
- return tbb_hasher(key);
- }
-};
-
namespace interface5 {
-// Template class for hash map traits
-template<typename Key, typename T, typename Hash_compare, typename Allocator, bool Allow_multimapping>
-class concurrent_unordered_map_traits
+// Template class for hash set traits
+template<typename Key, typename Hash_compare, typename Allocator, bool Allow_multimapping>
+class concurrent_unordered_set_traits
{
protected:
- typedef std::pair<const Key, T> value_type;
+ typedef Key value_type;
typedef Key key_type;
typedef Hash_compare hash_compare;
typedef typename Allocator::template rebind<value_type>::other allocator_type;
enum { allow_multimapping = Allow_multimapping };
- concurrent_unordered_map_traits() : my_hash_compare() {}
- concurrent_unordered_map_traits(const hash_compare& hc) : my_hash_compare(hc) {}
+ concurrent_unordered_set_traits() : my_hash_compare() {}
+ concurrent_unordered_set_traits(const hash_compare& hc) : my_hash_compare(hc) {}
- class value_compare : public std::binary_function<value_type, value_type, bool>
- {
- friend class concurrent_unordered_map_traits<Key, T, Hash_compare, Allocator, Allow_multimapping>;
-
- public:
- bool operator()(const value_type& left, const value_type& right) const
- {
- return (my_hash_compare(left.first, right.first));
- }
-
- value_compare(const hash_compare& comparator) : my_hash_compare(comparator) {}
+ typedef hash_compare value_compare;
- protected:
- hash_compare my_hash_compare; // the comparator predicate for keys
- };
-
- template<class Type1, class Type2>
- static const Key& get_key(const std::pair<Type1, Type2>& value) {
- return (value.first);
+ static const Key& get_key(const value_type& value) {
+ return value;
}
hash_compare my_hash_compare; // the comparator predicate for keys
};
-template <typename Key, typename T, typename Hasher = 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 Hasher = tbb::tbb_hash<Key>, typename Key_equality = std::equal_to<Key>, typename Allocator = tbb::tbb_allocator<Key> >
+class concurrent_unordered_set : public internal::concurrent_unordered_base< concurrent_unordered_set_traits<Key, 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 internal::concurrent_unordered_base< concurrent_unordered_set_traits<Key, hash_compare, Allocator, false> > base_type;
+ typedef concurrent_unordered_set_traits<Key, internal::hash_compare<Key, Hasher, Key_equality>, Allocator, false> traits_type;
using traits_type::my_hash_compare;
#if __TBB_EXTRA_DEBUG
public:
@@ -110,7 +82,7 @@ public:
// Type definitions
typedef Key key_type;
typedef typename base_type::value_type value_type;
- typedef T mapped_type;
+ typedef Key mapped_type;
typedef Hasher hasher;
typedef Key_equality key_equal;
typedef hash_compare key_compare;
@@ -130,18 +102,18 @@ 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(),
+ explicit concurrent_unordered_set(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(const Allocator& a) : base_type(8, key_compare(), a)
+ concurrent_unordered_set(const Allocator& a) : base_type(8, key_compare(), a)
{
}
template <typename Iterator>
- concurrent_unordered_map(Iterator first, Iterator last, size_type n_of_buckets = 8, const hasher& a_hasher = hasher(),
+ concurrent_unordered_set(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)
{
@@ -149,16 +121,16 @@ public:
base_type::insert(*first);
}
- concurrent_unordered_map(const concurrent_unordered_map& table) : base_type(table)
+ concurrent_unordered_set(const concurrent_unordered_set& table) : base_type(table)
{
}
- concurrent_unordered_map(const concurrent_unordered_map& table, const Allocator& a)
+ concurrent_unordered_set(const concurrent_unordered_set& table, const Allocator& a)
: base_type(table, a)
{
}
- concurrent_unordered_map& operator=(const concurrent_unordered_map& table)
+ concurrent_unordered_set& operator=(const concurrent_unordered_set& table)
{
base_type::operator=(table);
return (*this);
@@ -179,7 +151,7 @@ public:
return base_type::unsafe_erase(first, last);
}
- void swap(concurrent_unordered_map& table)
+ void swap(concurrent_unordered_set& table)
{
base_type::swap(table);
}
@@ -194,48 +166,12 @@ public:
{
return my_hash_compare.my_key_compare_object;
}
-
- mapped_type& operator[](const key_type& key)
- {
- iterator where = find(key);
-
- if (where == end())
- {
- where = insert(std::pair<key_type, mapped_type>(key, mapped_type())).first;
- }
-
- return ((*where).second);
- }
-
- mapped_type& at(const key_type& key)
- {
- iterator where = find(key);
-
- if (where == end())
- {
- tbb::internal::throw_exception(tbb::internal::eid_invalid_key);
- }
-
- return ((*where).second);
- }
-
- const mapped_type& at(const key_type& key) const
- {
- const_iterator where = find(key);
-
- if (where == end())
- {
- tbb::internal::throw_exception(tbb::internal::eid_invalid_key);
- }
-
- return ((*where).second);
- }
};
} // namespace interface5
-using interface5::concurrent_unordered_map;
+using interface5::concurrent_unordered_set;
} // namespace tbb
-#endif// __TBB_concurrent_unordered_map_H
+#endif// __TBB_concurrent_unordered_set_H
diff --git a/include/tbb/concurrent_vector.h b/include/tbb/concurrent_vector.h
index abcc645..2a38ff4 100644
--- a/include/tbb/concurrent_vector.h
+++ b/include/tbb/concurrent_vector.h
@@ -37,6 +37,7 @@
#include "tbb_machine.h"
#include "tbb_profiling.h"
#include <new>
+#include <cstring> // for memset()
#if !TBB_USE_EXCEPTIONS && _MSC_VER
// Suppress "C++ exception handler used, but unwind semantics are not enabled" warning in STL headers
diff --git a/include/tbb/enumerable_thread_specific.h b/include/tbb/enumerable_thread_specific.h
index c45a428..f0a2b57 100644
--- a/include/tbb/enumerable_thread_specific.h
+++ b/include/tbb/enumerable_thread_specific.h
@@ -31,6 +31,7 @@
#include "concurrent_vector.h"
#include "tbb_thread.h"
+#include "tbb_allocator.h"
#include "cache_aligned_allocator.h"
#include "aligned_space.h"
#include <string.h> // for memcpy
diff --git a/include/tbb/flow_graph.h b/include/tbb/flow_graph.h
new file mode 100644
index 0000000..98da0f5
--- /dev/null
+++ b/include/tbb/flow_graph.h
@@ -0,0 +1,1589 @@
+/*
+ Copyright 2005-2011 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_flow_graph_H
+#define __TBB_flow_graph_H
+
+#include "tbb_stddef.h"
+#include "atomic.h"
+#include "spin_mutex.h"
+#include "null_mutex.h"
+#include "spin_rw_mutex.h"
+#include "null_rw_mutex.h"
+#include "task.h"
+#include "concurrent_vector.h"
+#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"
+#else
+#include <tuple>
+#endif
+
+#include<list>
+#include<queue>
+
+/** @file
+ \brief The graph related classes and functions
+
+ 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.
+*/
+
+namespace tbb {
+namespace flow {
+
+//! An enumeration the provides the two most common concurrency levels: unlimited and serial
+enum concurrency { unlimited = 0, serial = 1 };
+
+namespace interface6 {
+
+//! The base of all graph nodes. Allows them to be stored in a collection for deletion.
+class graph_node {
+public:
+ virtual ~graph_node() {}
+};
+
+//! An empty class used for messages that mean "I'm done"
+class continue_msg {};
+
+template< typename T > class sender;
+template< typename T > class receiver;
+class continue_receiver;
+
+//! Pure virtual template class that defines a sender of messages of type T
+template< typename T >
+class sender {
+public:
+ //! The output type of this sender
+ typedef T output_type;
+
+ //! The successor type for this node
+ typedef receiver<T> successor_type;
+
+ virtual ~sender() {}
+
+ //! Add a new successor to this node
+ virtual bool register_successor( successor_type &r ) = 0;
+
+ //! Removes a successor from this node
+ virtual bool remove_successor( successor_type &r ) = 0;
+
+ //! Request an item from the sender
+ virtual bool try_get( T & ) { return false; }
+
+ //! Reserves an item in the sender
+ virtual bool try_reserve( T & ) { return false; }
+
+ //! Releases the reserved item
+ virtual bool try_release( ) { return false; }
+
+ //! Consumes the reserved item
+ virtual bool try_consume( ) { return false; }
+
+};
+
+
+//! Pure virtual template class that defines a receiver of messages of type T
+template< typename T >
+class receiver {
+public:
+
+ //! The input type of this receiver
+ typedef T input_type;
+
+ //! The predecessor type for this node
+ typedef sender<T> predecessor_type;
+
+ //! Destructor
+ virtual ~receiver() {}
+
+ //! Put an item to the receiver
+ virtual bool try_put( const T& t ) = 0;
+
+ //! 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; }
+
+};
+
+//! Base class for receivers of completion messages
+/** These receivers automatically reset, but cannot be explicitly waited on */
+class continue_receiver : public receiver< continue_msg > {
+public:
+
+ //! The input type
+ typedef continue_msg input_type;
+
+ //! The predecessor type for this node
+ typedef sender< continue_msg > predecessor_type;
+
+ //! Constructor
+ continue_receiver( int number_of_predecessors = 0 ) {
+ my_predecessor_count = my_initial_predecessor_count = number_of_predecessors;
+ my_current_count = 0;
+ }
+
+ //! Copy constructor
+ continue_receiver( const continue_receiver& src ) : receiver<continue_msg>() {
+ my_predecessor_count = my_initial_predecessor_count = src.my_initial_predecessor_count;
+ my_current_count = 0;
+ }
+
+ //! Destructor
+ virtual ~continue_receiver() { }
+
+ //! Increments the trigger threshold
+ /* override */ bool register_predecessor( predecessor_type & ) {
+ spin_mutex::scoped_lock l(my_mutex);
+ ++my_predecessor_count;
+ return true;
+ }
+
+ //! Decrements the trigger threshold
+ /** 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. */
+ /* override */ bool remove_predecessor( predecessor_type & ) {
+ spin_mutex::scoped_lock l(my_mutex);
+ --my_predecessor_count;
+ 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 & ) {
+ {
+ spin_mutex::scoped_lock l(my_mutex);
+ if ( ++my_current_count < my_predecessor_count )
+ return true;
+ else
+ my_current_count = 0;
+ }
+ execute();
+ return true;
+ }
+
+protected:
+
+ spin_mutex my_mutex;
+ int my_predecessor_count;
+ int my_current_count;
+ int my_initial_predecessor_count;
+
+ //! 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;
+
+};
+
+#include "internal/_flow_graph_impl.h"
+using namespace internal::graph_policy_namespace;
+
+//! The graph class
+/** This class serves as a handle to the graph */
+class graph : tbb::internal::no_copy {
+
+ template< typename Body >
+ class run_task : public task {
+ public:
+ run_task( Body& body ) : my_body(body) {}
+ task *execute() {
+ my_body();
+ return NULL;
+ }
+ private:
+ Body my_body;
+ };
+
+ template< typename Receiver, typename Body >
+ class run_and_put_task : public task {
+ 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;
+ }
+ private:
+ Receiver &my_receiver;
+ Body my_body;
+ };
+
+public:
+
+
+ //! Constructs a graph withy no nodes.
+ graph() : my_root_task( new ( task::allocate_root( ) ) empty_task ) {
+ my_root_task->set_ref_count(1);
+ }
+
+ //! Destroys the graph.
+ /** Calls wait_for_all on the graph, deletes all of the nodes appended by calls to add, and then
+ destroys the root task of the graph. */
+ ~graph() {
+ wait_for_all();
+ my_root_task->set_ref_count(0);
+ task::destroy( *my_root_task );
+ }
+
+
+ //! Used to register that an external entity may still interact with the graph.
+ /** The graph will not return from wait_for_all until a matching number of decrement_wait_count calls
+ is made. */
+ void increment_wait_count() {
+ if (my_root_task)
+ my_root_task->increment_ref_count();
+ }
+
+ //! Deregisters an external entity that may have interacted with the graph.
+ /** 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. */
+ void decrement_wait_count() {
+ if (my_root_task)
+ my_root_task->decrement_ref_count();
+ }
+
+ //! Spawns a task that runs a body and puts its output to a specific receiver
+ /** The task is spawned as a child of the graph. This is useful for running tasks
+ that need to block a wait_for_all() on the graph. For example a one-off source. */
+ template< typename Receiver, typename Body >
+ void run( Receiver &r, Body body ) {
+ task::enqueue( * new ( task::allocate_additional_child_of( *my_root_task ) )
+ run_and_put_task< Receiver, Body >( r, body ) );
+ }
+
+ //! Spawns a task that runs a function object
+ /** The task is spawned as a child of the graph. This is useful for running tasks
+ that need to block a wait_for_all() on the graph. For example a one-off source. */
+ template< typename Body >
+ void run( Body body ) {
+ task::enqueue( * new ( task::allocate_additional_child_of( *my_root_task ) )
+ run_task< Body >( body ) );
+ }
+
+ //! Waits until the graph is idle and the number of decrement_wait_count calls equals the number of increment_wait_count calls.
+ /** The waiting thread will go off and steal work while it is block in the wait_for_all. */
+ void wait_for_all() {
+ if (my_root_task)
+ my_root_task->wait_for_all();
+ my_root_task->set_ref_count(1);
+ }
+
+ //! Returns the root task of the graph
+ task * root_task() {
+ return my_root_task;
+ }
+
+private:
+
+ task *my_root_task;
+
+};
+
+#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 > {
+public:
+
+ //! The type of the output message, which is complete
+ typedef Output output_type;
+
+ //! The type of successors of this node
+ typedef receiver< Output > successor_type;
+
+ //! Constructor for a node with a successor
+ template< typename Body >
+ source_node( graph &g, Body body, bool is_active = true )
+ : my_root_task(g.root_task()), my_active(is_active), init_my_active(is_active),
+ my_body( new internal::source_body_leaf< output_type, Body>(body) ),
+ my_reserved(false), my_has_cached_item(false)
+ {
+ my_successors.set_owner(this);
+ }
+
+ //! Copy constructor
+ source_node( const source_node& src ) :
+ graph_node(), sender<Output>(),
+ my_root_task( src.my_root_task), my_active(src.init_my_active),
+ init_my_active(src.init_my_active), my_body( src.my_body->clone() ),
+ my_reserved(false), my_has_cached_item(false)
+ {
+ my_successors.set_owner(this);
+ }
+
+ //! The destructor
+ ~source_node() { delete my_body; }
+
+ //! Add a new successor to this node
+ /* override */ bool register_successor( receiver<output_type> &r ) {
+ spin_mutex::scoped_lock lock(my_mutex);
+ my_successors.register_successor(r);
+ if ( my_active )
+ spawn_put();
+ return true;
+ }
+
+ //! Removes a successor from this node
+ /* override */ bool remove_successor( receiver<output_type> &r ) {
+ spin_mutex::scoped_lock lock(my_mutex);
+ my_successors.remove_successor(r);
+ return true;
+ }
+
+ //! Request an item from the node
+ /*override */ bool try_get( output_type &v ) {
+ spin_mutex::scoped_lock lock(my_mutex);
+ if ( my_reserved )
+ return false;
+
+ if ( my_has_cached_item ) {
+ v = my_cached_item;
+ my_has_cached_item = false;
+ } else if ( (*my_body)(v) == false ) {
+ return false;
+ }
+ return true;
+ }
+
+ //! Reserves an item.
+ /* override */ bool try_reserve( 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;
+ }
+ }
+
+ //! Release a reserved item.
+ /** true = item has been released and so remains in sender, dest must request or reserve future items */
+ /* override */ bool try_release( ) {
+ spin_mutex::scoped_lock lock(my_mutex);
+ __TBB_ASSERT( my_reserved && my_has_cached_item, "releasing non-existent reservation" );
+ my_reserved = false;
+ spawn_put();
+ return true;
+ }
+
+ //! Consumes a reserved item
+ /* override */ bool try_consume( ) {
+ spin_mutex::scoped_lock lock(my_mutex);
+ __TBB_ASSERT( my_reserved && my_has_cached_item, "consuming non-existent reservation" );
+ my_reserved = false;
+ my_has_cached_item = false;
+ if ( !my_successors.empty() ) {
+ spawn_put();
+ }
+ return true;
+ }
+
+ //! Activates a node that was created in the inactive state
+ void activate() {
+ spin_mutex::scoped_lock lock(my_mutex);
+ my_active = true;
+ if ( !my_successors.empty() )
+ spawn_put();
+ }
+
+private:
+
+ task *my_root_task;
+ spin_mutex my_mutex;
+ bool my_active;
+ bool init_my_active;
+ internal::source_body<output_type> *my_body;
+ internal::broadcast_cache< output_type > my_successors;
+ bool my_reserved;
+ bool my_has_cached_item;
+ output_type my_cached_item;
+
+ friend class internal::source_task< source_node< output_type > >;
+
+ //! Applies the body
+ /* override */ void apply_body( ) {
+ output_type v;
+ if ( try_reserve(v) == false )
+ return;
+
+ if ( my_successors.try_put( v ) )
+ try_consume();
+ else
+ try_release();
+ }
+
+ //! 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 ) );
+ }
+
+};
+
+//! 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> {
+public:
+
+ typedef Input input_type;
+ typedef Output output_type;
+ typedef sender< input_type > predecessor_type;
+ typedef receiver< output_type > successor_type;
+ typedef internal::function_output<output_type> fOutput_type;
+
+ //! Constructor
+ template< typename Body >
+ function_node( graph &g, size_t concurrency, Body body )
+ : internal::function_input<input_type,output_type,Allocator>( g, concurrency, body ) {
+ }
+
+ //! Copy constructor
+ function_node( const function_node& src ) :
+ graph_node(), internal::function_input<input_type,output_type,Allocator>( src ),
+ fOutput_type() {}
+
+protected:
+
+ /* 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> {
+public:
+
+ typedef Input input_type;
+ typedef Output output_type;
+ typedef sender< input_type > predecessor_type;
+ typedef receiver< output_type > successor_type;
+ typedef internal::function_input<input_type,output_type,Allocator> fInput_type;
+ typedef internal::function_input_queue<input_type, Allocator> queue_type;
+ typedef internal::function_output<output_type> fOutput_type;
+
+ //! Constructor
+ template< typename Body >
+ function_node( graph &g, size_t concurrency, Body body ) : fInput_type( g, concurrency, body, new queue_type() ) {
+ }
+
+ //! Copy constructor
+ function_node( const function_node& src ) :
+ graph_node(), fInput_type( src, new queue_type() ) , fOutput_type() { }
+
+protected:
+
+ /* override */ internal::broadcast_cache<output_type> &successors () { return fOutput_type::my_successors; }
+
+};
+
+#include "tbb/internal/_flow_graph_types_impl.h"
+
+#if TBB_PREVIEW_GRAPH_NODES
+//! implements a function node that supports Input -> (set of outputs)
+// Output is a tuple of output types.
+template < typename Input, typename Output, graph_buffer_policy = queueing, typename Allocator=cache_aligned_allocator<Input> >
+class multioutput_function_node :
+ public graph_node,
+ public internal::multioutput_function_input
+ <
+ Input,
+ typename internal::wrap_tuple_elements<
+ std::tuple_size<Output>::value, // #elements in tuple
+ internal::function_output, // wrap this around each element
+ Output // the tuple providing the types
+ >::type,
+ Allocator
+ > {
+private:
+ static const int N = std::tuple_size<Output>::value;
+public:
+ typedef Input input_type;
+ typedef typename internal::wrap_tuple_elements<N,internal::function_output, Output>::type ports_type;
+private:
+ typedef typename internal::multioutput_function_input<input_type, ports_type, Allocator> base_type;
+ typedef typename internal::function_input_queue<input_type,Allocator> queue_type;
+public:
+ template<typename Body>
+ multioutput_function_node( graph &g, size_t concurrency, Body body ) : base_type(g,concurrency, body) {}
+ multioutput_function_node( const multioutput_function_node &other) :
+ graph_node(), base_type(other) {}
+ // all the guts are in multioutput_function_input...
+
+}; // multioutput_function_node
+
+template < typename Input, typename Output, typename Allocator >
+class multioutput_function_node<Input,Output,queueing,Allocator> : public graph_node, public internal::multioutput_function_input<Input,
+ typename internal::wrap_tuple_elements<std::tuple_size<Output>::value, internal::function_output, Output>::type, Allocator> {
+ static const int N = std::tuple_size<Output>::value;
+public:
+ typedef Input input_type;
+ typedef typename internal::wrap_tuple_elements<N, internal::function_output, Output>::type ports_type;
+private:
+ typedef typename internal::multioutput_function_input<input_type, ports_type, Allocator> base_type;
+ typedef typename internal::function_input_queue<input_type,Allocator> queue_type;
+public:
+
+ template<typename Body>
+ multioutput_function_node( graph &g, size_t concurrency, Body body) : base_type(g,concurrency, body, new queue_type()) {}
+ multioutput_function_node( const multioutput_function_node &other) :
+ graph_node(), base_type(other, new queue_type()) {}
+
+}; // multioutput_function_node
+
+//! split_node: accepts a tuple as input, forwards each element of the tuple to its
+// successors. The node has unlimited concurrency, so though it is marked as
+// "rejecting" it does not reject inputs.
+template<typename TupleType, typename Allocator=cache_aligned_allocator<TupleType> >
+class split_node : public multioutput_function_node<TupleType, TupleType, rejecting, Allocator> {
+ static const int N = std::tuple_size<TupleType>::value;
+ typedef multioutput_function_node<TupleType,TupleType,rejecting,Allocator> base_type;
+public:
+ typedef typename base_type::ports_type ports_type;
+private:
+
+ struct splitting_body {
+ void operator()(const TupleType& t, ports_type &p) {
+ internal::emit_element<N>::emit_this(t, p);
+ }
+ };
+public:
+ typedef TupleType input_type;
+ typedef Allocator allocator_type;
+ split_node(graph &g) : base_type(g, unlimited, splitting_body()) { }
+ split_node( const split_node & other) : base_type(other) { }
+};
+#endif // TBB_PREVIEW_GRAPH_NODES
+
+//! 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> {
+public:
+
+ typedef continue_msg input_type;
+ typedef Output output_type;
+ typedef sender< input_type > predecessor_type;
+ typedef receiver< output_type > successor_type;
+ typedef internal::function_output<output_type> fOutput_type;
+
+ //! Constructor for executable node with continue_msg -> Output
+ template <typename Body >
+ continue_node( graph &g, Body body )
+ : internal::continue_input<output_type>( g, body ) {
+ }
+
+ //! Constructor for executable node with continue_msg -> Output
+ template <typename Body >
+ continue_node( graph &g, int number_of_predecessors, Body body )
+ : internal::continue_input<output_type>( g, number_of_predecessors, body )
+ {
+ }
+
+ //! Copy constructor
+ continue_node( const continue_node& src ) :
+ graph_node(), internal::continue_input<output_type>(src),
+ internal::function_output<Output>() { }
+
+protected:
+
+ /* 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> {
+public:
+
+ typedef T input_type;
+ typedef T output_type;
+ typedef sender< input_type > predecessor_type;
+ typedef receiver< output_type > successor_type;
+
+ overwrite_node() : my_buffer_is_valid(false) {
+ my_successors.set_owner( this );
+ }
+
+ // Copy constructor; doesn't take anything from src; default won't work
+ overwrite_node( const overwrite_node& ) :
+ graph_node(), receiver<T>(), sender<T>(), my_buffer_is_valid(false) {
+ my_successors.set_owner( this );
+ }
+
+ ~overwrite_node() {}
+
+ /* override */ bool register_successor( successor_type &s ) {
+ spin_mutex::scoped_lock l( my_mutex );
+ 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
+ my_successors.register_successor( s );
+ return true;
+ } else {
+ // We don't add the successor: it rejected our put and we became its predecessor instead
+ return false;
+ }
+ } else {
+ // No valid value yet, just add as successor
+ my_successors.register_successor( s );
+ return true;
+ }
+ }
+
+ /* override */ bool remove_successor( successor_type &s ) {
+ spin_mutex::scoped_lock l( my_mutex );
+ my_successors.remove_successor(s);
+ 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 ) {
+ v = my_buffer;
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ bool is_valid() {
+ spin_mutex::scoped_lock l( my_mutex );
+ return my_buffer_is_valid;
+ }
+
+ void clear() {
+ spin_mutex::scoped_lock l( my_mutex );
+ my_buffer_is_valid = false;
+ }
+
+protected:
+
+ spin_mutex my_mutex;
+ internal::broadcast_cache< T, null_rw_mutex > my_successors;
+ T my_buffer;
+ bool my_buffer_is_valid;
+
+};
+
+template< typename T >
+class write_once_node : public overwrite_node<T> {
+public:
+
+ typedef T input_type;
+ typedef T output_type;
+ typedef sender< input_type > predecessor_type;
+ typedef receiver< output_type > successor_type;
+
+ //! Constructor
+ write_once_node() : overwrite_node<T>() {}
+
+ //! 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 ) {
+ spin_mutex::scoped_lock l( this->my_mutex );
+ if ( this->my_buffer_is_valid ) {
+ return false;
+ } else {
+ this->my_buffer = v;
+ this->my_buffer_is_valid = true;
+ this->my_successors.try_put(v);
+ return true;
+ }
+ }
+};
+
+//! Forwards messages of type T to all successors
+template <typename T>
+class broadcast_node : public graph_node, public receiver<T>, public sender<T> {
+
+ internal::broadcast_cache<T> my_successors;
+
+public:
+
+ typedef T input_type;
+ typedef T output_type;
+ typedef sender< input_type > predecessor_type;
+ typedef receiver< output_type > successor_type;
+
+ broadcast_node( ) {
+ my_successors.set_owner( this );
+ }
+
+ // Copy constructor
+ broadcast_node( const broadcast_node& ) : graph_node(), receiver<T>(), sender<T>() {
+ my_successors.set_owner( this );
+ }
+
+ //! Adds a successor
+ virtual bool register_successor( receiver<T> &r ) {
+ my_successors.register_successor( r );
+ return true;
+ }
+
+ //! Removes s as a successor
+ virtual bool remove_successor( receiver<T> &r ) {
+ my_successors.remove_successor( r );
+ return true;
+ }
+
+ /* override */ bool try_put( const T &t ) {
+ my_successors.try_put(t);
+ return true;
+ }
+
+};
+
+#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> {
+public:
+ typedef T input_type;
+ typedef T output_type;
+ typedef sender< input_type > predecessor_type;
+ typedef receiver< output_type > successor_type;
+ typedef buffer_node<T, A> my_class;
+protected:
+ typedef size_t size_type;
+ internal::round_robin_cache< T, null_rw_mutex > my_successors;
+
+ task *my_parent;
+
+ friend class internal::forward_task< 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_stat {WAIT=0, SUCCEEDED, FAILED};
+
+ // implements the aggregator_operation concept
+ class buffer_operation : public internal::aggregated_operation< buffer_operation > {
+ public:
+ char type;
+ T *elem;
+ 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) {}
+ };
+
+ bool forwarder_busy;
+ typedef internal::aggregating_functor<my_class, buffer_operation> my_handler;
+ friend class internal::aggregating_functor<my_class, buffer_operation>;
+ internal::aggregator< my_handler, buffer_operation> my_aggregator;
+
+ virtual void handle_operations(buffer_operation *op_list) {
+ buffer_operation *tmp;
+ bool try_forwarding=false;
+ while (op_list) {
+ tmp = op_list;
+ op_list = op_list->next;
+ switch (tmp->type) {
+ case reg_succ: internal_reg_succ(tmp); try_forwarding = true; break;
+ case rem_succ: internal_rem_succ(tmp); break;
+ case req_item: internal_pop(tmp); break;
+ case res_item: internal_reserve(tmp); break;
+ 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;
+ }
+ }
+ 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));
+ }
+ }
+
+ //! This is executed by an enqueued task, the "forwarder"
+ virtual void forward() {
+ buffer_operation op_data(try_fwd);
+ do {
+ op_data.status = WAIT;
+ my_aggregator.execute(&op_data);
+ } while (op_data.status == SUCCEEDED);
+ }
+
+ //! Register successor
+ virtual void internal_reg_succ(buffer_operation *op) {
+ my_successors.register_successor(*(op->r));
+ __TBB_store_with_release(op->status, SUCCEEDED);
+ }
+
+ //! Remove successor
+ virtual void internal_rem_succ(buffer_operation *op) {
+ my_successors.remove_successor(*(op->r));
+ __TBB_store_with_release(op->status, SUCCEEDED);
+ }
+
+ //! Tries to forward valid items to successors
+ virtual void internal_forward(buffer_operation *op) {
+ T i_copy;
+ bool success = false; // flagged when a successor accepts
+ 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) ) {
+ this->invalidate_back();
+ --(this->my_tail);
+ success = true; // found an accepting successor
+ }
+ --counter;
+ }
+ if (success && !counter)
+ __TBB_store_with_release(op->status, SUCCEEDED);
+ else {
+ __TBB_store_with_release(op->status, FAILED);
+ forwarder_busy = false;
+ }
+ }
+
+ virtual void internal_push(buffer_operation *op) {
+ this->push_back(*(op->elem));
+ __TBB_store_with_release(op->status, SUCCEEDED);
+ }
+
+ virtual void internal_pop(buffer_operation *op) {
+ if(this->pop_back(*(op->elem))) {
+ __TBB_store_with_release(op->status, SUCCEEDED);
+ }
+ else {
+ __TBB_store_with_release(op->status, FAILED);
+ }
+ }
+
+ virtual void internal_reserve(buffer_operation *op) {
+ if(this->reserve_front(*(op->elem))) {
+ __TBB_store_with_release(op->status, SUCCEEDED);
+ }
+ else {
+ __TBB_store_with_release(op->status, FAILED);
+ }
+ }
+
+ virtual void internal_consume(buffer_operation *op) {
+ this->consume_front();
+ __TBB_store_with_release(op->status, SUCCEEDED);
+ }
+
+ virtual void internal_release(buffer_operation *op) {
+ this->release_front();
+ __TBB_store_with_release(op->status, SUCCEEDED);
+ }
+
+public:
+ //! Constructor
+ buffer_node( graph &g ) : reservable_item_buffer<T>(),
+ my_parent( g.root_task() ), forwarder_busy(false) {
+ my_successors.set_owner(this);
+ my_aggregator.initialize_handler(my_handler(this));
+ }
+
+ //! Copy constructor
+ buffer_node( const buffer_node& src ) :
+ graph_node(), reservable_item_buffer<T>(), receiver<T>(), sender<T>(),
+ my_parent( src.my_parent ) {
+ forwarder_busy = false;
+ my_successors.set_owner(this);
+ my_aggregator.initialize_handler(my_handler(this));
+ }
+
+ virtual ~buffer_node() {}
+
+ //
+ // message sender implementation
+ //
+
+ //! Adds a new successor.
+ /** Adds successor r to the list of successors; may forward tasks. */
+ /* override */ bool register_successor( receiver<output_type> &r ) {
+ buffer_operation op_data(reg_succ);
+ op_data.r = &r;
+ my_aggregator.execute(&op_data);
+ return true;
+ }
+
+ //! Removes a successor.
+ /** Removes successor r from the list of successors.
+ It also calls r.remove_predecessor(*this) to remove this node as a predecessor. */
+ /* override */ bool remove_successor( receiver<output_type> &r ) {
+ r.remove_predecessor(*this);
+ buffer_operation op_data(rem_succ);
+ op_data.r = &r;
+ my_aggregator.execute(&op_data);
+ return true;
+ }
+
+ //! Request an item from the buffer_node
+ /** true = v contains the returned item<BR>
+ false = no item has been returned */
+ /* override */ bool try_get( T &v ) {
+ buffer_operation op_data(req_item);
+ op_data.elem = &v;
+ my_aggregator.execute(&op_data);
+ return (op_data.status==SUCCEEDED);
+ }
+
+ //! Reserves an item.
+ /** false = no item can be reserved<BR>
+ true = an item is reserved */
+ /* override */ bool try_reserve( T &v ) {
+ buffer_operation op_data(res_item);
+ op_data.elem = &v;
+ my_aggregator.execute(&op_data);
+ return (op_data.status==SUCCEEDED);
+ }
+
+ //! Release a reserved item.
+ /** true = item has been released and so remains in sender */
+ /* override */ bool try_release() {
+ buffer_operation op_data(rel_res);
+ my_aggregator.execute(&op_data);
+ return true;
+ }
+
+ //! Consumes a reserved item.
+ /** true = item is removed from sender and reservation removed */
+ /* override */ bool try_consume() {
+ buffer_operation op_data(con_res);
+ my_aggregator.execute(&op_data);
+ return true;
+ }
+
+ //! Receive an item
+ /** true is always returned */
+ /* override */ bool try_put(const T &t) {
+ buffer_operation op_data(t, put_item);
+ my_aggregator.execute(&op_data);
+ return true;
+ }
+};
+
+
+//! Forwards messages in FIFO order
+template <typename T, typename A=cache_aligned_allocator<T> >
+class queue_node : public buffer_node<T, A> {
+protected:
+typedef typename buffer_node<T, A>::size_type size_type;
+typedef typename buffer_node<T, A>::buffer_operation queue_operation;
+
+ 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();
+ if (this->my_reserved || !this->item_valid(this->my_head)){
+ __TBB_store_with_release(op->status, FAILED);
+ this->forwarder_busy = false;
+ return;
+ }
+ // 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
+ }
+ --counter;
+ }
+ if (success && !counter)
+ __TBB_store_with_release(op->status, SUCCEEDED);
+ else {
+ __TBB_store_with_release(op->status, FAILED);
+ this->forwarder_busy = false;
+ }
+ }
+
+ /* override */ void internal_pop(queue_operation *op) {
+ if ( this->my_reserved || !this->item_valid(this->my_head)){
+ __TBB_store_with_release(op->status, FAILED);
+ }
+ else {
+ this->pop_front(*(op->elem));
+ __TBB_store_with_release(op->status, SUCCEEDED);
+ }
+ }
+ /* override */ void internal_reserve(queue_operation *op) {
+ if (this->my_reserved || !this->item_valid(this->my_head)) {
+ __TBB_store_with_release(op->status, FAILED);
+ }
+ else {
+ this->my_reserved = true;
+ this->fetch_front(*(op->elem));
+ this->invalidate_front();
+ __TBB_store_with_release(op->status, SUCCEEDED);
+ }
+ }
+ /* override */ void internal_consume(queue_operation *op) {
+ this->consume_front();
+ __TBB_store_with_release(op->status, SUCCEEDED);
+ }
+
+public:
+
+ typedef T input_type;
+ typedef T output_type;
+ typedef sender< input_type > predecessor_type;
+ typedef receiver< output_type > successor_type;
+
+ //! Constructor
+ queue_node( graph &g ) : buffer_node<T, A>(g) {}
+
+ //! Copy constructor
+ queue_node( const queue_node& src) : buffer_node<T, A>(src) {}
+};
+
+//! Forwards messages in sequence order
+template< typename T, typename A=cache_aligned_allocator<T> >
+class sequencer_node : public queue_node<T, A> {
+ internal::function_body< T, size_t > *my_sequencer;
+public:
+
+ typedef T input_type;
+ typedef T output_type;
+ typedef sender< input_type > predecessor_type;
+ typedef receiver< output_type > successor_type;
+
+ //! Constructor
+ template< typename Sequencer >
+ sequencer_node( graph &g, const Sequencer& s ) : queue_node<T, A>(g),
+ my_sequencer(new internal::function_body_leaf< T, size_t, Sequencer>(s) ) {}
+
+ //! Copy constructor
+ sequencer_node( const sequencer_node& src ) : queue_node<T, A>(src),
+ my_sequencer( src.my_sequencer->clone() ) {}
+
+ //! Destructor
+ ~sequencer_node() { delete my_sequencer; }
+protected:
+ typedef typename buffer_node<T, A>::size_type size_type;
+ typedef typename buffer_node<T, A>::buffer_operation sequencer_operation;
+
+ enum op_stat {WAIT=0, SUCCEEDED, FAILED};
+
+private:
+ /* override */ void internal_push(sequencer_operation *op) {
+ size_type tag = (*my_sequencer)(*(op->elem));
+
+ this->my_tail = (tag+1 > this->my_tail) ? tag+1 : this->my_tail;
+
+ if(this->size() > this->capacity())
+ this->grow_my_array(this->size()); // tail already has 1 added to it
+ this->item(tag) = std::make_pair( *(op->elem), true );
+ __TBB_store_with_release(op->status, SUCCEEDED);
+ }
+};
+
+//! Forwards messages in priority order
+template< typename T, typename Compare = std::less<T>, typename A=cache_aligned_allocator<T> >
+class priority_queue_node : public buffer_node<T, A> {
+public:
+ typedef T input_type;
+ typedef T output_type;
+ typedef sender< input_type > predecessor_type;
+ typedef receiver< output_type > successor_type;
+
+ //! Constructor
+ priority_queue_node( graph &g ) : buffer_node<T, A>(g), mark(0) {}
+
+ //! Copy constructor
+ priority_queue_node( const priority_queue_node &src ) : buffer_node<T, A>(src), mark(0) {}
+
+protected:
+ 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;
+
+ enum op_stat {WAIT=0, SUCCEEDED, FAILED};
+
+ /* override */ void handle_operations(prio_operation *op_list) {
+ prio_operation *tmp /*, *pop_list*/ ;
+ bool try_forwarding=false;
+ while (op_list) {
+ tmp = op_list;
+ op_list = op_list->next;
+ switch (tmp->type) {
+ 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>::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;
+ case buffer_node<T, A>::res_item: internal_reserve(tmp); break;
+ }
+ }
+ // process pops! for now, no special pop processing
+ 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));
+ }
+ }
+
+ //! Tries to forward valid items to successors
+ /* override */ void internal_forward(prio_operation *op) {
+ T i_copy;
+ bool success = false; // flagged when a successor accepts
+ size_type counter = this->my_successors.size();
+
+ if (this->my_reserved || this->my_tail == 0) {
+ __TBB_store_with_release(op->status, FAILED);
+ this->forwarder_busy = false;
+ return;
+ }
+ // 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 ) {
+ 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)
+ __TBB_store_with_release(op->status, SUCCEEDED);
+ else {
+ __TBB_store_with_release(op->status, FAILED);
+ this->forwarder_busy = false;
+ }
+ }
+
+ /* override */ void internal_push(prio_operation *op) {
+ if ( this->my_tail >= this->my_array_size )
+ this->grow_my_array( this->my_tail + 1 );
+ this->my_array[this->my_tail] = std::make_pair( *(op->elem), true );
+ ++(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);
+ }
+ else {
+ if (mark<this->my_tail &&
+ compare(this->my_array[0].first,
+ this->my_array[this->my_tail-1].first)) {
+ // there are newly pushed elems; last one higher than top
+ // copy the data
+ *(op->elem) = this->my_array[this->my_tail-1].first;
+ --(this->my_tail);
+ __TBB_store_with_release(op->status, SUCCEEDED);
+ }
+ else { // extract and push the last element down heap
+ *(op->elem) = this->my_array[0].first; // copy the data
+ if (mark == this->my_tail) --mark;
+ --(this->my_tail);
+ __TBB_store_with_release(op->status, SUCCEEDED);
+ 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();
+ }
+ }
+ }
+ /* override */ void internal_reserve(prio_operation *op) {
+ if (this->my_reserved == true || this->my_tail == 0) {
+ __TBB_store_with_release(op->status, FAILED);
+ }
+ else {
+ this->my_reserved = true;
+ *(op->elem) = reserved_item = this->my_array[0].first;
+ if (mark == this->my_tail) --mark;
+ --(this->my_tail);
+ __TBB_store_with_release(op->status, SUCCEEDED);
+ 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();
+ }
+ }
+ /* override */ void internal_consume(prio_operation *op) {
+ this->my_reserved = false;
+ __TBB_store_with_release(op->status, SUCCEEDED);
+ }
+ /* override */ void internal_release(prio_operation *op) {
+ if (this->my_tail >= this->my_array_size)
+ this->grow_my_array( this->my_tail + 1 );
+ this->my_array[this->my_tail] = std::make_pair(reserved_item, true);
+ ++(this->my_tail);
+ this->my_reserved = false;
+ __TBB_store_with_release(op->status, SUCCEEDED);
+ heapify();
+ }
+private:
+ Compare compare;
+ size_type mark;
+ input_type reserved_item;
+
+ void heapify() {
+ if (!mark) mark = 1;
+ for (; mark<this->my_tail; ++mark) { // for each unheaped element
+ size_type cur_pos = mark;
+ input_type to_place = this->my_array[mark].first;
+ do { // push to_place up the heap
+ size_type parent = (cur_pos-1)>>1;
+ if (!compare(this->my_array[parent].first, to_place))
+ break;
+ this->my_array[cur_pos].first = this->my_array[parent].first;
+ cur_pos = parent;
+ } while( cur_pos );
+ this->my_array[cur_pos].first = to_place;
+ }
+ }
+
+ void reheap() {
+ size_type cur_pos=0, child=1;
+ while (child < mark) {
+ size_type target = child;
+ if (child+1<mark &&
+ compare(this->my_array[child].first,
+ this->my_array[child+1].first))
+ ++target;
+ // target now has the higher priority child
+ if (compare(this->my_array[target].first,
+ this->my_array[this->my_tail].first))
+ break;
+ this->my_array[cur_pos].first = this->my_array[target].first;
+ cur_pos = target;
+ child = (cur_pos<<1)+1;
+ }
+ this->my_array[cur_pos].first = this->my_array[this->my_tail].first;
+ }
+};
+
+//! Forwards messages only if the threshold has not been reached
+/** This node forwards items until its threshold is reached.
+ It contains no buffering. If the downstream node rejects, the
+ message is dropped. */
+template< typename T >
+class limiter_node : public graph_node, public receiver< T >, public sender< T > {
+public:
+
+ typedef T input_type;
+ typedef T output_type;
+ typedef sender< input_type > predecessor_type;
+ typedef receiver< output_type > successor_type;
+
+private:
+
+ task *my_root_task;
+ size_t my_threshold;
+ size_t my_count;
+ internal::predecessor_cache< T > my_predecessors;
+ spin_mutex my_mutex;
+ internal::broadcast_cache< T > my_successors;
+ int init_decrement_predecessors;
+
+ friend class internal::forward_task< limiter_node<T> >;
+
+ // Let decrementer call decrement_counter()
+ friend class internal::decrementer< limiter_node<T> >;
+
+ void decrement_counter() {
+ input_type v;
+
+ // 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 ) {
+ 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 ) );
+ }
+ }
+
+ void forward() {
+ {
+ spin_mutex::scoped_lock lock(my_mutex);
+ if ( my_count < my_threshold )
+ ++my_count;
+ else
+ return;
+ }
+ decrement_counter();
+ }
+
+public:
+
+ //! The internal receiver< continue_msg > that decrements the count
+ internal::decrementer< limiter_node<T> > decrement;
+
+ //! Constructor
+ limiter_node(graph &g, size_t threshold, int num_decrement_predecessors=0) :
+ my_root_task(g.root_task()), my_threshold(threshold), my_count(0),
+ init_decrement_predecessors(num_decrement_predecessors),
+ decrement(num_decrement_predecessors)
+ {
+ my_predecessors.set_owner(this);
+ my_successors.set_owner(this);
+ decrement.set_owner(this);
+ }
+
+ //! Copy constructor
+ limiter_node( const limiter_node& src ) :
+ graph_node(), receiver<T>(), sender<T>(),
+ my_root_task(src.my_root_task), my_threshold(src.my_threshold), my_count(0),
+ init_decrement_predecessors(src.init_decrement_predecessors),
+ decrement(src.init_decrement_predecessors)
+ {
+ my_predecessors.set_owner(this);
+ my_successors.set_owner(this);
+ decrement.set_owner(this);
+ }
+
+ //! Replace the current successor with this new successor
+ /* override */ bool register_successor( receiver<output_type> &r ) {
+ my_successors.register_successor(r);
+ return true;
+ }
+
+ //! Removes a successor from this node
+ /** r.remove_predecessor(*this) is also called. */
+ /* override */ bool remove_successor( receiver<output_type> &r ) {
+ r.remove_predecessor(*this);
+ my_successors.remove_successor(r);
+ return true;
+ }
+
+ //! Puts an item to this receiver
+ /* override */ bool try_put( const T &t ) {
+ {
+ spin_mutex::scoped_lock lock(my_mutex);
+ if ( my_count >= my_threshold )
+ return false;
+ else
+ ++my_count;
+ }
+
+ bool msg = my_successors.try_put(t);
+
+ if ( msg != true ) {
+ 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 ) );
+ }
+
+ return msg;
+ }
+
+ //! 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;
+ }
+
+ //! Removes src from the list of cached predecessors.
+ /* override */ bool remove_predecessor( predecessor_type &src ) {
+ my_predecessors.remove( src );
+ return true;
+ }
+
+};
+
+#include "internal/_flow_graph_join_impl.h"
+
+using internal::reserving_port;
+using internal::queueing_port;
+using internal::tag_matching_port;
+using internal::input_port;
+using internal::tag_value;
+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> {
+private:
+ static const int N = std::tuple_size<OutputTuple>::value;
+ typedef typename internal::unfolded_join_node<N, reserving_port, OutputTuple, reserving> unfolded_type;
+public:
+ typedef OutputTuple output_type;
+ typedef typename unfolded_type::input_ports_tuple_type input_ports_tuple_type;
+ join_node(graph &g) : unfolded_type(g) { }
+ join_node(const join_node &other) : unfolded_type(other) {}
+};
+
+template<typename OutputTuple>
+class join_node<OutputTuple,queueing>: public internal::unfolded_join_node<std::tuple_size<OutputTuple>::value, queueing_port, OutputTuple, queueing> {
+private:
+ static const int N = std::tuple_size<OutputTuple>::value;
+ typedef typename internal::unfolded_join_node<N, queueing_port, OutputTuple, queueing> unfolded_type;
+public:
+ typedef OutputTuple output_type;
+ typedef typename unfolded_type::input_ports_tuple_type input_ports_tuple_type;
+ join_node(graph &g) : unfolded_type(g) { }
+ join_node(const join_node &other) : unfolded_type(other) {}
+};
+
+// 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,
+ tag_matching_port, OutputTuple, tag_matching> {
+private:
+ static const int N = std::tuple_size<OutputTuple>::value;
+ typedef typename internal::unfolded_join_node<N, tag_matching_port, OutputTuple, tag_matching> unfolded_type;
+public:
+ typedef OutputTuple output_type;
+ typedef typename unfolded_type::input_ports_tuple_type input_ports_tuple_type;
+ template<typename B0, typename B1>
+ join_node(graph &g, B0 b0, B1 b1) : unfolded_type(g, b0, b1) { }
+ template<typename B0, typename B1, typename B2>
+ join_node(graph &g, B0 b0, B1 b1, B2 b2) : unfolded_type(g, b0, b1, b2) { }
+ template<typename B0, typename B1, typename B2, typename B3>
+ join_node(graph &g, B0 b0, B1 b1, B2 b2, B3 b3) : unfolded_type(g, b0, b1, b2, b3) { }
+ template<typename B0, typename B1, typename B2, typename B3, typename B4>
+ join_node(graph &g, B0 b0, B1 b1, B2 b2, B3 b3, B4 b4) : unfolded_type(g, b0, b1, b2, b3, b4) { }
+ template<typename B0, typename B1, typename B2, typename B3, typename B4, typename B5>
+ 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) { }
+ template<typename B0, typename B1, typename B2, typename B3, typename B4, typename B5, typename B6>
+ 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) { }
+ template<typename B0, typename B1, typename B2, typename B3, typename B4, typename B5, typename B6, typename B7>
+ 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) { }
+ template<typename B0, typename B1, typename B2, typename B3, typename B4, typename B5, typename B6, typename B7, typename B8>
+ 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) { }
+ template<typename B0, typename B1, typename B2, typename B3, typename B4, typename B5, typename B6, typename B7, typename B8, typename B9>
+ 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) { }
+ join_node(const join_node &other) : unfolded_type(other) {}
+};
+
+#if TBB_PREVIEW_GRAPH_NODES
+// or node
+#include "internal/_flow_graph_or_impl.h"
+
+template<typename InputTuple>
+class or_node : public internal::unfolded_or_node<InputTuple> {
+private:
+ static const int N = std::tuple_size<InputTuple>::value;
+public:
+ typedef typename internal::or_output_type<InputTuple>::type output_type;
+ typedef typename internal::unfolded_or_node<InputTuple> unfolded_type;
+ or_node() : unfolded_type() { }
+ // Copy constructor
+ or_node( const or_node& /*other*/ ) : unfolded_type() { }
+};
+#endif // TBB_PREVIEW_GRAPH_NODES
+
+//! Makes an edge between a single predecessor and a single successor
+template< typename T >
+inline void make_edge( sender<T> &p, receiver<T> &s ) {
+ p.register_successor( s );
+}
+
+//! Makes an edge between a single predecessor and a single successor
+template< typename T >
+inline void remove_edge( sender<T> &p, receiver<T> &s ) {
+ p.remove_successor( s );
+}
+
+//! Returns a copy of the body from a function or continue node
+template< typename Body, typename Node >
+Body copy_body( Node &n ) {
+ return n.template copy_function_object<Body>();
+}
+
+
+} // interface6
+
+ using interface6::graph;
+ using interface6::graph_node;
+ using interface6::continue_msg;
+ using interface6::sender;
+ using interface6::receiver;
+ using interface6::continue_receiver;
+
+ using interface6::source_node;
+ using interface6::function_node;
+#if TBB_PREVIEW_GRAPH_NODES
+ using interface6::multioutput_function_node;
+ using interface6::split_node;
+ using interface6::internal::output_port;
+ using interface6::or_node;
+#endif
+ using interface6::continue_node;
+ using interface6::overwrite_node;
+ using interface6::write_once_node;
+ using interface6::broadcast_node;
+ using interface6::buffer_node;
+ using interface6::queue_node;
+ using interface6::sequencer_node;
+ using interface6::priority_queue_node;
+ using interface6::limiter_node;
+ using namespace interface6::internal::graph_policy_namespace;
+ using interface6::join_node;
+ using interface6::input_port;
+ using interface6::copy_body;
+ using interface6::make_edge;
+ using interface6::remove_edge;
+ using interface6::internal::NO_TAG;
+ using interface6::internal::tag_value;
+
+} // flow
+} // tbb
+
+#endif // __TBB_flow_graph_H
diff --git a/include/tbb/graph.h b/include/tbb/graph.h
deleted file mode 100644
index 510741c..0000000
--- a/include/tbb/graph.h
+++ /dev/null
@@ -1,2673 +0,0 @@
-/*
- Copyright 2005-2011 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_graph_H
-#define __TBB_graph_H
-
-#if !TBB_PREVIEW_GRAPH
-#error Set TBB_PREVIEW_GRAPH to include graph.h
-#endif
-
-#include "tbb_stddef.h"
-#include "atomic.h"
-#include "spin_mutex.h"
-#include "null_mutex.h"
-#include "spin_rw_mutex.h"
-#include "null_rw_mutex.h"
-#include "task.h"
-#include "concurrent_vector.h"
-#include "_aggregator_internal.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"
-#else
-#include <tuple>
-#endif
-
-#include<list>
-#include<queue>
-
-
-/** @file
- \brief The graph related classes and functions
-
- 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.
-*/
-
-namespace tbb {
-
- //! The base of all graph nodes. Allows them to be stored in a collection for deletion.
- class graph_node {
- public:
- virtual ~graph_node() {}
- };
-
- //! An empty class used for messages that mean "I'm done"
- class continue_msg {};
-
- template< typename T > class sender;
- template< typename T > class receiver;
- class continue_receiver;
-
- //! Pure virtual template class that defines a sender of messages of type T
- template< typename T >
- class sender {
- public:
- //! The output type of this sender
- typedef T output_type;
-
- //! The successor type for this node
- typedef receiver<T> successor_type;
-
- virtual ~sender() {}
-
- //! Add a new successor to this node
- virtual bool register_successor( successor_type &r ) = 0;
-
- //! Removes a successor from this node
- virtual bool remove_successor( successor_type &r ) = 0;
-
- //! Request an item from the sender
- virtual bool try_get( T & ) { return false; }
-
- //! Reserves an item in the sender
- virtual bool try_reserve( T & ) { return false; }
-
- //! Releases the reserved item
- virtual bool try_release( ) { return false; }
-
- //! Consumes the reserved item
- virtual bool try_consume( ) { return false; }
-
- };
-
-
- //! Pure virtual template class that defines a receiver of messages of type T
- template< typename T >
- class receiver {
- public:
-
- //! The input type of this receiver
- typedef T input_type;
-
- //! The predecessor type for this node
- typedef sender<T> predecessor_type;
-
- //! Destructor
- virtual ~receiver() {}
-
- //! Put an item to the receiver
- virtual bool try_put( T t ) = 0;
-
- //! 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; }
-
- };
-
- //! Base class for receivers of completion messages
- /** These receivers automatically reset, but cannot be explicitly waited on */
- class continue_receiver : public receiver< continue_msg > {
- public:
-
- //! The input type
- typedef continue_msg input_type;
-
- //! The predecessor type for this node
- typedef sender< continue_msg > predecessor_type;
-
- //! Constructor
- continue_receiver( int number_of_predecessors = 0 ) {
- my_predecessor_count = number_of_predecessors;
- my_current_count = 0;
- }
-
- //! Destructor
- virtual ~continue_receiver() { }
-
- //! Increments the trigger threshold
- /* override */ bool register_predecessor( predecessor_type & ) {
- spin_mutex::scoped_lock l(my_mutex);
- ++my_predecessor_count;
- return true;
- }
-
- //! Decrements the trigger threshold
- /** 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. */
- /* override */ bool remove_predecessor( predecessor_type & ) {
- spin_mutex::scoped_lock l(my_mutex);
- --my_predecessor_count;
- 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( input_type ) {
- {
- spin_mutex::scoped_lock l(my_mutex);
- if ( ++my_current_count < my_predecessor_count )
- return true;
- else
- my_current_count = 0;
- }
- execute();
- return true;
- }
-
- protected:
-
- spin_mutex my_mutex;
- int my_predecessor_count;
- int my_current_count;
-
- //! 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;
-
- };
-
- //! @cond INTERNAL
- namespace internal {
-
- //! The state of an executable node
- enum node_state { node_state_idle=0, node_state_nonidle=1, node_state_inactive=2 };
-
-
- //! A functor that takes no input and generates a value of type Output
- template< typename Output >
- class source_body : no_assign {
- public:
- virtual ~source_body() {}
- virtual bool operator()(Output &output) = 0;
- };
-
- //! The leaf for source_body
- template< typename Output, typename Body>
- class source_body_leaf : public source_body<Output> {
- public:
- source_body_leaf( Body _body ) : body(_body) { }
- /*override */ bool operator()(Output &output) { return body( output ); }
- private:
- Body body;
- };
-
- //! A functor that takes an Input and generates an Output
- template< typename Input, typename Output >
- class function_body : no_assign {
- public:
- virtual ~function_body() {}
- virtual Output operator()(Input input) = 0;
- };
-
- //! the leaf for function_body
- template <typename Input, typename Output, typename B>
- class function_body_leaf : public function_body< Input, Output > {
- public:
- function_body_leaf( B _body ) : body(_body) { }
- Output operator()(Input i) { return body(i); }
-
- private:
- B body;
- };
-
- //! the leaf for function_body specialized for Input and output of continue_msg
- template <typename B>
- class function_body_leaf< continue_msg, continue_msg, B> : public function_body< continue_msg, continue_msg > {
- public:
- function_body_leaf( B _body ) : body(_body) { }
- continue_msg operator()( continue_msg i ) {
- body(i);
- return i;
- }
-
- private:
- B body;
- };
-
- //! the leaf for function_body specialized for Output of continue_msg
- template <typename Input, typename B>
- class function_body_leaf< Input, continue_msg, B> : public function_body< Input, continue_msg > {
- public:
- function_body_leaf( B _body ) : body(_body) { }
- continue_msg operator()(Input i) {
- body(i);
- return continue_msg();
- }
-
- private:
- B body;
- };
-
- //! the leaf for function_body specialized for Input of continue_msg
- template <typename Output, typename B>
- class function_body_leaf< continue_msg, Output, B > : public function_body< continue_msg, Output > {
- public:
- function_body_leaf( B _body ) : body(_body) { }
- Output operator()(continue_msg i) {
- return body(i);
- }
-
- private:
- B body;
- };
-
- //! A task that calls a node's forward function
- template< typename NodeType >
- class forward_task : public task {
-
- NodeType &my_node;
-
- public:
-
- forward_task( NodeType &n ) : my_node(n) {}
-
- task *execute() {
- my_node.forward();
- return NULL;
- }
- };
-
- //! A task that calls a node's apply_body function, passing in an input of type Input
- template< typename NodeType, typename Input >
- class apply_body_task : public task {
-
- NodeType &my_node;
- Input my_input;
-
- public:
-
- apply_body_task( NodeType &n, Input i ) : my_node(n), my_input(i) {}
-
- task *execute() {
- my_node.apply_body( my_input );
- return NULL;
- }
- };
-
- //! A task that calls a node's apply_body function with no input
- template< typename NodeType >
- class source_task : public task {
-
- NodeType &my_node;
-
- public:
-
- source_task( NodeType &n ) : my_node(n) {}
-
- task *execute() {
- my_node.apply_body( );
- return NULL;
- }
- };
-
- //! An empty functor that takes an Input and returns a default constructed Output
- template< typename Input, typename Output >
- struct empty_body {
- Output operator()( Input & ) const { return Output(); }
- };
-
- //! A node_cache maintains a std::queue of elements of type T. Each operation is protected by a lock.
- template< typename T, typename M=spin_mutex >
- class node_cache {
- public:
-
- typedef size_t size_type;
-
- bool empty() {
- typename my_mutex_type::scoped_lock lock( my_mutex );
- return internal_empty();
- }
-
- void add( T &n ) {
- typename my_mutex_type::scoped_lock lock( my_mutex );
- internal_push(n);
- }
-
- void remove( T &n ) {
- typename my_mutex_type::scoped_lock lock( my_mutex );
- for ( size_t i = internal_size(); i != 0; --i ) {
- T &s = internal_pop();
- if ( &s != &n ) {
- internal_push(s);
- }
- }
- }
-
- protected:
-
- typedef M my_mutex_type;
- my_mutex_type my_mutex;
- std::queue< T * > my_q;
-
- // Assumes lock is held
- inline bool internal_empty( ) {
- return my_q.empty();
- }
-
- // Assumes lock is held
- inline size_type internal_size( ) {
- return my_q.size();
- }
-
- // Assumes lock is held
- inline void internal_push( T &n ) {
- my_q.push(&n);
- }
-
- // Assumes lock is held
- inline T &internal_pop() {
- T *v = my_q.front();
- my_q.pop();
- return *v;
- }
-
- };
-
- //! 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:
- typedef M my_mutex_type;
- typedef T output_type;
- typedef sender<output_type> predecessor_type;
- typedef receiver<output_type> successor_type;
-
- predecessor_cache( ) : my_owner( NULL ) { }
-
- void set_owner( successor_type *owner ) { my_owner = owner; }
-
- bool get_item( output_type &v ) {
-
- bool msg = false;
-
- do {
- predecessor_type *src;
- {
- typename my_mutex_type::scoped_lock lock(this->my_mutex);
- if ( this->internal_empty() ) {
- break;
- }
- src = &this->internal_pop();
- }
-
- // Try to get from this sender
- msg = src->try_get( v );
-
- if (msg == false) {
- // Relinquish ownership of the edge
- if ( my_owner)
- src->register_successor( *my_owner );
- } else {
- // Retain ownership of the edge
- this->add(*src);
- }
- } while ( msg == false );
- return msg;
- }
-
- protected:
- successor_type *my_owner;
- };
-
- //! An cache of predecessors that supports requests and reservations
- template< typename T, typename M=spin_mutex >
- class reservable_predecessor_cache : public predecessor_cache< T, M > {
- public:
- typedef M my_mutex_type;
- typedef T output_type;
- typedef sender<T> predecessor_type;
- typedef receiver<T> successor_type;
-
- reservable_predecessor_cache( ) : reserved_src(NULL) { }
-
- bool
- try_reserve( output_type &v ) {
- bool msg = false;
-
- do {
- {
- typename my_mutex_type::scoped_lock lock(this->my_mutex);
- if ( reserved_src || this->internal_empty() )
- return false;
-
- reserved_src = &this->internal_pop();
- }
-
- // Try to get from this sender
- msg = reserved_src->try_reserve( v );
-
- if (msg == false) {
- typename my_mutex_type::scoped_lock lock(this->my_mutex);
- // Relinquish ownership of the edge
- reserved_src->register_successor( *this->my_owner );
- reserved_src = NULL;
- } else {
- // Retain ownership of the edge
- this->add( *reserved_src );
- }
- } while ( msg == false );
-
- return msg;
- }
-
- bool
- try_release( ) {
- reserved_src->try_release( );
- reserved_src = NULL;
- return true;
- }
-
- bool
- try_consume( ) {
- reserved_src->try_consume( );
- reserved_src = NULL;
- return true;
- }
-
- private:
- predecessor_type *reserved_src;
- };
-
-
- //! An abstract cache of succesors
- template<typename T, typename M=spin_rw_mutex >
- class successor_cache : no_copy {
- protected:
-
- typedef M my_mutex_type;
- my_mutex_type my_mutex;
-
- typedef std::list< receiver<T> * > my_successors_type;
- my_successors_type my_successors;
-
- sender<T> *my_owner;
-
- public:
-
- successor_cache( ) : my_owner(NULL) {}
-
- void set_owner( sender<T> *owner ) { my_owner = owner; }
-
- virtual ~successor_cache() {}
-
- void register_successor( receiver<T> &r ) {
- typename my_mutex_type::scoped_lock l(my_mutex, true);
- my_successors.push_back( &r );
- }
-
- void remove_successor( receiver<T> &r ) {
- typename my_mutex_type::scoped_lock l(my_mutex, true);
- for ( typename my_successors_type::iterator i = my_successors.begin();
- i != my_successors.end(); ++i ) {
- if ( *i == & r ) {
- my_successors.erase(i);
- break;
- }
- }
- }
-
- bool empty() {
- typename my_mutex_type::scoped_lock l(my_mutex, false);
- return my_successors.empty();
- }
-
- virtual bool try_put( T t ) = 0;
- };
-
- //! An abstract cache of succesors, specialized to continue_msg
- template<>
- class successor_cache< continue_msg > : no_copy {
- protected:
-
- typedef spin_rw_mutex my_mutex_type;
- my_mutex_type my_mutex;
-
- typedef std::list< receiver<continue_msg> * > my_successors_type;
- my_successors_type my_successors;
-
- sender<continue_msg> *my_owner;
-
- public:
-
- successor_cache( ) : my_owner(NULL) {}
-
- void set_owner( sender<continue_msg> *owner ) { my_owner = owner; }
-
- virtual ~successor_cache() {}
-
- void register_successor( receiver<continue_msg> &r ) {
- my_mutex_type::scoped_lock l(my_mutex, true);
- my_successors.push_back( &r );
- if ( my_owner )
- r.register_predecessor( *my_owner );
- }
-
- void remove_successor( receiver<continue_msg> &r ) {
- my_mutex_type::scoped_lock l(my_mutex, true);
- for ( my_successors_type::iterator i = my_successors.begin();
- i != my_successors.end(); ++i ) {
- if ( *i == & r ) {
- if ( my_owner )
- r.remove_predecessor( *my_owner );
- my_successors.erase(i);
- break;
- }
- }
- }
-
- bool empty() {
- my_mutex_type::scoped_lock l(my_mutex, false);
- return my_successors.empty();
- }
-
- virtual bool try_put( continue_msg t ) = 0;
-
- };
-
- //! A cache of successors that are broadcast to
- template<typename T, typename M=spin_rw_mutex>
- class broadcast_cache : public successor_cache<T, M> {
- typedef M my_mutex_type;
- typedef std::list< receiver<T> * > my_successors_type;
-
- public:
-
- broadcast_cache( ) {}
-
- bool try_put( T t ) {
- bool msg = false;
- 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;
- }
- }
- }
- return msg;
- }
- };
-
- //! A cache of successors that are put in a round-robin fashion
- template<typename T, typename M=spin_rw_mutex >
- class round_robin_cache : public successor_cache<T, M> {
- typedef size_t size_type;
- typedef M my_mutex_type;
- typedef std::list< receiver<T> * > my_successors_type;
-
- public:
-
- round_robin_cache( ) {}
-
- size_type size() {
- typename my_mutex_type::scoped_lock l(this->my_mutex, false);
- return this->my_successors.size();
- }
-
- bool try_put( 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;
- }
- }
- }
- return false;
- }
- };
-
- template<typename T>
- class decrementer : public continue_receiver, internal::no_copy {
-
- T *my_node;
-
- void execute() {
- my_node->decrement_counter();
- }
-
- public:
-
- typedef continue_msg input_type;
- typedef continue_msg output_type;
- decrementer( int number_of_predecessors = 0 ) : continue_receiver( number_of_predecessors ) { }
- void set_owner( T *node ) { my_node = node; }
- };
-
- }
- //! @endcond INTERNAL
-
-
- //! The graph class
- /** This class serves as a handle to the graph */
- class graph : internal::no_copy {
-
- template< typename Body >
- class run_task : public task {
- public:
- run_task( Body& body ) : my_body(body) {}
- task *execute() {
- my_body();
- return NULL;
- }
- private:
- Body my_body;
- };
-
- template< typename Receiver, typename Body >
- class run_and_put_task : public task {
- 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;
- }
- private:
- Receiver &my_receiver;
- Body my_body;
- };
-
- public:
-
- //! An enumeration the provides the two most common concurrency levels: unlimited and serial
- enum concurrency { unlimited = 0, serial = 1 };
-
- //! Constructs a graph withy no nodes.
- graph() : my_root_task( new ( task::allocate_root( ) ) empty_task ) {
- my_root_task->set_ref_count(1);
- }
-
- //! Destroys the graph.
- /** Calls wait_for_all on the graph, deletes all of the nodes appended by calls to add, and then
- destroys the root task of the graph. */
- ~graph() {
- wait_for_all();
- my_root_task->set_ref_count(0);
- task::destroy( *my_root_task );
- }
-
-
- //! Used to register that an external entity may still interact with the graph.
- /** The graph will not return from wait_for_all until a matching number of decrement_wait_count calls
- is made. */
- void increment_wait_count() {
- if (my_root_task)
- my_root_task->increment_ref_count();
- }
-
- //! Deregisters an external entity that may have interacted with the graph.
- /** 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. */
- void decrement_wait_count() {
- if (my_root_task)
- my_root_task->decrement_ref_count();
- }
-
- //! Spawns a task that runs a body and puts its output to a specific receiver
- /** The task is spawned as a child of the graph. This is useful for running tasks
- that need to block a wait_for_all() on the graph. For example a one-off source. */
- template< typename Receiver, typename Body >
- void run( Receiver &r, Body body ) {
- task::enqueue( * new ( task::allocate_additional_child_of( *my_root_task ) )
- run_and_put_task< Receiver, Body >( r, body ) );
- }
-
- //! Spawns a task that runs a function object
- /** The task is spawned as a child of the graph. This is useful for running tasks
- that need to block a wait_for_all() on the graph. For example a one-off source. */
- template< typename Body >
- void run( Body body ) {
- task::enqueue( * new ( task::allocate_additional_child_of( *my_root_task ) )
- run_task< Body >( body ) );
- }
-
- //! Waits until the graph is idle and the number of decrement_wait_count calls equals the number of increment_wait_count calls.
- /** The waiting thread will go off and steal work while it is block in the wait_for_all. */
- void wait_for_all() {
- if (my_root_task)
- my_root_task->wait_for_all();
- my_root_task->set_ref_count(1);
- }
-
- //! Returns the root task of the graph
- task * root_task() {
- return my_root_task;
- }
-
- private:
-
- task *my_root_task;
-
- };
-
-
- //! @cond INTERNAL
- namespace internal {
-
- //! Implements methods for a function node that takes a type T as input
- template< typename Input, typename Output >
- class function_input : public receiver<Input>, 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};
-
- public:
- //! The input type of this receiver
- typedef Input input_type;
- //! The output type of this receiver
- typedef Output output_type;
-
- //! Constructor for function_input
- template< typename Body >
- function_input( graph &g, size_t max_concurrency, Body& body )
- : my_root_task(g.root_task()), my_max_concurrency(max_concurrency), my_concurrency(internal::node_state_idle),
- my_body( new internal::function_body_leaf< input_type, output_type, Body>(body) ),
- forwarder_busy(false) {
- my_predecessors.set_owner(this);
- my_aggregator.initialize_handler(my_functor_t(this));
- }
-
- //! Destructor
- virtual ~function_input() { delete my_body; }
-
- //! Put to the node
- virtual bool try_put( input_type t ) {
- if ( my_max_concurrency == 0 ) {
- spawn_body_task( t );
- return true;
- } else {
- my_operation op_data(t, tryput);
- my_aggregator.execute(&op_data);
- return op_data.status == SUCCEEDED;
- }
- }
-
- //! Adds src to the list of cached predecessors.
- /* override */ bool register_predecessor( predecessor_type &src ) {
- my_operation op_data(reg_pred);
- op_data.r = &src;
- my_aggregator.execute(&op_data);
- return true;
- }
-
- //! Removes src from the list of cached predecessors.
- /* override */ bool remove_predecessor( predecessor_type &src ) {
- my_operation op_data(rem_pred);
- op_data.r = &src;
- my_aggregator.execute(&op_data);
- return true;
- }
-
- protected:
- task *my_root_task;
- const size_t my_max_concurrency;
- size_t my_concurrency;
- function_body<input_type, output_type> *my_body;
- predecessor_cache<input_type, null_mutex > my_predecessors;
-
- virtual broadcast_cache<output_type > &successors() = 0;
-
- private:
- friend class apply_body_task< function_input< input_type, output_type >, input_type >;
- friend class forward_task< function_input< input_type, output_type > >;
-
- class my_operation : public aggregated_operation< my_operation > {
- public:
- char type;
- union {
- input_type *elem;
- predecessor_type *r;
- };
- 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) {}
- };
-
- class my_functor_t {
- function_input<input_type, output_type> *fi;
- public:
- my_functor_t() {}
- my_functor_t(function_input<input_type, output_type> *fi_) : fi(fi_) {}
- void operator()(my_operation* op_list) {
- fi->handle_operations(op_list);
- }
- };
-
- bool forwarder_busy;
- aggregator< my_functor_t, my_operation > my_aggregator;
-
- void handle_operations(my_operation *op_list) {
- my_operation *tmp;
- while (op_list) {
- tmp = op_list;
- op_list = op_list->next;
- switch (tmp->type) {
- case reg_pred:
- my_predecessors.add(*(tmp->r));
- __TBB_store_with_release(tmp->status, SUCCEEDED);
- if (!forwarder_busy) {
- forwarder_busy = true;
- spawn_forward_task();
- }
- break;
- case rem_pred:
- my_predecessors.remove(*(tmp->r));
- __TBB_store_with_release(tmp->status, SUCCEEDED);
- break;
- case app_body:
- __TBB_ASSERT(my_max_concurrency != 0, NULL);
- --my_concurrency;
- __TBB_store_with_release(tmp->status, SUCCEEDED);
- if (my_concurrency<my_max_concurrency) {
- input_type i;
- if (my_predecessors.get_item(i)) {
- ++my_concurrency;
- spawn_body_task(i);
- }
- }
- break;
- case tryput: internal_try_put(tmp); break;
- case try_fwd: internal_forward(tmp); break;
- }
- }
- }
-
-
- //! Put to the node
- void internal_try_put(my_operation *op) {
- __TBB_ASSERT(my_max_concurrency != 0, NULL);
- if (my_concurrency < my_max_concurrency) {
- ++my_concurrency;
- spawn_body_task(*(op->elem));
- __TBB_store_with_release(op->status, SUCCEEDED);
- } else {
- __TBB_store_with_release(op->status, FAILED);
- }
- }
-
- //! Tries to spawn bodies if available and if concurrency allows
- void internal_forward(my_operation *op) {
- if (my_concurrency<my_max_concurrency || !my_max_concurrency) {
- input_type i;
- if (my_predecessors.get_item(i)) {
- ++my_concurrency;
- __TBB_store_with_release(op->status, SUCCEEDED);
- spawn_body_task(i);
- return;
- }
- }
- __TBB_store_with_release(op->status, FAILED);
- forwarder_busy = false;
- }
-
- //! Applies the body to the provided input
- void apply_body( input_type &i ) {
- successors().try_put( (*my_body)(i) );
- if ( my_max_concurrency != 0 ) {
- my_operation op_data(app_body);
- my_aggregator.execute(&op_data);
- }
- }
-
- //! Spawns a task that calls apply_body( input )
- inline void spawn_body_task( input_type &input ) {
- task::enqueue(*new(task::allocate_additional_child_of(*my_root_task)) apply_body_task<function_input<input_type, output_type>, input_type >(*this, input));
- }
-
- //! This is executed by an enqueued task, the "forwarder"
- void forward() {
- my_operation op_data(try_fwd);
- do {
- op_data.status = WAIT;
- my_aggregator.execute(&op_data);
- } while (op_data.status == SUCCEEDED);
- }
-
- //! Spawns a task that calls forward()
- inline void spawn_forward_task() {
- task::enqueue(*new(task::allocate_additional_child_of(*my_root_task)) forward_task<function_input<input_type, output_type> >(*this));
- }
- };
-
- //! Implements methods for an executable node that takes continue_msg as input
- template< typename Output >
- class continue_input : public continue_receiver {
- public:
-
- //! The input type of this receiver
- typedef continue_msg input_type;
-
- //! The output type of this receiver
- typedef Output output_type;
-
- template< typename Body >
- continue_input( graph &g, Body& body )
- : my_root_task(g.root_task()),
- my_body( new internal::function_body_leaf< input_type, output_type, Body>(body) ) { }
-
- template< typename Body >
- continue_input( graph &g, int number_of_predecessors, Body& body )
- : continue_receiver( number_of_predecessors ), my_root_task(g.root_task()),
- my_body( new internal::function_body_leaf< input_type, output_type, Body>(body) ) { }
-
- protected:
-
- task *my_root_task;
- function_body<input_type, output_type> *my_body;
-
- virtual broadcast_cache<output_type > &successors() = 0;
-
- friend class apply_body_task< 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() ) );
- }
-
- //! 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() ) );
- }
- };
-
- //! Implements methods for both executable and function nodes that puts Output to its successors
- template< typename Output >
- class function_output : public sender<Output> {
- public:
-
- typedef Output output_type;
-
- function_output() { }
-
- //! Adds a new successor to this node
- /* override */ bool register_successor( receiver<output_type> &r ) {
- successors().register_successor( r );
- return true;
- }
-
- //! Removes a successor from this node
- /* override */ bool remove_successor( receiver<output_type> &r ) {
- successors().remove_successor( r );
- return true;
- }
-
- protected:
-
- virtual broadcast_cache<output_type > &successors() = 0;
-
- };
-
- }
- //! @endcond INTERNAL
-
- //! 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 > {
- public:
-
- //! The type of the output message, which is complete
- typedef Output output_type;
-
- //! The type of successors of this node
- typedef receiver< Output > successor_type;
-
- //! Constructor for a node with a successor
- template< typename Body >
- source_node( graph &g, Body body, bool is_active = true )
- : my_root_task(g.root_task()), my_state( is_active ? internal::node_state_idle : internal::node_state_inactive ),
- my_body( new internal::source_body_leaf< output_type, Body>(body) ),
- my_reserved(false), my_has_cached_item(false) {
- my_successors.set_owner(this);
- }
-
- //! The destructor
- ~source_node() { delete my_body; }
-
- //! Add a new successor to this node
- /* override */ bool register_successor( receiver<output_type> &r ) {
- spin_mutex::scoped_lock lock(my_mutex);
- my_successors.register_successor(r);
- if ( my_state != internal::node_state_inactive )
- spawn_put();
- return true;
- }
-
- //! Removes a successor from this node
- /* override */ bool remove_successor( receiver<output_type> &r ) {
- spin_mutex::scoped_lock lock(my_mutex);
- my_successors.remove_successor(r);
- return true;
- }
-
- //! Request an item from the node
- /*override */ bool try_get( output_type &v ) {
- spin_mutex::scoped_lock lock(my_mutex);
- if ( my_reserved )
- return false;
-
- if ( my_has_cached_item ) {
- v = my_cached_item;
- my_has_cached_item = false;
- } else if ( (*my_body)(v) == false ) {
- return false;
- }
- return true;
- }
-
- //! Reserves an item.
- /* override */ bool try_reserve( 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;
- }
- }
-
- //! Release a reserved item.
- /** true = item has been released and so remains in sender, dest must request or reserve future items */
- /* override */ bool try_release( ) {
- spin_mutex::scoped_lock lock(my_mutex);
- __TBB_ASSERT( my_reserved && my_has_cached_item, "releasing non-existent reservation" );
- my_reserved = false;
- spawn_put();
- return true;
- }
-
- //! Consumes a reserved item
- /* override */ bool try_consume( ) {
- spin_mutex::scoped_lock lock(my_mutex);
- __TBB_ASSERT( my_reserved && my_has_cached_item, "consuming non-existent reservation" );
- my_reserved = false;
- my_has_cached_item = false;
- if ( !my_successors.empty() ) {
- spawn_put();
- }
- return true;
- }
-
- //! Activates a node that was created in the inactive state
- void activate() {
- spin_mutex::scoped_lock lock(my_mutex);
- my_state = internal::node_state_idle;
- if ( !my_successors.empty() )
- spawn_put();
- }
-
- private:
-
- task *my_root_task;
- spin_mutex my_mutex;
- internal::node_state my_state;
- internal::source_body<output_type> *my_body;
- internal::broadcast_cache< output_type > my_successors;
- bool my_reserved;
- bool my_has_cached_item;
- output_type my_cached_item;
-
- friend class internal::source_task< source_node< output_type > >;
-
- //! Applies the body
- /* override */ void apply_body( ) {
- output_type v;
- if ( try_reserve(v) == false )
- return;
-
- if ( my_successors.try_put( v ) )
- try_consume();
- else
- try_release();
- }
-
- //! 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 ) );
- }
-
- };
-
- //! Implements a function node that supports Input -> Output
- template <typename Input, typename Output = continue_msg >
- class function_node : public graph_node, public internal::function_input<Input,Output>, public internal::function_output<Output> {
- public:
-
- typedef Input input_type;
- typedef Output output_type;
- typedef sender< input_type > predecessor_type;
- typedef receiver< output_type > successor_type;
-
- //! Constructor
- template< typename Body >
- function_node( graph &g, size_t concurrency, Body body )
- : internal::function_input<input_type,output_type>( g, concurrency, body ) {
- my_successors.set_owner(this);
- }
-
- protected:
-
- internal::broadcast_cache<output_type> my_successors;
- /* override */ internal::broadcast_cache<output_type> &successors () { return my_successors; }
-
- };
-
- //! Implements an executable node that supports continue_msg -> Output
- template <typename Output>
- class executable_node : public graph_node, public internal::continue_input<Output>, public internal::function_output<Output> {
- public:
-
- typedef continue_msg input_type;
- typedef Output output_type;
- typedef sender< input_type > predecessor_type;
- typedef receiver< output_type > successor_type;
-
- //! Constructor for executable node with continue_msg -> Output
- template <typename Body >
- executable_node( graph &g, Body body )
- : internal::continue_input<output_type>( g, body ) {
- my_successors.set_owner(this);
- }
-
- //! Constructor for executable node with continue_msg -> Output
- template <typename Body >
- executable_node( graph &g, int number_of_predecessors, Body body )
- : internal::continue_input<output_type>( g, number_of_predecessors, body ) {
- my_successors.set_owner(this);
- }
-
- protected:
-
- internal::broadcast_cache<output_type> my_successors;
- /* override */ internal::broadcast_cache<output_type> &successors () { return my_successors; }
-
- };
-
-
-
- template< typename T >
- class overwrite_node : public graph_node, public receiver<T>, public sender<T>, internal::no_copy {
- public:
-
- typedef T input_type;
- typedef T output_type;
- typedef sender< input_type > predecessor_type;
- typedef receiver< output_type > successor_type;
-
- overwrite_node() : my_buffer_is_valid(false) {
- my_successors.set_owner( this );
- }
-
- ~overwrite_node() {}
-
- /* override */ bool register_successor( successor_type &s ) {
- spin_mutex::scoped_lock l( my_mutex );
- 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
- my_successors.register_successor( s );
- return true;
- } else {
- // We don't add the successor: it rejected our put and we became its predecessor instead
- return false;
- }
- } else {
- // No valid value yet, just add as successor
- my_successors.register_successor( s );
- return true;
- }
- }
-
- /* override */ bool remove_successor( successor_type &s ) {
- spin_mutex::scoped_lock l( my_mutex );
- my_successors.remove_successor(s);
- return true;
- }
-
- /* override */ bool try_put( 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 ) {
- v = my_buffer;
- return true;
- } else {
- return false;
- }
- }
-
- bool is_valid() {
- spin_mutex::scoped_lock l( my_mutex );
- return my_buffer_is_valid;
- }
-
- void clear() {
- spin_mutex::scoped_lock l( my_mutex );
- my_buffer_is_valid = false;
- }
-
- protected:
-
- spin_mutex my_mutex;
- internal::broadcast_cache< T, null_rw_mutex > my_successors;
- T my_buffer;
- bool my_buffer_is_valid;
-
- };
-
- template< typename T >
- class write_once_node : public overwrite_node<T> {
- public:
-
- typedef T input_type;
- typedef T output_type;
- typedef sender< input_type > predecessor_type;
- typedef receiver< output_type > successor_type;
-
- /* override */ bool try_put( T v ) {
- spin_mutex::scoped_lock l( this->my_mutex );
- if ( this->my_buffer_is_valid ) {
- return false;
- } else {
- this->my_buffer = v;
- this->my_buffer_is_valid = true;
- this->my_successors.try_put(v);
- return true;
- }
- }
- };
-
- //! Broadcasts completion message when it receives completion messages from all predecessors. Then resets.
- /** Is equivalent to an executable_node< continue_msg > with an empty_body */
- class continue_node : public executable_node< continue_msg > {
- public:
-
- typedef continue_msg input_type;
- typedef continue_msg output_type;
- typedef sender< input_type > predecessor_type;
- typedef receiver< output_type > successor_type;
-
- continue_node( graph &g ) : executable_node<continue_msg>( g, internal::empty_body< continue_msg, continue_msg>() ) {}
- };
-
- //! Forwards messages of type T to all successors
- template <typename T>
- class broadcast_node : public graph_node, public receiver<T>, public sender<T>, internal::no_copy {
-
- internal::broadcast_cache<T> my_successors;
-
- public:
-
- typedef T input_type;
- typedef T output_type;
- typedef sender< input_type > predecessor_type;
- typedef receiver< output_type > successor_type;
-
- broadcast_node( ) {
- my_successors.set_owner( this );
- }
-
- //! Adds a successor
- virtual bool register_successor( receiver<T> &r ) {
- my_successors.register_successor( r );
- return true;
- }
-
- //! Removes s as a successor
- virtual bool remove_successor( receiver<T> &r ) {
- my_successors.remove_successor( r );
- return true;
- }
-
- /* override */ bool try_put( T t ) {
- my_successors.try_put(t);
- return true;
- }
-
- };
-
-
- //! Forwards messages in arbitrary order
- template <typename T>
- class buffer_node : public graph_node, public receiver<T>, public sender<T>, internal::no_copy {
- public:
- typedef T input_type;
- typedef T output_type;
- typedef sender< input_type > predecessor_type;
- typedef receiver< output_type > successor_type;
- protected:
- typedef size_t size_type;
- typedef std::pair< T, bool > item_type;
-
- internal::round_robin_cache< T, null_rw_mutex > my_successors;
-
- task *my_parent;
- item_type *my_array;
- size_type my_array_size;
- static const size_type initial_buffer_size = 4;
- size_type my_head;
- size_type my_tail;
- spin_mutex my_mutex;
- bool my_reserved;
- size_type my_reserved_id;
-
- friend class internal::forward_task< buffer_node< T > >;
-
- enum op_type {reg_succ, rem_succ, req_item, res_item, rel_res, con_res, put_item, try_fwd};
- enum op_stat {WAIT=0, SUCCEEDED, FAILED};
-
- // implements the aggregator_operation concept
- class buffer_operation : public internal::aggregated_operation< buffer_operation > {
- public:
- char type;
- T *elem;
- 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) {}
- };
-
- class my_functor_t {
- buffer_node<T> *bfr;
- public:
- my_functor_t(buffer_node<T> *bfr_) : bfr(bfr_) {}
- my_functor_t() {}
- void operator()(buffer_operation* op_list) {
- bfr->handle_operations(op_list);
- }
- };
-
- bool forwarder_busy;
- internal::aggregator< my_functor_t, buffer_operation> my_aggregator;
-
- virtual void handle_operations(buffer_operation *op_list) {
- buffer_operation *tmp;
- bool try_forwarding=false;
- while (op_list) {
- tmp = op_list;
- op_list = op_list->next;
- switch (tmp->type) {
- case reg_succ: internal_reg_succ(tmp); try_forwarding = true; break;
- case rem_succ: internal_rem_succ(tmp); break;
- case req_item: internal_pop(tmp); break;
- case res_item: internal_reserve(tmp); break;
- 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;
- }
- }
- 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> >(*this));
- }
- }
-
- //! This is executed by an enqueued task, the "forwarder"
- virtual void forward() {
- buffer_operation op_data(try_fwd);
- do {
- op_data.status = WAIT;
- my_aggregator.execute(&op_data);
- } while (op_data.status == SUCCEEDED);
- }
-
- //! Register successor
- virtual void internal_reg_succ(buffer_operation *op) {
- my_successors.register_successor(*(op->r));
- __TBB_store_with_release(op->status, SUCCEEDED);
- }
-
- //! Remove successor
- virtual void internal_rem_succ(buffer_operation *op) {
- my_successors.remove_successor(*(op->r));
- __TBB_store_with_release(op->status, SUCCEEDED);
- }
-
- //! Tries to forward valid items to successors
- virtual void internal_forward(buffer_operation *op) {
- T i_copy;
- bool success = false; // flagged when a successor accepts
- size_type counter = my_successors.size();
- // Try forwarding, giving each successor a chance
- while (counter>0 && my_tail>my_head && my_array[ (my_tail-1) & (my_array_size-1)].second == true ) {
- i_copy = my_array[ (my_tail-1) & (my_array_size-1)].first;
- bool msg = my_successors.try_put(i_copy);
- if ( msg == true ) {
- my_array[ (my_tail-1) & (my_array_size-1)].second = false;
- --my_tail;
- success = true; // found an accepting successor
- }
- --counter;
- }
- if (success && !counter)
- __TBB_store_with_release(op->status, SUCCEEDED);
- else {
- __TBB_store_with_release(op->status, FAILED);
- forwarder_busy = false;
- }
- }
-
- virtual void internal_push(buffer_operation *op) {
- while( my_tail-my_head >= my_array_size ) {
- grow_my_array( my_tail - my_head + 1 );
- }
- my_array[my_tail&(my_array_size-1)] = std::make_pair( *(op->elem), true );
- ++my_tail;
- __TBB_store_with_release(op->status, SUCCEEDED);
- }
- virtual void internal_pop(buffer_operation *op) {
- if ( my_array[(my_tail-1) & (my_array_size-1)].second == false ) {
- __TBB_store_with_release(op->status, FAILED);
- }
- else {
- *(op->elem) = my_array[(my_tail-1) & (my_array_size-1)].first;
- my_array[(my_tail-1) & (my_array_size-1)].second = false;
- --my_tail;
- __TBB_store_with_release(op->status, SUCCEEDED);
- }
- }
- virtual void internal_reserve(buffer_operation *op) {
- if (my_reserved == true || my_array[ my_head & (my_array_size-1)].second == false ) {
- __TBB_store_with_release(op->status, FAILED);
- }
- else {
- my_reserved = true;
- *(op->elem) = my_array[ my_head & (my_array_size-1)].first;
- my_array[ my_head & (my_array_size-1)].second = false;
- __TBB_store_with_release(op->status, SUCCEEDED);
- }
- }
- virtual void internal_consume(buffer_operation *op) {
- my_reserved = false;
- ++my_head;
- __TBB_store_with_release(op->status, SUCCEEDED);
- }
-
- virtual void internal_release(buffer_operation *op) {
- my_array[my_head&(my_array_size-1)].second = true;
- my_reserved = false;
- __TBB_store_with_release(op->status, SUCCEEDED);
- }
-
- //! Grows the internal array
- void grow_my_array( size_t minimum_size ) {
- size_type old_size = my_array_size;
- size_type new_size = old_size ? 2*old_size : initial_buffer_size;
- while( new_size<minimum_size )
- new_size*=2;
-
- item_type* new_array = cache_aligned_allocator<item_type>().allocate(new_size);
- item_type* old_array = my_array;
-
- for( size_type i=0; i<new_size; ++i )
- new_array[i].second = false;
-
- size_t t=my_head;
- for( size_type i=0; i<old_size; ++i, ++t )
- new_array[t&(new_size-1)] = old_array[t&(old_size-1)];
- my_array = new_array;
- my_array_size = new_size;
- if( old_array )
- cache_aligned_allocator<item_type>().deallocate(old_array,old_size);
- }
-
- public:
- //! Constructor
- buffer_node( graph &g ) :
- my_parent( g.root_task() ), my_array(NULL), my_array_size(0),
- my_head(0), my_tail(0), my_reserved(false), forwarder_busy(false) {
- my_successors.set_owner(this);
- my_aggregator.initialize_handler(my_functor_t(this));
- grow_my_array(initial_buffer_size);
- }
-
- virtual ~buffer_node() {}
-
- //
- // message sender implementation
- //
-
- //! Adds a new successor.
- /** Adds successor r to the list of successors; may forward tasks. */
- /* override */ bool register_successor( receiver<output_type> &r ) {
- buffer_operation op_data(reg_succ);
- op_data.r = &r;
- my_aggregator.execute(&op_data);
- return true;
- }
-
- //! Removes a successor.
- /** Removes successor r from the list of successors.
- It also calls r.remove_predecessor(*this) to remove this node as a predecessor. */
- /* override */ bool remove_successor( receiver<output_type> &r ) {
- r.remove_predecessor(*this);
- buffer_operation op_data(rem_succ);
- op_data.r = &r;
- my_aggregator.execute(&op_data);
- return true;
- }
-
- //! Request an item from the buffer_node
- /** true = v contains the returned item<BR>
- false = no item has been returned */
- /* override */ bool try_get( T &v ) {
- buffer_operation op_data(req_item);
- op_data.elem = &v;
- my_aggregator.execute(&op_data);
- return (op_data.status==SUCCEEDED);
- }
-
- //! Reserves an item.
- /** false = no item can be reserved<BR>
- true = an item is reserved */
- /* override */ bool try_reserve( T &v ) {
- buffer_operation op_data(res_item);
- op_data.elem = &v;
- my_aggregator.execute(&op_data);
- return (op_data.status==SUCCEEDED);
- }
-
- //! Release a reserved item.
- /** true = item has been released and so remains in sender */
- /* override */ bool try_release() {
- buffer_operation op_data(rel_res);
- my_aggregator.execute(&op_data);
- return true;
- }
-
- //! Consumes a reserved item.
- /** true = item is removed from sender and reservation removed */
- /* override */ bool try_consume() {
- buffer_operation op_data(con_res);
- my_aggregator.execute(&op_data);
- return true;
- }
-
- //! Receive an item
- /** true is always returned */
- /* override */ bool try_put(T t) {
- buffer_operation op_data(t, put_item);
- my_aggregator.execute(&op_data);
- return true;
- }
- };
-
-
- //! Forwards messages in FIFO order
- template <typename T>
- class queue_node : public buffer_node<T> {
- protected:
- typedef typename buffer_node<T>::size_type size_type;
- typedef typename buffer_node<T>::buffer_operation queue_operation;
-
- 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();
- if (this->my_reserved || this->my_array[ this->my_head & (this->my_array_size-1)].second == false) {
- __TBB_store_with_release(op->status, FAILED);
- this->forwarder_busy = false;
- return;
- }
- // Keep trying to send items while there is at least one accepting successor
- while (counter>0 && this->my_array[ this->my_head & (this->my_array_size-1)].second == true ) {
- i_copy = this->my_array[ this->my_head & (this->my_array_size-1)].first;
- bool msg = this->my_successors.try_put(i_copy);
- if ( msg == true ) {
- this->my_array[ this->my_head & (this->my_array_size-1)].second = false;
- ++(this->my_head);
- success = true; // found an accepting successor
- }
- --counter;
- }
- if (success && !counter)
- __TBB_store_with_release(op->status, SUCCEEDED);
- else {
- __TBB_store_with_release(op->status, FAILED);
- this->forwarder_busy = false;
- }
- }
-
- /* override */ void internal_pop(queue_operation *op) {
- if ( this->my_reserved == true || this->my_array[ this->my_head & (this->my_array_size-1)].second == false ) {
- __TBB_store_with_release(op->status, FAILED);
- }
- else {
- *(op->elem) = this->my_array[ this->my_head & (this->my_array_size-1)].first;
- this->my_array[ this->my_head & (this->my_array_size-1)].second = false;
- ++(this->my_head);
- __TBB_store_with_release(op->status, SUCCEEDED);
- }
- }
- /* override */ void internal_reserve(queue_operation *op) {
- if (this->my_reserved == true || this->my_array[ this->my_head & (this->my_array_size-1)].second == false ) {
- __TBB_store_with_release(op->status, FAILED);
- }
- else {
- this->my_reserved = true;
- *(op->elem) = this->my_array[ this->my_head & (this->my_array_size-1)].first;
- __TBB_store_with_release(op->status, SUCCEEDED);
- }
- }
- /* override */ void internal_consume(queue_operation *op) {
- this->my_reserved = false;
- this->my_array[ this->my_head & (this->my_array_size-1)].second = false;
- ++(this->my_head);
- __TBB_store_with_release(op->status, SUCCEEDED);
- }
-
- public:
-
- typedef T input_type;
- typedef T output_type;
- typedef sender< input_type > predecessor_type;
- typedef receiver< output_type > successor_type;
-
- //! Constructor
- queue_node( graph &g ) : buffer_node<T>(g) {}
- };
-
- //! Forwards messages in sequence order
- template< typename T >
- class sequencer_node : public queue_node<T> {
- internal::function_body< T, size_t > *my_sequencer;
- public:
-
- typedef T input_type;
- typedef T output_type;
- typedef sender< input_type > predecessor_type;
- typedef receiver< output_type > successor_type;
-
- //! Constructor
- template< typename Sequencer >
- sequencer_node( graph &g, const Sequencer& s ) : queue_node<T>(g),
- my_sequencer(new internal::function_body_leaf< T, size_t, Sequencer>(s) ) {}
-
- //! Destructor
- ~sequencer_node() { delete my_sequencer; }
- protected:
- typedef typename buffer_node<T>::size_type size_type;
- typedef typename buffer_node<T>::buffer_operation sequencer_operation;
-
- enum op_stat {WAIT=0, SUCCEEDED, FAILED};
-
- private:
- /* override */ void internal_push(sequencer_operation *op) {
- size_type tag = (*my_sequencer)(*(op->elem));
-
- this->my_tail = (tag+1 > this->my_tail) ? tag+1 : this->my_tail;
- while ( this->my_tail - this->my_head >= this->my_array_size ) {
- this->grow_my_array( this->my_tail - this->my_head + 1);
- }
- this->my_array[tag&(this->my_array_size-1)] = std::make_pair( *(op->elem), true );
- __TBB_store_with_release(op->status, SUCCEEDED);
- }
- };
-
- //! Forwards messages in priority order
- template< typename T, typename Compare = std::less<T> >
- class priority_queue_node : public buffer_node<T> {
- public:
- typedef T input_type;
- typedef T output_type;
- typedef sender< input_type > predecessor_type;
- typedef receiver< output_type > successor_type;
-
- //! Constructor
- priority_queue_node( graph &g ) : buffer_node<T>(g), mark(0) {}
-
- protected:
- typedef typename buffer_node<T>::size_type size_type;
- typedef typename buffer_node<T>::item_type item_type;
- typedef typename buffer_node<T>::buffer_operation prio_operation;
-
- enum op_stat {WAIT=0, SUCCEEDED, FAILED};
-
- /* override */ void handle_operations(prio_operation *op_list) {
- prio_operation *tmp /*, *pop_list*/ ;
- bool try_forwarding=false;
- while (op_list) {
- tmp = op_list;
- op_list = op_list->next;
- switch (tmp->type) {
- case buffer_node<T>::reg_succ: this->internal_reg_succ(tmp); try_forwarding = true; break;
- case buffer_node<T>::rem_succ: this->internal_rem_succ(tmp); break;
- case buffer_node<T>::put_item: internal_push(tmp); try_forwarding = true; break;
- case buffer_node<T>::try_fwd: internal_forward(tmp); break;
- case buffer_node<T>::rel_res: internal_release(tmp); try_forwarding = true; break;
- case buffer_node<T>::con_res: internal_consume(tmp); try_forwarding = true; break;
- case buffer_node<T>::req_item: internal_pop(tmp); break;
- case buffer_node<T>::res_item: internal_reserve(tmp); break;
- }
- }
- // process pops! for now, no special pop processing
- 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> >(*this));
- }
- }
-
- //! Tries to forward valid items to successors
- /* override */ void internal_forward(prio_operation *op) {
- T i_copy;
- bool success = false; // flagged when a successor accepts
- size_type counter = this->my_successors.size();
-
- if (this->my_reserved || this->my_tail == 0) {
- __TBB_store_with_release(op->status, FAILED);
- this->forwarder_busy = false;
- return;
- }
- // 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 ) {
- 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)
- __TBB_store_with_release(op->status, SUCCEEDED);
- else {
- __TBB_store_with_release(op->status, FAILED);
- this->forwarder_busy = false;
- }
- }
-
- /* override */ void internal_push(prio_operation *op) {
- if ( this->my_tail >= this->my_array_size )
- this->grow_my_array( this->my_tail + 1 );
- this->my_array[this->my_tail] = std::make_pair( *(op->elem), true );
- ++(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);
- }
- else {
- if (mark<this->my_tail &&
- compare(this->my_array[0].first,
- this->my_array[this->my_tail-1].first)) {
- // there are newly pushed elems; last one higher than top
- // copy the data
- *(op->elem) = this->my_array[this->my_tail-1].first;
- --(this->my_tail);
- __TBB_store_with_release(op->status, SUCCEEDED);
- }
- else { // extract and push the last element down heap
- *(op->elem) = this->my_array[0].first; // copy the data
- if (mark == this->my_tail) --mark;
- --(this->my_tail);
- __TBB_store_with_release(op->status, SUCCEEDED);
- 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();
- }
- }
- }
- /* override */ void internal_reserve(prio_operation *op) {
- if (this->my_reserved == true || this->my_tail == 0) {
- __TBB_store_with_release(op->status, FAILED);
- }
- else {
- this->my_reserved = true;
- *(op->elem) = reserved_item = this->my_array[0].first;
- if (mark == this->my_tail) --mark;
- --(this->my_tail);
- __TBB_store_with_release(op->status, SUCCEEDED);
- 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();
- }
- }
- /* override */ void internal_consume(prio_operation *op) {
- this->my_reserved = false;
- __TBB_store_with_release(op->status, SUCCEEDED);
- }
- /* override */ void internal_release(prio_operation *op) {
- if (this->my_tail >= this->my_array_size)
- this->grow_my_array( this->my_tail + 1 );
- this->my_array[this->my_tail] = std::make_pair(reserved_item, true);
- ++(this->my_tail);
- this->my_reserved = false;
- __TBB_store_with_release(op->status, SUCCEEDED);
- heapify();
- }
- private:
- Compare compare;
- size_type mark;
- input_type reserved_item;
-
- void heapify() {
- if (!mark) mark = 1;
- for (; mark<this->my_tail; ++mark) { // for each unheaped element
- size_type cur_pos = mark;
- input_type to_place = this->my_array[mark].first;
- do { // push to_place up the heap
- size_type parent = (cur_pos-1)>>1;
- if (!compare(this->my_array[parent].first, to_place))
- break;
- this->my_array[cur_pos].first = this->my_array[parent].first;
- cur_pos = parent;
- } while( cur_pos );
- this->my_array[cur_pos].first = to_place;
- }
- }
-
- void reheap() {
- size_type cur_pos=0, child=1;
- while (child < mark) {
- size_type target = child;
- if (child+1<mark &&
- compare(this->my_array[child].first,
- this->my_array[child+1].first))
- ++target;
- // target now has the higher priority child
- if (compare(this->my_array[target].first,
- this->my_array[this->my_tail].first))
- break;
- this->my_array[cur_pos].first = this->my_array[target].first;
- cur_pos = target;
- child = (cur_pos<<1)+1;
- }
- this->my_array[cur_pos].first = this->my_array[this->my_tail].first;
- }
- };
-
- //! Forwards messages only if the threshold has not been reached
- /** This node forwards items until its threshold is reached.
- It contains no buffering. If the downstream node rejects, the
- message is dropped. */
- template< typename T >
- class limiter_node : public graph_node, public receiver< T >, public sender< T >, internal::no_copy {
- public:
-
- typedef T input_type;
- typedef T output_type;
- typedef sender< input_type > predecessor_type;
- typedef receiver< output_type > successor_type;
-
- private:
-
- task *my_root_task;
- size_t my_threshold;
- size_t my_count;
- internal::predecessor_cache< T > my_predecessors;
- spin_mutex my_mutex;
- internal::broadcast_cache< T > my_successors;
-
- friend class internal::forward_task< limiter_node<T> >;
-
- // Let decrementer call decrement_counter()
- friend class internal::decrementer< limiter_node<T> >;
-
- void decrement_counter() {
- input_type v;
-
- // 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 ) {
- 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 ) );
- }
- }
-
- void forward() {
- {
- spin_mutex::scoped_lock lock(my_mutex);
- if ( my_count < my_threshold )
- ++my_count;
- else
- return;
- }
- decrement_counter();
- }
-
- public:
-
- //! The internal receiver< continue_msg > that decrements the count
- internal::decrementer< limiter_node<T> > decrement;
-
- //! Constructor
- limiter_node( graph &g, size_t threshold, int number_of_decrement_predecessors = 0 ) :
- my_root_task(g.root_task()), my_threshold(threshold), my_count(0), decrement(number_of_decrement_predecessors) {
- my_predecessors.set_owner(this);
- my_successors.set_owner(this);
- decrement.set_owner(this);
- }
-
- //! Replace the current successor with this new successor
- /* override */ bool register_successor( receiver<output_type> &r ) {
- my_successors.register_successor(r);
- return true;
- }
-
- //! Removes a successor from this node
- /** r.remove_predecessor(*this) is also called. */
- /* override */ bool remove_successor( receiver<output_type> &r ) {
- r.remove_predecessor(*this);
- my_successors.remove_successor(r);
- return true;
- }
-
- //! Puts an item to this receiver
- /* override */ bool try_put( T t ) {
- {
- spin_mutex::scoped_lock lock(my_mutex);
- if ( my_count >= my_threshold )
- return false;
- else
- ++my_count;
- }
-
- bool msg = my_successors.try_put(t);
-
- if ( msg != true ) {
- 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 ) );
- }
-
- return msg;
- }
-
- //! 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;
- }
-
- //! Removes src from the list of cached predecessors.
- /* override */ bool remove_predecessor( predecessor_type &src ) {
- my_predecessors.remove( src );
- return true;
- }
-
- };
-
- namespace internal {
-
- struct forwarding_base {
- virtual ~forwarding_base() {}
- virtual void decrement_port_count() = 0;
- virtual void increment_port_count() = 0;
- };
-
- template< int N >
- struct join_helper {
-
- 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);
- 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();
- 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();
- }
-
- template <typename TupleType>
- static inline void release_reservations( TupleType &my_input) {
- join_helper<N-1>::release_reservations(my_input);
- release_my_reservation(my_input);
- }
-
- 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 ( !join_helper<N-1>::reserve( my_input, out ) ) {
- release_my_reservation( my_input );
- return false;
- }
- return true;
- }
- };
-
- template< >
- struct join_helper<1> {
-
- 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);
- }
-
- template< typename TupleType >
- static inline void consume_reservations( TupleType &my_input ) {
- std::get<0>( my_input ).consume();
- }
-
- template< typename TupleType >
- static inline void release_my_reservation( TupleType &my_input ) {
- std::get<0>( my_input ).release();
- }
-
- template<typename TupleType>
- static inline void release_reservations( TupleType &my_input) {
- release_my_reservation(my_input);
- }
-
- 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 ) );
- }
- };
-
- namespace join_policy_namespace {
- enum join_policy { two_phase
- };
- }
- using namespace join_policy_namespace;
-
- //! The two-phase join port
- template< typename T >
- class two_phase_port : public receiver<T> {
- public:
- typedef T input_type;
- typedef sender<T> predecessor_type;
-
- //! Constructor
- two_phase_port() : reserved(false) {
- my_join = NULL;
- my_predecessors.set_owner( this );
- }
-
- // copy constructor
- two_phase_port(const two_phase_port& /* other */) : receiver<T>() {
- reserved = false;
- my_join = NULL;
- my_predecessors.set_owner( this );
- }
-
- void set_join_node_pointer(forwarding_base *join) {
- my_join = join;
- }
-
- bool try_put( T ) {
- return false;
- }
-
- //! Add a predecessor
- bool register_predecessor( sender<T> &src ) {
- spin_mutex::scoped_lock l(my_mutex);
- bool no_predecessors = my_predecessors.empty();
- my_predecessors.add(src);
- if ( no_predecessors ) {
- my_join->decrement_port_count( );
- }
- return true;
- }
-
- //! Remove a predecessor
- bool remove_predecessor( sender<T> &src ) {
- spin_mutex::scoped_lock l(my_mutex);
- my_predecessors.remove( src );
- if(my_predecessors.empty()) my_join->increment_port_count();
- return true;
- }
-
- //! Reserve an item from the port
- bool reserve( T &v ) {
- spin_mutex::scoped_lock l(my_mutex);
- if ( reserved ) {
- return false;
- }
- if ( my_predecessors.try_reserve( v ) ) {
- reserved = true;
- return true;
- } else if ( my_predecessors.empty() ) {
- my_join->increment_port_count();
- }
- return false;
- }
-
- //! Release the port
- void release( ) {
- spin_mutex::scoped_lock l(my_mutex);
- reserved = false;
- my_predecessors.try_release( );
- }
-
- //! Complete use of the port
- void consume( ) {
- spin_mutex::scoped_lock l(my_mutex);
- reserved = false;
- my_predecessors.try_consume( );
- }
-
- private:
- spin_mutex my_mutex;
- forwarding_base *my_join;
- reservable_predecessor_cache< T > my_predecessors;
- bool reserved;
- };
-
- template<join_policy JP, typename InputTuple, typename OutputTuple>
- class join_node_base;
-
- //! join_node_FE : implements input port policy
- template<join_policy JP, typename InputTuple, typename OutputTuple>
- class join_node_FE;
-
- template<typename InputTuple, typename OutputTuple>
- class join_node_FE<two_phase, InputTuple, OutputTuple> : public forwarding_base {
- public:
- static const int N = std::tuple_size<OutputTuple>::value;
- typedef OutputTuple output_type;
- typedef InputTuple input_type;
- typedef join_node_base<two_phase, InputTuple, OutputTuple> my_node_type; // for forwarding
-
- join_node_FE(graph &g) : my_root_task(g.root_task()), my_node(NULL) {
- ports_with_no_inputs = N;
- join_helper<N>::set_join_node_pointer(my_inputs, this);
- }
-
- void set_my_node(my_node_type *new_my_node) { my_node = new_my_node; }
-
- void increment_port_count() {
- ++ports_with_no_inputs;
- }
-
- // if all input_ports have predecessors, spawn forward to try and consume tuples
- void decrement_port_count() {
- if(ports_with_no_inputs.fetch_and_decrement() == 1) {
- task::enqueue( * new ( task::allocate_additional_child_of( *my_root_task ) )
- forward_task<my_node_type>(*my_node) );
- }
- }
-
- input_type &inputs() { return my_inputs; }
- protected:
- // all methods on input ports should be called under spin lock from join_node_base.
-
- bool tuple_build_may_succeed() {
- return !ports_with_no_inputs;
- }
-
- bool try_to_make_tuple(output_type &out) {
- if(ports_with_no_inputs) return false;
- return join_helper<N>::reserve(my_inputs, out);
- }
-
- void tuple_accepted() {
- join_helper<N>::consume_reservations(my_inputs);
- }
- void tuple_rejected() {
- join_helper<N>::release_reservations(my_inputs);
- }
-
- input_type my_inputs;
- task *my_root_task;
- my_node_type *my_node;
- atomic<size_t> ports_with_no_inputs;
- };
-
- //! join_node_base
- template<join_policy JP, typename InputTuple, typename OutputTuple>
- class join_node_base : public graph_node, public join_node_FE<JP, InputTuple, OutputTuple>,
- public sender<OutputTuple>, no_copy {
- public:
- typedef OutputTuple output_type;
-
- typedef receiver<output_type> successor_type;
- typedef join_node_FE<JP, InputTuple, OutputTuple> input_ports_type;
- using input_ports_type::tuple_build_may_succeed;
- using input_ports_type::try_to_make_tuple;
- using input_ports_type::tuple_accepted;
- using input_ports_type::tuple_rejected;
-
- join_node_base(graph &g) : input_ports_type(g), my_root_task(g.root_task()) {
- my_successors.set_owner(this);
- input_ports_type::set_my_node(this);
- }
-
- bool register_successor(successor_type &r) {
- spin_mutex::scoped_lock l(my_mutex);
- my_successors.register_successor(r);
- if(tuple_build_may_succeed()) {
- task::enqueue( * new ( task::allocate_additional_child_of( *my_root_task) )
- forward_task<join_node_base<JP,InputTuple,OutputTuple> >( *this ) );
- }
- return true;
- }
-
- template<size_t N>
- receiver<typename std::tuple_element<N, OutputTuple>::value> & input_port(void) { return std::get<N>(input_ports_type::inputs()); }
-
- bool remove_successor( successor_type &r) {
- spin_mutex::scoped_lock l(my_mutex);
- my_successors.remove_successor(r);
- return true;
- }
-
- bool try_get( output_type &v) {
- spin_mutex::scoped_lock l(my_mutex);
- if(tuple_build_may_succeed()) {
- if(try_to_make_tuple(v)) {
- // successor requested, so acceptance guaranteed
- tuple_accepted();
- return true;
- }
- }
- return false;
- }
-
- private:
- task *my_root_task;
- broadcast_cache<output_type, null_rw_mutex> my_successors;
- spin_mutex my_mutex;
-
- friend class forward_task< join_node_base<JP, InputTuple, OutputTuple> >;
-
- void forward() {
- spin_mutex::scoped_lock l(my_mutex);
- output_type out;
- if(!tuple_build_may_succeed()) return;
- while(try_to_make_tuple(out)) {
- if(my_successors.try_put(out)) {
- tuple_accepted();
- }
- else {
- tuple_rejected();
- return;
- }
- }
- }
- };
-
- //! unfolded_join_node : passes input_port_tuple to join_node_base. We build the input port type
- // using tuple_element.
- template<int N, typename OutputTuple, join_policy JP>
- class unfolded_join_node;
-
- template<typename OutputTuple>
- class unfolded_join_node<2,OutputTuple,two_phase> : public internal::join_node_base<two_phase,
- std::tuple<
- two_phase_port<typename std::tuple_element<0,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<1,OutputTuple>::type> >,
- OutputTuple
- >
- {
- private:
- typedef typename std::tuple<
- two_phase_port<typename std::tuple_element<0,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<1,OutputTuple>::type> > port_tuple_type;
- public:
- typedef OutputTuple output_type;
- private:
- typedef join_node_base<two_phase, port_tuple_type, output_type > base_type;
- public:
- unfolded_join_node(graph &g) : base_type(g) {}
- };
-
- template<typename OutputTuple>
- class unfolded_join_node<3,OutputTuple,two_phase> : public internal::join_node_base<two_phase,
- std::tuple<
- two_phase_port<typename std::tuple_element<0,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<1,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<2,OutputTuple>::type> >,
- OutputTuple
- >
- {
- private:
- typedef typename std::tuple<
- two_phase_port<typename std::tuple_element<0,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<1,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<2,OutputTuple>::type> > port_tuple_type;
- public:
- typedef OutputTuple output_type;
- private:
- typedef join_node_base<two_phase, port_tuple_type, output_type > base_type;
- public:
- unfolded_join_node(graph &g) : base_type(g) {}
- };
-
- template<typename OutputTuple>
- class unfolded_join_node<4,OutputTuple,two_phase> : public internal::join_node_base<two_phase,
- std::tuple<
- two_phase_port<typename std::tuple_element<0,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<1,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<2,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<3,OutputTuple>::type> >,
- OutputTuple
- > {
- private:
- typedef typename std::tuple<
- two_phase_port<typename std::tuple_element<0,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<1,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<2,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<3,OutputTuple>::type> > port_tuple_type;
- public:
- typedef OutputTuple output_type;
- private:
- typedef join_node_base<two_phase, port_tuple_type, output_type > base_type;
- public:
- unfolded_join_node(graph &g) : base_type(g) {}
- };
-
- template<typename OutputTuple>
- class unfolded_join_node<5,OutputTuple,two_phase> : public internal::join_node_base<two_phase,
- std::tuple<
- two_phase_port<typename std::tuple_element<0,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<1,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<2,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<3,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<4,OutputTuple>::type> >,
- OutputTuple
- > {
- private:
- typedef typename std::tuple<
- two_phase_port<typename std::tuple_element<0,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<1,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<2,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<3,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<4,OutputTuple>::type> > port_tuple_type;
- public:
- typedef OutputTuple output_type;
- private:
- typedef join_node_base<two_phase, port_tuple_type, output_type > base_type;
- public:
- unfolded_join_node(graph &g) : base_type(g) {}
- };
-
- template<typename OutputTuple>
- class unfolded_join_node<6,OutputTuple,two_phase> : public internal::join_node_base<two_phase,
- std::tuple<
- two_phase_port<typename std::tuple_element<0,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<1,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<2,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<3,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<4,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<5,OutputTuple>::type> >,
- OutputTuple
- > {
- private:
- typedef typename std::tuple<
- two_phase_port<typename std::tuple_element<0,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<1,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<2,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<3,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<4,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<5,OutputTuple>::type> > port_tuple_type;
- public:
- typedef OutputTuple output_type;
- private:
- typedef join_node_base<two_phase, port_tuple_type, output_type > base_type;
- public:
- unfolded_join_node(graph &g) : base_type(g) {}
- };
-
- template<typename OutputTuple>
- class unfolded_join_node<7,OutputTuple,two_phase> : public internal::join_node_base<two_phase,
- std::tuple<
- two_phase_port<typename std::tuple_element<0,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<1,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<2,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<3,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<4,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<5,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<6,OutputTuple>::type> >,
- OutputTuple
- > {
- private:
- typedef typename std::tuple<
- two_phase_port<typename std::tuple_element<0,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<1,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<2,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<3,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<4,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<5,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<6,OutputTuple>::type> > port_tuple_type;
- public:
- typedef OutputTuple output_type;
- private:
- typedef join_node_base<two_phase, port_tuple_type, output_type > base_type;
- public:
- unfolded_join_node(graph &g) : base_type(g) {}
- };
-
- template<typename OutputTuple>
- class unfolded_join_node<8,OutputTuple,two_phase> : public internal::join_node_base<two_phase,
- std::tuple<
- two_phase_port<typename std::tuple_element<0,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<1,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<2,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<3,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<4,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<5,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<6,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<7,OutputTuple>::type> >,
- OutputTuple
- > {
- private:
- typedef typename std::tuple<
- two_phase_port<typename std::tuple_element<0,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<1,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<2,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<3,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<4,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<5,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<6,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<7,OutputTuple>::type> > port_tuple_type;
- public:
- typedef OutputTuple output_type;
- private:
- typedef join_node_base<two_phase, port_tuple_type, output_type > base_type;
- public:
- unfolded_join_node(graph &g) : base_type(g) {}
- };
-
- template<typename OutputTuple>
- class unfolded_join_node<9,OutputTuple,two_phase> : public internal::join_node_base<two_phase,
- std::tuple<
- two_phase_port<typename std::tuple_element<0,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<1,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<2,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<3,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<4,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<5,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<6,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<7,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<8,OutputTuple>::type> >,
- OutputTuple
- > {
- private:
- typedef typename std::tuple<
- two_phase_port<typename std::tuple_element<0,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<1,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<2,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<3,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<4,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<5,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<6,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<7,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<8,OutputTuple>::type> > port_tuple_type;
- public:
- typedef OutputTuple output_type;
- private:
- typedef join_node_base<two_phase, port_tuple_type, output_type > base_type;
- public:
- unfolded_join_node(graph &g) : base_type(g) {}
- };
-
- template<typename OutputTuple>
- class unfolded_join_node<10,OutputTuple,two_phase> : public internal::join_node_base<two_phase,
- std::tuple<
- two_phase_port<typename std::tuple_element<0,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<1,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<2,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<3,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<4,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<5,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<6,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<7,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<8,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<9,OutputTuple>::type> >,
- OutputTuple
- > {
- private:
- typedef typename std::tuple<
- two_phase_port<typename std::tuple_element<0,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<1,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<2,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<3,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<4,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<5,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<6,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<7,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<8,OutputTuple>::type>,
- two_phase_port<typename std::tuple_element<9,OutputTuple>::type> > port_tuple_type;
- public:
- typedef OutputTuple output_type;
- private:
- typedef join_node_base<two_phase, port_tuple_type, output_type > base_type;
- public:
- unfolded_join_node(graph &g) : base_type(g) {}
- };
-
- } // namespace internal
-
-using namespace internal::join_policy_namespace;
-
-template<typename OutputTuple, join_policy JP=two_phase>
-class join_node: public internal::unfolded_join_node<std::tuple_size<OutputTuple>::value, OutputTuple, JP> {
-private:
- static const int N = std::tuple_size<OutputTuple>::value;
- typedef typename internal::unfolded_join_node<N, OutputTuple, JP> unfolded_type;
-public:
- typedef OutputTuple output_type;
- join_node(graph &g) : unfolded_type(g) { }
-};
-
- //
- // Making edges
- //
-
- //! Makes an edge between a single predecessor and a single successor
- template< typename T >
- inline void make_edge( sender<T> &p, receiver<T> &s ) {
- p.register_successor( s );
- }
-
- //! Makes edges between a single predecessor and multiple successors
- template< typename T, typename SIterator >
- inline void make_edges( sender<T> &p, SIterator s_begin, SIterator s_end ) {
- for ( SIterator i = s_begin; i != s_end; ++i ) {
- make_edge( p, **i );
- }
- }
-
- //! Makes edges between a set of predecessors and a single successor
- template< typename T, typename PIterator >
- inline void make_edges( PIterator p_begin, PIterator p_end, receiver<T> &s ) {
- for ( PIterator i = p_begin; i != p_end; ++i ) {
- make_edge( **i, s );
- }
- }
-
-}
-
-#endif
-
diff --git a/include/tbb/index.html b/include/tbb/index.html
index 33f69d1..5eaf53e 100644
--- a/include/tbb/index.html
+++ b/include/tbb/index.html
@@ -18,10 +18,9 @@ Include files for Threading Building Blocks classes and functions.
<A HREF="../index.html">Up to parent directory</A>
<p></p>
Copyright © 2005-2011 Intel Corporation. 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>
+Intel is a registered trademark or trademark 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.
</BODY>
diff --git a/include/tbb/_aggregator_internal.h b/include/tbb/internal/_aggregator_impl.h
similarity index 88%
rename from include/tbb/_aggregator_internal.h
rename to include/tbb/internal/_aggregator_impl.h
index 9d71182..33384c1 100644
--- a/include/tbb/_aggregator_internal.h
+++ b/include/tbb/internal/_aggregator_impl.h
@@ -26,11 +26,11 @@
the GNU General Public License.
*/
-#ifndef __TBB_aggregator_internal_H
-#define __TBB_aggregator_internal_H
+#ifndef __TBB__aggregator_impl_H
+#define __TBB__aggregator_impl_H
-#include "atomic.h"
-#include "tbb_profiling.h"
+#include "../atomic.h"
+#include "../tbb_profiling.h"
namespace tbb {
namespace interface6 {
@@ -57,7 +57,9 @@ class aggregated_operation {
class aggregator {
public:
aggregator() : handler_busy(false) { pending_operations = NULL; }
- ~aggregator() {}
+ explicit aggregator(handler_type h) : handler_busy(false), handle_operations(h) {
+ pending_operations = NULL;
+ }
void initialize_handler(handler_type h) { handle_operations = h; }
@@ -135,14 +137,26 @@ class aggregator {
}
};
+// the most-compatible friend declaration (vs, gcc, icc) is
+// template<class U, class V> friend class aggregating_functor;
+template<typename aggregating_class, typename operation_list>
+class aggregating_functor {
+ aggregating_class *fi;
+public:
+ aggregating_functor() {}
+ aggregating_functor(aggregating_class *fi_) : fi(fi_) {}
+ void operator()(operation_list* op_list) { fi->handle_operations(op_list); }
+};
+
} // namespace internal
} // namespace interface6
namespace internal {
using interface6::internal::aggregated_operation;
using interface6::internal::aggregator;
+ using interface6::internal::aggregating_functor;
} // namespace internal
} // namespace tbb
-#endif
+#endif // __TBB__aggregator_impl_H
diff --git a/include/tbb/_concurrent_queue_internal.h b/include/tbb/internal/_concurrent_queue_impl.h
similarity index 98%
rename from include/tbb/_concurrent_queue_internal.h
rename to include/tbb/internal/_concurrent_queue_impl.h
index 72754e1..4d6adbb 100644
--- a/include/tbb/_concurrent_queue_internal.h
+++ b/include/tbb/internal/_concurrent_queue_impl.h
@@ -26,16 +26,20 @@
the GNU General Public License.
*/
-#ifndef __TBB_concurrent_queue_internal_H
-#define __TBB_concurrent_queue_internal_H
-
-#include "tbb_stddef.h"
-#include "tbb_machine.h"
-#include "atomic.h"
-#include "spin_mutex.h"
-#include "cache_aligned_allocator.h"
-#include "tbb_exception.h"
-#include "tbb_profiling.h"
+#ifndef __TBB__concurrent_queue_impl_H
+#define __TBB__concurrent_queue_impl_H
+
+#ifndef __TBB_concurrent_queue_H
+#error Do not #include this internal file directly; use public TBB headers instead.
+#endif
+
+#include "../tbb_stddef.h"
+#include "../tbb_machine.h"
+#include "../atomic.h"
+#include "../spin_mutex.h"
+#include "../cache_aligned_allocator.h"
+#include "../tbb_exception.h"
+#include "../tbb_profiling.h"
#include <new>
#if !TBB_USE_EXCEPTIONS && _MSC_VER
@@ -653,7 +657,7 @@ protected:
//! Default constructor
concurrent_queue_iterator_base_v3() : my_rep(NULL), my_item(NULL) {
#if __TBB_GCC_OPTIMIZER_ORDERING_BROKEN
- __asm__ __volatile__("": : :"memory");
+ __TBB_compiler_fence();
#endif
}
@@ -1016,4 +1020,4 @@ bool operator!=( const concurrent_queue_iterator<C,T>& i, const concurrent_queue
} // namespace tbb
-#endif /* __TBB_concurrent_queue_internal_H */
+#endif /* __TBB__concurrent_queue_impl_H */
diff --git a/include/tbb/_concurrent_unordered_internal.h b/include/tbb/internal/_concurrent_unordered_impl.h
similarity index 98%
rename from include/tbb/_concurrent_unordered_internal.h
rename to include/tbb/internal/_concurrent_unordered_impl.h
index a3a1add..9422728 100644
--- a/include/tbb/_concurrent_unordered_internal.h
+++ b/include/tbb/internal/_concurrent_unordered_impl.h
@@ -29,10 +29,13 @@
/* Container implementations in this header are based on PPL implementations
provided by Microsoft. */
-#ifndef __TBB_concurrent_unordered_internal_H
-#define __TBB_concurrent_unordered_internal_H
+#ifndef __TBB__concurrent_unordered_impl_H
+#define __TBB__concurrent_unordered_impl_H
+#if !defined(__TBB_concurrent_unordered_map_H) && !defined(__TBB_concurrent_unordered_set_H) && !defined(__TBB_concurrent_hash_map_H)
+#error Do not #include this internal file directly; use public TBB headers instead.
+#endif
-#include "tbb_stddef.h"
+#include "../tbb_stddef.h"
#if !TBB_USE_EXCEPTIONS && _MSC_VER
// Suppress "C++ exception handler used, but unwind semantics are not enabled" warning in STL headers
@@ -50,9 +53,9 @@
#pragma warning (pop)
#endif
-#include "atomic.h"
-#include "tbb_exception.h"
-#include "tbb_allocator.h"
+#include "../atomic.h"
+#include "../tbb_exception.h"
+#include "../tbb_allocator.h"
namespace tbb {
namespace interface5 {
@@ -1407,5 +1410,20 @@ inline size_t tbb_hasher( const std::pair<F,S>& p ) {
}
} // namespace interface5
using interface5::tbb_hasher;
+
+
+// Template class for hash compare
+template<typename Key>
+class tbb_hash
+{
+public:
+ tbb_hash() {}
+
+ size_t operator()(const Key& key) const
+ {
+ return tbb_hasher(key);
+ }
+};
+
} // namespace tbb
-#endif// __TBB_concurrent_unordered_internal_H
+#endif// __TBB__concurrent_unordered_impl_H
diff --git a/include/tbb/internal/_flow_graph_impl.h b/include/tbb/internal/_flow_graph_impl.h
new file mode 100644
index 0000000..6e7ea56
--- /dev/null
+++ b/include/tbb/internal/_flow_graph_impl.h
@@ -0,0 +1,582 @@
+/*
+ Copyright 2005-2011 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__flow_graph_impl_H
+#define __TBB__flow_graph_impl_H
+
+#ifndef __TBB_flow_graph_H
+#error Do not #include this internal file directly; use public TBB headers instead.
+#endif
+
+namespace internal {
+
+ namespace graph_policy_namespace {
+ enum graph_buffer_policy { rejecting, reserving, queueing, tag_matching };
+ }
+
+ //! A functor that takes no input and generates a value of type Output
+ template< typename Output >
+ class source_body : tbb::internal::no_assign {
+ public:
+ virtual ~source_body() {}
+ virtual bool operator()(Output &output) = 0;
+ virtual source_body* clone() = 0;
+ };
+
+ //! The leaf for source_body
+ template< typename Output, typename Body>
+ class source_body_leaf : public source_body<Output> {
+ public:
+ source_body_leaf( const Body &_body ) : body(_body), init_body(_body) { }
+ /*override*/ bool operator()(Output &output) { return body( output ); }
+ /*override*/ source_body_leaf* clone() {
+ return new source_body_leaf< Output, Body >(init_body);
+ }
+ private:
+ Body body;
+ Body init_body;
+ };
+
+ //! A functor that takes an Input and generates an Output
+ template< typename Input, typename Output >
+ class function_body : tbb::internal::no_assign {
+ public:
+ virtual ~function_body() {}
+ virtual Output operator()(const Input &input) = 0;
+ virtual function_body* clone() = 0;
+ };
+
+ //! the leaf for function_body
+ template <typename Input, typename Output, typename B>
+ class function_body_leaf : public function_body< Input, Output > {
+ public:
+ function_body_leaf( const B &_body ) : body(_body), init_body(_body) { }
+ Output operator()(const Input &i) { return body(i); }
+ B get_body() { return body; }
+ /*override*/ function_body_leaf* clone() {
+ return new function_body_leaf< Input, Output, B >(init_body);
+ }
+ private:
+ B body;
+ B init_body;
+ };
+
+ //! the leaf for function_body specialized for Input and output of continue_msg
+ template <typename B>
+ class function_body_leaf< continue_msg, continue_msg, B> : public function_body< continue_msg, continue_msg > {
+ public:
+ function_body_leaf( const B &_body ) : body(_body), init_body(_body) { }
+ continue_msg operator()( const continue_msg &i ) {
+ body(i);
+ return i;
+ }
+ B get_body() { return body; }
+ /*override*/ function_body_leaf* clone() {
+ return new function_body_leaf< continue_msg, continue_msg, B >(init_body);
+ }
+ private:
+ B body;
+ B init_body;
+ };
+
+ //! the leaf for function_body specialized for Output of continue_msg
+ template <typename Input, typename B>
+ class function_body_leaf< Input, continue_msg, B> : public function_body< Input, continue_msg > {
+ public:
+ function_body_leaf( const B &_body ) : body(_body), init_body(_body) { }
+ continue_msg operator()(const Input &i) {
+ body(i);
+ return continue_msg();
+ }
+ B get_body() { return body; }
+ /*override*/ function_body_leaf* clone() {
+ return new function_body_leaf< Input, continue_msg, B >(init_body);
+ }
+ private:
+ B body;
+ B init_body;
+ };
+
+ //! the leaf for function_body specialized for Input of continue_msg
+ template <typename Output, typename B>
+ class function_body_leaf< continue_msg, Output, B > : public function_body< continue_msg, Output > {
+ public:
+ function_body_leaf( const B &_body ) : body(_body), init_body(_body) { }
+ Output operator()(const continue_msg &i) {
+ return body(i);
+ }
+ B get_body() { return body; }
+ /*override*/ function_body_leaf* clone() {
+ return new function_body_leaf< continue_msg, Output, B >(init_body);
+ }
+ private:
+ B body;
+ B init_body;
+ };
+
+# if TBB_PREVIEW_GRAPH_NODES
+ //! function_body that takes an Input and a set of output ports
+ template<typename Input, typename OutputSet>
+ class multioutput_function_body {
+ public:
+ virtual ~multioutput_function_body () {}
+ virtual void operator()(const Input &/* input*/, OutputSet &/*oset*/) = 0;
+ virtual multioutput_function_body* clone() = 0;
+ };
+
+ //! leaf for multi-output function. OutputSet can be a std::tuple or a vector.
+ template<typename Input, typename OutputSet, typename B>
+ class multioutput_function_body_leaf : public multioutput_function_body<Input, OutputSet> {
+ public:
+ multioutput_function_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.
+ }
+ B get_body() { return body; }
+ /*override*/ multioutput_function_body_leaf* clone() {
+ return new multioutput_function_body_leaf<Input, OutputSet,B>(init_body);
+ }
+ private:
+ B body;
+ B init_body;
+ };
+#endif // TBB_PREVIEW_GRAPH_NODES
+
+ //! A task that calls a node's forward function
+ template< typename NodeType >
+ class forward_task : public task {
+
+ NodeType &my_node;
+
+ public:
+
+ forward_task( NodeType &n ) : my_node(n) {}
+
+ task *execute() {
+ my_node.forward();
+ return NULL;
+ }
+ };
+
+ //! A task that calls a node's apply_body function, passing in an input of type Input
+ template< typename NodeType, typename Input >
+ class apply_body_task : public task {
+
+ NodeType &my_node;
+ Input my_input;
+
+ public:
+
+ apply_body_task( NodeType &n, const Input &i ) : my_node(n), my_input(i) {}
+
+ task *execute() {
+ my_node.apply_body( my_input );
+ return NULL;
+ }
+ };
+
+ //! A task that calls a node's apply_body function with no input
+ template< typename NodeType >
+ class source_task : public task {
+
+ NodeType &my_node;
+
+ public:
+
+ source_task( NodeType &n ) : my_node(n) {}
+
+ task *execute() {
+ my_node.apply_body( );
+ return NULL;
+ }
+ };
+
+ //! An empty functor that takes an Input and returns a default constructed Output
+ template< typename Input, typename Output >
+ struct empty_body {
+ Output operator()( const Input & ) const { return Output(); }
+ };
+
+ //! A node_cache maintains a std::queue of elements of type T. Each operation is protected by a lock.
+ template< typename T, typename M=spin_mutex >
+ class node_cache {
+ public:
+
+ typedef size_t size_type;
+
+ bool empty() {
+ typename my_mutex_type::scoped_lock lock( my_mutex );
+ return internal_empty();
+ }
+
+ void add( T &n ) {
+ typename my_mutex_type::scoped_lock lock( my_mutex );
+ internal_push(n);
+ }
+
+ void remove( T &n ) {
+ typename my_mutex_type::scoped_lock lock( my_mutex );
+ for ( size_t i = internal_size(); i != 0; --i ) {
+ T &s = internal_pop();
+ if ( &s != &n ) {
+ internal_push(s);
+ }
+ }
+ }
+
+ protected:
+
+ typedef M my_mutex_type;
+ my_mutex_type my_mutex;
+ std::queue< T * > my_q;
+
+ // Assumes lock is held
+ inline bool internal_empty( ) {
+ return my_q.empty();
+ }
+
+ // Assumes lock is held
+ inline size_type internal_size( ) {
+ return my_q.size();
+ }
+
+ // Assumes lock is held
+ inline void internal_push( T &n ) {
+ my_q.push(&n);
+ }
+
+ // Assumes lock is held
+ inline T &internal_pop() {
+ T *v = my_q.front();
+ my_q.pop();
+ return *v;
+ }
+
+ };
+
+ //! 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:
+ typedef M my_mutex_type;
+ typedef T output_type;
+ typedef sender<output_type> predecessor_type;
+ typedef receiver<output_type> successor_type;
+
+ predecessor_cache( ) : my_owner( NULL ) { }
+
+ void set_owner( successor_type *owner ) { my_owner = owner; }
+
+ bool get_item( output_type &v ) {
+
+ bool msg = false;
+
+ do {
+ predecessor_type *src;
+ {
+ typename my_mutex_type::scoped_lock lock(this->my_mutex);
+ if ( this->internal_empty() ) {
+ break;
+ }
+ src = &this->internal_pop();
+ }
+
+ // Try to get from this sender
+ msg = src->try_get( v );
+
+ if (msg == false) {
+ // Relinquish ownership of the edge
+ if ( my_owner)
+ src->register_successor( *my_owner );
+ } else {
+ // Retain ownership of the edge
+ this->add(*src);
+ }
+ } while ( msg == false );
+ return msg;
+ }
+
+ protected:
+ successor_type *my_owner;
+ };
+
+ //! An cache of predecessors that supports requests and reservations
+ template< typename T, typename M=spin_mutex >
+ class reservable_predecessor_cache : public predecessor_cache< T, M > {
+ public:
+ typedef M my_mutex_type;
+ typedef T output_type;
+ typedef sender<T> predecessor_type;
+ typedef receiver<T> successor_type;
+
+ reservable_predecessor_cache( ) : reserved_src(NULL) { }
+
+ bool
+ try_reserve( output_type &v ) {
+ bool msg = false;
+
+ do {
+ {
+ typename my_mutex_type::scoped_lock lock(this->my_mutex);
+ if ( reserved_src || this->internal_empty() )
+ return false;
+
+ reserved_src = &this->internal_pop();
+ }
+
+ // Try to get from this sender
+ msg = reserved_src->try_reserve( v );
+
+ if (msg == false) {
+ typename my_mutex_type::scoped_lock lock(this->my_mutex);
+ // Relinquish ownership of the edge
+ reserved_src->register_successor( *this->my_owner );
+ reserved_src = NULL;
+ } else {
+ // Retain ownership of the edge
+ this->add( *reserved_src );
+ }
+ } while ( msg == false );
+
+ return msg;
+ }
+
+ bool
+ try_release( ) {
+ reserved_src->try_release( );
+ reserved_src = NULL;
+ return true;
+ }
+
+ bool
+ try_consume( ) {
+ reserved_src->try_consume( );
+ reserved_src = NULL;
+ return true;
+ }
+
+ private:
+ predecessor_type *reserved_src;
+ };
+
+
+ //! An abstract cache of succesors
+ template<typename T, typename M=spin_rw_mutex >
+ class successor_cache : tbb::internal::no_copy {
+ protected:
+
+ typedef M my_mutex_type;
+ my_mutex_type my_mutex;
+
+ typedef std::list< receiver<T> * > my_successors_type;
+ my_successors_type my_successors;
+
+ sender<T> *my_owner;
+
+ public:
+
+ successor_cache( ) : my_owner(NULL) {}
+
+ void set_owner( sender<T> *owner ) { my_owner = owner; }
+
+ virtual ~successor_cache() {}
+
+ void register_successor( receiver<T> &r ) {
+ typename my_mutex_type::scoped_lock l(my_mutex, true);
+ my_successors.push_back( &r );
+ }
+
+ void remove_successor( receiver<T> &r ) {
+ typename my_mutex_type::scoped_lock l(my_mutex, true);
+ for ( typename my_successors_type::iterator i = my_successors.begin();
+ i != my_successors.end(); ++i ) {
+ if ( *i == & r ) {
+ my_successors.erase(i);
+ break;
+ }
+ }
+ }
+
+ bool empty() {
+ typename my_mutex_type::scoped_lock l(my_mutex, false);
+ return my_successors.empty();
+ }
+
+ virtual bool try_put( const T &t ) = 0;
+ };
+
+ //! An abstract cache of succesors, specialized to continue_msg
+ template<>
+ class successor_cache< continue_msg > : tbb::internal::no_copy {
+ protected:
+
+ typedef spin_rw_mutex my_mutex_type;
+ my_mutex_type my_mutex;
+
+ typedef std::list< receiver<continue_msg> * > my_successors_type;
+ my_successors_type my_successors;
+
+ sender<continue_msg> *my_owner;
+
+ public:
+
+ successor_cache( ) : my_owner(NULL) {}
+
+ void set_owner( sender<continue_msg> *owner ) { my_owner = owner; }
+
+ virtual ~successor_cache() {}
+
+ 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 );
+ }
+ }
+
+ void remove_successor( receiver<continue_msg> &r ) {
+ my_mutex_type::scoped_lock l(my_mutex, true);
+ for ( my_successors_type::iterator i = my_successors.begin();
+ i != my_successors.end(); ++i ) {
+ if ( *i == & r ) {
+ if ( my_owner )
+ r.remove_predecessor( *my_owner );
+ my_successors.erase(i);
+ break;
+ }
+ }
+ }
+
+ bool empty() {
+ my_mutex_type::scoped_lock l(my_mutex, false);
+ return my_successors.empty();
+ }
+
+ virtual bool try_put( const continue_msg &t ) = 0;
+
+ };
+
+ //! A cache of successors that are broadcast to
+ template<typename T, typename M=spin_rw_mutex>
+ class broadcast_cache : public successor_cache<T, M> {
+ typedef M my_mutex_type;
+ typedef std::list< receiver<T> * > my_successors_type;
+
+ public:
+
+ broadcast_cache( ) {}
+
+ bool try_put( const T &t ) {
+ bool msg = false;
+ 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;
+ }
+ }
+ }
+ return msg;
+ }
+ };
+
+ //! A cache of successors that are put in a round-robin fashion
+ template<typename T, typename M=spin_rw_mutex >
+ class round_robin_cache : public successor_cache<T, M> {
+ typedef size_t size_type;
+ typedef M my_mutex_type;
+ typedef std::list< receiver<T> * > my_successors_type;
+
+ public:
+
+ round_robin_cache( ) {}
+
+ size_type size() {
+ typename my_mutex_type::scoped_lock l(this->my_mutex, false);
+ return this->my_successors.size();
+ }
+
+ bool try_put( 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;
+ }
+ }
+ }
+ return false;
+ }
+ };
+
+ template<typename T>
+ class decrementer : public continue_receiver, tbb::internal::no_copy {
+
+ T *my_node;
+
+ void execute() {
+ my_node->decrement_counter();
+ }
+
+ public:
+
+ typedef continue_msg input_type;
+ typedef continue_msg output_type;
+ decrementer( int number_of_predecessors = 0 ) : continue_receiver( number_of_predecessors ) { }
+ void set_owner( T *node ) { my_node = node; }
+ };
+
+}
+
+#endif // __TBB__flow_graph_impl_H
+
diff --git a/include/tbb/internal/_flow_graph_item_buffer_impl.h b/include/tbb/internal/_flow_graph_item_buffer_impl.h
new file mode 100644
index 0000000..85c0069
--- /dev/null
+++ b/include/tbb/internal/_flow_graph_item_buffer_impl.h
@@ -0,0 +1,190 @@
+/*
+ Copyright 2005-2011 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__flow_graph_item_buffer_impl_H
+#define __TBB__flow_graph_item_buffer_impl_H
+
+#ifndef __TBB_flow_graph_H
+#error Do not #include this internal file directly; use public TBB headers instead.
+#endif
+
+ //! Expandable buffer of items. The possible operations are push, pop,
+ //* tests for empty and so forth. No mutual exclusion is built in.
+ template <typename T, typename A=cache_aligned_allocator<T> >
+ class item_buffer {
+ public:
+ typedef T input_type;
+ typedef T output_type;
+ protected:
+ typedef size_t size_type;
+ typedef std::pair< T, bool > item_type;
+ typedef typename A::template rebind<item_type>::other allocator_type;
+
+ item_type *my_array;
+ size_type my_array_size;
+ static const size_type initial_buffer_size = 4;
+ size_type my_head;
+ size_type my_tail;
+
+ bool buffer_empty() { return my_head == my_tail; }
+
+ item_type &item(size_type i) { return my_array[i & (my_array_size - 1) ]; } // may not be marked valid
+
+ bool item_valid(size_type i) { return item(i).second; }
+
+ void fetch_front(T &v) { __TBB_ASSERT(item_valid(my_head), "front not valid"); v = item(my_head).first; }
+ void fetch_back(T &v) { __TBB_ASSERT(item_valid(my_tail-1), "back not valid"); v = item(my_tail-1).first; }
+
+ void invalidate(size_type i) { __TBB_ASSERT(item_valid(i), "Item not valid"); item(i).second = false; }
+ void validate(size_type i) { __TBB_ASSERT(!item_valid(i), "Item already valid"); item(i).second = true; }
+
+ void invalidate_front() { invalidate(my_head); }
+ void validate_front() { validate(my_head); }
+ void invalidate_back() { invalidate(my_tail-1); }
+
+ size_type size() { return my_tail - my_head; }
+ size_type capacity() { return my_array_size; }
+ bool buffer_full() { return size() == capacity(); }
+
+ //! Grows the internal array.
+ void grow_my_array( size_t minimum_size ) {
+ size_type old_size = my_array_size;
+ size_type new_size = old_size ? 2*old_size : initial_buffer_size;
+ while( new_size<minimum_size )
+ new_size*=2;
+
+ item_type* new_array = allocator_type().allocate(new_size);
+ item_type* old_array = my_array;
+
+ for( size_type i=0; i<new_size; ++i ) {
+ new (&(new_array[i].first)) input_type;
+ new_array[i].second = false;
+ }
+
+ size_t t=my_head;
+ for( size_type i=0; i<old_size; ++i, ++t )
+ new_array[t&(new_size-1)] = old_array[t&(old_size-1)];
+ my_array = new_array;
+ my_array_size = new_size;
+ if( old_array ) {
+ for( size_type i=0; i<old_size; ++i, ++t )
+ old_array[i].first.~input_type();
+ allocator_type().deallocate(old_array,old_size);
+ }
+ }
+
+ bool push_back(T &v) {
+ if(buffer_full()) {
+ grow_my_array(size() + 1);
+ }
+ item(my_tail) = std::make_pair( v, true );
+ ++my_tail;
+ return true;
+ }
+
+ bool pop_back(T &v) {
+ if (!item_valid(my_tail-1)) {
+ return false;
+ }
+ fetch_back(v);
+ invalidate_back();
+ --my_tail;
+ return true;
+ }
+
+ bool pop_front(T &v) {
+ if(!item_valid(my_head)) {
+ return false;
+ }
+ fetch_front(v);
+ invalidate_front();
+ ++my_head;
+ return true;
+ }
+
+ public:
+ //! Constructor
+ item_buffer( ) : my_array(NULL), my_array_size(0),
+ my_head(0), my_tail(0) {
+ grow_my_array(initial_buffer_size);
+ }
+
+ ~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);
+ }
+ }
+
+ };
+
+ //! item_buffer with reservable front-end. NOTE: if reserving, do not
+ //* complete operation with pop_front(); use consume_front().
+ //* No synchronization built-in.
+ template<typename T, typename A=cache_aligned_allocator<T> >
+ class reservable_item_buffer : public item_buffer<T, A> {
+ protected:
+ using item_buffer<T, A>::buffer_empty;
+ using item_buffer<T, A>::fetch_front;
+ using item_buffer<T, A>::invalidate_front;
+ using item_buffer<T, A>::validate_front;
+ using item_buffer<T, A>::item_valid;
+ using item_buffer<T, A>::my_head;
+
+ public:
+ reservable_item_buffer() : item_buffer<T, A>(), my_reserved(false) {}
+ protected:
+
+ bool reserve_front(T &v) {
+ if(my_reserved || !item_valid(my_head)) return false;
+ my_reserved = true;
+ // reserving the head
+ fetch_front(v);
+ // invalidate the head, but don't commit until consume is called
+ invalidate_front();
+ return true;
+ }
+
+ void consume_front() {
+ __TBB_ASSERT(my_reserved, "Attempt to consume a non-reserved item");
+ ++my_head;
+ my_reserved = false;
+ }
+
+ void release_front() {
+ __TBB_ASSERT(my_reserved, "Attempt to release a non-reserved item");
+ validate_front();
+ my_reserved = false;
+ }
+
+ bool my_reserved;
+ };
+
+#endif // __TBB__flow_graph_item_buffer_impl_H
diff --git a/include/tbb/internal/_flow_graph_join_impl.h b/include/tbb/internal/_flow_graph_join_impl.h
new file mode 100644
index 0000000..f24cfa4
--- /dev/null
+++ b/include/tbb/internal/_flow_graph_join_impl.h
@@ -0,0 +1,1702 @@
+/*
+ Copyright 2005-2011 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__flow_graph_join_impl_H
+#define __TBB__flow_graph_join_impl_H
+
+#ifndef __TBB_flow_graph_H
+#error Do not #include this internal file directly; use public TBB headers instead.
+#endif
+
+namespace internal {
+
+ typedef size_t tag_value;
+ static const tag_value NO_TAG = tag_value(-1);
+
+ struct forwarding_base {
+ forwarding_base(task *rt) : my_root_task(rt), current_tag(NO_TAG) {}
+ virtual ~forwarding_base() {}
+ virtual void decrement_port_count() = 0;
+ virtual void increment_port_count() = 0;
+ virtual void increment_tag_count(tag_value /*t*/) {}
+ // 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
+ };
+
+ template< int N >
+ struct join_helper {
+
+ 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);
+ 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();
+ 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();
+ }
+
+ template <typename TupleType>
+ static inline void release_reservations( TupleType &my_input) {
+ join_helper<N-1>::release_reservations(my_input);
+ release_my_reservation(my_input);
+ }
+
+ 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 ( !join_helper<N-1>::reserve( my_input, out ) ) {
+ release_my_reservation( my_input );
+ return false;
+ }
+ return true;
+ }
+
+ 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
+ return join_helper<N-1>::get_my_item(my_input, out) && res; // do get on other inputs before returning
+ }
+
+ template<typename InputTuple, typename OutputTuple>
+ static inline bool get_items(InputTuple &my_input, OutputTuple &out) {
+ return get_my_item(my_input, out);
+ }
+
+ 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();
+ }
+
+ template<typename InputTuple>
+ static inline void reset_ports(InputTuple& my_input) {
+ reset_my_port(my_input);
+ }
+
+ 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;
+ 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());
+ }
+ join_helper<N-1>::copy_tag_functors(my_inputs, other_inputs);
+ }
+ };
+
+ template< >
+ struct join_helper<1> {
+
+ 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);
+ }
+
+ template< typename TupleType >
+ static inline void consume_reservations( TupleType &my_input ) {
+ std::get<0>( my_input ).consume();
+ }
+
+ template< typename TupleType >
+ static inline void release_my_reservation( TupleType &my_input ) {
+ std::get<0>( my_input ).release();
+ }
+
+ template<typename TupleType>
+ static inline void release_reservations( TupleType &my_input) {
+ release_my_reservation(my_input);
+ }
+
+ 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 ) );
+ }
+
+ 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));
+ }
+
+ template<typename InputTuple, typename OutputTuple>
+ static inline bool get_items(InputTuple &my_input, OutputTuple &out) {
+ return get_my_item(my_input, out);
+ }
+
+ template<typename InputTuple>
+ static inline void reset_my_port(InputTuple &my_input) {
+ std::get<0>(my_input).reset_port();
+ }
+
+ template<typename InputTuple>
+ static inline void reset_ports(InputTuple& my_input) {
+ reset_my_port(my_input);
+ }
+
+ 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;
+ }
+
+ 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());
+ }
+ }
+ };
+
+ //! The two-phase join port
+ template< typename T >
+ class reserving_port : public receiver<T> {
+ public:
+ typedef T input_type;
+ typedef sender<T> predecessor_type;
+ private:
+ // ----------- Aggregator ------------
+ enum op_type { reg_pred, rem_pred, res_item, rel_res, con_res };
+ enum op_stat {WAIT=0, SUCCEEDED, FAILED};
+ typedef reserving_port<T> my_class;
+
+ class reserving_port_operation : public aggregated_operation<reserving_port_operation> {
+ public:
+ char type;
+ union {
+ T *my_arg;
+ predecessor_type *my_pred;
+ };
+ reserving_port_operation(const T& e, op_type t) :
+ type(char(t)), my_arg(const_cast<T*>(&e)) {}
+ reserving_port_operation(const predecessor_type &s, op_type t) : type(char(t)),
+ my_pred(const_cast<predecessor_type *>(&s)) {}
+ reserving_port_operation(op_type t) : type(char(t)) {}
+ };
+
+ typedef internal::aggregating_functor<my_class, reserving_port_operation> my_handler;
+ friend class internal::aggregating_functor<my_class, reserving_port_operation>;
+ aggregator<my_handler, reserving_port_operation> my_aggregator;
+
+ void handle_operations(reserving_port_operation* op_list) {
+ reserving_port_operation *current;
+ bool no_predecessors;
+ while(op_list) {
+ current = op_list;
+ op_list = op_list->next;
+ switch(current->type) {
+ case reg_pred:
+ no_predecessors = my_predecessors.empty();
+ my_predecessors.add(*(current->my_pred));
+ if ( no_predecessors ) {
+ my_join->decrement_port_count( ); // may try to forward
+ }
+ __TBB_store_with_release(current->status, SUCCEEDED);
+ break;
+ case rem_pred:
+ my_predecessors.remove(*(current->my_pred));
+ if(my_predecessors.empty()) my_join->increment_port_count();
+ __TBB_store_with_release(current->status, SUCCEEDED);
+ break;
+ case res_item:
+ if ( reserved ) {
+ __TBB_store_with_release(current->status, FAILED);
+ }
+ else if ( my_predecessors.try_reserve( *(current->my_arg) ) ) {
+ reserved = true;
+ __TBB_store_with_release(current->status, SUCCEEDED);
+ } else {
+ if ( my_predecessors.empty() ) {
+ my_join->increment_port_count();
+ }
+ __TBB_store_with_release(current->status, FAILED);
+ }
+ break;
+ case rel_res:
+ reserved = false;
+ my_predecessors.try_release( );
+ __TBB_store_with_release(current->status, SUCCEEDED);
+ break;
+ case con_res:
+ reserved = false;
+ my_predecessors.try_consume( );
+ __TBB_store_with_release(current->status, SUCCEEDED);
+ break;
+ }
+ }
+ }
+
+ public:
+
+ //! Constructor
+ reserving_port() : reserved(false) {
+ my_join = NULL;
+ my_predecessors.set_owner( this );
+ my_aggregator.initialize_handler(my_handler(this));
+ }
+
+ // copy constructor
+ reserving_port(const reserving_port& /* other */) : receiver<T>() {
+ reserved = false;
+ my_join = NULL;
+ my_predecessors.set_owner( this );
+ my_aggregator.initialize_handler(my_handler(this));
+ }
+
+ void set_join_node_pointer(forwarding_base *join) {
+ 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);
+ my_aggregator.execute(&op_data);
+ return op_data.status == SUCCEEDED;
+ }
+
+ //! Remove a predecessor
+ bool remove_predecessor( sender<T> &src ) {
+ reserving_port_operation op_data(src, rem_pred);
+ my_aggregator.execute(&op_data);
+ return op_data.status == SUCCEEDED;
+ }
+
+ //! Reserve an item from the port
+ bool reserve( T &v ) {
+ reserving_port_operation op_data(v, res_item);
+ my_aggregator.execute(&op_data);
+ return op_data.status == SUCCEEDED;
+ }
+
+ //! Release the port
+ void release( ) {
+ reserving_port_operation op_data(rel_res);
+ my_aggregator.execute(&op_data);
+ }
+
+ //! Complete use of the port
+ void consume( ) {
+ reserving_port_operation op_data(con_res);
+ my_aggregator.execute(&op_data);
+ }
+
+ private:
+ forwarding_base *my_join;
+ reservable_predecessor_cache< T, null_mutex > my_predecessors;
+ bool reserved;
+ };
+
+ //! queueing join_port
+ template<typename T>
+ class queueing_port : public receiver<T>, public item_buffer<T> {
+ public:
+ typedef T input_type;
+ typedef sender<T> predecessor_type;
+ typedef queueing_port<T> my_node_type;
+
+ // ----------- Aggregator ------------
+ private:
+ enum op_type { try__put, get__item, res_port };
+ enum op_stat {WAIT=0, SUCCEEDED, FAILED};
+ typedef queueing_port<T> my_class;
+
+ class queueing_port_operation : public aggregated_operation<queueing_port_operation> {
+ public:
+ char type;
+ T my_val;
+ T *my_arg;
+ // 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) {}
+ // constructor for pointer parameter
+ queueing_port_operation(const T* p, op_type t) :
+ type(char(t)), my_arg(const_cast<T*>(p)) {}
+ // constructor with no parameter
+ queueing_port_operation(op_type t) : type(char(t)) {}
+ };
+
+ typedef internal::aggregating_functor<my_class, queueing_port_operation> my_handler;
+ friend class internal::aggregating_functor<my_class, queueing_port_operation>;
+ aggregator<my_handler, queueing_port_operation> my_aggregator;
+
+ void handle_operations(queueing_port_operation* op_list) {
+ queueing_port_operation *current;
+ bool was_empty;
+ while(op_list) {
+ 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);
+ break;
+ case get__item:
+ if(!this->buffer_empty()) {
+ this->fetch_front(*(current->my_arg));
+ __TBB_store_with_release(current->status, SUCCEEDED);
+ }
+ else {
+ __TBB_store_with_release(current->status, FAILED);
+ }
+ break;
+ case res_port:
+ __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();
+ }
+ __TBB_store_with_release(current->status, SUCCEEDED);
+ break;
+ }
+ }
+ }
+ // ------------ End Aggregator ---------------
+ public:
+
+ //! Constructor
+ queueing_port() : item_buffer<T>() {
+ my_join = NULL;
+ my_aggregator.initialize_handler(my_handler(this));
+ }
+
+ //! copy constructor
+ queueing_port(const queueing_port& /* other */) : receiver<T>(), item_buffer<T>() {
+ my_join = NULL;
+ my_aggregator.initialize_handler(my_handler(this));
+ }
+
+ //! record parent for tallying available items
+ void set_join_node_pointer(forwarding_base *join) {
+ 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);
+ return op_data.status == SUCCEEDED;
+ }
+
+ // reset_port is called when item is accepted by successor, but
+ // is initiated by join_node.
+ void reset_port() {
+ queueing_port_operation op_data(res_port);
+ my_aggregator.execute(&op_data);
+ return;
+ }
+
+ private:
+ forwarding_base *my_join;
+ };
+
+#include "_flow_graph_tagged_buffer_impl.h"
+
+ template< typename T >
+ class tag_matching_port : public receiver<T>, public tagged_buffer< tag_value, T, NO_TAG > {
+ public:
+ typedef T input_type;
+ 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;
+ private:
+// ----------- Aggregator ------------
+ private:
+ enum op_type { try__put, get__item, res_port };
+ enum op_stat {WAIT=0, SUCCEEDED, FAILED};
+ typedef tag_matching_port<T> my_class;
+
+ class tag_matching_port_operation : public aggregated_operation<tag_matching_port_operation> {
+ public:
+ char type;
+ T my_val;
+ T *my_arg;
+ 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) :
+ type(char(t)), my_arg(const_cast<T*>(p)) {}
+ // constructor with no parameter
+ tag_matching_port_operation(op_type t) : type(char(t)) {}
+ };
+
+ typedef internal::aggregating_functor<my_class, tag_matching_port_operation> my_handler;
+ friend class internal::aggregating_functor<my_class, tag_matching_port_operation>;
+ aggregator<my_handler, tag_matching_port_operation> my_aggregator;
+
+ void handle_operations(tag_matching_port_operation* op_list) {
+ tag_matching_port_operation *current;
+ while(op_list) {
+ current = op_list;
+ op_list = op_list->next;
+ switch(current->type) {
+ case try__put: {
+ bool was_inserted = this->tagged_insert(current->my_tag_value, current->my_val);
+ if(!was_inserted) __TBB_ASSERT( false, "multiple insertions of same tag");
+ __TBB_store_with_release(current->status, SUCCEEDED);
+ }
+ break;
+ case get__item:
+ // use current_tag from FE for item
+ if(!this->tagged_find(my_join->current_tag, *(current->my_arg))) {
+ __TBB_ASSERT(false, "Failed to find item corresponding to current_tag.");
+ }
+ __TBB_store_with_release(current->status, SUCCEEDED);
+ break;
+ case res_port:
+ // use current_tag from FE for item
+ this->tagged_delete(my_join->current_tag);
+ __TBB_store_with_release(current->status, SUCCEEDED);
+ break;
+ }
+ }
+ }
+// ------------ End Aggregator ---------------
+ public:
+
+ tag_matching_port() : receiver<T>(), tagged_buffer<tag_value, T, NO_TAG>() {
+ my_join = NULL;
+ my_tag_func = NULL;
+ my_original_tag_func = NULL;
+ my_aggregator.initialize_handler(my_handler(this));
+ }
+
+ // copy constructor
+ tag_matching_port(const tag_matching_port& /*other*/) : receiver<T>(), tagged_buffer<tag_value,T, NO_TAG>() {
+ my_join = NULL;
+ // setting the tag methods is done in the copy-constructor for the front-end.
+ my_tag_func = NULL;
+ my_original_tag_func = NULL;
+ my_aggregator.initialize_handler(my_handler(this));
+ }
+
+ ~tag_matching_port() {
+ if (my_tag_func) delete my_tag_func;
+ if (my_original_tag_func) delete my_original_tag_func;
+ }
+
+ void set_join_node_pointer(forwarding_base *join) {
+ my_join = join;
+ }
+
+ void set_my_original_tag_func(my_tag_func_type *f) {
+ my_original_tag_func = f;
+ }
+
+ void set_my_tag_func(my_tag_func_type *f) {
+ 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);
+ return op_data.status == SUCCEEDED;
+ }
+
+ // reset_port is called when item is accepted by successor, but
+ // is initiated by join_node.
+ void reset_port() {
+ tag_matching_port_operation op_data(res_port);
+ my_aggregator.execute(&op_data);
+ return;
+ }
+
+ my_tag_func_type *my_func() { return my_tag_func; }
+ my_tag_func_type *my_original_func() { return my_original_tag_func; }
+
+ private:
+ // need map of tags to values
+ forwarding_base *my_join;
+ my_tag_func_type *my_tag_func;
+ my_tag_func_type *my_original_tag_func;
+ }; // tag_matching_port
+
+ using namespace graph_policy_namespace;
+
+ template<graph_buffer_policy JP, typename InputTuple, typename OutputTuple>
+ class join_node_base;
+
+ //! join_node_FE : implements input port policy
+ template<graph_buffer_policy JP, typename InputTuple, typename OutputTuple>
+ class join_node_FE;
+
+ 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;
+ typedef OutputTuple output_type;
+ typedef InputTuple input_type;
+ typedef join_node_base<reserving, InputTuple, OutputTuple> my_node_type; // for forwarding
+
+ join_node_FE(graph &g) : forwarding_base(g.root_task()), my_node(NULL) {
+ ports_with_no_inputs = N;
+ join_helper<N>::set_join_node_pointer(my_inputs, this);
+ }
+
+ join_node_FE(const join_node_FE& other) : forwarding_base(other.my_root_task), my_node(NULL) {
+ ports_with_no_inputs = N;
+ join_helper<N>::set_join_node_pointer(my_inputs, this);
+ }
+
+ void set_my_node(my_node_type *new_my_node) { my_node = new_my_node; }
+
+ void increment_port_count() {
+ ++ports_with_no_inputs;
+ }
+
+ // if all input_ports have predecessors, spawn forward to try and consume tuples
+ void decrement_port_count() {
+ 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) );
+ }
+ }
+
+ input_type &inputs() { return my_inputs; }
+ protected:
+ // all methods on input ports should be called under mutual exclusion from join_node_base.
+
+ bool tuple_build_may_succeed() {
+ return !ports_with_no_inputs;
+ }
+
+ bool try_to_make_tuple(output_type &out) {
+ if(ports_with_no_inputs) return false;
+ return join_helper<N>::reserve(my_inputs, out);
+ }
+
+ void tuple_accepted() {
+ join_helper<N>::consume_reservations(my_inputs);
+ }
+ void tuple_rejected() {
+ join_helper<N>::release_reservations(my_inputs);
+ }
+
+ input_type my_inputs;
+ my_node_type *my_node;
+ atomic<size_t> ports_with_no_inputs;
+ };
+
+ 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;
+ typedef OutputTuple output_type;
+ typedef InputTuple input_type;
+ typedef join_node_base<queueing, InputTuple, OutputTuple> my_node_type; // for forwarding
+
+ join_node_FE(graph &g) : forwarding_base(g.root_task()), my_node(NULL) {
+ ports_with_no_items = N;
+ join_helper<N>::set_join_node_pointer(my_inputs, this);
+ }
+
+ join_node_FE(const join_node_FE& other) : forwarding_base(other.my_root_task), my_node(NULL) {
+ ports_with_no_items = N;
+ join_helper<N>::set_join_node_pointer(my_inputs, this);
+ }
+
+ // needed for forwarding
+ void set_my_node(my_node_type *new_my_node) { my_node = new_my_node; }
+
+ void reset_port_count() {
+ ports_with_no_items = N;
+ }
+
+ // if all input_ports have items, spawn forward to try and consume tuples
+ void decrement_port_count() {
+ 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) );
+ }
+ }
+
+ void increment_port_count() { __TBB_ASSERT(false, NULL); } // should never be called
+
+ input_type &inputs() { return my_inputs; }
+ protected:
+ // all methods on input ports should be called under mutual exclusion from join_node_base.
+
+ bool tuple_build_may_succeed() {
+ return !ports_with_no_items;
+ }
+
+ bool try_to_make_tuple(output_type &out) {
+ if(ports_with_no_items) return false;
+ return join_helper<N>::get_items(my_inputs, out);
+ }
+
+ void tuple_accepted() {
+ reset_port_count();
+ join_helper<N>::reset_ports(my_inputs);
+ }
+ void tuple_rejected() {
+ // nothing to do.
+ }
+
+ input_type my_inputs;
+ my_node_type *my_node;
+ atomic<size_t> ports_with_no_items;
+ };
+
+ // tag_matching join input port.
+ template<typename InputTuple, typename OutputTuple>
+ class join_node_FE<tag_matching, InputTuple, OutputTuple> : public forwarding_base,
+ public tagged_buffer<tag_value, size_t, NO_TAG>, public item_buffer<OutputTuple> {
+ public:
+ static const int N = std::tuple_size<OutputTuple>::value;
+ typedef OutputTuple output_type;
+ typedef InputTuple input_type;
+ typedef tagged_buffer<tag_value, size_t, NO_TAG> my_tag_buffer;
+ typedef item_buffer<output_type> output_buffer_type;
+ typedef join_node_base<tag_matching, InputTuple, OutputTuple> my_node_type; // for forwarding
+
+// ----------- Aggregator ------------
+ // the aggregator is only needed to serialize the access to the hash table.
+ // and the output_buffer_type base class
+ private:
+ enum op_type { res_count, inc_count, may_succeed, try_make };
+ enum op_stat {WAIT=0, SUCCEEDED, FAILED};
+ typedef join_node_FE<tag_matching, InputTuple, OutputTuple> my_class;
+
+ class tag_matching_FE_operation : public aggregated_operation<tag_matching_FE_operation> {
+ public:
+ char type;
+ union {
+ tag_value my_val;
+ output_type* my_output;
+ };
+ // 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) {}
+ // constructor with no parameter
+ tag_matching_FE_operation(op_type t) : type(char(t)) {}
+ };
+
+ typedef internal::aggregating_functor<my_class, tag_matching_FE_operation> my_handler;
+ friend class internal::aggregating_functor<my_class, tag_matching_FE_operation>;
+ aggregator<my_handler, tag_matching_FE_operation> my_aggregator;
+
+ // called from aggregator, so serialized
+ void fill_output_buffer(bool should_enqueue) {
+ output_type l_out;
+ bool do_fwd = should_enqueue && this->buffer_empty();
+ while(find_value_tag(this->current_tag,N)) {
+ this->tagged_delete(this->current_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) );
+ do_fwd = false;
+ }
+ // retire the input values
+ join_helper<N>::reset_ports(my_inputs); // <== call back
+ this->current_tag = NO_TAG;
+ }
+ else {
+ __TBB_ASSERT(false, "should have had something to push");
+ }
+ }
+ }
+
+ void handle_operations(tag_matching_FE_operation* op_list) {
+ tag_matching_FE_operation *current;
+ while(op_list) {
+ current = op_list;
+ op_list = op_list->next;
+ switch(current->type) {
+ case res_count: // called from BE
+ {
+ 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);
+ __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;
+ if(!(this->tagged_find_ref(t,p))) {
+ this->tagged_insert(t, 0);
+ if(!(this->tagged_find_ref(t,p))) {
+ __TBB_ASSERT(false, NULL);
+ }
+ }
+ if(++(*p) == size_t(N)) {
+ task::enqueue( * new ( task::allocate_additional_child_of( *(this->my_root_task) ) )
+ forward_task<my_node_type>(*my_node) );
+ }
+ }
+ __TBB_store_with_release(current->status, SUCCEEDED);
+ break;
+ case may_succeed: // called from BE
+ fill_output_buffer(false);
+ __TBB_store_with_release(current->status, this->buffer_empty() ? FAILED : SUCCEEDED);
+ break;
+ case try_make: // called from BE
+ if(this->buffer_empty()) {
+ __TBB_store_with_release(current->status, FAILED);
+ }
+ else {
+ this->fetch_front(*(current->my_output));
+ __TBB_store_with_release(current->status, SUCCEEDED);
+ }
+ break;
+ }
+ }
+ }
+// ------------ End Aggregator ---------------
+
+ public:
+ template<typename FunctionTuple>
+ join_node_FE(graph &g, FunctionTuple tag_funcs) : forwarding_base(g.root_task()), my_node(NULL) {
+ join_helper<N>::set_join_node_pointer(my_inputs, this);
+ join_helper<N>::set_tag_func(my_inputs, tag_funcs);
+ my_aggregator.initialize_handler(my_handler(this));
+ }
+
+ join_node_FE(const join_node_FE& other) : forwarding_base(other.my_root_task), my_tag_buffer(),
+ output_buffer_type() {
+ my_node = NULL;
+ join_helper<N>::set_join_node_pointer(my_inputs, this);
+ join_helper<N>::copy_tag_functors(my_inputs, const_cast<input_type &>(other.my_inputs));
+ my_aggregator.initialize_handler(my_handler(this));
+ }
+
+ // needed for forwarding
+ void set_my_node(my_node_type *new_my_node) { my_node = new_my_node; }
+
+ void reset_port_count() { // called from BE
+ tag_matching_FE_operation op_data(res_count);
+ my_aggregator.execute(&op_data);
+ return;
+ }
+
+ // 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);
+ my_aggregator.execute(&op_data);
+ return;
+ }
+
+ void decrement_port_count() { __TBB_ASSERT(false, NULL); }
+
+ void increment_port_count() { __TBB_ASSERT(false, NULL); } // should never be called
+
+ input_type &inputs() { return my_inputs; }
+ protected:
+ // all methods on input ports should be called under mutual exclusion from join_node_base.
+
+ bool tuple_build_may_succeed() { // called from back-end
+ tag_matching_FE_operation op_data(may_succeed);
+ my_aggregator.execute(&op_data);
+ return op_data.status == SUCCEEDED;
+ }
+
+ // cannot lock while calling back to input_ports. current_tag will only be set
+ // and reset under the aggregator, so it will remain consistent.
+ bool try_to_make_tuple(output_type &out) {
+ tag_matching_FE_operation op_data(&out,try_make);
+ my_aggregator.execute(&op_data);
+ return op_data.status == SUCCEEDED;
+ }
+
+ void tuple_accepted() {
+ reset_port_count(); // reset current_tag after ports reset.
+ }
+
+ void tuple_rejected() {
+ // nothing to do.
+ }
+
+ input_type my_inputs; // input ports
+ my_node_type *my_node;
+ }; // join_node_FE<tag_matching, InputTuple, OutputTuple>
+
+ //! join_node_base
+ 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> {
+ public:
+ typedef OutputTuple output_type;
+
+ typedef receiver<output_type> successor_type;
+ typedef join_node_FE<JP, InputTuple, OutputTuple> input_ports_type;
+ using input_ports_type::tuple_build_may_succeed;
+ using input_ports_type::try_to_make_tuple;
+ using input_ports_type::tuple_accepted;
+ using input_ports_type::tuple_rejected;
+
+ private:
+ // ----------- Aggregator ------------
+ enum op_type { reg_succ, rem_succ, try__get, do_fwrd };
+ enum op_stat {WAIT=0, SUCCEEDED, FAILED};
+ typedef join_node_base<JP,InputTuple,OutputTuple> my_class;
+
+ class join_node_base_operation : public aggregated_operation<join_node_base_operation> {
+ public:
+ char type;
+ union {
+ 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)) {}
+ 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)) {}
+ };
+
+ typedef internal::aggregating_functor<my_class, join_node_base_operation> my_handler;
+ friend class internal::aggregating_functor<my_class, join_node_base_operation>;
+ bool forwarder_busy;
+ aggregator<my_handler, join_node_base_operation> my_aggregator;
+
+ void handle_operations(join_node_base_operation* op_list) {
+ join_node_base_operation *current;
+ while(op_list) {
+ current = op_list;
+ op_list = op_list->next;
+ switch(current->type) {
+ 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));
+ forwarder_busy = true;
+ }
+ __TBB_store_with_release(current->status, SUCCEEDED);
+ break;
+ case rem_succ:
+ my_successors.remove_successor(*(current->my_succ));
+ __TBB_store_with_release(current->status, SUCCEEDED);
+ break;
+ case try__get:
+ if(tuple_build_may_succeed()) {
+ if(try_to_make_tuple(*(current->my_arg))) {
+ tuple_accepted();
+ __TBB_store_with_release(current->status, SUCCEEDED);
+ }
+ else __TBB_store_with_release(current->status, FAILED);
+ }
+ else __TBB_store_with_release(current->status, FAILED);
+ break;
+ case do_fwrd: {
+ bool build_succeeded;
+ 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)) {
+ tuple_accepted();
+ }
+ else {
+ tuple_rejected();
+ build_succeeded = false;
+ }
+ }
+ } while(build_succeeded);
+ }
+ __TBB_store_with_release(current->status, SUCCEEDED);
+ forwarder_busy = false;
+ }
+ break;
+ }
+ }
+ }
+ // ---------- end aggregator -----------
+ public:
+ join_node_base(graph &g) : input_ports_type(g), forwarder_busy(false) {
+ my_successors.set_owner(this);
+ input_ports_type::set_my_node(this);
+ my_aggregator.initialize_handler(my_handler(this));
+ }
+
+ join_node_base(const join_node_base& other) :
+ graph_node(), input_ports_type(other),
+ sender<OutputTuple>(), forwarder_busy(false), my_successors() {
+ my_successors.set_owner(this);
+ input_ports_type::set_my_node(this);
+ my_aggregator.initialize_handler(my_handler(this));
+ }
+
+ template<typename FunctionTuple>
+ join_node_base(graph &g, FunctionTuple f) : input_ports_type(g, f), forwarder_busy(false) {
+ my_successors.set_owner(this);
+ input_ports_type::set_my_node(this);
+ my_aggregator.initialize_handler(my_handler(this));
+ }
+
+ bool register_successor(successor_type &r) {
+ join_node_base_operation op_data(r, reg_succ);
+ my_aggregator.execute(&op_data);
+ return op_data.status == SUCCEEDED;
+ }
+
+ bool remove_successor( successor_type &r) {
+ join_node_base_operation op_data(r, rem_succ);
+ my_aggregator.execute(&op_data);
+ return op_data.status == SUCCEEDED;
+ }
+
+ bool try_get( output_type &v) {
+ join_node_base_operation op_data(v, try__get);
+ my_aggregator.execute(&op_data);
+ return op_data.status == SUCCEEDED;
+ }
+
+ 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);
+ my_aggregator.execute(&op_data);
+ }
+ };
+
+ //! unfolded_join_node : passes input_ports_tuple_type to join_node_base. We build the input port type
+ // using tuple_element. The class PT is the port type (reserving_port, queueing_port, tag_matching_port)
+ // and should match the graph_buffer_policy.
+ template<int N, template<class> class PT, typename OutputTuple, graph_buffer_policy JP>
+ class unfolded_join_node;
+
+ template<template<class> class PT, typename OutputTuple, graph_buffer_policy JP>
+ class unfolded_join_node<2,PT,OutputTuple,JP> : public internal::join_node_base<JP,
+ std::tuple<
+ PT<typename std::tuple_element<0,OutputTuple>::type>,
+ PT<typename std::tuple_element<1,OutputTuple>::type> >,
+ OutputTuple
+ >
+ {
+ public:
+ typedef typename std::tuple<
+ PT<typename std::tuple_element<0,OutputTuple>::type>,
+ PT<typename std::tuple_element<1,OutputTuple>::type> > input_ports_tuple_type;
+ typedef OutputTuple output_type;
+ private:
+ typedef join_node_base<JP, input_ports_tuple_type, output_type > base_type;
+ public:
+ unfolded_join_node(graph &g) : base_type(g) {}
+ unfolded_join_node(const unfolded_join_node &other) : base_type(other) {}
+ };
+
+ template<template<class> class PT, typename OutputTuple, graph_buffer_policy JP>
+ class unfolded_join_node<3,PT,OutputTuple,JP> : public internal::join_node_base<JP,
+ std::tuple<
+ PT<typename std::tuple_element<0,OutputTuple>::type>,
+ PT<typename std::tuple_element<1,OutputTuple>::type>,
+ PT<typename std::tuple_element<2,OutputTuple>::type> >,
+ OutputTuple
+ >
+ {
+ public:
+ typedef typename std::tuple<
+ PT<typename std::tuple_element<0,OutputTuple>::type>,
+ PT<typename std::tuple_element<1,OutputTuple>::type>,
+ PT<typename std::tuple_element<2,OutputTuple>::type> > input_ports_tuple_type;
+ typedef OutputTuple output_type;
+ private:
+ typedef join_node_base<JP, input_ports_tuple_type, output_type > base_type;
+ public:
+ unfolded_join_node(graph &g) : base_type(g) {}
+ unfolded_join_node(const unfolded_join_node &other) : base_type(other) {}
+ };
+
+ template<template<class> class PT, typename OutputTuple, graph_buffer_policy JP>
+ class unfolded_join_node<4,PT,OutputTuple,JP> : public internal::join_node_base<JP,
+ std::tuple<
+ PT<typename std::tuple_element<0,OutputTuple>::type>,
+ PT<typename std::tuple_element<1,OutputTuple>::type>,
+ PT<typename std::tuple_element<2,OutputTuple>::type>,
+ PT<typename std::tuple_element<3,OutputTuple>::type> >,
+ OutputTuple
+ > {
+ public:
+ typedef typename std::tuple<
+ PT<typename std::tuple_element<0,OutputTuple>::type>,
+ PT<typename std::tuple_element<1,OutputTuple>::type>,
+ PT<typename std::tuple_element<2,OutputTuple>::type>,
+ PT<typename std::tuple_element<3,OutputTuple>::type> > input_ports_tuple_type;
+ typedef OutputTuple output_type;
+ private:
+ typedef join_node_base<JP, input_ports_tuple_type, output_type > base_type;
+ public:
+ unfolded_join_node(graph &g) : base_type(g) {}
+ unfolded_join_node(const unfolded_join_node &other) : base_type(other) {}
+ };
+
+ template<template<class> class PT, typename OutputTuple, graph_buffer_policy JP>
+ class unfolded_join_node<5,PT,OutputTuple,JP> : public internal::join_node_base<JP,
+ std::tuple<
+ PT<typename std::tuple_element<0,OutputTuple>::type>,
+ PT<typename std::tuple_element<1,OutputTuple>::type>,
+ PT<typename std::tuple_element<2,OutputTuple>::type>,
+ PT<typename std::tuple_element<3,OutputTuple>::type>,
+ PT<typename std::tuple_element<4,OutputTuple>::type> >,
+ OutputTuple
+ > {
+ public:
+ typedef typename std::tuple<
+ PT<typename std::tuple_element<0,OutputTuple>::type>,
+ PT<typename std::tuple_element<1,OutputTuple>::type>,
+ PT<typename std::tuple_element<2,OutputTuple>::type>,
+ PT<typename std::tuple_element<3,OutputTuple>::type>,
+ PT<typename std::tuple_element<4,OutputTuple>::type> > input_ports_tuple_type;
+ typedef OutputTuple output_type;
+ private:
+ typedef join_node_base<JP, input_ports_tuple_type, output_type > base_type;
+ public:
+ unfolded_join_node(graph &g) : base_type(g) {}
+ unfolded_join_node(const unfolded_join_node &other) : base_type(other) {}
+ };
+
+ template<template<class> class PT, typename OutputTuple, graph_buffer_policy JP>
+ class unfolded_join_node<6,PT,OutputTuple,JP> : public internal::join_node_base<JP,
+ std::tuple<
+ PT<typename std::tuple_element<0,OutputTuple>::type>,
+ PT<typename std::tuple_element<1,OutputTuple>::type>,
+ PT<typename std::tuple_element<2,OutputTuple>::type>,
+ PT<typename std::tuple_element<3,OutputTuple>::type>,
+ PT<typename std::tuple_element<4,OutputTuple>::type>,
+ PT<typename std::tuple_element<5,OutputTuple>::type> >,
+ OutputTuple
+ > {
+ public:
+ typedef typename std::tuple<
+ PT<typename std::tuple_element<0,OutputTuple>::type>,
+ PT<typename std::tuple_element<1,OutputTuple>::type>,
+ PT<typename std::tuple_element<2,OutputTuple>::type>,
+ PT<typename std::tuple_element<3,OutputTuple>::type>,
+ PT<typename std::tuple_element<4,OutputTuple>::type>,
+ PT<typename std::tuple_element<5,OutputTuple>::type> > input_ports_tuple_type;
+ typedef OutputTuple output_type;
+ private:
+ typedef join_node_base<JP, input_ports_tuple_type, output_type > base_type;
+ public:
+ unfolded_join_node(graph &g) : base_type(g) {}
+ unfolded_join_node(const unfolded_join_node &other) : base_type(other) {}
+ };
+
+ template<template<class> class PT, typename OutputTuple, graph_buffer_policy JP>
+ class unfolded_join_node<7,PT,OutputTuple,JP> : public internal::join_node_base<JP,
+ std::tuple<
+ PT<typename std::tuple_element<0,OutputTuple>::type>,
+ PT<typename std::tuple_element<1,OutputTuple>::type>,
+ PT<typename std::tuple_element<2,OutputTuple>::type>,
+ PT<typename std::tuple_element<3,OutputTuple>::type>,
+ PT<typename std::tuple_element<4,OutputTuple>::type>,
+ PT<typename std::tuple_element<5,OutputTuple>::type>,
+ PT<typename std::tuple_element<6,OutputTuple>::type> >,
+ OutputTuple
+ > {
+ public:
+ typedef typename std::tuple<
+ PT<typename std::tuple_element<0,OutputTuple>::type>,
+ PT<typename std::tuple_element<1,OutputTuple>::type>,
+ PT<typename std::tuple_element<2,OutputTuple>::type>,
+ PT<typename std::tuple_element<3,OutputTuple>::type>,
+ PT<typename std::tuple_element<4,OutputTuple>::type>,
+ PT<typename std::tuple_element<5,OutputTuple>::type>,
+ PT<typename std::tuple_element<6,OutputTuple>::type> > input_ports_tuple_type;
+ typedef OutputTuple output_type;
+ private:
+ typedef join_node_base<JP, input_ports_tuple_type, output_type > base_type;
+ public:
+ unfolded_join_node(graph &g) : base_type(g) {}
+ unfolded_join_node(const unfolded_join_node &other) : base_type(other) {}
+ };
+
+ template<template<class> class PT, typename OutputTuple, graph_buffer_policy JP>
+ class unfolded_join_node<8,PT,OutputTuple,JP> : public internal::join_node_base<JP,
+ std::tuple<
+ PT<typename std::tuple_element<0,OutputTuple>::type>,
+ PT<typename std::tuple_element<1,OutputTuple>::type>,
+ PT<typename std::tuple_element<2,OutputTuple>::type>,
+ PT<typename std::tuple_element<3,OutputTuple>::type>,
+ PT<typename std::tuple_element<4,OutputTuple>::type>,
+ PT<typename std::tuple_element<5,OutputTuple>::type>,
+ PT<typename std::tuple_element<6,OutputTuple>::type>,
+ PT<typename std::tuple_element<7,OutputTuple>::type> >,
+ OutputTuple
+ > {
+ public:
+ typedef typename std::tuple<
+ PT<typename std::tuple_element<0,OutputTuple>::type>,
+ PT<typename std::tuple_element<1,OutputTuple>::type>,
+ PT<typename std::tuple_element<2,OutputTuple>::type>,
+ PT<typename std::tuple_element<3,OutputTuple>::type>,
+ PT<typename std::tuple_element<4,OutputTuple>::type>,
+ PT<typename std::tuple_element<5,OutputTuple>::type>,
+ PT<typename std::tuple_element<6,OutputTuple>::type>,
+ PT<typename std::tuple_element<7,OutputTuple>::type> > input_ports_tuple_type;
+ typedef OutputTuple output_type;
+ private:
+ typedef join_node_base<JP, input_ports_tuple_type, output_type > base_type;
+ public:
+ unfolded_join_node(graph &g) : base_type(g) {}
+ unfolded_join_node(const unfolded_join_node &other) : base_type(other) {}
+ };
+
+ template<template<class> class PT, typename OutputTuple, graph_buffer_policy JP>
+ class unfolded_join_node<9,PT,OutputTuple,JP> : public internal::join_node_base<JP,
+ std::tuple<
+ PT<typename std::tuple_element<0,OutputTuple>::type>,
+ PT<typename std::tuple_element<1,OutputTuple>::type>,
+ PT<typename std::tuple_element<2,OutputTuple>::type>,
+ PT<typename std::tuple_element<3,OutputTuple>::type>,
+ PT<typename std::tuple_element<4,OutputTuple>::type>,
+ PT<typename std::tuple_element<5,OutputTuple>::type>,
+ PT<typename std::tuple_element<6,OutputTuple>::type>,
+ PT<typename std::tuple_element<7,OutputTuple>::type>,
+ PT<typename std::tuple_element<8,OutputTuple>::type> >,
+ OutputTuple
+ > {
+ public:
+ typedef typename std::tuple<
+ PT<typename std::tuple_element<0,OutputTuple>::type>,
+ PT<typename std::tuple_element<1,OutputTuple>::type>,
+ PT<typename std::tuple_element<2,OutputTuple>::type>,
+ PT<typename std::tuple_element<3,OutputTuple>::type>,
+ PT<typename std::tuple_element<4,OutputTuple>::type>,
+ PT<typename std::tuple_element<5,OutputTuple>::type>,
+ PT<typename std::tuple_element<6,OutputTuple>::type>,
+ PT<typename std::tuple_element<7,OutputTuple>::type>,
+ PT<typename std::tuple_element<8,OutputTuple>::type> > input_ports_tuple_type;
+ typedef OutputTuple output_type;
+ private:
+ typedef join_node_base<JP, input_ports_tuple_type, output_type > base_type;
+ public:
+ unfolded_join_node(graph &g) : base_type(g) {}
+ unfolded_join_node(const unfolded_join_node &other) : base_type(other) {}
+ };
+
+ template<template<class> class PT, typename OutputTuple, graph_buffer_policy JP>
+ class unfolded_join_node<10,PT,OutputTuple,JP> : public internal::join_node_base<JP,
+ std::tuple<
+ PT<typename std::tuple_element<0,OutputTuple>::type>,
+ PT<typename std::tuple_element<1,OutputTuple>::type>,
+ PT<typename std::tuple_element<2,OutputTuple>::type>,
+ PT<typename std::tuple_element<3,OutputTuple>::type>,
+ PT<typename std::tuple_element<4,OutputTuple>::type>,
+ PT<typename std::tuple_element<5,OutputTuple>::type>,
+ PT<typename std::tuple_element<6,OutputTuple>::type>,
+ PT<typename std::tuple_element<7,OutputTuple>::type>,
+ PT<typename std::tuple_element<8,OutputTuple>::type>,
+ PT<typename std::tuple_element<9,OutputTuple>::type> >,
+ OutputTuple
+ > {
+ public:
+ typedef typename std::tuple<
+ PT<typename std::tuple_element<0,OutputTuple>::type>,
+ PT<typename std::tuple_element<1,OutputTuple>::type>,
+ PT<typename std::tuple_element<2,OutputTuple>::type>,
+ PT<typename std::tuple_element<3,OutputTuple>::type>,
+ PT<typename std::tuple_element<4,OutputTuple>::type>,
+ PT<typename std::tuple_element<5,OutputTuple>::type>,
+ PT<typename std::tuple_element<6,OutputTuple>::type>,
+ PT<typename std::tuple_element<7,OutputTuple>::type>,
+ PT<typename std::tuple_element<8,OutputTuple>::type>,
+ PT<typename std::tuple_element<9,OutputTuple>::type> > input_ports_tuple_type;
+ typedef OutputTuple output_type;
+ private:
+ typedef join_node_base<JP, input_ports_tuple_type, output_type > base_type;
+ public:
+ unfolded_join_node(graph &g) : base_type(g) {}
+ unfolded_join_node(const unfolded_join_node &other) : base_type(other) {}
+ };
+
+ // tag_matching unfolded_join_node. This must be a separate specialization because the constructors
+ // differ.
+
+ template<typename OutputTuple>
+ class unfolded_join_node<2,tag_matching_port,OutputTuple,tag_matching> : public internal::join_node_base<tag_matching,
+ std::tuple<
+ tag_matching_port<typename std::tuple_element<0,OutputTuple>::type>,
+ tag_matching_port<typename std::tuple_element<1,OutputTuple>::type> >,
+ OutputTuple
+ >
+ {
+ typedef typename std::tuple_element<0, OutputTuple>::type T0;
+ typedef typename std::tuple_element<1, OutputTuple>::type T1;
+ public:
+ typedef typename std::tuple< tag_matching_port<T0>, tag_matching_port<T1> > input_ports_tuple_type;
+ typedef OutputTuple output_type;
+ private:
+ typedef join_node_base<tag_matching, input_ports_tuple_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;
+ public:
+ template<typename B0, typename B1>
+ unfolded_join_node(graph &g, B0 b0, B1 b1) : base_type(g,
+ func_initializer_type(
+ new internal::function_body_leaf<T0, tag_value, B0>(b0),
+ new internal::function_body_leaf<T1, tag_value, B1>(b1)
+ ) ) {}
+ unfolded_join_node(const unfolded_join_node &other) : base_type(other) {}
+ };
+
+ template<typename OutputTuple>
+ class unfolded_join_node<3,tag_matching_port,OutputTuple,tag_matching> : public internal::join_node_base<tag_matching,
+ std::tuple<
+ tag_matching_port<typename std::tuple_element<0,OutputTuple>::type>,
+ tag_matching_port<typename std::tuple_element<1,OutputTuple>::type>,
+ tag_matching_port<typename std::tuple_element<2,OutputTuple>::type> >,
+ OutputTuple
+ >
+ {
+ 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;
+ public:
+ typedef typename std::tuple< tag_matching_port<T0>, tag_matching_port<T1>, tag_matching_port<T2>
+ > input_ports_tuple_type;
+ typedef OutputTuple output_type;
+ private:
+ typedef join_node_base<tag_matching, input_ports_tuple_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 internal::function_body<T2, tag_value> *f2_p;
+ typedef typename std::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,
+ func_initializer_type(
+ new internal::function_body_leaf<T0, tag_value, B0>(b0),
+ new internal::function_body_leaf<T1, tag_value, B1>(b1),
+ new internal::function_body_leaf<T2, tag_value, B2>(b2)
+ ) ) {}
+ unfolded_join_node(const unfolded_join_node &other) : base_type(other) {}
+ };
+
+ template<typename OutputTuple>
+ class unfolded_join_node<4,tag_matching_port,OutputTuple,tag_matching> : public internal::join_node_base<tag_matching,
+ std::tuple<
+ tag_matching_port<typename std::tuple_element<0,OutputTuple>::type>,
+ tag_matching_port<typename std::tuple_element<1,OutputTuple>::type>,
+ tag_matching_port<typename std::tuple_element<2,OutputTuple>::type>,
+ tag_matching_port<typename std::tuple_element<3,OutputTuple>::type>
+ >, OutputTuple >
+ {
+ 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;
+ public:
+ typedef typename std::tuple< tag_matching_port<T0>, tag_matching_port<T1>, tag_matching_port<T2>,
+ tag_matching_port<T3> > input_ports_tuple_type;
+ typedef OutputTuple output_type;
+ private:
+ typedef join_node_base<tag_matching, input_ports_tuple_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 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;
+ 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,
+ func_initializer_type(
+ new internal::function_body_leaf<T0, tag_value, B0>(b0),
+ new internal::function_body_leaf<T1, tag_value, B1>(b1),
+ new internal::function_body_leaf<T2, tag_value, B2>(b2),
+ new internal::function_body_leaf<T3, tag_value, B3>(b3)
+ ) ) {}
+ unfolded_join_node(const unfolded_join_node &other) : base_type(other) {}
+ };
+
+ template<typename OutputTuple>
+ class unfolded_join_node<5,tag_matching_port,OutputTuple,tag_matching> : public internal::join_node_base<tag_matching,
+ std::tuple<
+ tag_matching_port<typename std::tuple_element<0,OutputTuple>::type>,
+ tag_matching_port<typename std::tuple_element<1,OutputTuple>::type>,
+ tag_matching_port<typename std::tuple_element<2,OutputTuple>::type>,
+ tag_matching_port<typename std::tuple_element<3,OutputTuple>::type>,
+ tag_matching_port<typename std::tuple_element<4,OutputTuple>::type>
+ >, OutputTuple >
+ {
+ 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;
+ public:
+ typedef typename std::tuple< tag_matching_port<T0>, tag_matching_port<T1>, tag_matching_port<T2>,
+ tag_matching_port<T3>, tag_matching_port<T4> > input_ports_tuple_type;
+ typedef OutputTuple output_type;
+ private:
+ typedef join_node_base<tag_matching, input_ports_tuple_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 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;
+ 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,
+ func_initializer_type(
+ new internal::function_body_leaf<T0, tag_value, B0>(b0),
+ new internal::function_body_leaf<T1, tag_value, B1>(b1),
+ new internal::function_body_leaf<T2, tag_value, B2>(b2),
+ new internal::function_body_leaf<T3, tag_value, B3>(b3),
+ new internal::function_body_leaf<T4, tag_value, B4>(b4)
+ ) ) {}
+ unfolded_join_node(const unfolded_join_node &other) : base_type(other) {}
+ };
+
+ template<typename OutputTuple>
+ class unfolded_join_node<6,tag_matching_port,OutputTuple,tag_matching> : public internal::join_node_base<tag_matching,
+ std::tuple<
+ tag_matching_port<typename std::tuple_element<0,OutputTuple>::type>,
+ tag_matching_port<typename std::tuple_element<1,OutputTuple>::type>,
+ tag_matching_port<typename std::tuple_element<2,OutputTuple>::type>,
+ tag_matching_port<typename std::tuple_element<3,OutputTuple>::type>,
+ tag_matching_port<typename std::tuple_element<4,OutputTuple>::type>,
+ tag_matching_port<typename std::tuple_element<5,OutputTuple>::type>
+ >, OutputTuple >
+ {
+ 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;
+ public:
+ typedef typename std::tuple< tag_matching_port<T0>, tag_matching_port<T1>, tag_matching_port<T2>,
+ tag_matching_port<T3>, tag_matching_port<T4>, tag_matching_port<T5> > input_ports_tuple_type;
+ typedef OutputTuple output_type;
+ private:
+ typedef join_node_base<tag_matching, input_ports_tuple_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 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 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;
+ 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,
+ func_initializer_type(
+ new internal::function_body_leaf<T0, tag_value, B0>(b0),
+ new internal::function_body_leaf<T1, tag_value, B1>(b1),
+ new internal::function_body_leaf<T2, tag_value, B2>(b2),
+ new internal::function_body_leaf<T3, tag_value, B3>(b3),
+ new internal::function_body_leaf<T4, tag_value, B4>(b4),
+ new internal::function_body_leaf<T5, tag_value, B5>(b5)
+ ) ) {}
+ unfolded_join_node(const unfolded_join_node &other) : base_type(other) {}
+ };
+
+ template<typename OutputTuple>
+ class unfolded_join_node<7,tag_matching_port,OutputTuple,tag_matching> : public internal::join_node_base<tag_matching,
+ std::tuple<
+ tag_matching_port<typename std::tuple_element<0,OutputTuple>::type>,
+ tag_matching_port<typename std::tuple_element<1,OutputTuple>::type>,
+ tag_matching_port<typename std::tuple_element<2,OutputTuple>::type>,
+ tag_matching_port<typename std::tuple_element<3,OutputTuple>::type>,
+ tag_matching_port<typename std::tuple_element<4,OutputTuple>::type>,
+ tag_matching_port<typename std::tuple_element<5,OutputTuple>::type>,
+ tag_matching_port<typename std::tuple_element<6,OutputTuple>::type>
+ >, OutputTuple >
+ {
+ 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;
+ public:
+ typedef typename std::tuple< tag_matching_port<T0>, tag_matching_port<T1>, tag_matching_port<T2>,
+ tag_matching_port<T3>, tag_matching_port<T4>, tag_matching_port<T5>, tag_matching_port<T6>
+ > input_ports_tuple_type;
+ typedef OutputTuple output_type;
+ private:
+ typedef join_node_base<tag_matching, input_ports_tuple_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 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 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;
+ 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,
+ func_initializer_type(
+ new internal::function_body_leaf<T0, tag_value, B0>(b0),
+ new internal::function_body_leaf<T1, tag_value, B1>(b1),
+ new internal::function_body_leaf<T2, tag_value, B2>(b2),
+ new internal::function_body_leaf<T3, tag_value, B3>(b3),
+ new internal::function_body_leaf<T4, tag_value, B4>(b4),
+ new internal::function_body_leaf<T5, tag_value, B5>(b5),
+ new internal::function_body_leaf<T6, tag_value, B6>(b6)
+ ) ) {}
+ unfolded_join_node(const unfolded_join_node &other) : base_type(other) {}
+ };
+
+ template<typename OutputTuple>
+ class unfolded_join_node<8,tag_matching_port,OutputTuple,tag_matching> : public internal::join_node_base<tag_matching,
+ std::tuple<
+ tag_matching_port<typename std::tuple_element<0,OutputTuple>::type>,
+ tag_matching_port<typename std::tuple_element<1,OutputTuple>::type>,
+ tag_matching_port<typename std::tuple_element<2,OutputTuple>::type>,
+ tag_matching_port<typename std::tuple_element<3,OutputTuple>::type>,
+ tag_matching_port<typename std::tuple_element<4,OutputTuple>::type>,
+ tag_matching_port<typename std::tuple_element<5,OutputTuple>::type>,
+ tag_matching_port<typename std::tuple_element<6,OutputTuple>::type>,
+ tag_matching_port<typename std::tuple_element<7,OutputTuple>::type>
+ >, OutputTuple >
+ {
+ 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;
+ public:
+ typedef typename std::tuple< tag_matching_port<T0>, tag_matching_port<T1>, tag_matching_port<T2>,
+ tag_matching_port<T3>, tag_matching_port<T4>, tag_matching_port<T5>, tag_matching_port<T6>,
+ tag_matching_port<T7> > input_ports_tuple_type;
+ typedef OutputTuple output_type;
+ private:
+ typedef join_node_base<tag_matching, input_ports_tuple_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 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 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;
+ 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,
+ func_initializer_type(
+ new internal::function_body_leaf<T0, tag_value, B0>(b0),
+ new internal::function_body_leaf<T1, tag_value, B1>(b1),
+ new internal::function_body_leaf<T2, tag_value, B2>(b2),
+ new internal::function_body_leaf<T3, tag_value, B3>(b3),
+ new internal::function_body_leaf<T4, tag_value, B4>(b4),
+ new internal::function_body_leaf<T5, tag_value, B5>(b5),
+ new internal::function_body_leaf<T6, tag_value, B6>(b6),
+ new internal::function_body_leaf<T7, tag_value, B7>(b7)
+ ) ) {}
+ unfolded_join_node(const unfolded_join_node &other) : base_type(other) {}
+ };
+
+ template<typename OutputTuple>
+ class unfolded_join_node<9,tag_matching_port,OutputTuple,tag_matching> : public internal::join_node_base<tag_matching,
+ std::tuple<
+ tag_matching_port<typename std::tuple_element<0,OutputTuple>::type>,
+ tag_matching_port<typename std::tuple_element<1,OutputTuple>::type>,
+ tag_matching_port<typename std::tuple_element<2,OutputTuple>::type>,
+ tag_matching_port<typename std::tuple_element<3,OutputTuple>::type>,
+ tag_matching_port<typename std::tuple_element<4,OutputTuple>::type>,
+ tag_matching_port<typename std::tuple_element<5,OutputTuple>::type>,
+ tag_matching_port<typename std::tuple_element<6,OutputTuple>::type>,
+ tag_matching_port<typename std::tuple_element<7,OutputTuple>::type>,
+ tag_matching_port<typename std::tuple_element<8,OutputTuple>::type>
+ >, OutputTuple >
+ {
+ 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;
+ public:
+ typedef typename std::tuple< tag_matching_port<T0>, tag_matching_port<T1>, tag_matching_port<T2>,
+ tag_matching_port<T3>, tag_matching_port<T4>, tag_matching_port<T5>, tag_matching_port<T6>,
+ tag_matching_port<T7>, tag_matching_port<T8> > input_ports_tuple_type;
+ typedef OutputTuple output_type;
+ private:
+ typedef join_node_base<tag_matching, input_ports_tuple_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 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 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 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;
+ 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,
+ func_initializer_type(
+ new internal::function_body_leaf<T0, tag_value, B0>(b0),
+ new internal::function_body_leaf<T1, tag_value, B1>(b1),
+ new internal::function_body_leaf<T2, tag_value, B2>(b2),
+ new internal::function_body_leaf<T3, tag_value, B3>(b3),
+ new internal::function_body_leaf<T4, tag_value, B4>(b4),
+ new internal::function_body_leaf<T5, tag_value, B5>(b5),
+ new internal::function_body_leaf<T6, tag_value, B6>(b6),
+ new internal::function_body_leaf<T7, tag_value, B7>(b7),
+ new internal::function_body_leaf<T8, tag_value, B8>(b8)
+ ) ) {}
+ unfolded_join_node(const unfolded_join_node &other) : base_type(other) {}
+ };
+
+ template<typename OutputTuple>
+ class unfolded_join_node<10,tag_matching_port,OutputTuple,tag_matching> : public internal::join_node_base<tag_matching,
+ std::tuple<
+ tag_matching_port<typename std::tuple_element<0,OutputTuple>::type>,
+ tag_matching_port<typename std::tuple_element<1,OutputTuple>::type>,
+ tag_matching_port<typename std::tuple_element<2,OutputTuple>::type>,
+ tag_matching_port<typename std::tuple_element<3,OutputTuple>::type>,
+ tag_matching_port<typename std::tuple_element<4,OutputTuple>::type>,
+ tag_matching_port<typename std::tuple_element<5,OutputTuple>::type>,
+ tag_matching_port<typename std::tuple_element<6,OutputTuple>::type>,
+ tag_matching_port<typename std::tuple_element<7,OutputTuple>::type>,
+ tag_matching_port<typename std::tuple_element<8,OutputTuple>::type>,
+ tag_matching_port<typename std::tuple_element<9,OutputTuple>::type>
+ >, OutputTuple >
+ {
+ 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;
+ public:
+ typedef typename std::tuple< tag_matching_port<T0>, tag_matching_port<T1>, tag_matching_port<T2>,
+ tag_matching_port<T3>, tag_matching_port<T4>, tag_matching_port<T5>, tag_matching_port<T6>,
+ tag_matching_port<T7>, tag_matching_port<T8>, tag_matching_port<T9> > input_ports_tuple_type;
+ typedef OutputTuple output_type;
+ private:
+ typedef join_node_base<tag_matching, input_ports_tuple_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 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 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 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;
+ 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,
+ func_initializer_type(
+ new internal::function_body_leaf<T0, tag_value, B0>(b0),
+ new internal::function_body_leaf<T1, tag_value, B1>(b1),
+ new internal::function_body_leaf<T2, tag_value, B2>(b2),
+ new internal::function_body_leaf<T3, tag_value, B3>(b3),
+ new internal::function_body_leaf<T4, tag_value, B4>(b4),
+ new internal::function_body_leaf<T5, tag_value, B5>(b5),
+ new internal::function_body_leaf<T6, tag_value, B6>(b6),
+ new internal::function_body_leaf<T7, tag_value, B7>(b7),
+ new internal::function_body_leaf<T8, tag_value, B8>(b8),
+ new internal::function_body_leaf<T9, tag_value, B9>(b9)
+ ) ) {}
+ unfolded_join_node(const unfolded_join_node &other) : base_type(other) {}
+ };
+
+ //! 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_tuple_type>::type &input_port(JNT &jn) {
+ return std::get<N>(jn.inputs());
+ }
+
+}
+
+#endif // __TBB__flow_graph_join_impl_H
+
diff --git a/include/tbb/internal/_flow_graph_node_impl.h b/include/tbb/internal/_flow_graph_node_impl.h
new file mode 100644
index 0000000..de2fe40
--- /dev/null
+++ b/include/tbb/internal/_flow_graph_node_impl.h
@@ -0,0 +1,473 @@
+/*
+ Copyright 2005-2011 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__flow_graph_node_impl_H
+#define __TBB__flow_graph_node_impl_H
+
+#ifndef __TBB_flow_graph_H
+#error Do not #include this internal file directly; use public TBB headers instead.
+#endif
+
+#include "_flow_graph_item_buffer_impl.h"
+
+//! @cond INTERNAL
+namespace internal {
+
+ using tbb::internal::aggregated_operation;
+ using tbb::internal::aggregating_functor;
+ using tbb::internal::aggregator;
+
+ template< typename T, typename A >
+ class function_input_queue : public item_buffer<T,A> {
+ public:
+ bool pop( T& t ) {
+ return this->pop_front( t );
+ }
+
+ bool push( T& t ) {
+ return this->push_back( t );
+ }
+ };
+
+ //! Input and scheduling for a function node that takes a type Input as input
+ // The only up-ref is apply_body_impl, which should implement the function
+ // call and any handling of the result.
+ template< typename Input, typename A, typename ImplType >
+ 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};
+ typedef function_input_base<Input, A, ImplType> my_class;
+
+ public:
+
+ //! The input type of this receiver
+ typedef Input input_type;
+
+ //! Constructor for function_input_base
+ function_input_base( graph &g, size_t max_concurrency, function_input_queue<input_type,A> *q = NULL )
+ : my_root_task(g.root_task()), my_max_concurrency(max_concurrency), my_concurrency(0),
+ my_queue(q), forwarder_busy(false) {
+ my_predecessors.set_owner(this);
+ my_aggregator.initialize_handler(my_handler(this));
+ }
+
+ //! Copy constructor
+ function_input_base( const function_input_base& src, function_input_queue<input_type,A> *q = NULL ) :
+ receiver<Input>(), tbb::internal::no_assign(),
+ my_root_task( src.my_root_task), my_max_concurrency(src.my_max_concurrency),
+ my_concurrency(0), my_queue(q), forwarder_busy(false)
+ {
+ my_predecessors.set_owner(this);
+ my_aggregator.initialize_handler(my_handler(this));
+ }
+
+ //! Destructor
+ virtual ~function_input_base() {
+ if ( my_queue ) delete my_queue;
+ }
+
+ //! Put to the node
+ virtual bool try_put( const input_type &t ) {
+ if ( my_max_concurrency == 0 ) {
+ spawn_body_task( t );
+ return true;
+ } else {
+ my_operation op_data(t, tryput);
+ my_aggregator.execute(&op_data);
+ return op_data.status == SUCCEEDED;
+ }
+ }
+
+ //! Adds src to the list of cached predecessors.
+ /* override */ bool register_predecessor( predecessor_type &src ) {
+ my_operation op_data(reg_pred);
+ op_data.r = &src;
+ my_aggregator.execute(&op_data);
+ return true;
+ }
+
+ //! Removes src from the list of cached predecessors.
+ /* override */ bool remove_predecessor( predecessor_type &src ) {
+ my_operation op_data(rem_pred);
+ op_data.r = &src;
+ my_aggregator.execute(&op_data);
+ return true;
+ }
+
+ protected:
+
+ 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;
+
+ private:
+
+ friend class apply_body_task< my_class, input_type >;
+ friend class forward_task< my_class >;
+
+ class my_operation : public aggregated_operation< my_operation > {
+ public:
+ char type;
+ union {
+ input_type *elem;
+ predecessor_type *r;
+ };
+ 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) {}
+ };
+
+ bool forwarder_busy;
+ typedef internal::aggregating_functor<my_class, my_operation> my_handler;
+ friend class internal::aggregating_functor<my_class, my_operation>;
+ aggregator< my_handler, my_operation > my_aggregator;
+
+ void handle_operations(my_operation *op_list) {
+ my_operation *tmp;
+ while (op_list) {
+ tmp = op_list;
+ op_list = op_list->next;
+ switch (tmp->type) {
+ case reg_pred:
+ my_predecessors.add(*(tmp->r));
+ __TBB_store_with_release(tmp->status, SUCCEEDED);
+ if (!forwarder_busy) {
+ forwarder_busy = true;
+ spawn_forward_task();
+ }
+ break;
+ case rem_pred:
+ my_predecessors.remove(*(tmp->r));
+ __TBB_store_with_release(tmp->status, SUCCEEDED);
+ break;
+ case app_body:
+ __TBB_ASSERT(my_max_concurrency != 0, NULL);
+ --my_concurrency;
+ __TBB_store_with_release(tmp->status, SUCCEEDED);
+ 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;
+ spawn_body_task(i);
+ }
+ }
+ break;
+ case tryput: internal_try_put(tmp); break;
+ case try_fwd: internal_forward(tmp); break;
+ }
+ }
+ }
+
+ //! Put to the node
+ void internal_try_put(my_operation *op) {
+ __TBB_ASSERT(my_max_concurrency != 0, NULL);
+ if (my_concurrency < my_max_concurrency) {
+ ++my_concurrency;
+ spawn_body_task(*(op->elem));
+ __TBB_store_with_release(op->status, SUCCEEDED);
+ } else if ( my_queue && my_queue->push(*(op->elem)) ) {
+ __TBB_store_with_release(op->status, SUCCEEDED);
+ } else {
+ __TBB_store_with_release(op->status, FAILED);
+ }
+ }
+
+ //! Tries to spawn bodies if available and if concurrency allows
+ void internal_forward(my_operation *op) {
+ if (my_concurrency<my_max_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;
+ __TBB_store_with_release(op->status, SUCCEEDED);
+ spawn_body_task(i);
+ return;
+ }
+ }
+ __TBB_store_with_release(op->status, FAILED);
+ forwarder_busy = false;
+ }
+
+ //! Applies the body to the provided input
+ void apply_body( input_type &i ) {
+ static_cast<ImplType *>(this)->apply_body_impl(i);
+ if ( my_max_concurrency != 0 ) {
+ my_operation op_data(app_body);
+ my_aggregator.execute(&op_data);
+ }
+ }
+
+ //! 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));
+ }
+
+ //! This is executed by an enqueued task, the "forwarder"
+ void forward() {
+ my_operation op_data(try_fwd);
+ do {
+ op_data.status = WAIT;
+ my_aggregator.execute(&op_data);
+ } while (op_data.status == SUCCEEDED);
+ }
+
+ //! 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));
+ }
+ }; // function_input_base
+
+ //! Implements methods for a function node that takes a type Input as input and sends
+ // a type Output to its successors.
+ template< typename Input, typename Output, typename A>
+ class function_input : public function_input_base<Input, A, function_input<Input,Output,A> > {
+ public:
+ typedef Input input_type;
+ typedef Output output_type;
+ typedef function_input<Input,Output,A> my_class;
+ typedef function_input_base<Input, A, my_class> base_type;
+ typedef function_input_queue<input_type, A> input_queue_type;
+
+
+ // constructor
+ template<typename Body>
+ function_input( graph &g, size_t max_concurrency, Body& body, function_input_queue<input_type,A> *q = NULL ) :
+ base_type(g, max_concurrency, q),
+ my_body( new internal::function_body_leaf< input_type, output_type, Body>(body) ) {
+ }
+
+ //! Copy constructor
+ function_input( const function_input& src, input_queue_type *q = NULL ) :
+ base_type(src, q),
+ my_body( src.my_body->clone() ) {
+ }
+
+ ~function_input() {
+ delete my_body;
+ }
+
+ template< typename Body >
+ Body copy_function_object() {
+ internal::function_body<input_type, output_type> &body_ref = *this->my_body;
+ 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) );
+ }
+
+ protected:
+ function_body<input_type, output_type> *my_body;
+ virtual broadcast_cache<output_type > &successors() = 0;
+
+ };
+
+#if TBB_PREVIEW_GRAPH_NODES
+ //! Implements methods for a function node that takes a type Input as input
+ // and has a tuple of output ports specified.
+ template< typename Input, typename OutputPortSet, typename A>
+ class multioutput_function_input : public function_input_base<Input, A, multioutput_function_input<Input,OutputPortSet,A> > {
+ public:
+ typedef Input input_type;
+ typedef OutputPortSet output_ports_type;
+ typedef multioutput_function_input<Input,OutputPortSet,A> my_class;
+ typedef function_input_base<Input, A, my_class> base_type;
+ typedef function_input_queue<input_type, A> input_queue_type;
+
+
+ // constructor
+ template<typename Body>
+ multioutput_function_input(
+ graph &g,
+ size_t max_concurrency,
+ Body& body,
+ function_input_queue<input_type,A> *q = NULL ) :
+ base_type(g, max_concurrency, q),
+ my_body( new internal::multioutput_function_body_leaf<input_type, output_ports_type, Body>(body) ) {
+ }
+
+ //! Copy constructor
+ multioutput_function_input( const multioutput_function_input& src, input_queue_type *q = NULL ) :
+ base_type(src, q),
+ my_body( src.my_body->clone() ) {
+ }
+
+ ~multioutput_function_input() {
+ delete my_body;
+ }
+
+ template< typename Body >
+ Body copy_function_object() {
+ internal::multioutput_function_body<input_type, output_ports_type> &body_ref = *this->my_body;
+ return dynamic_cast< internal::multioutput_function_body_leaf<input_type, output_ports_type, Body> & >(body_ref).get_body();
+ }
+
+ void apply_body_impl( const input_type &i) {
+ (*my_body)(i, my_output_ports);
+ }
+
+ output_ports_type &output_ports(){ return my_output_ports; }
+
+ protected:
+ multioutput_function_body<input_type, output_ports_type> *my_body;
+ output_ports_type my_output_ports;
+
+ };
+
+ // template to refer to an output port of a multioutput_function_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());
+ }
+
+// helper structs for split_node
+ template<int N>
+ struct emit_element {
+ template<typename T, typename P>
+ static void emit_this(const T &t, P &p) {
+ std::get<N-1>(p).put(std::get<N-1>(t));
+ emit_element<N-1>::emit_this(t,p);
+ }
+ };
+
+ template<>
+ struct emit_element<1> {
+ template<typename T, typename P>
+ static void emit_this(const T &t, P &p) {
+ std::get<0>(p).put(std::get<0>(t));
+ }
+ };
+#endif // TBB_PREVIEW_GRAPH_NODES
+
+ //! Implements methods for an executable node that takes continue_msg as input
+ template< typename Output >
+ class continue_input : public continue_receiver {
+ public:
+
+ //! The input type of this receiver
+ typedef continue_msg input_type;
+
+ //! The output type of this receiver
+ typedef Output output_type;
+
+ template< typename Body >
+ continue_input( graph &g, Body& body )
+ : my_root_task(g.root_task()),
+ my_body( new internal::function_body_leaf< input_type, output_type, Body>(body) ) { }
+
+ template< typename Body >
+ continue_input( graph &g, int number_of_predecessors, Body& body )
+ : continue_receiver( number_of_predecessors ), my_root_task(g.root_task()),
+ my_body( new internal::function_body_leaf< input_type, output_type, Body>(body) ) { }
+
+ continue_input( const continue_input& src ) : continue_receiver(src),
+ my_root_task(src.my_root_task), my_body( src.my_body->clone() ) {}
+
+ template< typename Body >
+ Body copy_function_object() {
+ internal::function_body<input_type, output_type> &body_ref = *my_body;
+ return dynamic_cast< internal::function_body_leaf<input_type, output_type, Body> & >(body_ref).get_body();
+ }
+
+ protected:
+
+ task *my_root_task;
+ function_body<input_type, output_type> *my_body;
+
+ virtual broadcast_cache<output_type > &successors() = 0;
+
+ friend class apply_body_task< 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() ) );
+ }
+
+ //! 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() ) );
+ }
+
+ };
+
+ //! Implements methods for both executable and function nodes that puts Output to its successors
+ template< typename Output >
+ class function_output : public sender<Output> {
+ public:
+
+ typedef Output output_type;
+
+ function_output() { my_successors.set_owner(this); }
+ function_output(const function_output & /*other*/) : sender<output_type>() {
+ my_successors.set_owner(this);
+ }
+
+ //! Adds a new successor to this node
+ /* override */ bool register_successor( receiver<output_type> &r ) {
+ successors().register_successor( r );
+ return true;
+ }
+
+ //! Removes a successor from this node
+ /* override */ bool remove_successor( receiver<output_type> &r ) {
+ successors().remove_successor( r );
+ return true;
+ }
+
+ // for multioutput_function_node. The function_body that implements
+ // the node will have an input and an output tuple of ports. To put
+ // an item to a successor, the body should
+ //
+ // get<I>(output_ports).put(output_value);
+ //
+ // successors must always accept (for instance, a queue_node) or items
+ // may be dropped.
+ void put(const output_type &i) { my_successors.try_put(i); }
+
+ protected:
+ broadcast_cache<output_type> my_successors;
+ broadcast_cache<output_type > &successors() { return my_successors; }
+
+ };
+
+} // 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
new file mode 100644
index 0000000..f17f536
--- /dev/null
+++ b/include/tbb/internal/_flow_graph_or_impl.h
@@ -0,0 +1,268 @@
+/*
+ Copyright 2005-2011 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__flow_graph_or_impl_H
+#define __TBB__flow_graph_or_impl_H
+
+#ifndef __TBB_flow_graph_H
+#error Do not #include this internal file directly; use public TBB headers instead.
+#endif
+
+#if TBB_PREVIEW_GRAPH_NODES
+#include "tbb/internal/_flow_graph_types_impl.h"
+
+namespace internal {
+
+ // Output of the or_node is a struct containing a std::tuple, and will be of
+ // the form
+ //
+ // struct {
+ // size_t indx;
+ // tuple_types result;
+ // };
+ //
+ // 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.
+ //
+ // tuple_types is the tuple that specified the possible outputs (and
+ // the corresponding inputs to the or_node.)
+ //
+ // the types of each element are represented by tuple_types, a typedef
+ // 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
+
+ // 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 {
+ size_t indx;
+ OutputTuple result;
+ } type;
+ };
+
+ template<typename TupleTypes,int N>
+ struct or_item_helper {
+ 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));
+ }
+ };
+
+ template<typename TupleTypes,int N>
+ struct or_helper {
+ template<typename OutputType>
+ static inline void create_output(OutputType &o, size_t i, void* v) {
+ if(i == N-1) {
+ or_item_helper<TupleTypes,N-1>::create_output_value(o,v);
+ }
+ else
+ or_helper<TupleTypes,N-1>::create_output(o,i,v);
+ }
+ 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);
+ or_helper<TupleTypes,N-1>::set_or_node_pointer(my_input, p);
+ }
+ };
+
+ template<typename TupleTypes>
+ struct or_helper<TupleTypes,1> {
+ template<typename OutputType>
+ static inline void create_output(OutputType &o, size_t i, void* v) {
+ if(i == 0) {
+ or_item_helper<TupleTypes,0>::create_output_value(o,v);
+ }
+ }
+ 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);
+ }
+ };
+
+ struct put_base {
+ virtual bool try_put_with_index(size_t index, void *v) = 0;
+ virtual ~put_base() { }
+ };
+
+ template<typename T>
+ class or_input_port : public receiver<T> {
+ private:
+ size_t my_index;
+ 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)));
+ }
+ };
+
+ template<typename InputTuple, typename OutputType, typename StructTypes>
+ class or_node_FE : public put_base {
+ public:
+ static const int N = std::tuple_size<InputTuple>::value;
+ typedef OutputType output_type;
+ typedef InputTuple input_type;
+
+ or_node_FE( ) {
+ or_helper<StructTypes,N>::set_or_node_pointer(my_inputs, this);
+ }
+
+ input_type &inputs() { return my_inputs; }
+ protected:
+ input_type my_inputs;
+ };
+
+ //! or_node_base
+ template<typename InputTuple, typename OutputType, typename StructTypes>
+ class or_node_base : public graph_node, public or_node_FE<InputTuple, OutputType,StructTypes>,
+ public sender<OutputType> {
+ public:
+ static const size_t N = std::tuple_size<InputTuple>::value;
+ typedef OutputType output_type;
+ typedef StructTypes tuple_types;
+ typedef receiver<output_type> successor_type;
+ typedef or_node_FE<InputTuple, output_type,StructTypes> input_ports_type;
+
+ private:
+ // ----------- Aggregator ------------
+ enum op_type { reg_succ, rem_succ, try__put };
+ enum op_stat {WAIT=0, SUCCEEDED, FAILED};
+ typedef or_node_base<InputTuple,output_type,StructTypes> my_class;
+
+ class or_node_base_operation : public aggregated_operation<or_node_base_operation> {
+ public:
+ char type;
+ size_t indx;
+ union {
+ void *my_arg;
+ successor_type *my_succ;
+ };
+ or_node_base_operation(size_t i, const void* e, op_type t) :
+ type(char(t)), indx(i), my_arg(const_cast<void *>(e)) {}
+ or_node_base_operation(const successor_type &s, op_type t) : type(char(t)),
+ my_succ(const_cast<successor_type *>(&s)) {}
+ or_node_base_operation(op_type t) : type(char(t)) {}
+ };
+
+ typedef internal::aggregating_functor<my_class, or_node_base_operation> my_handler;
+ friend class internal::aggregating_functor<my_class, or_node_base_operation>;
+ aggregator<my_handler, or_node_base_operation> my_aggregator;
+
+ void handle_operations(or_node_base_operation* op_list) {
+ or_node_base_operation *current;
+ while(op_list) {
+ current = op_list;
+ op_list = op_list->next;
+ switch(current->type) {
+
+ case reg_succ:
+ my_successors.register_successor(*(current->my_succ));
+ __TBB_store_with_release(current->status, SUCCEEDED);
+ break;
+
+ case rem_succ:
+ 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);
+ break;
+ }
+ }
+ }
+ // ---------- end aggregator -----------
+ public:
+ or_node_base( ) : input_ports_type() {
+ my_successors.set_owner(this);
+ my_aggregator.initialize_handler(my_handler(this));
+ }
+
+ or_node_base( const or_node_base& /*other*/) : input_ports_type() {
+ my_successors.set_owner(this);
+ my_aggregator.initialize_handler(my_handler(this));
+ }
+
+ bool register_successor(successor_type &r) {
+ or_node_base_operation op_data(r, reg_succ);
+ my_aggregator.execute(&op_data);
+ return op_data.status == SUCCEEDED;
+ }
+
+ bool remove_successor( successor_type &r) {
+ or_node_base_operation op_data(r, rem_succ);
+ my_aggregator.execute(&op_data);
+ 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);
+ my_aggregator.execute(&op_data);
+ return op_data.status == SUCCEEDED;
+ }
+
+ private:
+ broadcast_cache<output_type, null_rw_mutex> my_successors;
+ };
+
+ // type generators
+ template<typename OutputTuple>
+ struct or_types {
+ static const int N = std::tuple_size<OutputTuple>::value;
+ typedef typename wrap_tuple_elements<N,or_input_port,OutputTuple>::type input_ports_tuple_type;
+ typedef typename or_output_type<OutputTuple>::type output_type;
+ typedef internal::or_node_FE<input_ports_tuple_type,output_type,OutputTuple> or_FE_type;
+ typedef internal::or_node_base<input_ports_tuple_type, output_type, OutputTuple> or_base_type;
+ };
+
+ template<class OutputTuple>
+ class unfolded_or_node : public or_types<OutputTuple>::or_base_type {
+ public:
+ typedef typename or_types<OutputTuple>::input_ports_tuple_type input_ports_tuple_type;
+ typedef OutputTuple tuple_types;
+ typedef typename or_types<OutputTuple>::output_type output_type;
+ private:
+ typedef typename or_types<OutputTuple>::or_base_type base_type;
+ public:
+ unfolded_or_node() : base_type() {}
+ };
+
+
+} /* namespace internal */
+#endif // TBB_PREVIEW_GRAPH_NODES
+
+#endif /* __TBB__flow_graph_or_impl_H */
diff --git a/include/tbb/internal/_flow_graph_tagged_buffer_impl.h b/include/tbb/internal/_flow_graph_tagged_buffer_impl.h
new file mode 100644
index 0000000..8b87fd1
--- /dev/null
+++ b/include/tbb/internal/_flow_graph_tagged_buffer_impl.h
@@ -0,0 +1,212 @@
+/*
+ Copyright 2005-2011 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.
+*/
+
+// tagged buffer that can expand, and can support as many deletions as additions
+// list-based, with elements of list held in std::vector (for destruction management),
+// multiplicative hashing (like ets). No synchronization built-in.
+//
+
+#ifndef __TBB__flow_graph_tagged_buffer_impl_H
+#define __TBB__flow_graph_tagged_buffer_impl_H
+
+#ifndef __TBB_flow_graph_H
+#error Do not #include this internal file directly; use public TBB headers instead.
+#endif
+
+template<typename TagType, typename ValueType, size_t NoTagMark>
+struct buffer_element {
+ TagType t;
+ ValueType v;
+ buffer_element *next;
+ buffer_element() : t(NoTagMark), next(NULL) {}
+};
+
+template
+ <
+ typename TagType,
+ typename ValueType,
+ size_t NoTagMark = 0,
+ typename Allocator=tbb::cache_aligned_allocator< buffer_element<TagType,ValueType,NoTagMark> >
+ >
+class tagged_buffer {
+public:
+ static const size_t INITIAL_SIZE = 8; // initial size of the hash pointer table
+ static const TagType NO_TAG = TagType(NoTagMark);
+ typedef ValueType value_type;
+ typedef buffer_element<TagType,ValueType, NO_TAG> element_type;
+ typedef value_type *pointer_type;
+ typedef std::vector<element_type, Allocator> list_array_type;
+ typedef typename Allocator::template rebind<element_type*>::other pointer_array_allocator_type;
+ typedef typename Allocator::template rebind<list_array_type>::other list_array_allocator;
+private:
+
+ size_t my_size;
+ size_t nelements;
+ element_type** array;
+ std::vector<element_type, Allocator> *lists;
+ element_type* free_list;
+
+ size_t mask() { return my_size - 1; }
+
+// #define ABYSMAL 1
+ static size_t hash(TagType t) {
+#if ABYSMAL
+ return (size_t)1;
+#else
+#if __TBB_WORDSIZE == 4
+ return uintptr_t(t)*0x9E3779B9;
+#else
+ return uintptr_t(t)*0x9E3779B97F4A7C15;
+#endif
+#endif
+ }
+
+ void set_up_free_list( element_type **p_free_list, list_array_type *la, size_t sz) {
+ for(size_t i=0; i < sz - 1; ++i ) { // construct free list
+ (*la)[i].next = &((*la)[i+1]);
+ (*la)[i].t = NO_TAG;
+ }
+ (*la)[sz-1].next = NULL;
+ *p_free_list = &((*la)[0]);
+ }
+
+ void grow_array() {
+ // make the pointer array larger
+ element_type **new_array;
+ element_type **old_array = array;
+ size_t old_size = my_size;
+ my_size *=2;
+ new_array = pointer_array_allocator_type().allocate(my_size);
+ for(size_t i=0; i < my_size; ++i) new_array[i] = NULL;
+ list_array_type *new_list_array = new list_array_type(old_size, element_type(), Allocator());
+ set_up_free_list(&free_list, new_list_array, old_size );
+
+ for(size_t i=0; i < old_size; ++i) {
+ for( element_type* op = old_array[i]; op; op = op->next) {
+ internal_tagged_insert(new_array, my_size, op->t, op->v);
+ }
+ }
+ pointer_array_allocator_type().deallocate(old_array, old_size);
+
+ delete lists; // destroy and deallocate instead
+ array = new_array;
+ lists = new_list_array;
+ }
+
+ void internal_tagged_insert( element_type **ar, size_t sz, TagType t, value_type v) {
+ size_t l_mask = sz-1;
+ size_t h = hash(t) & l_mask;
+ __TBB_ASSERT(free_list, "Error: free list not set up.");
+ element_type* my_elem = free_list; free_list = free_list->next;
+ my_elem->t = t;
+ my_elem->v = v;
+ my_elem->next = ar[h];
+ ar[h] = my_elem;
+ }
+
+public:
+ tagged_buffer() : my_size(INITIAL_SIZE), nelements(0) {
+ 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() {
+ if(array) {
+ pointer_array_allocator_type().deallocate(array, my_size);
+ }
+ if(lists) {
+ delete lists;
+ }
+ }
+
+ bool tagged_insert(TagType t, value_type v) {
+ pointer_type p;
+ if(tagged_find_ref(t, p)) {
+ *p = v; // replace the value
+ return false;
+ }
+ ++nelements;
+ if(nelements*2 > my_size) grow_array();
+ internal_tagged_insert(array, my_size, t, v);
+ return true;
+ }
+
+ // returns reference to array element.v
+ bool tagged_find_ref(TagType t, pointer_type &v) {
+ size_t i = hash(t) & mask();
+ for(element_type* p = array[i]; p; p = p->next) {
+ if(p->t == t) {
+ v = &(p->v);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ bool tagged_find( TagType t, value_type &v) {
+ value_type *p;
+ if(tagged_find_ref(t, p)) {
+ v = *p;
+ return true;
+ }
+ else
+ return false;
+ }
+
+ void tagged_delete(TagType t) {
+ size_t h = hash(t) & mask();
+ element_type* prev = NULL;
+ for(element_type* p = array[h]; p; prev = p, p = p->next) {
+ if(p->t == t) {
+ p->t = NO_TAG;
+ if(prev) prev->next = p->next;
+ else array[h] = p->next;
+ p->next = free_list;
+ free_list = p;
+ --nelements;
+ return;
+ }
+ }
+ __TBB_ASSERT(false, "tag not found for delete");
+ }
+
+ // search for v in the array; if found {set t, return true} else return false
+ // we use this in join_node_FE to find if a tag's items are all available.
+ bool find_value_tag( TagType &t, value_type v) {
+ for(size_t i= 0; i < my_size / 2; ++i) { // remember the vector is half the size of the hash array
+ if( (*lists)[i].t != NO_TAG && (*lists)[i].v == v) {
+ t = (*lists)[i].t;
+ return true;
+ }
+ }
+ return false;
+ }
+};
+#endif // __TBB__flow_graph_tagged_buffer_impl_H
diff --git a/include/tbb/internal/_flow_graph_types_impl.h b/include/tbb/internal/_flow_graph_types_impl.h
new file mode 100644
index 0000000..335b04f
--- /dev/null
+++ b/include/tbb/internal/_flow_graph_types_impl.h
@@ -0,0 +1,158 @@
+/*
+ Copyright 2005-2011 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__flow_graph_types_impl_H
+#define __TBB__flow_graph_types_impl_H
+
+#ifndef __TBB_flow_graph_H
+#error Do not #include this internal file directly; use public TBB headers instead.
+#endif
+
+namespace internal {
+// wrap each element of a tuple in a template, and make a tuple of the result.
+
+ template<int N, template<class> class PT, typename TypeTuple>
+ struct wrap_tuple_elements;
+
+ 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> >
+ 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> >
+ 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> >
+ 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> >
+ 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> >
+ type;
+ };
+
+ 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> >
+ type;
+ };
+
+ 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> >
+ type;
+ };
+
+ 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> >
+ type;
+ };
+
+ 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> >
+ type;
+ };
+
+ 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> >
+ type;
+ };
+
+} // namespace internal
+#endif /* __TBB__flow_graph_types_impl_H */
diff --git a/include/tbb/_tbb_windef.h b/include/tbb/internal/_tbb_windef.h
similarity index 94%
rename from include/tbb/_tbb_windef.h
rename to include/tbb/internal/_tbb_windef.h
index dd96c60..bda75c7 100644
--- a/include/tbb/_tbb_windef.h
+++ b/include/tbb/internal/_tbb_windef.h
@@ -27,7 +27,7 @@
*/
#ifndef __TBB_tbb_windef_H
-#error Do not #include this file directly. Use "#include tbb/tbb_stddef.h" instead.
+#error Do not #include this internal file directly; use public TBB headers instead.
#endif /* __TBB_tbb_windef_H */
// Check that the target Windows version has all API calls requried for TBB.
@@ -60,11 +60,7 @@ namespace std {
# pragma message(__FILE__ "(" __TBB_STRING(__LINE__) ") : Warning: Recommend using /MD if compiling with TBB_USE_DEBUG==0")
# endif
# endif
-#else
-# ifdef _DEBUG
-# define TBB_USE_DEBUG 1
-# endif
-#endif
+#endif
#if __TBB_BUILD && !defined(__TBB_NO_IMPLICIT_LINKAGE)
#define __TBB_NO_IMPLICIT_LINKAGE 1
diff --git a/include/tbb/machine/gcc_generic.h b/include/tbb/machine/gcc_generic.h
new file mode 100644
index 0000000..0192fde
--- /dev/null
+++ b/include/tbb/machine/gcc_generic.h
@@ -0,0 +1,74 @@
+/*
+ Copyright 2005-2011 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_gcc_generic_H)
+#error Do not #include this internal file directly; use public TBB headers instead.
+#endif
+
+#define __TBB_machine_gcc_generic_H
+
+#include <stdint.h>
+#include <unistd.h>
+
+#define __TBB_WORDSIZE __SIZEOF_INT__
+
+// For some reason straight mapping does not work on mingw
+#if __BYTE_ORDER__==__ORDER_BIG_ENDIAN__
+ #define __TBB_BIG_ENDIAN 0
+#elif __BYTE_ORDER__==__ORDER_LITTLE_ENDIAN__
+ #define __TBB_BIG_ENDIAN 1
+#else
+#error Unsupported endianness
+#endif
+
+/** As this generic implementation has absolutely no information about underlying
+ hardware, its performance most likely will be sub-optimal because of full memory
+ fence usages where a more lightweight synchronization means (or none at all)
+ could suffice. Thus if you use this header to enable TBB on a new platform,
+ consider forking it and relaxing below helpers as appropriate. **/
+#define __TBB_acquire_consistency_helper() __sync_synchronize()
+#define __TBB_release_consistency_helper() __sync_synchronize()
+#define __TBB_full_memory_fence() __sync_synchronize()
+#define __TBB_control_consistency_helper() __sync_synchronize()
+
+#define __TBB_MACHINE_DEFINE_ATOMICS(S,T) \
+inline T __TBB_machine_cmpswp##S( volatile void *ptr, T value, T comparand ) { \
+ return __sync_val_compare_and_swap(reinterpret_cast<volatile T *>(ptr),comparand,value); \
+} \
+
+__TBB_MACHINE_DEFINE_ATOMICS(1,int8_t)
+__TBB_MACHINE_DEFINE_ATOMICS(2,int16_t)
+__TBB_MACHINE_DEFINE_ATOMICS(4,int32_t)
+__TBB_MACHINE_DEFINE_ATOMICS(8,int64_t)
+
+#undef __TBB_MACHINE_DEFINE_ATOMICS
+
+#define __TBB_USE_GENERIC_FETCH_ADD 1
+#define __TBB_USE_GENERIC_FETCH_STORE 1
+#define __TBB_USE_GENERIC_HALF_FENCED_LOAD_STORE 1
+#define __TBB_USE_GENERIC_RELAXED_LOAD_STORE 1
diff --git a/include/tbb/machine/ibm_aix51.h b/include/tbb/machine/ibm_aix51.h
index 54bd080..2cd606e 100644
--- a/include/tbb/machine/ibm_aix51.h
+++ b/include/tbb/machine/ibm_aix51.h
@@ -26,10 +26,14 @@
the GNU General Public License.
*/
-#ifndef __TBB_machine_H
-#error Do not include this file directly; include tbb_machine.h instead
+// TODO: revise by comparing with mac_ppc.h
+
+#if !defined(__TBB_machine_H) || defined(__TBB_machine_ibm_aix51_H)
+#error Do not #include this internal file directly; use public TBB headers instead.
#endif
+#define __TBB_machine_ibm_aix51_H
+
#define __TBB_WORDSIZE 8
#define __TBB_BIG_ENDIAN 1
@@ -38,23 +42,36 @@
#include <sched.h>
extern "C" {
-
int32_t __TBB_machine_cas_32 (volatile void* ptr, int32_t value, int32_t comparand);
int64_t __TBB_machine_cas_64 (volatile void* ptr, int64_t value, int64_t comparand);
-void __TBB_machine_flush ();
-
+void __TBB_machine_flush ();
+void __TBB_machine_lwsync ();
+void __TBB_machine_isync ();
}
-#define __TBB_CompareAndSwap4(P,V,C) __TBB_machine_cas_32(P,V,C)
-#define __TBB_CompareAndSwap8(P,V,C) __TBB_machine_cas_64(P,V,C)
-#define __TBB_CompareAndSwapW(P,V,C) __TBB_machine_cas_64(P,V,C)
+// Mapping of old entry point names retained for the sake of backward binary compatibility
+#define __TBB_machine_cmpswp4 __TBB_machine_cas_32
+#define __TBB_machine_cmpswp8 __TBB_machine_cas_64
+
#define __TBB_Yield() sched_yield()
+#define __TBB_USE_GENERIC_PART_WORD_CAS 1
+#define __TBB_USE_GENERIC_FETCH_ADD 1
+#define __TBB_USE_GENERIC_FETCH_STORE 1
+#define __TBB_USE_GENERIC_HALF_FENCED_LOAD_STORE 1
+#define __TBB_USE_GENERIC_RELAXED_LOAD_STORE 1
+
#if __GNUC__
-#define __TBB_full_memory_fence() __asm__ __volatile__("sync": : :"memory")
-#define __TBB_release_consistency_helper() __asm__ __volatile__("lwsync": : :"memory")
+ #define __TBB_control_consistency_helper() __asm__ __volatile__( "isync": : :"memory")
+ #define __TBB_acquire_consistency_helper() __asm__ __volatile__("lwsync": : :"memory")
+ #define __TBB_release_consistency_helper() __asm__ __volatile__("lwsync": : :"memory")
+ #define __TBB_full_memory_fence() __asm__ __volatile__( "sync": : :"memory")
#else
-// IBM C++ Compiler does not support inline assembly
-#define __TBB_full_memory_fence() __TBB_machine_flush ()
-#define __TBB_release_consistency_helper() __TBB_machine_flush ()
+ // IBM C++ Compiler does not support inline assembly
+ // TODO: Since XL 9.0 or earlier GCC syntax is supported. Replace with more
+ // lightweight implementation (like in mac_ppc.h)
+ #define __TBB_control_consistency_helper() __TBB_machine_isync ()
+ #define __TBB_acquire_consistency_helper() __TBB_machine_lwsync ()
+ #define __TBB_release_consistency_helper() __TBB_machine_lwsync ()
+ #define __TBB_full_memory_fence() __TBB_machine_flush ()
#endif
diff --git a/include/tbb/machine/linux_common.h b/include/tbb/machine/linux_common.h
index 15b581c..2efa77d 100644
--- a/include/tbb/machine/linux_common.h
+++ b/include/tbb/machine/linux_common.h
@@ -27,7 +27,7 @@
*/
#ifndef __TBB_machine_H
-#error Do not include this file directly; include tbb_machine.h instead
+#error Do not #include this internal file directly; use public TBB headers instead.
#endif
#include <sched.h>
diff --git a/include/tbb/machine/linux_ia32.h b/include/tbb/machine/linux_ia32.h
index df080c4..3218341 100644
--- a/include/tbb/machine/linux_ia32.h
+++ b/include/tbb/machine/linux_ia32.h
@@ -26,18 +26,23 @@
the GNU General Public License.
*/
-#ifndef __TBB_machine_H
-#error Do not include this file directly; include tbb_machine.h instead
+#if !defined(__TBB_machine_H) || defined(__TBB_machine_linux_ia32_H)
+#error Do not #include this internal file directly; use public TBB headers instead.
#endif
+#define __TBB_machine_linux_ia32_H
+
#include <stdint.h>
#include <unistd.h>
#define __TBB_WORDSIZE 4
#define __TBB_BIG_ENDIAN 0
-#define __TBB_release_consistency_helper() __asm__ __volatile__("": : :"memory")
-#define __TBB_full_memory_fence() __asm__ __volatile__("mfence": : :"memory")
+#define __TBB_compiler_fence() __asm__ __volatile__("": : :"memory")
+#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__ __volatile__("mfence": : :"memory")
#if __TBB_ICC_ASM_VOLATILE_BROKEN
#define __TBB_VOLATILE
@@ -45,7 +50,7 @@
#define __TBB_VOLATILE volatile
#endif
-#define __MACHINE_DECL_ATOMICS(S,T,X) \
+#define __TBB_MACHINE_DEFINE_ATOMICS(S,T,X,R) \
static inline T __TBB_machine_cmpswp##S (volatile void *ptr, T value, T comparand ) \
{ \
T result; \
@@ -61,7 +66,7 @@ static inline T __TBB_machine_fetchadd##S(volatile void *ptr, T addend)
{ \
T result; \
__asm__ __volatile__("lock\nxadd" X " %0,%1" \
- : "=r"(result), "=m"(*(__TBB_VOLATILE T*)ptr) \
+ : R (result), "=m"(*(__TBB_VOLATILE T*)ptr) \
: "0"(addend), "m"(*(__TBB_VOLATILE T*)ptr) \
: "memory"); \
return result; \
@@ -71,15 +76,21 @@ static inline T __TBB_machine_fetchstore##S(volatile void *ptr, T value)
{ \
T result; \
__asm__ __volatile__("lock\nxchg" X " %0,%1" \
- : "=r"(result), "=m"(*(__TBB_VOLATILE T*)ptr) \
+ : R (result), "=m"(*(__TBB_VOLATILE T*)ptr) \
: "0"(value), "m"(*(__TBB_VOLATILE T*)ptr) \
: "memory"); \
return result; \
} \
-__MACHINE_DECL_ATOMICS(1,int8_t,"")
-__MACHINE_DECL_ATOMICS(2,int16_t,"")
-__MACHINE_DECL_ATOMICS(4,int32_t,"l")
+__TBB_MACHINE_DEFINE_ATOMICS(1,int8_t,"","=q")
+__TBB_MACHINE_DEFINE_ATOMICS(2,int16_t,"","=r")
+__TBB_MACHINE_DEFINE_ATOMICS(4,int32_t,"l","=r")
+
+#if __INTEL_COMPILER
+#pragma warning( push )
+// reference to EBX in a function requiring stack alignment
+#pragma warning( disable: 998 )
+#endif
static inline int64_t __TBB_machine_cmpswp8 (volatile void *ptr, int64_t value, int64_t comparand )
{
@@ -130,6 +141,10 @@ static inline int64_t __TBB_machine_cmpswp8 (volatile void *ptr, int64_t value,
return result;
}
+#if __INTEL_COMPILER
+#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));
@@ -184,46 +199,18 @@ static inline void __TBB_machine_store8(volatile void *ptr, int64_t value) {
}
// Machine specific atomic operations
-
-#define __TBB_CompareAndSwap1(P,V,C) __TBB_machine_cmpswp1(P,V,C)
-#define __TBB_CompareAndSwap2(P,V,C) __TBB_machine_cmpswp2(P,V,C)
-#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_CompareAndSwapW(P,V,C) __TBB_machine_cmpswp4(P,V,C)
-
-#define __TBB_FetchAndAdd1(P,V) __TBB_machine_fetchadd1(P,V)
-#define __TBB_FetchAndAdd2(P,V) __TBB_machine_fetchadd2(P,V)
-#define __TBB_FetchAndAdd4(P,V) __TBB_machine_fetchadd4(P,V)
-#define __TBB_FetchAndAddW(P,V) __TBB_machine_fetchadd4(P,V)
-
-#define __TBB_FetchAndStore1(P,V) __TBB_machine_fetchstore1(P,V)
-#define __TBB_FetchAndStore2(P,V) __TBB_machine_fetchstore2(P,V)
-#define __TBB_FetchAndStore4(P,V) __TBB_machine_fetchstore4(P,V)
-#define __TBB_FetchAndStoreW(P,V) __TBB_machine_fetchstore4(P,V)
-
-#define __TBB_Store8(P,V) __TBB_machine_store8(P,V)
-#define __TBB_Load8(P) __TBB_machine_load8(P)
-
#define __TBB_AtomicOR(P,V) __TBB_machine_or(P,V)
#define __TBB_AtomicAND(P,V) __TBB_machine_and(P,V)
-
-// Those we chose not to implement (they will be implemented generically using CMPSWP8)
-#undef __TBB_FetchAndAdd8
-#undef __TBB_FetchAndStore8
-
// Definition of other functions
#define __TBB_Pause(V) __TBB_machine_pause(V)
#define __TBB_Log2(V) __TBB_machine_lg(V)
-// Special atomic functions
-#define __TBB_FetchAndAddWrelease(P,V) __TBB_FetchAndAddW(P,V)
-#define __TBB_FetchAndIncrementWacquire(P) __TBB_FetchAndAddW(P,1)
-#define __TBB_FetchAndDecrementWrelease(P) __TBB_FetchAndAddW(P,-1)
-
-// Use generic definitions from tbb_machine.h
-#undef __TBB_TryLockByte
-#undef __TBB_LockByte
+#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
+#define __TBB_USE_GENERIC_HALF_FENCED_LOAD_STORE 1
+#define __TBB_USE_GENERIC_RELAXED_LOAD_STORE 1
// API to retrieve/update FPU control setting
#define __TBB_CPU_CTL_ENV_PRESENT 1
@@ -247,4 +234,3 @@ inline void __TBB_set_cpu_ctl_env ( const __TBB_cpu_ctl_env_t* ctl ) {
: : "m"(ctl->mxcsr), "m"(ctl->x87cw)
);
}
-
diff --git a/include/tbb/machine/linux_ia64.h b/include/tbb/machine/linux_ia64.h
index b815d3c..7d92936 100644
--- a/include/tbb/machine/linux_ia64.h
+++ b/include/tbb/machine/linux_ia64.h
@@ -26,64 +26,85 @@
the GNU General Public License.
*/
-#ifndef __TBB_machine_H
-#error Do not include this file directly; include tbb_machine.h instead
+#if !defined(__TBB_machine_H) || defined(__TBB_machine_linux_ia64_H)
+#error Do not #include this internal file directly; use public TBB headers instead.
#endif
+#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_DECL_FENCED_ATOMICS 1
+
+#if __INTEL_COMPILER
+ #define __TBB_compiler_fence()
+ #define __TBB_control_consistency_helper() __TBB_compiler_fence()
+ #define __TBB_acquire_consistency_helper()
+ #define __TBB_release_consistency_helper()
+ #define __TBB_full_memory_fence() __mf()
+#else
+ #define __TBB_compiler_fence() __asm__ __volatile__("": : :"memory")
+ #define __TBB_control_consistency_helper() __TBB_compiler_fence()
+ // Even though GCC imbues volatile loads with acquire semantics, it sometimes moves
+ // loads over the acquire fence. The following helpers stop such incorrect code motion.
+ #define __TBB_acquire_consistency_helper() __TBB_compiler_fence()
+ #define __TBB_release_consistency_helper() __TBB_compiler_fence()
+ #define __TBB_full_memory_fence() __asm__ __volatile__("mf": : :"memory")
+#endif /* !__INTEL_COMPILER */
// Most of the functions will be in a .s file
extern "C" {
- int8_t __TBB_machine_cmpswp1__TBB_full_fence (volatile void *ptr, int8_t value, int8_t comparand);
int8_t __TBB_machine_fetchadd1__TBB_full_fence (volatile void *ptr, int8_t addend);
int8_t __TBB_machine_fetchadd1acquire(volatile void *ptr, int8_t addend);
int8_t __TBB_machine_fetchadd1release(volatile void *ptr, int8_t addend);
- int8_t __TBB_machine_fetchstore1acquire(volatile void *ptr, int8_t value);
- int8_t __TBB_machine_fetchstore1release(volatile void *ptr, int8_t value);
- int16_t __TBB_machine_cmpswp2__TBB_full_fence (volatile void *ptr, int16_t value, int16_t comparand);
int16_t __TBB_machine_fetchadd2__TBB_full_fence (volatile void *ptr, int16_t addend);
int16_t __TBB_machine_fetchadd2acquire(volatile void *ptr, int16_t addend);
int16_t __TBB_machine_fetchadd2release(volatile void *ptr, int16_t addend);
+
+ int32_t __TBB_machine_fetchadd4__TBB_full_fence (volatile void *ptr, int32_t value);
+ int32_t __TBB_machine_fetchadd4acquire(volatile void *ptr, int32_t addend);
+ int32_t __TBB_machine_fetchadd4release(volatile void *ptr, int32_t addend);
+
+ int64_t __TBB_machine_fetchadd8__TBB_full_fence (volatile void *ptr, int64_t value);
+ int64_t __TBB_machine_fetchadd8acquire(volatile void *ptr, int64_t addend);
+ int64_t __TBB_machine_fetchadd8release(volatile void *ptr, int64_t addend);
+
+ int8_t __TBB_machine_fetchstore1__TBB_full_fence (volatile void *ptr, int8_t value);
+ int8_t __TBB_machine_fetchstore1acquire(volatile void *ptr, int8_t value);
+ int8_t __TBB_machine_fetchstore1release(volatile void *ptr, int8_t value);
+
+ int16_t __TBB_machine_fetchstore2__TBB_full_fence (volatile void *ptr, int16_t value);
int16_t __TBB_machine_fetchstore2acquire(volatile void *ptr, int16_t value);
int16_t __TBB_machine_fetchstore2release(volatile void *ptr, int16_t value);
int32_t __TBB_machine_fetchstore4__TBB_full_fence (volatile void *ptr, int32_t value);
int32_t __TBB_machine_fetchstore4acquire(volatile void *ptr, int32_t value);
int32_t __TBB_machine_fetchstore4release(volatile void *ptr, int32_t value);
- int32_t __TBB_machine_fetchadd4acquire(volatile void *ptr, int32_t addend);
- int32_t __TBB_machine_fetchadd4release(volatile void *ptr, int32_t addend);
- int64_t __TBB_machine_cmpswp8__TBB_full_fence (volatile void *ptr, int64_t value, int64_t comparand);
int64_t __TBB_machine_fetchstore8__TBB_full_fence (volatile void *ptr, int64_t value);
int64_t __TBB_machine_fetchstore8acquire(volatile void *ptr, int64_t value);
int64_t __TBB_machine_fetchstore8release(volatile void *ptr, int64_t value);
- int64_t __TBB_machine_fetchadd8acquire(volatile void *ptr, int64_t addend);
- int64_t __TBB_machine_fetchadd8release(volatile void *ptr, int64_t addend);
+ int8_t __TBB_machine_cmpswp1__TBB_full_fence (volatile void *ptr, int8_t value, int8_t comparand);
int8_t __TBB_machine_cmpswp1acquire(volatile void *ptr, int8_t value, int8_t comparand);
int8_t __TBB_machine_cmpswp1release(volatile void *ptr, int8_t value, int8_t comparand);
- int8_t __TBB_machine_fetchstore1__TBB_full_fence (volatile void *ptr, int8_t value);
+ int16_t __TBB_machine_cmpswp2__TBB_full_fence (volatile void *ptr, int16_t value, int16_t comparand);
int16_t __TBB_machine_cmpswp2acquire(volatile void *ptr, int16_t value, int16_t comparand);
int16_t __TBB_machine_cmpswp2release(volatile void *ptr, int16_t value, int16_t comparand);
- int16_t __TBB_machine_fetchstore2__TBB_full_fence (volatile void *ptr, int16_t value);
int32_t __TBB_machine_cmpswp4__TBB_full_fence (volatile void *ptr, int32_t value, int32_t comparand);
int32_t __TBB_machine_cmpswp4acquire(volatile void *ptr, int32_t value, int32_t comparand);
int32_t __TBB_machine_cmpswp4release(volatile void *ptr, int32_t value, int32_t comparand);
- int32_t __TBB_machine_fetchadd4__TBB_full_fence (volatile void *ptr, int32_t value);
+ int64_t __TBB_machine_cmpswp8__TBB_full_fence (volatile void *ptr, int64_t value, int64_t comparand);
int64_t __TBB_machine_cmpswp8acquire(volatile void *ptr, int64_t value, int64_t comparand);
int64_t __TBB_machine_cmpswp8release(volatile void *ptr, int64_t value, int64_t comparand);
- int64_t __TBB_machine_fetchadd8__TBB_full_fence (volatile void *ptr, int64_t value);
int64_t __TBB_machine_lg(uint64_t value);
void __TBB_machine_pause(int32_t delay);
@@ -92,73 +113,71 @@ extern "C" {
//! Retrieves the current RSE backing store pointer. IA64 specific.
void* __TBB_get_bsp();
-}
-
-#define __TBB_CompareAndSwap1(P,V,C) __TBB_machine_cmpswp1__TBB_full_fence(P,V,C)
-#define __TBB_CompareAndSwap2(P,V,C) __TBB_machine_cmpswp2__TBB_full_fence(P,V,C)
-
-#define __TBB_FetchAndAdd1(P,V) __TBB_machine_fetchadd1__TBB_full_fence(P,V)
-#define __TBB_FetchAndAdd1acquire(P,V) __TBB_machine_fetchadd1acquire(P,V)
-#define __TBB_FetchAndAdd1release(P,V) __TBB_machine_fetchadd1release(P,V)
-#define __TBB_FetchAndAdd2(P,V) __TBB_machine_fetchadd2__TBB_full_fence(P,V)
-#define __TBB_FetchAndAdd2acquire(P,V) __TBB_machine_fetchadd2acquire(P,V)
-#define __TBB_FetchAndAdd2release(P,V) __TBB_machine_fetchadd2release(P,V)
-#define __TBB_FetchAndAdd4acquire(P,V) __TBB_machine_fetchadd4acquire(P,V)
-#define __TBB_FetchAndAdd4release(P,V) __TBB_machine_fetchadd4release(P,V)
-#define __TBB_FetchAndAdd8acquire(P,V) __TBB_machine_fetchadd8acquire(P,V)
-#define __TBB_FetchAndAdd8release(P,V) __TBB_machine_fetchadd8release(P,V)
-
-#define __TBB_FetchAndStore1acquire(P,V) __TBB_machine_fetchstore1acquire(P,V)
-#define __TBB_FetchAndStore1release(P,V) __TBB_machine_fetchstore1release(P,V)
-#define __TBB_FetchAndStore2acquire(P,V) __TBB_machine_fetchstore2acquire(P,V)
-#define __TBB_FetchAndStore2release(P,V) __TBB_machine_fetchstore2release(P,V)
-#define __TBB_FetchAndStore4acquire(P,V) __TBB_machine_fetchstore4acquire(P,V)
-#define __TBB_FetchAndStore4release(P,V) __TBB_machine_fetchstore4release(P,V)
-#define __TBB_FetchAndStore8acquire(P,V) __TBB_machine_fetchstore8acquire(P,V)
-#define __TBB_FetchAndStore8release(P,V) __TBB_machine_fetchstore8release(P,V)
-
-#define __TBB_CompareAndSwap1acquire(P,V,C) __TBB_machine_cmpswp1acquire(P,V,C)
-#define __TBB_CompareAndSwap1release(P,V,C) __TBB_machine_cmpswp1release(P,V,C)
-#define __TBB_CompareAndSwap2acquire(P,V,C) __TBB_machine_cmpswp2acquire(P,V,C)
-#define __TBB_CompareAndSwap2release(P,V,C) __TBB_machine_cmpswp2release(P,V,C)
-#define __TBB_CompareAndSwap4(P,V,C) __TBB_machine_cmpswp4__TBB_full_fence(P,V,C)
-#define __TBB_CompareAndSwap4acquire(P,V,C) __TBB_machine_cmpswp4acquire(P,V,C)
-#define __TBB_CompareAndSwap4release(P,V,C) __TBB_machine_cmpswp4release(P,V,C)
-#define __TBB_CompareAndSwap8(P,V,C) __TBB_machine_cmpswp8__TBB_full_fence(P,V,C)
-#define __TBB_CompareAndSwap8acquire(P,V,C) __TBB_machine_cmpswp8acquire(P,V,C)
-#define __TBB_CompareAndSwap8release(P,V,C) __TBB_machine_cmpswp8release(P,V,C)
-
-#define __TBB_FetchAndAdd4(P,V) __TBB_machine_fetchadd4__TBB_full_fence(P,V)
-#define __TBB_FetchAndAdd8(P,V) __TBB_machine_fetchadd8__TBB_full_fence(P,V)
-
-#define __TBB_FetchAndStore1(P,V) __TBB_machine_fetchstore1__TBB_full_fence(P,V)
-#define __TBB_FetchAndStore2(P,V) __TBB_machine_fetchstore2__TBB_full_fence(P,V)
-#define __TBB_FetchAndStore4(P,V) __TBB_machine_fetchstore4__TBB_full_fence(P,V)
-#define __TBB_FetchAndStore8(P,V) __TBB_machine_fetchstore8__TBB_full_fence(P,V)
-
-#define __TBB_FetchAndIncrementWacquire(P) __TBB_FetchAndAdd8acquire(P,1)
-#define __TBB_FetchAndDecrementWrelease(P) __TBB_FetchAndAdd8release(P,-1)
-
-#ifndef __INTEL_COMPILER
-/* Even though GCC imbues volatile loads with acquire semantics,
- it sometimes moves loads over the acquire fence. The
- fences defined here stop such incorrect code motion. */
-#define __TBB_release_consistency_helper() __asm__ __volatile__("": : :"memory")
-#define __TBB_full_memory_fence() __asm__ __volatile__("mf": : :"memory")
-#else
-#define __TBB_release_consistency_helper()
-#define __TBB_full_memory_fence() __mf()
-#endif /* __INTEL_COMPILER */
-// Special atomic functions
-#define __TBB_CompareAndSwapW(P,V,C) __TBB_CompareAndSwap8(P,V,C)
-#define __TBB_FetchAndStoreW(P,V) __TBB_FetchAndStore8(P,V)
-#define __TBB_FetchAndAddW(P,V) __TBB_FetchAndAdd8(P,V)
-#define __TBB_FetchAndAddWrelease(P,V) __TBB_FetchAndAdd8release(P,V)
-
-// Not needed
-#undef __TBB_Store8
-#undef __TBB_Load8
+ int32_t __TBB_machine_load1_relaxed(const void *ptr);
+ int32_t __TBB_machine_load2_relaxed(const void *ptr);
+ int32_t __TBB_machine_load4_relaxed(const void *ptr);
+ int64_t __TBB_machine_load8_relaxed(const void *ptr);
+
+ void __TBB_machine_store1_relaxed(void *ptr, int32_t value);
+ void __TBB_machine_store2_relaxed(void *ptr, int32_t value);
+ void __TBB_machine_store4_relaxed(void *ptr, int32_t value);
+ void __TBB_machine_store8_relaxed(void *ptr, int64_t value);
+} // extern "C"
+
+// Mapping old entry points to the names corresponding to the new full_fence identifier.
+#define __TBB_machine_fetchadd1full_fence __TBB_machine_fetchadd1__TBB_full_fence
+#define __TBB_machine_fetchadd2full_fence __TBB_machine_fetchadd2__TBB_full_fence
+#define __TBB_machine_fetchadd4full_fence __TBB_machine_fetchadd4__TBB_full_fence
+#define __TBB_machine_fetchadd8full_fence __TBB_machine_fetchadd8__TBB_full_fence
+#define __TBB_machine_fetchstore1full_fence __TBB_machine_fetchstore1__TBB_full_fence
+#define __TBB_machine_fetchstore2full_fence __TBB_machine_fetchstore2__TBB_full_fence
+#define __TBB_machine_fetchstore4full_fence __TBB_machine_fetchstore4__TBB_full_fence
+#define __TBB_machine_fetchstore8full_fence __TBB_machine_fetchstore8__TBB_full_fence
+#define __TBB_machine_cmpswp1full_fence __TBB_machine_cmpswp1__TBB_full_fence
+#define __TBB_machine_cmpswp2full_fence __TBB_machine_cmpswp2__TBB_full_fence
+#define __TBB_machine_cmpswp4full_fence __TBB_machine_cmpswp4__TBB_full_fence
+#define __TBB_machine_cmpswp8full_fence __TBB_machine_cmpswp8__TBB_full_fence
+
+// Mapping relaxed operations to the entry points implementing them.
+/** On IA64 RMW operations implicitly have acquire semantics. Thus one cannot
+ actually have completely relaxed RMW operation here. **/
+#define __TBB_machine_fetchadd1relaxed __TBB_machine_fetchadd1acquire
+#define __TBB_machine_fetchadd2relaxed __TBB_machine_fetchadd2acquire
+#define __TBB_machine_fetchadd4relaxed __TBB_machine_fetchadd4acquire
+#define __TBB_machine_fetchadd8relaxed __TBB_machine_fetchadd8acquire
+#define __TBB_machine_fetchstore1relaxed __TBB_machine_fetchstore1acquire
+#define __TBB_machine_fetchstore2relaxed __TBB_machine_fetchstore2acquire
+#define __TBB_machine_fetchstore4relaxed __TBB_machine_fetchstore4acquire
+#define __TBB_machine_fetchstore8relaxed __TBB_machine_fetchstore8acquire
+#define __TBB_machine_cmpswp1relaxed __TBB_machine_cmpswp1acquire
+#define __TBB_machine_cmpswp2relaxed __TBB_machine_cmpswp2acquire
+#define __TBB_machine_cmpswp4relaxed __TBB_machine_cmpswp4acquire
+#define __TBB_machine_cmpswp8relaxed __TBB_machine_cmpswp8acquire
+
+#define __TBB_MACHINE_DEFINE_ATOMICS(S,V) \
+ template <typename T> \
+ struct machine_load_store_relaxed<T,S> { \
+ static inline T load ( const T& location ) { \
+ return (T)__TBB_machine_load##S##_relaxed(&location); \
+ } \
+ static inline void store ( T& location, T value ) { \
+ __TBB_machine_store##S##_relaxed(&location, (V)value); \
+ } \
+ }
+
+namespace tbb {
+namespace internal {
+ __TBB_MACHINE_DEFINE_ATOMICS(1,int8_t);
+ __TBB_MACHINE_DEFINE_ATOMICS(2,int16_t);
+ __TBB_MACHINE_DEFINE_ATOMICS(4,int32_t);
+ __TBB_MACHINE_DEFINE_ATOMICS(8,int64_t);
+}} // namespaces internal, tbb
+
+#undef __TBB_MACHINE_DEFINE_ATOMICS
+
+#define __TBB_USE_FENCED_ATOMICS 1
+#define __TBB_USE_GENERIC_HALF_FENCED_LOAD_STORE 1
// Definition of Lock functions
#define __TBB_TryLockByte(P) __TBB_machine_trylockbyte(P)
@@ -167,4 +186,3 @@ extern "C" {
// Definition of other utility functions
#define __TBB_Pause(V) __TBB_machine_pause(V)
#define __TBB_Log2(V) __TBB_machine_lg(V)
-
diff --git a/include/tbb/machine/linux_intel64.h b/include/tbb/machine/linux_intel64.h
index 8d05762..8e34e08 100644
--- a/include/tbb/machine/linux_intel64.h
+++ b/include/tbb/machine/linux_intel64.h
@@ -26,24 +26,28 @@
the GNU General Public License.
*/
-#ifndef __TBB_machine_H
-#error Do not include this file directly; include tbb_machine.h instead
+#if !defined(__TBB_machine_H) || defined(__TBB_machine_linux_intel64_H)
+#error Do not #include this internal file directly; use public TBB headers instead.
#endif
+#define __TBB_machine_linux_intel64_H
+
#include <stdint.h>
#include <unistd.h>
#define __TBB_WORDSIZE 8
#define __TBB_BIG_ENDIAN 0
-#define __TBB_release_consistency_helper() __asm__ __volatile__("": : :"memory")
+#define __TBB_compiler_fence() __asm__ __volatile__("": : :"memory")
+#define __TBB_control_consistency_helper() __TBB_compiler_fence()
+#define __TBB_acquire_consistency_helper() __TBB_compiler_fence()
+#define __TBB_release_consistency_helper() __TBB_compiler_fence()
-// __TBB_full_memory_fence can be predefined
#ifndef __TBB_full_memory_fence
#define __TBB_full_memory_fence() __asm__ __volatile__("mfence": : :"memory")
#endif
-#define __MACHINE_DECL_ATOMICS(S,T,X) \
+#define __TBB_MACHINE_DEFINE_ATOMICS(S,T,X) \
static inline T __TBB_machine_cmpswp##S (volatile void *ptr, T value, T comparand ) \
{ \
T result; \
@@ -75,10 +79,12 @@ static inline T __TBB_machine_fetchstore##S(volatile void *ptr, T value)
return result; \
} \
-__MACHINE_DECL_ATOMICS(1,int8_t,"")
-__MACHINE_DECL_ATOMICS(2,int16_t,"")
-__MACHINE_DECL_ATOMICS(4,int32_t,"")
-__MACHINE_DECL_ATOMICS(8,int64_t,"q")
+__TBB_MACHINE_DEFINE_ATOMICS(1,int8_t,"")
+__TBB_MACHINE_DEFINE_ATOMICS(2,int16_t,"")
+__TBB_MACHINE_DEFINE_ATOMICS(4,int32_t,"")
+__TBB_MACHINE_DEFINE_ATOMICS(8,int64_t,"q")
+
+#undef __TBB_MACHINE_DEFINE_ATOMICS
static inline int64_t __TBB_machine_lg( uint64_t x ) {
int64_t j;
@@ -94,29 +100,6 @@ static inline void __TBB_machine_and( volatile void *ptr, uint64_t addend ) {
__asm__ __volatile__("lock\nandq %1,%0" : "=m"(*(volatile uint64_t*)ptr) : "r"(addend), "m"(*(volatile uint64_t*)ptr) : "memory");
}
-// Machine specific atomic operations
-
-#define __TBB_CompareAndSwap1(P,V,C) __TBB_machine_cmpswp1(P,V,C)
-#define __TBB_CompareAndSwap2(P,V,C) __TBB_machine_cmpswp2(P,V,C)
-#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_CompareAndSwapW(P,V,C) __TBB_machine_cmpswp8(P,V,C)
-
-#define __TBB_FetchAndAdd1(P,V) __TBB_machine_fetchadd1(P,V)
-#define __TBB_FetchAndAdd2(P,V) __TBB_machine_fetchadd2(P,V)
-#define __TBB_FetchAndAdd4(P,V) __TBB_machine_fetchadd4(P,V)
-#define __TBB_FetchAndAdd8(P,V) __TBB_machine_fetchadd8(P,V)
-#define __TBB_FetchAndAddW(P,V) __TBB_machine_fetchadd8(P,V)
-
-#define __TBB_FetchAndStore1(P,V) __TBB_machine_fetchstore1(P,V)
-#define __TBB_FetchAndStore2(P,V) __TBB_machine_fetchstore2(P,V)
-#define __TBB_FetchAndStore4(P,V) __TBB_machine_fetchstore4(P,V)
-#define __TBB_FetchAndStore8(P,V) __TBB_machine_fetchstore8(P,V)
-#define __TBB_FetchAndStoreW(P,V) __TBB_machine_fetchstore8(P,V)
-
-#undef __TBB_Store8
-#undef __TBB_Load8
-
#define __TBB_AtomicOR(P,V) __TBB_machine_or(P,V)
#define __TBB_AtomicAND(P,V) __TBB_machine_and(P,V)
@@ -129,17 +112,13 @@ static inline void __TBB_machine_pause( int32_t delay ) {
return;
}
#define __TBB_Pause(V) __TBB_machine_pause(V)
-#endif
-#define __TBB_Log2(V) __TBB_machine_lg(V)
+#endif /* !__TBB_Pause */
-// Special atomic functions
-#define __TBB_FetchAndAddWrelease(P,V) __TBB_FetchAndAddW(P,V)
-#define __TBB_FetchAndIncrementWacquire(P) __TBB_FetchAndAddW(P,1)
-#define __TBB_FetchAndDecrementWrelease(P) __TBB_FetchAndAddW(P,-1)
+#define __TBB_Log2(V) __TBB_machine_lg(V)
-// Use generic definitions from tbb_machine.h
-#undef __TBB_TryLockByte
-#undef __TBB_LockByte
+#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
// API to retrieve/update FPU control setting
#ifndef __TBB_CPU_CTL_ENV_PRESENT
@@ -151,11 +130,21 @@ struct __TBB_cpu_ctl_env_t {
};
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__ (
@@ -164,4 +153,4 @@ inline void __TBB_set_cpu_ctl_env ( const __TBB_cpu_ctl_env_t* ctl ) {
: : "m"(ctl->mxcsr), "m"(ctl->x87cw)
);
}
-#endif
+#endif /* !__TBB_CPU_CTL_ENV_PRESENT */
diff --git a/include/tbb/machine/mac_ppc.h b/include/tbb/machine/mac_ppc.h
index 3114039..bb7bd8a 100644
--- a/include/tbb/machine/mac_ppc.h
+++ b/include/tbb/machine/mac_ppc.h
@@ -26,93 +26,279 @@
the GNU General Public License.
*/
-#ifndef __TBB_machine_H
-#error Do not include this file directly; include tbb_machine.h instead
+#if !defined(__TBB_machine_H) || defined(__TBB_machine_gcc_power_H)
+#error Do not #include this internal file directly; use public TBB headers instead.
#endif
+#define __TBB_machine_gcc_power_H
+
#include <stdint.h>
#include <unistd.h>
-// This file is for PowerPC with compilers supporting GNU inline-assembler syntax (currently GNU g++ and IBM XL).
+// TODO: rename to gcc_power.h?
+// This file is for Power Architecture with compilers supporting GNU inline-assembler syntax (currently GNU g++ and IBM XL).
+// Note that XL V9.0 (sometimes?) has trouble dealing with empty input and/or clobber lists, so they should be avoided.
+
+#if __powerpc64__ || __ppc64__
+ // IBM XL documents __powerpc64__ (and __PPC64__).
+ // Apple documents __ppc64__ (with __ppc__ only on 32-bit).
+ #define __TBB_WORDSIZE 8
+#else
+ #define __TBB_WORDSIZE 4
+#endif
+
+// On Power Architecture, (lock-free) 64-bit atomics require 64-bit hardware:
+#if __TBB_WORDSIZE==8
+ // Do not change the following definition, because TBB itself will use 64-bit atomics in 64-bit builds.
+ #define __TBB_64BIT_ATOMICS 1
+#elif __bgp__
+ // Do not change the following definition on known 32-bit hardware.
+ #define __TBB_64BIT_ATOMICS 0
+#else
+ // To enable 64-bit atomics in 32-bit builds, set the value below to 1 instead of 0.
+ // You must make certain that the program will only use them on actual 64-bit hardware
+ // (which typically means that the entire program is only executed on such hardware),
+ // because their implementation involves machine instructions that are illegal elsewhere.
+ // The setting can be chosen independently per compilation unit,
+ // which also means that TBB itself does not need to be rebuilt.
+ // Alternatively (but only for the current architecture and TBB version),
+ // override the default as a predefined macro when invoking the compiler.
+ #ifndef __TBB_64BIT_ATOMICS
+ #define __TBB_64BIT_ATOMICS 0
+ #endif
+#endif
-// Motivation for use of "#if defined(__powerpc64__) || defined(__ppc64__)" to detect a 64-bit environment:
-// IBM XL documents both __powerpc64__ and __PPC64__, and these also appear to work on g++ (documentation?)
-// Apple documents __ppc64__ (with __ppc__ only 32-bit, which is not portable even to other environments using g++)
inline int32_t __TBB_machine_cmpswp4 (volatile void *ptr, int32_t value, int32_t comparand )
{
int32_t result;
__asm__ __volatile__("sync\n"
- "0: lwarx %0,0,%2\n\t" /* load w/ reservation */
- "cmpw %0,%4\n\t" /* compare against comparand */
- "bne- 1f\n\t" /* exit if not same */
- "stwcx. %3,0,%2\n\t" /* store new_value */
- "bne- 0b\n" /* retry if reservation lost */
- "1: sync" /* the exit */
- : "=&r"(result), "=m"(* (int32_t*) ptr)
- : "r"(ptr), "r"(value), "r"(comparand), "m"(* (int32_t*) ptr)
- : "cr0", "memory");
+ "0:\n\t"
+ "lwarx %[res],0,%[ptr]\n\t" /* load w/ reservation */
+ "cmpw %[res],%[cmp]\n\t" /* compare against comparand */
+ "bne- 1f\n\t" /* exit if not same */
+ "stwcx. %[val],0,%[ptr]\n\t" /* store new value */
+ "bne- 0b\n" /* retry if reservation lost */
+ "1:\n\t" /* the exit */
+ "isync"
+ : [res]"=&r"(result)
+ , "+m"(* (int32_t*) ptr) /* redundant with "memory" */
+ : [ptr]"r"(ptr)
+ , [val]"r"(value)
+ , [cmp]"r"(comparand)
+ : "memory" /* compiler full fence */
+ , "cr0" /* clobbered by cmp and/or stwcx. */
+ );
return result;
}
-#if defined(__powerpc64__) || defined(__ppc64__)
+#if __TBB_WORDSIZE==8
inline int64_t __TBB_machine_cmpswp8 (volatile void *ptr, int64_t value, int64_t comparand )
{
int64_t result;
__asm__ __volatile__("sync\n"
- "0: ldarx %0,0,%2\n\t" /* load w/ reservation */
- "cmpd %0,%4\n\t" /* compare against comparand */
- "bne- 1f\n\t" /* exit if not same */
- "stdcx. %3,0,%2\n\t" /* store new_value */
- "bne- 0b\n" /* retry if reservation lost */
- "1: sync" /* the exit */
- : "=&r"(result), "=m"(* (int64_t*) ptr)
- : "r"(ptr), "r"(value), "r"(comparand), "m"(* (int64_t*) ptr)
- : "cr0", "memory");
+ "0:\n\t"
+ "ldarx %[res],0,%[ptr]\n\t" /* load w/ reservation */
+ "cmpd %[res],%[cmp]\n\t" /* compare against comparand */
+ "bne- 1f\n\t" /* exit if not same */
+ "stdcx. %[val],0,%[ptr]\n\t" /* store new value */
+ "bne- 0b\n" /* retry if reservation lost */
+ "1:\n\t" /* the exit */
+ "isync"
+ : [res]"=&r"(result)
+ , "+m"(* (int64_t*) ptr) /* redundant with "memory" */
+ : [ptr]"r"(ptr)
+ , [val]"r"(value)
+ , [cmp]"r"(comparand)
+ : "memory" /* compiler full fence */
+ , "cr0" /* clobbered by cmp and/or stdcx. */
+ );
return result;
}
-#else
-// Except for special circumstances, 32-bit builds are meant to run on actual 32-bit hardware
-// A locked implementation would also be a possibility
-#define __TBB_64BIT_ATOMICS 0
-#endif /* 64bit CAS */
-#define __TBB_BIG_ENDIAN 1
+#elif __TBB_64BIT_ATOMICS /* && __TBB_WORDSIZE==4 */
-#if defined(__powerpc64__) || defined(__ppc64__)
-#define __TBB_WORDSIZE 8
-#define __TBB_CompareAndSwapW(P,V,C) __TBB_machine_cmpswp8(P,V,C)
-#else
-#define __TBB_WORDSIZE 4
-#define __TBB_CompareAndSwapW(P,V,C) __TBB_machine_cmpswp4(P,V,C)
-#endif
+inline int64_t __TBB_machine_cmpswp8 (volatile void *ptr, int64_t value, int64_t comparand )
+{
+ int64_t result;
+ int64_t value_register, comparand_register, result_register; // dummy variables to allocate registers
+ __asm__ __volatile__("sync\n\t"
+ "ld %[val],%[valm]\n\t"
+ "ld %[cmp],%[cmpm]\n"
+ "0:\n\t"
+ "ldarx %[res],0,%[ptr]\n\t" /* load w/ reservation */
+ "cmpd %[res],%[cmp]\n\t" /* compare against comparand */
+ "bne- 1f\n\t" /* exit if not same */
+ "stdcx. %[val],0,%[ptr]\n\t" /* store new value */
+ "bne- 0b\n" /* retry if reservation lost */
+ "1:\n\t" /* the exit */
+ "std %[res],%[resm]\n\t"
+ "isync"
+ : [resm]"=m"(result)
+ , [res] "=&r"( result_register)
+ , [val] "=&r"( value_register)
+ , [cmp] "=&r"(comparand_register)
+ , "+m"(* (int64_t*) ptr) /* redundant with "memory" */
+ : [ptr] "r"(ptr)
+ , [valm]"m"(value)
+ , [cmpm]"m"(comparand)
+ : "memory" /* compiler full fence */
+ , "cr0" /* clobbered by cmpd and/or stdcx. */
+ );
+ return result;
+}
+#endif /* __TBB_WORDSIZE==4 && __TBB_64BIT_ATOMICS */
-#define __TBB_CompareAndSwap4(P,V,C) __TBB_machine_cmpswp4(P,V,C)
-#if __TBB_64BIT_ATOMICS
-#define __TBB_CompareAndSwap8(P,V,C) __TBB_machine_cmpswp8(P,V,C)
-#endif
-#define __TBB_full_memory_fence() __asm__ __volatile__("sync": : :"memory")
-#define __TBB_release_consistency_helper() __asm__ __volatile__("lwsync": : :"memory")
+#define __TBB_MACHINE_DEFINE_LOAD_STORE(S,ldx,stx,cmpx) \
+ template <typename T> \
+ struct machine_load_store<T,S> { \
+ static inline T load_with_acquire(const volatile T& location) { \
+ T result; \
+ __asm__ __volatile__(ldx " %[res],0(%[ptr])\n" \
+ "0:\n\t" \
+ cmpx " %[res],%[res]\n\t" \
+ "bne- 0b\n\t" \
+ "isync" \
+ : [res]"=r"(result) \
+ : [ptr]"b"(&location) /* cannot use register 0 here */ \
+ , "m"(location) /* redundant with "memory" */ \
+ : "memory" /* compiler acquire fence */ \
+ , "cr0" /* clobbered by cmpw/cmpd */); \
+ return result; \
+ } \
+ static inline void store_with_release(volatile T &location, T value) { \
+ __asm__ __volatile__("lwsync\n\t" \
+ stx " %[val],0(%[ptr])" \
+ : "=m"(location) /* redundant with "memory" */ \
+ : [ptr]"b"(&location) /* cannot use register 0 here */ \
+ , [val]"r"(value) \
+ : "memory"/*compiler release fence*/ /*(cr0 not affected)*/); \
+ } \
+ }; \
+ \
+ template <typename T> \
+ struct machine_load_store_relaxed<T,S> { \
+ static inline T load (const __TBB_atomic T& location) { \
+ T result; \
+ __asm__ __volatile__(ldx " %[res],0(%[ptr])" \
+ : [res]"=r"(result) \
+ : [ptr]"b"(&location) /* cannot use register 0 here */ \
+ , "m"(location) \
+ ); /*(no compiler fence)*/ /*(cr0 not affected)*/ \
+ return result; \
+ } \
+ static inline void store (__TBB_atomic T &location, T value) { \
+ __asm__ __volatile__(stx " %[val],0(%[ptr])" \
+ : "=m"(location) \
+ : [ptr]"b"(&location) /* cannot use register 0 here */ \
+ , [val]"r"(value) \
+ ); /*(no compiler fence)*/ /*(cr0 not affected)*/ \
+ } \
+ };
+
+namespace tbb {
+namespace internal {
+ __TBB_MACHINE_DEFINE_LOAD_STORE(1,"lbz","stb","cmpw")
+ __TBB_MACHINE_DEFINE_LOAD_STORE(2,"lhz","sth","cmpw")
+ __TBB_MACHINE_DEFINE_LOAD_STORE(4,"lwz","stw","cmpw")
+
+#if __TBB_WORDSIZE==8
+
+ __TBB_MACHINE_DEFINE_LOAD_STORE(8,"ld" ,"std","cmpd")
+
+#elif __TBB_64BIT_ATOMICS /* && __TBB_WORDSIZE==4 */
+
+ template <typename T>
+ struct machine_load_store<T,8> {
+ static inline T load_with_acquire(const volatile T& location) {
+ T result;
+ T result_register; // dummy variable to allocate a register
+ __asm__ __volatile__("ld %[res],0(%[ptr])\n\t"
+ "std %[res],%[resm]\n"
+ "0:\n\t"
+ "cmpd %[res],%[res]\n\t"
+ "bne- 0b\n\t"
+ "isync"
+ : [resm]"=m"(result)
+ , [res]"=&r"(result_register)
+ : [ptr]"b"(&location) /* cannot use register 0 here */
+ , "m"(location) /* redundant with "memory" */
+ : "memory" /* compiler acquire fence */
+ , "cr0" /* clobbered by cmpd */);
+ return result;
+ }
+
+ static inline void store_with_release(volatile T &location, T value) {
+ T value_register; // dummy variable to allocate a register
+ __asm__ __volatile__("lwsync\n\t"
+ "ld %[val],%[valm]\n\t"
+ "std %[val],0(%[ptr])"
+ : "=m"(location) /* redundant with "memory" */
+ , [val]"=&r"(value_register)
+ : [ptr]"b"(&location) /* cannot use register 0 here */
+ , [valm]"m"(value)
+ : "memory"/*compiler release fence*/ /*(cr0 not affected)*/);
+ }
+ };
+
+ struct machine_load_store_relaxed<T,8> {
+ static inline T load (const volatile T& location) {
+ T result;
+ T result_register; // dummy variable to allocate a register
+ __asm__ __volatile__("ld %[res],0(%[ptr])\n\t"
+ "std %[res],%[resm]"
+ : [resm]"=m"(result)
+ , [res]"=&r"(result_register)
+ : [ptr]"b"(&location) /* cannot use register 0 here */
+ , "m"(location)
+ ); /*(no compiler fence)*/ /*(cr0 not affected)*/
+ return result;
+ }
+
+ static inline void store (volatile T &location, T value) {
+ T value_register; // dummy variable to allocate a register
+ __asm__ __volatile__("ld %[val],%[valm]\n\t"
+ "std %[val],0(%[ptr])"
+ : "=m"(location)
+ , [val]"=&r"(value_register)
+ : [ptr]"b"(&location) /* cannot use register 0 here */
+ , [valm]"m"(value)
+ ); /*(no compiler fence)*/ /*(cr0 not affected)*/
+ }
+ };
+ #define __TBB_machine_load_store_relaxed_8
+
+#endif /* __TBB_WORDSIZE==4 && __TBB_64BIT_ATOMICS */
+
+}} // namespaces internal, tbb
+
+#undef __TBB_MACHINE_DEFINE_LOAD_STORE
+
+#define __TBB_USE_GENERIC_PART_WORD_CAS 1
+#define __TBB_USE_GENERIC_FETCH_ADD 1
+#define __TBB_USE_GENERIC_FETCH_STORE 1
+
+#define __TBB_control_consistency_helper() __asm__ __volatile__("isync": : :"memory")
+#define __TBB_full_memory_fence() __asm__ __volatile__( "sync": : :"memory")
-#if !__IBMCPP__
-// "1501-230 (S) Internal compiler error; please contact your Service Representative"
static inline intptr_t __TBB_machine_lg( uintptr_t x ) {
- // TODO: assumes sizeof(uintptr_t)<=8 resp. 4
- #if defined(__powerpc64__) || defined(__ppc64__)
- __asm__ __volatile__ ("cntlzd %0,%0" : "+r"(x)); // counting starts at 2^63
+ // cntlzd/cntlzw starts counting at 2^63/2^31 (ignoring any higher-order bits), and does not affect cr0
+#if __TBB_WORDSIZE==8
+ __asm__ __volatile__ ("cntlzd %0,%0" : "+r"(x));
return 63-static_cast<intptr_t>(x);
- #else
- __asm__ __volatile__ ("cntlzw %0,%0" : "+r"(x)); // counting starts at 2^31 (on 64-bit hardware, higher-order bits are ignored)
+#else
+ __asm__ __volatile__ ("cntlzw %0,%0" : "+r"(x));
return 31-static_cast<intptr_t>(x);
- #endif
+#endif
}
#define __TBB_Log2(V) __TBB_machine_lg(V)
-#endif
-#define __TBB_Byte uint32_t // TODO: would this ever not be aligned without an alignment specification?
+// Assumes implicit alignment for any 32-bit value
+typedef uint32_t __TBB_Flag;
+#define __TBB_Flag __TBB_Flag
-inline bool __TBB_machine_trylockbyte( __TBB_Byte &flag ) {
+inline bool __TBB_machine_trylockbyte( __TBB_atomic __TBB_Flag &flag ) {
return __TBB_machine_cmpswp4(&flag,1,0)==0;
}
#define __TBB_TryLockByte(P) __TBB_machine_trylockbyte(P)
diff --git a/include/tbb/machine/macos_common.h b/include/tbb/machine/macos_common.h
index c0e8799..dd12779 100644
--- a/include/tbb/machine/macos_common.h
+++ b/include/tbb/machine/macos_common.h
@@ -26,14 +26,15 @@
the GNU General Public License.
*/
-#ifndef __TBB_machine_H
-#error Do not include this file directly; include tbb_machine.h instead
+#if !defined(__TBB_machine_H) || defined(__TBB_machine_macos_common_H)
+#error Do not #include this internal file directly; use public TBB headers instead.
#endif
+#define __TBB_machine_macos_common_H
+
#include <sched.h>
#define __TBB_Yield() sched_yield()
-
// __TBB_HardwareConcurrency
#include <sys/types.h>
@@ -49,40 +50,21 @@ static inline int __TBB_macos_available_cpu() {
#define __TBB_HardwareConcurrency() __TBB_macos_available_cpu()
-
-#ifndef __TBB_WORDSIZE
-#define __TBB_WORDSIZE 4
-#endif
-
-#ifndef __TBB_BIG_ENDIAN
-#if __BIG_ENDIAN__
-#define __TBB_BIG_ENDIAN 1
-#else
-#define __TBB_BIG_ENDIAN 0
-#endif
+#ifndef __TBB_full_memory_fence
+ // TBB has not recognized the architecture (none of the architecture abstraction
+ // headers was included).
+ #define __TBB_UnknownArchitecture 1
#endif
-
-#if !defined(__TBB_CompareAndSwap4) || !defined(__TBB_CompareAndSwap8)
+#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).
// Implementation of atomic operations based on OS provided primitives
#include <libkern/OSAtomic.h>
-#define __TBB_release_consistency_helper() OSMemoryBarrier()
-#define __TBB_full_memory_fence() OSMemoryBarrier()
-
-static inline int32_t __TBB_macos_cmpswp4(volatile void *ptr, int32_t value, int32_t comparand)
-{
- __TBB_ASSERT( !((uintptr_t)ptr&0x3), "address not properly aligned for Mac OS atomics");
- int32_t* address = (int32_t*)ptr;
- while( !OSAtomicCompareAndSwap32Barrier(comparand, value, address) ){
- int32_t snapshot = *address;
- if( snapshot!=comparand ) return snapshot;
- }
- return comparand;
-}
-
-static inline int64_t __TBB_macos_cmpswp8(volatile void *ptr, int64_t value, int64_t comparand)
+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");
int64_t* address = (int64_t*)ptr;
@@ -97,30 +79,58 @@ static inline int64_t __TBB_macos_cmpswp8(volatile void *ptr, int64_t value, int
return comparand;
}
-#define __TBB_CompareAndSwap4(P,V,C) __TBB_macos_cmpswp4(P,V,C)
-#define __TBB_CompareAndSwap8(P,V,C) __TBB_macos_cmpswp8(P,V,C)
+#define __TBB_machine_cmpswp8 __TBB_machine_cmpswp8_OsX
-static inline int32_t __TBB_macos_fetchadd4(volatile void *ptr, int32_t addend)
+#endif /* __TBB_UnknownArchitecture || __TBB_WORDSIZE==4 */
+
+#if __TBB_UnknownArchitecture
+
+#ifndef __TBB_WORDSIZE
+#define __TBB_WORDSIZE 4
+#endif
+
+#define __TBB_BIG_ENDIAN __BIG_ENDIAN__
+
+/** As this generic implementation has absolutely no information about underlying
+ hardware, its performance most likely will be sub-optimal because of full memory
+ fence usages where a more lightweight synchronization means (or none at all)
+ could suffice. Thus if you use this header to enable TBB on a new platform,
+ consider forking it and relaxing below helpers as appropriate. **/
+#define __TBB_control_consistency_helper() OSMemoryBarrier()
+#define __TBB_acquire_consistency_helper() OSMemoryBarrier()
+#define __TBB_release_consistency_helper() OSMemoryBarrier()
+#define __TBB_full_memory_fence() OSMemoryBarrier()
+
+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");
+ int32_t* address = (int32_t*)ptr;
+ while( !OSAtomicCompareAndSwap32Barrier(comparand, value, address) ){
+ int32_t snapshot = *address;
+ if( snapshot!=comparand ) return snapshot;
+ }
+ return comparand;
+}
+
+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");
return OSAtomicAdd32Barrier(addend, (int32_t*)ptr) - addend;
}
-static inline int64_t __TBB_macos_fetchadd8(volatile void *ptr, int64_t 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");
return OSAtomicAdd64Barrier(addend, (int64_t*)ptr) - addend;
}
-#define __TBB_FetchAndAdd4(P,V) __TBB_macos_fetchadd4(P,V)
-#define __TBB_FetchAndAdd8(P,V) __TBB_macos_fetchadd8(P,V)
-
-#if __TBB_WORDSIZE==4
-#define __TBB_CompareAndSwapW(P,V,C) __TBB_CompareAndSwap4(P,V,C)
-#define __TBB_FetchAndAddW(P,V) __TBB_FetchAndAdd4(P,V)
-#else
-#define __TBB_CompareAndSwapW(P,V,C) __TBB_CompareAndSwap8(P,V,C)
-#define __TBB_FetchAndAddW(P,V) __TBB_FetchAndAdd8(P,V)
+#define __TBB_USE_GENERIC_PART_WORD_CAS 1
+#define __TBB_USE_GENERIC_PART_WORD_FETCH_ADD 1
+#define __TBB_USE_GENERIC_FETCH_STORE 1
+#define __TBB_USE_GENERIC_HALF_FENCED_LOAD_STORE 1
+#define __TBB_USE_GENERIC_RELAXED_LOAD_STORE 1
+#if __TBB_WORDSIZE == 4
+ #define __TBB_USE_GENERIC_DWORD_LOAD_STORE 1
#endif
-#endif /* !defined(__TBB_CompareAndSwap4) || !defined(__TBB_CompareAndSwap8) */
+#endif /* __TBB_UnknownArchitecture */
diff --git a/include/tbb/machine/sunos_sparc.h b/include/tbb/machine/sunos_sparc.h
index ca228fa..e6e8079 100644
--- a/include/tbb/machine/sunos_sparc.h
+++ b/include/tbb/machine/sunos_sparc.h
@@ -27,18 +27,25 @@
*/
-#ifndef __TBB_machine_H
-#error Do not include this file directly; include tbb_machine.h instead
+#if !defined(__TBB_machine_H) || defined(__TBB_machine_sunos_sparc_H)
+#error Do not #include this internal file directly; use public TBB headers instead.
#endif
+#define __TBB_machine_sunos_sparc_H
+
#include <stdint.h>
#include <unistd.h>
#define __TBB_WORDSIZE 8
#define __TBB_BIG_ENDIAN 1
-#define __TBB_release_consistency_helper() __asm__ __volatile__ ("": : :"memory")
-#define __TBB_full_memory_fence() __asm__ __volatile__("membar #LoadLoad|#LoadStore|#StoreStore|#StoreLoad": : : "memory")
+/** To those working on SPARC hardware. Consider relaxing acquire and release
+ consistency helpers to no-op (as this port covers TSO mode only). **/
+#define __TBB_compiler_fence() __asm__ __volatile__ ("": : :"memory")
+#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__ __volatile__("membar #LoadLoad|#LoadStore|#StoreStore|#StoreLoad": : : "memory")
//--------------------------------------------------
// Compare and swap
@@ -184,45 +191,17 @@ static inline bool __TBB_machine_trylockbyte(unsigned char &flag){
return result == 0;
}
-
-// Machine specific atomic operations
-
-//#define __TBB_CompareAndSwap1(P,V,C) __TBB_machine_cmpswp1(P,V,C) // use generic version in tbb_machine.h
-//#define __TBB_CompareAndSwap2(P,V,C) __TBB_machine_cmpswp2(P,V,C) // use generic version in tbb_machine.h
-#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_CompareAndSwapW(P,V,C) __TBB_machine_cmpswp8(P,V,C)
-
-//#define __TBB_FetchAndAdd1(P,V) __TBB_machine_fetchadd1(P,V) // use generic version in tbb_machine.h
-//#define __TBB_FetchAndAdd2(P,V) __TBB_machine_fetchadd2(P,V) // use generic version in tbb_machine.h
-#define __TBB_FetchAndAdd4(P,V) __TBB_machine_fetchadd4(P,V)
-#define __TBB_FetchAndAdd8(P,V) __TBB_machine_fetchadd8(P,V)
-#define __TBB_FetchAndAddW(P,V) __TBB_machine_fetchadd8(P,V)
-
-// use generic version in tbb_machine.h
-//#define __TBB_FetchAndStore1(P,V) __TBB_machine_fetchstore1(P,V)
-//#define __TBB_FetchAndStore2(P,V) __TBB_machine_fetchstore2(P,V)
-//#define __TBB_FetchAndStore4(P,V) __TBB_machine_fetchstore4(P,V)
-//#define __TBB_FetchAndStore8(P,V) __TBB_machine_fetchstore8(P,V)
-//#define __TBB_FetchAndStoreW(P,V) __TBB_machine_fetchstore8(P,V)
-
-#undef __TBB_Store8
-#undef __TBB_Load8
+#define __TBB_USE_GENERIC_PART_WORD_CAS 1
+#define __TBB_USE_GENERIC_PART_WORD_FETCH_ADD 1
+#define __TBB_USE_GENERIC_FETCH_STORE 1
+#define __TBB_USE_GENERIC_HALF_FENCED_LOAD_STORE 1
+#define __TBB_USE_GENERIC_RELAXED_LOAD_STORE 1
#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)
-
-// Special atomic functions
-#define __TBB_FetchAndAddWrelease(P,V) __TBB_FetchAndAddW(P,V)
-#define __TBB_FetchAndIncrementWacquire(P) __TBB_FetchAndAddW(P,1)
-#define __TBB_FetchAndDecrementWrelease(P) __TBB_FetchAndAddW(P,-1)
-
-// Definition of Lock functions
-// Repeatedly runs TryLockByte, no need to implement
-#undef __TBB_LockByte
+#define __TBB_Log2(V) __TBB_machine_lg(V)
#define __TBB_TryLockByte(P) __TBB_machine_trylockbyte(P)
diff --git a/include/tbb/machine/windows_ia32.h b/include/tbb/machine/windows_ia32.h
index 22dbddd..2902f18 100644
--- a/include/tbb/machine/windows_ia32.h
+++ b/include/tbb/machine/windows_ia32.h
@@ -26,24 +26,29 @@
the GNU General Public License.
*/
-#ifndef __TBB_machine_H
-#error Do not include this file directly; include tbb_machine.h instead
+#if !defined(__TBB_machine_H) || defined(__TBB_machine_windows_ia32_H)
+#error Do not #include this internal file directly; use public TBB headers instead.
#endif
-#if defined(__INTEL_COMPILER)
-#define __TBB_release_consistency_helper() __asm { __asm nop }
+#define __TBB_machine_windows_ia32_H
+
+#define __TBB_WORDSIZE 4
+#define __TBB_BIG_ENDIAN 0
+
+#if __INTEL_COMPILER
+ #define __TBB_compiler_fence() __asm { __asm nop }
#elif _MSC_VER >= 1300
-extern "C" void _ReadWriteBarrier();
-#pragma intrinsic(_ReadWriteBarrier)
-#define __TBB_release_consistency_helper() _ReadWriteBarrier()
+ extern "C" void _ReadWriteBarrier();
+ #pragma intrinsic(_ReadWriteBarrier)
+ #define __TBB_compiler_fence() _ReadWriteBarrier()
#else
-#error Unsupported compiler - need to define __TBB_release_consistency_helper to support it
+ #error Unsupported compiler - need to define __TBB_{control,acquire,release}_consistency_helper to support it
#endif
-#define __TBB_full_memory_fence() __asm { __asm mfence }
-
-#define __TBB_WORDSIZE 4
-#define __TBB_BIG_ENDIAN 0
+#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
@@ -59,11 +64,10 @@ extern "C" {
__int64 __TBB_EXPORTED_FUNC __TBB_machine_load8 (const volatile void *ptr);
}
-#define __TBB_DEFINE_ATOMICS(S,T,U,A,C) \
+#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; \
volatile T *p = (T *)ptr; \
- __TBB_release_consistency_helper(); \
__asm \
{ \
__asm mov edx, p \
@@ -72,14 +76,12 @@ static inline T __TBB_machine_cmpswp##S ( volatile void * ptr, U value, U compar
__asm lock cmpxchg [edx], C \
__asm mov result, A \
} \
- __TBB_release_consistency_helper(); \
return result; \
} \
\
static inline T __TBB_machine_fetchadd##S ( volatile void * ptr, U addend ) { \
T result; \
volatile T *p = (T *)ptr; \
- __TBB_release_consistency_helper(); \
__asm \
{ \
__asm mov edx, p \
@@ -87,14 +89,12 @@ static inline T __TBB_machine_fetchadd##S ( volatile void * ptr, U addend ) { \
__asm lock xadd [edx], A \
__asm mov result, A \
} \
- __TBB_release_consistency_helper(); \
return result; \
}\
\
static inline T __TBB_machine_fetchstore##S ( volatile void * ptr, U value ) { \
T result; \
volatile T *p = (T *)ptr; \
- __TBB_release_consistency_helper(); \
__asm \
{ \
__asm mov edx, p \
@@ -102,14 +102,15 @@ static inline T __TBB_machine_fetchstore##S ( volatile void * ptr, U value ) { \
__asm lock xchg [edx], A \
__asm mov result, A \
} \
- __TBB_release_consistency_helper(); \
return result; \
}
-__TBB_DEFINE_ATOMICS(1, __int8, __int8, al, cl)
-__TBB_DEFINE_ATOMICS(2, __int16, __int16, ax, cx)
-__TBB_DEFINE_ATOMICS(4, __int32, __int32, eax, ecx)
-__TBB_DEFINE_ATOMICS(W, ptrdiff_t, ptrdiff_t, eax, ecx)
+
+__TBB_MACHINE_DEFINE_ATOMICS(1, __int8, __int8, al, cl)
+__TBB_MACHINE_DEFINE_ATOMICS(2, __int16, __int16, ax, cx)
+__TBB_MACHINE_DEFINE_ATOMICS(4, ptrdiff_t, ptrdiff_t, eax, ecx)
+
+#undef __TBB_MACHINE_DEFINE_ATOMICS
static inline __int32 __TBB_machine_lg( unsigned __int64 i ) {
unsigned __int32 j;
@@ -151,39 +152,18 @@ static inline void __TBB_machine_pause (__int32 delay ) {
return;
}
-#define __TBB_CompareAndSwap1(P,V,C) __TBB_machine_cmpswp1(P,V,C)
-#define __TBB_CompareAndSwap2(P,V,C) __TBB_machine_cmpswp2(P,V,C)
-#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_CompareAndSwapW(P,V,C) __TBB_machine_cmpswpW(P,V,C)
-
-#define __TBB_FetchAndAdd1(P,V) __TBB_machine_fetchadd1(P,V)
-#define __TBB_FetchAndAdd2(P,V) __TBB_machine_fetchadd2(P,V)
-#define __TBB_FetchAndAdd4(P,V) __TBB_machine_fetchadd4(P,V)
-#define __TBB_FetchAndAdd8(P,V) __TBB_machine_fetchadd8(P,V)
-#define __TBB_FetchAndAddW(P,V) __TBB_machine_fetchaddW(P,V)
-
-#define __TBB_FetchAndStore1(P,V) __TBB_machine_fetchstore1(P,V)
-#define __TBB_FetchAndStore2(P,V) __TBB_machine_fetchstore2(P,V)
-#define __TBB_FetchAndStore4(P,V) __TBB_machine_fetchstore4(P,V)
-#define __TBB_FetchAndStore8(P,V) __TBB_machine_fetchstore8(P,V)
-#define __TBB_FetchAndStoreW(P,V) __TBB_machine_fetchstoreW(P,V)
-
-// Should define this:
-#define __TBB_Store8(P,V) __TBB_machine_store8(P,V)
-#define __TBB_Load8(P) __TBB_machine_load8(P)
#define __TBB_AtomicOR(P,V) __TBB_machine_OR(P,V)
#define __TBB_AtomicAND(P,V) __TBB_machine_AND(P,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
+
// 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)
-
-// Use generic definitions from tbb_machine.h
-#undef __TBB_TryLockByte
-#undef __TBB_LockByte
+#define __TBB_Log2(V) __TBB_machine_lg(V)
#if defined(_MSC_VER)&&_MSC_VER<1400
static inline void* __TBB_machine_get_current_teb () {
diff --git a/include/tbb/machine/windows_intel64.h b/include/tbb/machine/windows_intel64.h
index 9a45f5d..4d86eaf 100644
--- a/include/tbb/machine/windows_intel64.h
+++ b/include/tbb/machine/windows_intel64.h
@@ -26,35 +26,42 @@
the GNU General Public License.
*/
-#ifndef __TBB_machine_H
-#error Do not include this file directly; include tbb_machine.h instead
+#if !defined(__TBB_machine_H) || defined(__TBB_machine_windows_intel64_H)
+#error Do not #include this internal file directly; use public TBB headers instead.
#endif
+#define __TBB_machine_windows_intel64_H
+
+#define __TBB_WORDSIZE 8
+#define __TBB_BIG_ENDIAN 0
+
#include <intrin.h>
-#if !defined(__INTEL_COMPILER)
-#pragma intrinsic(_InterlockedOr64)
-#pragma intrinsic(_InterlockedAnd64)
-#pragma intrinsic(_InterlockedCompareExchange)
-#pragma intrinsic(_InterlockedCompareExchange64)
-#pragma intrinsic(_InterlockedExchangeAdd)
-#pragma intrinsic(_InterlockedExchangeAdd64)
-#pragma intrinsic(_InterlockedExchange)
-#pragma intrinsic(_InterlockedExchange64)
+
+#if !__INTEL_COMPILER
+ #pragma intrinsic(_InterlockedOr64)
+ #pragma intrinsic(_InterlockedAnd64)
+ #pragma intrinsic(_InterlockedCompareExchange)
+ #pragma intrinsic(_InterlockedCompareExchange64)
+ #pragma intrinsic(_InterlockedExchangeAdd)
+ #pragma intrinsic(_InterlockedExchangeAdd64)
+ #pragma intrinsic(_InterlockedExchange)
+ #pragma intrinsic(_InterlockedExchange64)
#endif /* !defined(__INTEL_COMPILER) */
-#if defined(__INTEL_COMPILER)
-#define __TBB_release_consistency_helper() __asm { __asm nop }
-#define __TBB_full_memory_fence() __asm { __asm mfence }
+#if __INTEL_COMPILER
+ #define __TBB_compiler_fence() __asm { __asm nop }
+ #define __TBB_full_memory_fence() __asm { __asm mfence }
#elif _MSC_VER >= 1300
-extern "C" void _ReadWriteBarrier();
-#pragma intrinsic(_ReadWriteBarrier)
-#define __TBB_release_consistency_helper() _ReadWriteBarrier()
-#pragma intrinsic(_mm_mfence)
-#define __TBB_full_memory_fence() _mm_mfence()
+ extern "C" void _ReadWriteBarrier();
+ #pragma intrinsic(_ReadWriteBarrier)
+ #pragma intrinsic(_mm_mfence)
+ #define __TBB_compiler_fence() _ReadWriteBarrier()
+ #define __TBB_full_memory_fence() _mm_mfence()
#endif
-#define __TBB_WORDSIZE 8
-#define __TBB_BIG_ENDIAN 0
+#define __TBB_control_consistency_helper() __TBB_compiler_fence()
+#define __TBB_acquire_consistency_helper() __TBB_compiler_fence()
+#define __TBB_release_consistency_helper() __TBB_compiler_fence()
// ATTENTION: if you ever change argument types in machine-specific primitives,
// please take care of atomic_word<> specializations in tbb/atomic.h
@@ -68,6 +75,29 @@ extern "C" {
void __TBB_EXPORTED_FUNC __TBB_machine_pause (__int32 delay );
}
+inline long __TBB_machine_cmpswp4 (volatile void *ptr, __int32 value, __int32 comparand ) {
+ return _InterlockedCompareExchange( (long*)ptr, value, comparand );
+}
+inline long __TBB_machine_fetchadd4 (volatile void *ptr, __int32 addend ) {
+ return _InterlockedExchangeAdd( (long*)ptr, addend );
+}
+inline long __TBB_machine_fetchstore4 (volatile void *ptr, __int32 value ) {
+ return _InterlockedExchange( (long*)ptr, value );
+}
+
+inline __int64 __TBB_machine_cmpswp8 (volatile void *ptr, __int64 value, __int64 comparand ) {
+ return _InterlockedCompareExchange64( (__int64*)ptr, value, comparand );
+}
+inline __int64 __TBB_machine_fetchadd8 (volatile void *ptr, __int64 addend ) {
+ return _InterlockedExchangeAdd64( (__int64*)ptr, addend );
+}
+inline __int64 __TBB_machine_fetchstore8 (volatile void *ptr, __int64 value ) {
+ return _InterlockedExchange64( (__int64*)ptr, value );
+}
+
+#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
#if !__INTEL_COMPILER
extern "C" unsigned char _BitScanReverse64( unsigned long* i, unsigned __int64 w );
@@ -97,39 +127,13 @@ inline void __TBB_machine_AND( volatile void *operand, intptr_t addend ) {
_InterlockedAnd64((__int64*)operand, addend);
}
-#define __TBB_CompareAndSwap1(P,V,C) __TBB_machine_cmpswp1(P,V,C)
-#define __TBB_CompareAndSwap2(P,V,C) __TBB_machine_cmpswp2(P,V,C)
-#define __TBB_CompareAndSwap4(P,V,C) _InterlockedCompareExchange( (long*) P , V , C )
-#define __TBB_CompareAndSwap8(P,V,C) _InterlockedCompareExchange64( (__int64*) P , V , C )
-#define __TBB_CompareAndSwapW(P,V,C) _InterlockedCompareExchange64( (__int64*) P , V , C )
-
-#define __TBB_FetchAndAdd1(P,V) __TBB_machine_fetchadd1(P,V)
-#define __TBB_FetchAndAdd2(P,V) __TBB_machine_fetchadd2(P,V)
-#define __TBB_FetchAndAdd4(P,V) _InterlockedExchangeAdd((long*) P , V )
-#define __TBB_FetchAndAdd8(P,V) _InterlockedExchangeAdd64((__int64*) P , V )
-#define __TBB_FetchAndAddW(P,V) _InterlockedExchangeAdd64((__int64*) P , V )
-
-#define __TBB_FetchAndStore1(P,V) __TBB_machine_fetchstore1(P,V)
-#define __TBB_FetchAndStore2(P,V) __TBB_machine_fetchstore2(P,V)
-#define __TBB_FetchAndStore4(P,V) _InterlockedExchange((long*) P , V )
-#define __TBB_FetchAndStore8(P,V) _InterlockedExchange64((__int64*) P , V )
-#define __TBB_FetchAndStoreW(P,V) _InterlockedExchange64((__int64*) P , V )
-
-// Not used if wordsize == 8
-#undef __TBB_Store8
-#undef __TBB_Load8
-
#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(V)
-#define __TBB_Log2(V) __TBB_machine_lg(V)
-
-// Use generic definitions from tbb_machine.h
-#undef __TBB_TryLockByte
-#undef __TBB_LockByte
+#define __TBB_Log2(V) __TBB_machine_lg(V)
// API to retrieve/update FPU control setting
#define __TBB_CPU_CTL_ENV_PRESENT 1
diff --git a/include/tbb/machine/xbox360_ppc.h b/include/tbb/machine/xbox360_ppc.h
index 7bde308..382b4ef 100644
--- a/include/tbb/machine/xbox360_ppc.h
+++ b/include/tbb/machine/xbox360_ppc.h
@@ -26,10 +26,14 @@
the GNU General Public License.
*/
-#ifndef __TBB_machine_H
-#error Do not include this file directly; include tbb_machine.h instead
+// TODO: revise by comparing with mac_ppc.h
+
+#if !defined(__TBB_machine_H) || defined(__TBB_machine_xbox360_ppc_H)
+#error Do not #include this internal file directly; use public TBB headers instead.
#endif
+#define __TBB_machine_xbox360_ppc_H
+
#define NONET
#define NOD3D
#include "xtl.h"
@@ -38,6 +42,8 @@
#if _MSC_VER >= 1300
extern "C" void _MemoryBarrier();
#pragma intrinsic(_MemoryBarrier)
+#define __TBB_control_consistency_helper() __isync()
+#define __TBB_acquire_consistency_helper() _MemoryBarrier()
#define __TBB_release_consistency_helper() _MemoryBarrier()
#endif
@@ -46,27 +52,30 @@ extern "C" void _MemoryBarrier();
#define __TBB_WORDSIZE 4
#define __TBB_BIG_ENDIAN 1
-//todo: define __TBB_DECL_FENCED_ATOMICS and define acquire/release primitives to maximize performance
-
-typedef __int64 int64_t; //required for definition of Store8/Load8 in atomic.h
-typedef unsigned char uint8_t; //same reason
+//todo: define __TBB_USE_FENCED_ATOMICS and define acquire/release primitives to maximize performance
-inline __int32 __TBB_machine_cmpswp4(volatile void *ptr, __int32 value, __int32 comparand )
-{
- __lwsync();
+inline __int32 __TBB_machine_cmpswp4(volatile void *ptr, __int32 value, __int32 comparand ) {
+ __sync();
__int32 result = InterlockedCompareExchange((volatile LONG*)ptr, value, comparand);
- __lwsync();
+ __isync();
return result;
}
inline __int64 __TBB_machine_cmpswp8(volatile void *ptr, __int64 value, __int64 comparand )
{
- __lwsync();
+ __sync();
__int64 result = InterlockedCompareExchange64((volatile LONG64*)ptr, value, comparand);
- __lwsync();
+ __isync();
return result;
}
+#define __TBB_USE_GENERIC_PART_WORD_CAS 1
+#define __TBB_USE_GENERIC_FETCH_ADD 1
+#define __TBB_USE_GENERIC_FETCH_STORE 1
+#define __TBB_USE_GENERIC_HALF_FENCED_LOAD_STORE 1
+#define __TBB_USE_GENERIC_RELAXED_LOAD_STORE 1
+#define __TBB_USE_GENERIC_DWORD_LOAD_STORE 1
+
#pragma optimize( "", off )
inline void __TBB_machine_pause (__int32 delay )
{
@@ -74,10 +83,6 @@ inline void __TBB_machine_pause (__int32 delay )
}
#pragma optimize( "", on )
-
-#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_CompareAndSwapW(P,V,C) __TBB_machine_cmpswp4(P,V,C)
#define __TBB_Yield() Sleep(0)
#define __TBB_Pause(V) __TBB_machine_pause(V)
diff --git a/include/tbb/memory_pool.h b/include/tbb/memory_pool.h
new file mode 100644
index 0000000..980a8bf
--- /dev/null
+++ b/include/tbb/memory_pool.h
@@ -0,0 +1,259 @@
+/*
+ Copyright 2005-2011 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_memory_pool_H
+#define __TBB_memory_pool_H
+
+#if !TBB_PREVIEW_MEMORY_POOL
+#error Set TBB_PREVIEW_MEMORY_POOL to include memory_pool.h
+#endif
+/** @file */
+
+#include "scalable_allocator.h"
+#include "tbb_stddef.h"
+#include "tbb_machine.h" // TODO: Itanium requires linkage with TBB library
+#include <new> // std::bad_alloc
+
+#if __TBB_EXTRA_DEBUG
+#define __TBBMALLOC_ASSERT ASSERT
+#else
+#define __TBBMALLOC_ASSERT(a,b) ((void)0)
+#endif
+
+namespace tbb {
+namespace interface6 {
+//! @cond INTERNAL
+namespace internal {
+
+//! Base of thread-safe pool allocator for variable-size requests
+class pool_base : tbb::internal::no_copy {
+ // Pool interface is separate from standard allocator classes because it has
+ // to maintain internal state, no copy or assignment. Move and swap are possible.
+public:
+ //! Reset pool to reuse its memory (free all objects at once)
+ void recycle() { rml::pool_reset(my_pool); }
+
+ //! The "malloc" analogue to allocate block of memory of size bytes
+ void *malloc(size_t size) { return rml::pool_malloc(my_pool, size); }
+
+ //! The "free" analogue to discard a previously allocated piece of memory.
+ void free(void* ptr) { rml::pool_free(my_pool, ptr); }
+
+ //! The "realloc" analogue complementing pool_malloc.
+ // Enables some low-level optimization possibilities
+ void *realloc(void* ptr, size_t size) {
+ return rml::pool_realloc(my_pool, ptr, size);
+ }
+
+protected:
+ //! destroy pool - must be called in a child class
+ void destroy() { rml::pool_destroy(my_pool); }
+
+ rml::MemoryPool *my_pool;
+};
+
+} // namespace internal
+//! @endcond
+
+#if _MSC_VER && !defined(__INTEL_COMPILER)
+ // Workaround for erroneous "unreferenced parameter" warning in method destroy.
+ #pragma warning (push)
+ #pragma warning (disable: 4100)
+#endif
+
+//! Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5
+/** @ingroup memory_allocation */
+template<typename T, typename P = internal::pool_base>
+class memory_pool_allocator {
+protected:
+ typedef P pool_type;
+ pool_type *my_pool;
+ template<typename U, typename R>
+ friend class memory_pool_allocator;
+ template<typename V, typename U, typename R>
+ friend bool operator==( const memory_pool_allocator<V,R>& a, const memory_pool_allocator<U,R>& b);
+ template<typename V, typename U, typename R>
+ friend bool operator!=( const memory_pool_allocator<V,R>& a, const memory_pool_allocator<U,R>& b);
+public:
+ typedef typename tbb::internal::allocator_type<T>::value_type value_type;
+ typedef value_type* pointer;
+ typedef const value_type* const_pointer;
+ typedef value_type& reference;
+ typedef const value_type& const_reference;
+ typedef size_t size_type;
+ typedef ptrdiff_t difference_type;
+ template<typename U> struct rebind {
+ typedef memory_pool_allocator<U, P> other;
+ };
+
+ memory_pool_allocator(pool_type &pool) throw() : my_pool(&pool) {}
+ memory_pool_allocator(const memory_pool_allocator& src) throw() : my_pool(src.my_pool) {}
+ template<typename U>
+ memory_pool_allocator(const memory_pool_allocator<U,P>& src) throw() : my_pool(src.my_pool) {}
+
+ pointer address(reference x) const { return &x; }
+ const_pointer address(const_reference x) const { return &x; }
+
+ //! Allocate space for n objects.
+ pointer allocate( size_type n, const void* /*hint*/ = 0) {
+ return static_cast<pointer>( my_pool->malloc( n*sizeof(value_type) ) );
+ }
+ //! Free previously allocated block of memory.
+ void deallocate( pointer p, size_type ) {
+ my_pool->free(p);
+ }
+ //! Largest value for which method allocate might succeed.
+ size_type max_size() const throw() {
+ size_type max = static_cast<size_type>(-1) / sizeof (value_type);
+ return (max > 0 ? max : 1);
+ }
+ //! Copy-construct value at location pointed to by p.
+ void construct( pointer p, const value_type& value ) { ::new((void*)(p)) value_type(value); }
+
+ //! Destroy value at location pointed to by p.
+ void destroy( pointer p ) { p->~value_type(); }
+
+};
+
+#if _MSC_VER && !defined(__INTEL_COMPILER)
+ #pragma warning (pop)
+#endif // warning 4100 is back
+
+//! Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1
+/** @ingroup memory_allocation */
+template<typename P>
+class memory_pool_allocator<void, P> {
+public:
+ typedef P pool_type;
+ typedef void* pointer;
+ typedef const void* const_pointer;
+ typedef void value_type;
+ template<typename U> struct rebind {
+ typedef memory_pool_allocator<U, P> other;
+ };
+
+ memory_pool_allocator( pool_type &pool) throw() : my_pool(&pool) {}
+ memory_pool_allocator( const memory_pool_allocator& src) throw() : my_pool(src.my_pool) {}
+ template<typename U>
+ memory_pool_allocator(const memory_pool_allocator<U,P>& src) throw() : my_pool(src.my_pool) {}
+
+protected:
+ pool_type *my_pool;
+ template<typename U, typename R>
+ friend class memory_pool_allocator;
+ template<typename V, typename U, typename R>
+ friend bool operator==( const memory_pool_allocator<V,R>& a, const memory_pool_allocator<U,R>& b);
+ template<typename V, typename U, typename R>
+ friend bool operator!=( const memory_pool_allocator<V,R>& a, const memory_pool_allocator<U,R>& b);
+};
+
+template<typename T, typename U, typename P>
+inline bool operator==( const memory_pool_allocator<T,P>& a, const memory_pool_allocator<U,P>& b) {return a.my_pool==b.my_pool;}
+
+template<typename T, typename U, typename P>
+inline bool operator!=( const memory_pool_allocator<T,P>& a, const memory_pool_allocator<U,P>& b) {return a.my_pool!=b.my_pool;}
+
+
+//! Thread-safe growable pool allocator for variable-size requests
+template <typename Alloc>
+class memory_pool : public internal::pool_base {
+ Alloc my_alloc; // TODO: base-class optimization
+ static void *allocate_request(intptr_t pool_id, size_t & bytes);
+ static int deallocate_request(intptr_t pool_id, void*, size_t raw_bytes);
+
+public:
+ //! construct pool with underlying allocator
+ memory_pool(const Alloc &src = Alloc());
+
+ //! destroy pool
+ ~memory_pool() { destroy(); } // call the callbacks first and destroy my_alloc latter
+
+};
+
+class fixed_pool : public internal::pool_base {
+ void *my_buffer;
+ size_t my_size;
+ inline static void *allocate_request(intptr_t pool_id, size_t & bytes);
+
+public:
+ //! construct pool with underlying allocator
+ inline fixed_pool(void *buf, size_t size);
+ //! destroy pool
+ ~fixed_pool() { destroy(); }
+};
+
+//////////////// Implementation ///////////////
+
+template <typename Alloc>
+memory_pool<Alloc>::memory_pool(const Alloc &src) : my_alloc(src) {
+ rml::MemPoolPolicy args = {
+ allocate_request, deallocate_request, sizeof(typename Alloc::value_type)
+ };
+ my_pool = rml::pool_create(intptr_t(this), &args);
+ __TBBMALLOC_ASSERT(my_pool, "Pool is not created");
+ if( !my_pool ) __TBB_THROW(std::bad_alloc());
+}
+template <typename Alloc>
+void *memory_pool<Alloc>::allocate_request(intptr_t pool_id, size_t & bytes) {
+ memory_pool<Alloc> &self = *reinterpret_cast<memory_pool<Alloc>*>(pool_id);
+ const size_t unit_size = sizeof(typename Alloc::value_type);
+ __TBBMALLOC_ASSERT( 0 == bytes%unit_size, NULL);
+ void *ptr;
+ __TBB_TRY { ptr = self.my_alloc.allocate( bytes/unit_size ); }
+ __TBB_CATCH(...) { return 0; }
+ return ptr;
+}
+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);
+ const size_t unit_size = sizeof(typename Alloc::value_type);
+ __TBBMALLOC_ASSERT( 0 == raw_bytes%unit_size, NULL);
+ self.my_alloc.deallocate( static_cast<typename Alloc::value_type*>(raw_ptr), raw_bytes/unit_size );
+ return 0;
+}
+inline fixed_pool::fixed_pool(void *buf, size_t size) : my_buffer(buf), my_size(size) {
+ rml::MemPoolPolicy args = { allocate_request, 0, size };
+ my_pool = rml::pool_create(intptr_t(this), &args);
+ __TBBMALLOC_ASSERT(my_pool, "Pool is not created");
+ if( !my_pool ) __TBB_THROW(std::bad_alloc());
+}
+inline void *fixed_pool::allocate_request(intptr_t pool_id, size_t & bytes) {
+ fixed_pool &self = *reinterpret_cast<fixed_pool*>(pool_id);
+ if( bytes > self.my_size || !__TBB_CompareAndSwapW(&self.my_size, 0, (bytes=self.my_size)) )
+ return 0; // all the memory was given already
+ return self.my_buffer;
+}
+
+} //namespace interface6
+using interface6::memory_pool_allocator;
+using interface6::memory_pool;
+using interface6::fixed_pool;
+} //namespace tbb
+
+#undef __TBBMALLOC_ASSERT
+#endif// __TBB_memory_pool_H
diff --git a/include/tbb/parallel_for.h b/include/tbb/parallel_for.h
index 31b9f98..5b998fd 100644
--- a/include/tbb/parallel_for.h
+++ b/include/tbb/parallel_for.h
@@ -29,14 +29,15 @@
#ifndef __TBB_parallel_for_H
#define __TBB_parallel_for_H
+#include <new>
#include "task.h"
#include "partitioner.h"
#include "blocked_range.h"
-#include <new>
#include "tbb_exception.h"
namespace tbb {
+namespace interface6 {
//! @cond INTERNAL
namespace internal {
@@ -46,9 +47,10 @@ namespace internal {
class start_for: public task {
Range my_range;
const Body my_body;
- typename Partitioner::partition_type my_partition;
+ typename Partitioner::task_partition_type my_partition;
/*override*/ task* execute();
+ public:
//! Constructor for root task.
start_for( const Range& range, const Body& body, Partitioner& partitioner ) :
my_range(range),
@@ -57,19 +59,28 @@ namespace internal {
{
}
//! Splitting constructor used to generate children.
- /** this becomes left child. Newly constructed object is right child. */
+ /** parent_ becomes left child. Newly constructed object is right child. */
start_for( start_for& parent_, split ) :
- my_range(parent_.my_range,split()),
+ my_range(parent_.my_range,split()),
+ my_body(parent_.my_body),
+ my_partition(parent_.my_partition, split())
+ {
+ my_partition.set_affinity(*this);
+ }
+ //! Construct right child from the given range as response to the demand.
+ /** parent_ remains left child. Newly constructed object is right child. */
+ start_for( start_for& parent_, const Range& r, depth_t d ) :
+ my_range(r),
my_body(parent_.my_body),
my_partition(parent_.my_partition,split())
{
my_partition.set_affinity(*this);
+ my_partition.align_depth( d );
}
//! Update affinity info, if any.
/*override*/ void note_affinity( affinity_id id ) {
my_partition.note_affinity( id );
}
- public:
static void run( const Range& range, const Body& body, const Partitioner& partitioner ) {
if( !range.empty() ) {
#if !__TBB_TASK_GROUP_CONTEXT || TBB_JOIN_OUTER_TASK_GROUP
@@ -91,26 +102,45 @@ namespace internal {
}
}
#endif /* __TBB_TASK_GROUP_CONTEXT */
+ //! create a continuation task, serve as callback for partitioner
+ flag_task *create_continuation() {
+ return new( allocate_continuation() ) flag_task();
+ }
+ //! Run body for range
+ void run_body( Range &r ) { my_body( r ); }
};
template<typename Range, typename Body, typename Partitioner>
task* start_for<Range,Body,Partitioner>::execute() {
- if( !my_range.is_divisible() || my_partition.should_execute_range(*this) ) {
- my_body( my_range );
- return my_partition.continue_after_execute_range();
- } else {
- empty_task& c = *new( this->allocate_continuation() ) empty_task;
- recycle_as_child_of(c);
- c.set_ref_count(2);
- bool delay = my_partition.decide_whether_to_delay();
- start_for& b = *new( c.allocate_child() ) start_for(*this,split());
- my_partition.spawn_or_delay(delay,b);
- return this;
- }
+ my_partition.check_being_stolen( *this );
+ my_partition.execute(*this, my_range);
+ return NULL;
}
} // namespace internal
//! @endcond
+} // namespace interfaceX
+//! @cond INTERNAL
+namespace internal {
+ using interface6::internal::start_for;
+
+ //! Calls the function with values from range [begin, end) with a step provided
+ template<typename Function, typename Index>
+ class parallel_for_body : internal::no_assign {
+ const Function &my_func;
+ const Index my_begin;
+ const Index my_step;
+ public:
+ parallel_for_body( const Function& _func, Index& _begin, Index& _step)
+ : my_func(_func), my_begin(_begin), my_step(_step) {}
+
+ void operator()( tbb::blocked_range<Index>& r ) const {
+ for( Index i = r.begin(), k = my_begin + i * my_step; i < r.end(); i++, k = k + my_step)
+ my_func( k );
+ }
+ };
+} // namespace internal
+//! @endcond
// Requirements on Range concept are documented in blocked_range.h
@@ -177,37 +207,12 @@ void parallel_for( const Range& range, const Body& body, affinity_partitioner& p
#endif /* __TBB_TASK_GROUP_CONTEXT */
//@}
-//! @cond INTERNAL
-namespace internal {
- //! Calls the function with values from range [begin, end) with a step provided
-template<typename Function, typename Index>
-class parallel_for_body : internal::no_assign {
- const Function &my_func;
- const Index my_begin;
- const Index my_step;
-public:
- parallel_for_body( const Function& _func, Index& _begin, Index& _step)
- : my_func(_func), my_begin(_begin), my_step(_step) {}
-
- void operator()( tbb::blocked_range<Index>& r ) const {
- for( Index i = r.begin(), k = my_begin + i * my_step; i < r.end(); i++, k = k + my_step)
- my_func( k );
- }
-};
-} // namespace internal
-//! @endcond
-
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) {
- tbb::task_group_context context;
- parallel_for(first, last, step, f, context);
-}
-template <typename Index, typename Function>
-void parallel_for(Index first, Index last, Index step, const Function& f, tbb::task_group_context &context) {
if (step <= 0 )
internal::throw_exception(internal::eid_nonpositive_step); // throws std::invalid_argument
else if (last > first) {
@@ -215,20 +220,35 @@ 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, tbb::auto_partitioner());
}
}
//! Parallel iteration over a range of integers with a default step value
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(first, last, static_cast<Index>(1), f);
+}
+
+#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) {
+ if (step <= 0 )
+ internal::throw_exception(internal::eid_nonpositive_step); // throws std::invalid_argument
+ else if (last > first) {
+ // Above "else" avoids "potential divide by zero" warning on some platforms
+ 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);
+ }
}
+//! Parallel iteration over a range of integers with a default step value and explicit task group context
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);
}
-
+#endif /* __TBB_TASK_GROUP_CONTEXT */
//@}
} // namespace strict_ppl
@@ -237,5 +257,11 @@ using strict_ppl::parallel_for;
} // namespace tbb
+#if TBB_PREVIEW_SERIAL_SUBSET
+#define __TBB_NORMAL_EXECUTION
+#include "../serial/tbb/parallel_for.h"
+#undef __TBB_NORMAL_EXECUTION
+#endif
+
#endif /* __TBB_parallel_for_H */
diff --git a/include/tbb/parallel_for_each.h b/include/tbb/parallel_for_each.h
index e59ee76..59200b1 100644
--- a/include/tbb/parallel_for_each.h
+++ b/include/tbb/parallel_for_each.h
@@ -43,7 +43,7 @@ namespace internal {
parallel_for_each_body(const Function &_func) : my_func(_func) {}
parallel_for_each_body(const parallel_for_each_body<Function, Iterator> &_caller) : my_func(_caller.my_func) {}
- void operator() ( typename std::iterator_traits<Iterator>::value_type& value ) const {
+ void operator() ( typename std::iterator_traits<Iterator>::reference value ) const {
my_func(value);
}
};
@@ -55,18 +55,18 @@ namespace internal {
//@{
//! Calls function f for all items from [first, last) interval using user-supplied context
/** @ingroup algorithms */
+#if __TBB_TASK_GROUP_CONTEXT
template<typename InputIterator, typename Function>
void parallel_for_each(InputIterator first, InputIterator last, const Function& f, task_group_context &context) {
internal::parallel_for_each_body<Function, InputIterator> body(f);
-
tbb::parallel_do (first, last, body, context);
}
+#endif /* __TBB_TASK_GROUP_CONTEXT */
//! Uses default context
template<typename InputIterator, typename Function>
void parallel_for_each(InputIterator first, InputIterator last, const Function& f) {
internal::parallel_for_each_body<Function, InputIterator> body(f);
-
tbb::parallel_do (first, last, body);
}
diff --git a/include/tbb/parallel_invoke.h b/include/tbb/parallel_invoke.h
index 3303c41..6cc38e2 100644
--- a/include/tbb/parallel_invoke.h
+++ b/include/tbb/parallel_invoke.h
@@ -33,6 +33,11 @@
namespace tbb {
+#if !__TBB_TASK_GROUP_CONTEXT
+ /** Dummy to avoid cluttering the bulk of the header with enormous amount of ifdefs. **/
+ struct task_group_context {};
+#endif /* __TBB_TASK_GROUP_CONTEXT */
+
//! @cond INTERNAL
namespace internal {
// Simple task object, executing user method
@@ -137,8 +142,15 @@ namespace internal {
// The class destroys root if exception occured as well as in normal case
class parallel_invoke_cleaner: internal::no_copy {
public:
- parallel_invoke_cleaner(int number_of_children, tbb::task_group_context& context) : root(*new(task::allocate_root(context)) internal::parallel_invoke_helper(number_of_children))
+#if __TBB_TASK_GROUP_CONTEXT
+ parallel_invoke_cleaner(int number_of_children, tbb::task_group_context& context)
+ : root(*new(task::allocate_root(context)) internal::parallel_invoke_helper(number_of_children))
+#else
+ parallel_invoke_cleaner(int number_of_children, tbb::task_group_context&)
+ : root(*new(task::allocate_root()) internal::parallel_invoke_helper(number_of_children))
+#endif /* !__TBB_TASK_GROUP_CONTEXT */
{}
+
~parallel_invoke_cleaner(){
root.destroy(root);
}
diff --git a/include/tbb/parallel_reduce.h b/include/tbb/parallel_reduce.h
index bef9d6c..12d17ca 100644
--- a/include/tbb/parallel_reduce.h
+++ b/include/tbb/parallel_reduce.h
@@ -29,16 +29,20 @@
#ifndef __TBB_parallel_reduce_H
#define __TBB_parallel_reduce_H
+#include <new>
#include "task.h"
#include "aligned_space.h"
#include "partitioner.h"
#include "tbb_profiling.h"
-#include <new>
namespace tbb {
+namespace interface6 {
//! @cond INTERNAL
namespace internal {
+
+ using namespace tbb::internal;
+
//! 0 if root, 1 if a left child, 2 if a right child.
/** Represented as a char, not enum, for compactness. */
typedef char reduction_context;
@@ -46,16 +50,16 @@ namespace internal {
//! Task type use to combine the partial results of parallel_reduce.
/** @ingroup algorithms */
template<typename Body>
- class finish_reduce: public task {
+ class finish_reduce: public flag_task {
//! Pointer to body, or NULL if the left child has not yet finished.
- Body* my_body;
bool has_right_zombie;
const reduction_context my_context;
+ Body* my_body;
aligned_space<Body,1> zombie_space;
finish_reduce( reduction_context context_ ) :
- my_body(NULL),
- has_right_zombie(false),
- my_context(context_)
+ has_right_zombie(false), // TODO: substitute by flag_task::child_stolen?
+ my_context(context_),
+ my_body(NULL)
{
}
task* execute() {
@@ -80,12 +84,13 @@ namespace internal {
typedef finish_reduce<Body> finish_type;
Body* my_body;
Range my_range;
- typename Partitioner::partition_type my_partition;
- reduction_context my_context;
+ typename Partitioner::task_partition_type my_partition;
+ reduction_context my_context; // TODO: factor out into start_reduce_base
/*override*/ task* execute();
template<typename Body_>
friend class finish_reduce;
+public:
//! Constructor used for root task
start_reduce( const Range& range, Body* body, Partitioner& partitioner ) :
my_body(body),
@@ -105,12 +110,22 @@ namespace internal {
my_partition.set_affinity(*this);
parent_.my_context = 1;
}
+ //! Construct right child from the given range as response to the demand.
+ /** parent_ remains left child. Newly constructed object is right child. */
+ start_reduce( start_reduce& parent_, const Range& r, depth_t d ) :
+ my_body(parent_.my_body),
+ my_range(r),
+ my_partition(parent_.my_partition,split()),
+ my_context(2) // right leaf mark
+ {
+ my_partition.set_affinity(*this);
+ my_partition.align_depth( d );
+ parent_.my_context = 1; // left leaf mark
+ }
//! Update affinity info, if any
/*override*/ void note_affinity( affinity_id id ) {
my_partition.note_affinity( id );
}
-
-public:
static void run( const Range& range, Body& body, Partitioner& partitioner ) {
if( !range.empty() ) {
#if !__TBB_TASK_GROUP_CONTEXT || TBB_JOIN_OUTER_TASK_GROUP
@@ -129,33 +144,122 @@ public:
task::spawn_root_and_wait( *new(task::allocate_root(context)) start_reduce(range,&body,partitioner) );
}
#endif /* __TBB_TASK_GROUP_CONTEXT */
+ //! create a continuation task, serve as callback for partitioner
+ finish_type *create_continuation() {
+ return new( allocate_continuation() ) finish_type(my_context);
+ }
+ //! Run body for range
+ void run_body( Range &r ) { (*my_body)( r ); }
};
-
template<typename Range, typename Body, typename Partitioner>
task* start_reduce<Range,Body,Partitioner>::execute() {
+ my_partition.check_being_stolen( *this );
if( my_context==2 ) { // right child
- finish_type* p = static_cast<finish_type*>(parent());
- if( !itt_load_word_with_acquire(p->my_body) ) {
- my_body = new( p->zombie_space.begin() ) Body(*my_body,split());
- p->has_right_zombie = true;
+ finish_type* parent_ptr = static_cast<finish_type*>(parent());
+ if( !itt_load_word_with_acquire(parent_ptr->my_body) ) { // TODO: replace by is_stolen_task() or by parent_ptr->ref_count() == 2???
+ my_body = new( parent_ptr->zombie_space.begin() ) Body(*my_body,split());
+ parent_ptr->has_right_zombie = true;
+ }
+ } else __TBB_ASSERT(my_context==0,0);// because left leaf spawns right leafs without recycling
+ my_partition.execute(*this, my_range);
+ if( my_context==1 ) {
+ finish_type* parent_ptr = static_cast<finish_type*>(parent());
+ __TBB_ASSERT(my_body!=parent_ptr->zombie_space.begin(),0);
+ itt_store_word_with_release(parent_ptr->my_body, my_body );
+ }
+ return NULL;
+ }
+
+#if TBB_PREVIEW_DETERMINISTIC_REDUCE
+ //! Task type use to combine the partial results of parallel_deterministic_reduce.
+ /** @ingroup algorithms */
+ template<typename Body>
+ class finish_deterministic_reduce: public task {
+ Body &my_left_body;
+ Body my_right_body;
+
+ finish_deterministic_reduce( Body &body ) :
+ my_left_body( body ),
+ my_right_body( body, split() )
+ {
+ }
+ task* execute() {
+ my_left_body.join( my_right_body );
+ return NULL;
+ }
+ template<typename Range,typename Body_>
+ friend class start_deterministic_reduce;
+ };
+
+ //! Task type used to split the work of parallel_deterministic_reduce.
+ /** @ingroup algorithms */
+ template<typename Range, typename Body>
+ class start_deterministic_reduce: public task {
+ typedef finish_deterministic_reduce<Body> finish_type;
+ Body &my_body;
+ Range my_range;
+ /*override*/ task* execute();
+
+ //! Constructor used for root task
+ start_deterministic_reduce( const Range& range, Body& body ) :
+ my_body( body ),
+ my_range( range )
+ {
+ }
+ //! Splitting constructor used to generate children.
+ /** parent_ becomes left child. Newly constructed object is right child. */
+ start_deterministic_reduce( start_deterministic_reduce& parent_, finish_type& c ) :
+ my_body( c.my_right_body ),
+ my_range( parent_.my_range, split() )
+ {
+ }
+
+public:
+ static void run( const Range& range, Body& body ) {
+ if( !range.empty() ) {
+#if !__TBB_TASK_GROUP_CONTEXT || TBB_JOIN_OUTER_TASK_GROUP
+ task::spawn_root_and_wait( *new(task::allocate_root()) start_deterministic_reduce(range,&body) );
+#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;
+ task::spawn_root_and_wait( *new(task::allocate_root(context)) start_deterministic_reduce(range,body) );
+#endif /* __TBB_TASK_GROUP_CONTEXT && !TBB_JOIN_OUTER_TASK_GROUP */
}
}
- if( !my_range.is_divisible() || my_partition.should_execute_range(*this) ) {
- (*my_body)( my_range );
- if( my_context==1 )
- itt_store_word_with_release(static_cast<finish_type*>(parent())->my_body, my_body );
- return my_partition.continue_after_execute_range();
+#if __TBB_TASK_GROUP_CONTEXT
+ static void run( const Range& range, Body& body, task_group_context& context ) {
+ if( !range.empty() )
+ task::spawn_root_and_wait( *new(task::allocate_root(context)) start_deterministic_reduce(range,body) );
+ }
+#endif /* __TBB_TASK_GROUP_CONTEXT */
+ };
+
+ template<typename Range, typename Body>
+ task* start_deterministic_reduce<Range,Body>::execute() {
+ if( !my_range.is_divisible() ) {
+ my_body( my_range );
+ return NULL;
} else {
- finish_type& c = *new( allocate_continuation()) finish_type(my_context);
+ finish_type& c = *new( allocate_continuation() ) finish_type( my_body );
recycle_as_child_of(c);
- c.set_ref_count(2);
- bool delay = my_partition.decide_whether_to_delay();
- start_reduce& b = *new( c.allocate_child() ) start_reduce(*this,split());
- my_partition.spawn_or_delay(delay,b);
+ c.set_ref_count(2);
+ start_deterministic_reduce& b = *new( c.allocate_child() ) start_deterministic_reduce( *this, c );
+ task::spawn(b);
return this;
}
}
+#endif /* TBB_PREVIEW_DETERMINISTIC_REDUCE */
+} // namespace internal
+//! @endcond
+} //namespace interfaceX
+//! @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".
@@ -357,6 +461,50 @@ Value parallel_reduce( const Range& range, const Value& identity, const RealBody
return body.result();
}
#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>
+void parallel_deterministic_reduce( const Range& range, Body& body ) {
+ internal::start_deterministic_reduce<Range,Body>::run( range, body );
+}
+
+#if __TBB_TASK_GROUP_CONTEXT
+//! Parallel iteration with deterministic reduction, simple partitioner and user-supplied context.
+/** @ingroup algorithms **/
+template<typename Range, typename Body>
+void parallel_deterministic_reduce( const Range& range, Body& body, task_group_context& context ) {
+ internal::start_deterministic_reduce<Range,Body>::run( range, body, context );
+}
+#endif /* __TBB_TASK_GROUP_CONTEXT */
+
+/** parallel_reduce overloads that work with anonymous function objects
+ (see also \ref parallel_reduce_lambda_req "requirements on parallel_reduce anonymous function objects"). **/
+
+//! Parallel iteration with deterministic reduction and default partitioner.
+/** @ingroup algorithms **/
+template<typename Range, typename Value, typename RealBody, typename Reduction>
+Value parallel_deterministic_reduce( const Range& range, const Value& identity, const RealBody& real_body, const Reduction& reduction ) {
+ internal::lambda_reduce_body<Range,Value,RealBody,Reduction> body(identity, real_body, reduction);
+ internal::start_deterministic_reduce<Range,internal::lambda_reduce_body<Range,Value,RealBody,Reduction> >
+ ::run(range, body);
+ return body.result();
+}
+
+#if __TBB_TASK_GROUP_CONTEXT
+//! Parallel iteration with deterministic reduction, simple partitioner and user-supplied context.
+/** @ingroup algorithms **/
+template<typename Range, typename Value, typename RealBody, typename Reduction>
+Value parallel_deterministic_reduce( const Range& range, const Value& identity, const RealBody& real_body, const Reduction& reduction,
+ task_group_context& context ) {
+ internal::lambda_reduce_body<Range,Value,RealBody,Reduction> body(identity, real_body, reduction);
+ internal::start_deterministic_reduce<Range,internal::lambda_reduce_body<Range,Value,RealBody,Reduction> >
+ ::run( range, body, context );
+ return body.result();
+}
+#endif /* __TBB_TASK_GROUP_CONTEXT */
+#endif /* TBB_PREVIEW_DETERMINISTIC_REDUCE */
//@}
} // namespace tbb
diff --git a/include/tbb/parallel_sort.h b/include/tbb/parallel_sort.h
index 0050046..cdfbb61 100644
--- a/include/tbb/parallel_sort.h
+++ b/include/tbb/parallel_sort.h
@@ -111,6 +111,7 @@ partition:
}
};
+#if __TBB_TASK_GROUP_CONTEXT
//! Body class used to test if elements in a range are presorted
/** @ingroup algorithms */
template<typename RandomAccessIterator, typename Compare>
@@ -137,6 +138,7 @@ public:
}
};
+#endif /* __TBB_TASK_GROUP_CONTEXT */
//! Body class used to sort elements in a range that is smaller than the grainsize.
/** @ingroup algorithms */
@@ -152,6 +154,7 @@ struct quick_sort_body {
/** @ingroup algorithms */
template<typename RandomAccessIterator, typename Compare>
void parallel_quick_sort( RandomAccessIterator begin, RandomAccessIterator end, const Compare& comp ) {
+#if __TBB_TASK_GROUP_CONTEXT
task_group_context my_context;
const int serial_cutoff = 9;
@@ -170,6 +173,7 @@ void parallel_quick_sort( RandomAccessIterator begin, RandomAccessIterator end,
if (my_context.is_group_execution_cancelled())
do_parallel_quick_sort:
+#endif /* __TBB_TASK_GROUP_CONTEXT */
parallel_for( quick_sort_range<RandomAccessIterator,Compare>(begin, end-begin, comp ),
quick_sort_body<RandomAccessIterator,Compare>(),
auto_partitioner() );
diff --git a/include/tbb/partitioner.h b/include/tbb/partitioner.h
index eaa95c6..9301be8 100644
--- a/include/tbb/partitioner.h
+++ b/include/tbb/partitioner.h
@@ -29,19 +29,44 @@
#ifndef __TBB_partitioner_H
#define __TBB_partitioner_H
+#ifndef __TBB_INITIAL_CHUNKS
+#define __TBB_INITIAL_CHUNKS 2
+#endif
+#ifndef __TBB_RANGE_POOL_CAPACITY
+#define __TBB_RANGE_POOL_CAPACITY 8
+#endif
+#ifndef __TBB_INIT_DEPTH
+#define __TBB_INIT_DEPTH 5
+#endif
+
#include "task.h"
+#include "aligned_space.h"
+#include "atomic.h"
+
+#if defined(_MSC_VER) && !defined(__INTEL_COMPILER)
+ // Workaround for overzealous compiler warnings
+ #pragma warning (push)
+ #pragma warning (disable: 4244)
+#endif
namespace tbb {
+
+class auto_partitioner;
+class simple_partitioner;
class affinity_partitioner;
+namespace interface6 {
+ namespace internal {
+ class affinity_partition_type;
+ }
+}
-//! @cond INTERNAL
namespace internal {
size_t __TBB_EXPORTED_FUNC get_initial_auto_partitioner_divisor();
-//! Defines entry points into tbb run-time library;
-/** The entry points are the constructor and destructor. */
+//! Defines entry point for affinity partitioner into tbb run-time library.
class affinity_partitioner_base_v3: no_copy {
friend class tbb::affinity_partitioner;
+ friend class tbb::interface6::internal::affinity_partition_type;
//! Array that remembers affinities of tree positions to affinity_id.
/** NULL if my_size==0. */
affinity_id* my_array;
@@ -54,10 +79,9 @@ class affinity_partitioner_base_v3: no_copy {
//! Resize my_array.
/** Retains values if resulting size is the same. */
void __TBB_EXPORTED_METHOD resize( unsigned factor );
- friend class affinity_partition_type;
};
-//! Provides default methods for partition objects without affinity.
+//! Provides backward-compatible methods for partition objects without affinity.
class partition_type_base {
public:
void set_affinity( task & ) {}
@@ -69,115 +93,279 @@ public:
}
};
-class affinity_partition_type;
-
-template<typename Range, typename Body, typename Partitioner> class start_for;
-template<typename Range, typename Body, typename Partitioner> class start_reduce;
template<typename Range, typename Body, typename Partitioner> class start_scan;
} // namespace internal
//! @endcond
-//! A simple partitioner
-/** Divides the range until the range is not divisible.
- @ingroup algorithms */
-class simple_partitioner {
-public:
- simple_partitioner() {}
-private:
- template<typename Range, typename Body, typename Partitioner> friend class internal::start_for;
- template<typename Range, typename Body, typename Partitioner> friend class internal::start_reduce;
- template<typename Range, typename Body, typename Partitioner> friend class internal::start_scan;
+namespace serial {
+namespace interface6 {
+template<typename Range, typename Body, typename Partitioner> class start_for;
+}
+}
- class partition_type: public internal::partition_type_base {
- public:
- bool should_execute_range(const task& ) {return false;}
- partition_type( const simple_partitioner& ) {}
- partition_type( const partition_type&, split ) {}
- };
-};
+namespace interface6 {
+//! @cond INTERNAL
+namespace internal {
+using namespace tbb::internal;
+template<typename Range, typename Body, typename Partitioner> class start_for;
+template<typename Range, typename Body, typename Partitioner> class start_reduce;
-//! An auto partitioner
-/** The range is initial divided into several large chunks.
- Chunks are further subdivided into VICTIM_CHUNKS pieces if they are stolen and divisible.
- @ingroup algorithms */
-class auto_partitioner {
+//! Join task node that contains shared flag for stealing feedback
+class flag_task: public task {
public:
- auto_partitioner() {}
-
-private:
- template<typename Range, typename Body, typename Partitioner> friend class internal::start_for;
- template<typename Range, typename Body, typename Partitioner> friend class internal::start_reduce;
- template<typename Range, typename Body, typename Partitioner> friend class internal::start_scan;
+ tbb::atomic<bool> child_stolen;
+ flag_task() { child_stolen = false; }
+ task* execute() { return NULL; }
+};
- class partition_type: public internal::partition_type_base {
- size_t num_chunks;
- static const size_t VICTIM_CHUNKS = 4;
+//! Task to signal the demand without carrying the work
+class signal_task: public task {
public:
- bool should_execute_range(const task &t) {
- if( num_chunks<VICTIM_CHUNKS && t.is_stolen_task() )
- num_chunks = VICTIM_CHUNKS;
- return num_chunks==1;
+ task* execute() {
+ if( is_stolen_task() ) {
+ static_cast<flag_task*>(parent())->child_stolen = true;
}
- partition_type( const auto_partitioner& ) : num_chunks(internal::get_initial_auto_partitioner_divisor()) {}
- partition_type( partition_type& pt, split ) {
- num_chunks = pt.num_chunks /= 2u;
- }
- };
+ return NULL;
+ }
};
-//! An affinity partitioner
-class affinity_partitioner: internal::affinity_partitioner_base_v3 {
-public:
- affinity_partitioner() {}
+//! Depth is a relative depth of recursive division inside a range pool. Relative depth allows
+//! infinite absolute depth of the recursion for heavily imbalanced workloads with range represented
+//! by a number that cannot fit into machine word.
+typedef unsigned char depth_t;
-private:
- template<typename Range, typename Body, typename Partitioner> friend class internal::start_for;
- template<typename Range, typename Body, typename Partitioner> friend class internal::start_reduce;
- template<typename Range, typename Body, typename Partitioner> friend class internal::start_scan;
+//! Range pool stores ranges of type T in a circular buffer with MaxCapacity
+template <typename T, depth_t MaxCapacity>
+class range_vector {
+ depth_t my_head;
+ depth_t my_tail;
+ depth_t my_size;
+ depth_t my_depth[MaxCapacity]; // relative depths of stored ranges
+ tbb::aligned_space<T, MaxCapacity> my_pool;
- typedef internal::affinity_partition_type partition_type;
- friend class internal::affinity_partition_type;
+public:
+ //! initialize via first range in pool
+ range_vector(const T& elem) : my_head(0), my_tail(0), my_size(1) {
+ my_depth[0] = 0;
+ new( my_pool.begin() ) T(elem);//TODO: std::move?
+ }
+ ~range_vector() {
+ while( !empty() ) pop_back();
+ }
+ bool empty() const { return my_size == 0; }
+ depth_t size() const { return my_size; }
+ //! Populates range pool via ranges up to max depth or while divisible
+ //! max_depth starts from 0, e.g. value 2 makes 3 ranges in the pool up to two 1/4 pieces
+ void split_to_fill(depth_t max_depth) {
+ while( my_size < MaxCapacity && my_depth[my_head] < max_depth
+ && my_pool.begin()[my_head].is_divisible() ) {
+ depth_t prev = my_head;
+ my_head = (my_head + 1) % MaxCapacity;
+ new(my_pool.begin()+my_head) T(my_pool.begin()[prev]); // copy TODO: std::move?
+ my_pool.begin()[prev].~T(); // instead of assignment
+ new(my_pool.begin()+prev) T(my_pool.begin()[my_head], split()); // do 'inverse' split
+ my_depth[my_head] = ++my_depth[prev];
+ my_size++;
+ }
+ }
+ void pop_back() {
+ __TBB_ASSERT(my_size > 0, "range_vector::pop_back() with empty size");
+ my_pool.begin()[my_head].~T();
+ my_size--;
+ my_head = (my_head + MaxCapacity - 1) % MaxCapacity;
+ }
+ void pop_front() {
+ __TBB_ASSERT(my_size > 0, "range_vector::pop_front() with empty size");
+ my_pool.begin()[my_tail].~T();
+ my_size--;
+ my_tail = (my_tail + 1) % MaxCapacity;
+ }
+ T& back() {
+ __TBB_ASSERT(my_size > 0, "range_vector::back() with empty size");
+ return my_pool.begin()[my_head];
+ }
+ T& front() {
+ __TBB_ASSERT(my_size > 0, "range_vector::front() with empty size");
+ return my_pool.begin()[my_tail];
+ }
+ //! similarly to front(), returns depth of the first range in the pool
+ depth_t front_depth() {
+ __TBB_ASSERT(my_size > 0, "range_vector::front_depth() with empty size");
+ return my_depth[my_tail];
+ }
};
-//! @cond INTERNAL
-namespace internal {
+//! Provides default methods for partition objects and common algorithm blocks.
+template <typename Partition>
+struct partition_type_base {
+ // decision makers
+ void set_affinity( task & ) {}
+ void note_affinity( task::affinity_id ) {}
+ bool check_being_stolen(task &) { return false; } // part of old should_execute_range()
+ bool check_for_demand(task &) { return false; }
+ bool divisions_left() { return true; } // part of old should_execute_range()
+ bool should_create_trap() { return false; }
+ depth_t max_depth() { return 0; }
+ void align_depth(depth_t) { }
+ // common function blocks
+ Partition& derived() { return *static_cast<Partition*>(this); }
+ template<typename StartType>
+ flag_task* split_work(StartType &start) {
+ flag_task* parent_ptr = start.create_continuation(); // the type here is to express expectation
+ start.set_parent(parent_ptr);
+ parent_ptr->set_ref_count(2);
+ StartType& right_work = *new( parent_ptr->allocate_child() ) StartType(start, split());
+ start.spawn(right_work);
+ return parent_ptr;
+ }
+ template<typename StartType, typename Range>
+ void execute(StartType &start, Range &range) {
+ // The algorithm in a few words ([]-denotes calls to decision mathods of partitioner):
+ // [If this task is stolen, adjust depth and divisions if necessary, set flag].
+ // If range is divisible {
+ // Spread the work while [initial divisions left];
+ // Create trap task [if necessary];
+ // }
+ // If not divisible or [max depth is reached], execute, else do the range pool part
+ task* parent_ptr = start.parent();
+ if( range.is_divisible() ) {
+ if( derived().divisions_left() )
+ do parent_ptr = split_work(start); // split until divisions_left()
+ while( range.is_divisible() && derived().divisions_left() );
+ if( derived().should_create_trap() ) { // only for range pool
+ if( parent_ptr->ref_count() > 1 ) { // create new parent if necessary
+ parent_ptr = start.create_continuation();
+ start.set_parent(parent_ptr);
+ } else __TBB_ASSERT(parent_ptr->ref_count() == 1, NULL);
+ parent_ptr->set_ref_count(2); // safe because parent has only one reference
+ signal_task& right_signal = *new( parent_ptr->allocate_child() ) signal_task();
+ start.spawn(right_signal); // pure signal is to avoid deep recursion in the end
+ }
+ }
+ if( !range.is_divisible() || !derived().max_depth() )
+ start.run_body( range ); // simple partitioner goes always here
+ else { // do range pool
+ internal::range_vector<Range, Partition::range_pool_size> range_pool(range);
+ do {
+ range_pool.split_to_fill(derived().max_depth()); // fill range pool
+ if( derived().check_for_demand( start ) ) {
+ if( range_pool.size() > 1 ) {
+ parent_ptr = start.create_continuation();
+ start.set_parent(parent_ptr);
+ parent_ptr->set_ref_count(2);
+ StartType& right_work = *new( parent_ptr->allocate_child() ) StartType(start, range_pool.front(), range_pool.front_depth());
+ start.spawn(right_work);
+ range_pool.pop_front();
+ continue;
+ }
+ if( range_pool.back().is_divisible() ) // was not enough depth to fork a task
+ continue; // note: check_for_demand() should guarantee increasing max_depth() next time
+ }
+ start.run_body( range_pool.back() );
+ range_pool.pop_back();
+ } while( !range_pool.empty() && !start.is_cancelled() );
+ }
+ }
+};
-class affinity_partition_type: public no_copy {
- //! Must be power of two
- static const unsigned factor = 16;
- static const size_t VICTIM_CHUNKS = 4;
+//! Provides default methods for auto (adaptive) partition objects.
+template <typename Partition>
+struct auto_partition_type_base : partition_type_base<Partition> {
+ size_t my_divisor;
+ depth_t my_max_depth;
+ auto_partition_type_base() : my_max_depth(__TBB_INIT_DEPTH) {
+ my_divisor = tbb::internal::get_initial_auto_partitioner_divisor()*__TBB_INITIAL_CHUNKS/4;
+ __TBB_ASSERT(my_divisor, "initial value of get_initial_auto_partitioner_divisor() is not valid");
+ }
+ auto_partition_type_base(auto_partition_type_base &src, split) {
+ my_max_depth = src.my_max_depth;
+#if __TBB_INITIAL_TASK_IMBALANCE
+ if( src.my_divisor <= 1 ) my_divisor = 0;
+ else my_divisor = src.my_divisor = (src.my_divisor+1u) / 2u;
+#else
+ my_divisor = src.my_divisor / 2u;
+ src.my_divisor = src.my_divisor - my_divisor; // TODO: check the effect separately
+ if(my_divisor) src.my_max_depth += static_cast<depth_t>(__TBB_Log2(src.my_divisor/my_divisor));
+#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( 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);
+ // correctess of the cast rely 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.
+#endif
+ static_cast<flag_task*>(t.parent())->child_stolen = true;
+ my_max_depth++;
+ return true;
+ }
+ }
+ return false;
+ }
+ bool divisions_left() { // part of old should_execute_range()
+ if( my_divisor > 1 ) return true;
+ 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;
+ return true;
+ } else return false;
+ }
+ bool should_create_trap() {
+ return my_divisor > 0;
+ }
+ bool check_for_demand(task &t) {
+ if( static_cast<flag_task*>(t.parent())->child_stolen ) {
+ my_max_depth++;
+ return true;
+ } else return false;
+ }
+ void align_depth(depth_t base) {
+ __TBB_ASSERT(base <= my_max_depth, 0);
+ my_max_depth -= base;
+ }
+ depth_t max_depth() { return my_max_depth; }
+};
- internal::affinity_id* my_array;
- task_list delay_list;
- unsigned map_begin, map_end;
- size_t num_chunks;
+//! Provides default methods for affinity (adaptive) partition objects.
+class affinity_partition_type : public auto_partition_type_base<affinity_partition_type> {
+ static const unsigned factor_power = 4;
+ static const unsigned factor = 1<<factor_power;
+ bool my_delay;
+ unsigned map_begin, map_end, map_mid;
+ tbb::internal::affinity_id* my_array;
+ void set_mid() {
+ unsigned d = (map_end - map_begin)/2; // we could add 1 but it is rather for LIFO affinity
+ if( d > factor )
+ d &= 0u-factor;
+ map_mid = map_end - d;
+ }
public:
- affinity_partition_type( affinity_partitioner& ap ) {
+ affinity_partition_type( tbb::internal::affinity_partitioner_base_v3& ap ) {
__TBB_ASSERT( (factor&(factor-1))==0, "factor must be power of two" );
ap.resize(factor);
my_array = ap.my_array;
map_begin = 0;
map_end = unsigned(ap.my_size);
- num_chunks = internal::get_initial_auto_partitioner_divisor();
+ set_mid();
+ my_delay = true;
+ my_divisor /= __TBB_INITIAL_CHUNKS; // let excatly P tasks to be distributed across workers
+ my_max_depth = factor_power+1; // the first factor_power ranges will be spawned, and >=1 ranges should left
+ __TBB_ASSERT( my_max_depth < __TBB_RANGE_POOL_CAPACITY, 0 );
}
- affinity_partition_type(affinity_partition_type& p, split) : my_array(p.my_array) {
+ affinity_partition_type(affinity_partition_type& p, split)
+ : auto_partition_type_base<affinity_partition_type>(p, split()), my_array(p.my_array) {
__TBB_ASSERT( p.map_end-p.map_begin<factor || (p.map_end-p.map_begin)%factor==0, NULL );
- num_chunks = p.num_chunks /= 2;
- unsigned e = p.map_end;
- unsigned d = (e - p.map_begin)/2;
- if( d>factor )
- d &= 0u-factor;
- map_end = e;
- map_begin = p.map_end = e-d;
+ map_end = p.map_end;
+ map_begin = p.map_end = p.map_mid;
+ set_mid(); p.set_mid();
+ my_delay = p.my_delay;
}
-
- bool should_execute_range(const task &t) {
- if( num_chunks < VICTIM_CHUNKS && t.is_stolen_task() )
- num_chunks = VICTIM_CHUNKS;
- return num_chunks == 1;
- }
-
void set_affinity( task &t ) {
if( map_begin<map_end )
t.set_affinity( my_array[map_begin] );
@@ -186,41 +374,136 @@ public:
if( map_begin<map_end )
my_array[map_begin] = id;
}
- task* continue_after_execute_range() {
- task* first = NULL;
- if( !delay_list.empty() ) {
- first = &delay_list.pop_front();
- while( !delay_list.empty() ) {
- task::spawn(*first);
- first = &delay_list.pop_front();
+ bool check_for_demand( task &t ) {
+ if( !my_delay ) {
+ if( map_mid<map_end ) {
+ __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
}
- }
- return first;
+ if( static_cast<flag_task*>(t.parent())->child_stolen ) {
+ my_max_depth++;
+ return true;
+ }
+ } else my_delay = false;
+ return false;
}
- bool decide_whether_to_delay() {
- // The possible underflow caused by "-1u" is deliberate
- return (map_begin&(factor-1))==0 && map_end-map_begin-1u<factor;
+ bool divisions_left() { // part of old should_execute_range()
+ return my_divisor > 1;
}
- void spawn_or_delay( bool delay, task& b ) {
- if( delay )
- delay_list.push_back(b);
- else
- task::spawn(b);
+ bool should_create_trap() {
+ return true; // TODO: rethink for the stage after memorizing level
}
+ static const unsigned range_pool_size = __TBB_RANGE_POOL_CAPACITY;
+};
+
+class auto_partition_type: public auto_partition_type_base<auto_partition_type> {
+public:
+ auto_partition_type( const auto_partitioner& ) {}
+ auto_partition_type( auto_partition_type& src, split)
+ : auto_partition_type_base<auto_partition_type>(src, split()) {}
+ static const unsigned range_pool_size = __TBB_RANGE_POOL_CAPACITY;
+};
- ~affinity_partition_type() {
- // The delay_list can be non-empty if an exception is thrown.
- while( !delay_list.empty() ) {
- task& t = delay_list.pop_front();
- t.destroy(t);
- }
+class simple_partition_type: public partition_type_base<simple_partition_type> {
+public:
+ simple_partition_type( const simple_partitioner& ) {}
+ simple_partition_type( const simple_partition_type&, split ) {}
+ //! simplified algorithm
+ template<typename StartType, typename Range>
+ void execute(StartType &start, Range &range) {
+ while( range.is_divisible() )
+ split_work( start );
+ start.run_body( range );
}
+ //static const unsigned range_pool_size = 1; - not necessary because execute() is overridden
};
-} // namespace internal
+//! Backward-compatible partition for auto and affinity partition objects.
+class old_auto_partition_type: public tbb::internal::partition_type_base {
+ size_t num_chunks;
+ static const size_t VICTIM_CHUNKS = 4;
+public:
+ bool should_execute_range(const task &t) {
+ if( num_chunks<VICTIM_CHUNKS && t.is_stolen_task() )
+ num_chunks = VICTIM_CHUNKS;
+ return num_chunks==1;
+ }
+ old_auto_partition_type( const auto_partitioner& )
+ : num_chunks(internal::get_initial_auto_partitioner_divisor()*__TBB_INITIAL_CHUNKS/4) {}
+ old_auto_partition_type( const affinity_partitioner& )
+ : num_chunks(internal::get_initial_auto_partitioner_divisor()*__TBB_INITIAL_CHUNKS/4) {}
+ old_auto_partition_type( old_auto_partition_type& pt, split ) {
+ num_chunks = pt.num_chunks = (pt.num_chunks+1u) / 2u;
+ }
+};
+
+} // namespace interfaceX::internal
//! @endcond
+} // namespace interfaceX
+//! A simple partitioner
+/** Divides the range until the range is not divisible.
+ @ingroup algorithms */
+class simple_partitioner {
+public:
+ simple_partitioner() {}
+private:
+ template<typename Range, typename Body, typename Partitioner> friend class serial::interface6::start_for;
+ template<typename Range, typename Body, typename Partitioner> friend class interface6::internal::start_for;
+ template<typename Range, typename Body, typename Partitioner> friend class interface6::internal::start_reduce;
+ template<typename Range, typename Body, typename Partitioner> friend class internal::start_scan;
+ // backward compatibility
+ class partition_type: public internal::partition_type_base {
+ public:
+ bool should_execute_range(const task& ) {return false;}
+ partition_type( const simple_partitioner& ) {}
+ partition_type( const partition_type&, split ) {}
+ };
+ // new implementation just extends existing interface
+ typedef interface6::internal::simple_partition_type task_partition_type;
+};
+
+//! An auto partitioner
+/** The range is initial divided into several large chunks.
+ Chunks are further subdivided into smaller pieces if demand detected and they are divisible.
+ @ingroup algorithms */
+class auto_partitioner {
+public:
+ auto_partitioner() {}
+
+private:
+ template<typename Range, typename Body, typename Partitioner> friend class serial::interface6::start_for;
+ template<typename Range, typename Body, typename Partitioner> friend class interface6::internal::start_for;
+ template<typename Range, typename Body, typename Partitioner> friend class interface6::internal::start_reduce;
+ template<typename Range, typename Body, typename Partitioner> friend class internal::start_scan;
+ // backward compatibility
+ typedef interface6::internal::old_auto_partition_type partition_type;
+ // new implementation just extends existing interface
+ typedef interface6::internal::auto_partition_type task_partition_type;
+};
+
+//! An affinity partitioner
+class affinity_partitioner: internal::affinity_partitioner_base_v3 {
+public:
+ affinity_partitioner() {}
+
+private:
+ template<typename Range, typename Body, typename Partitioner> friend class serial::interface6::start_for;
+ template<typename Range, typename Body, typename Partitioner> friend class interface6::internal::start_for;
+ template<typename Range, typename Body, typename Partitioner> friend class interface6::internal::start_reduce;
+ template<typename Range, typename Body, typename Partitioner> friend class internal::start_scan;
+ // backward compatibility - for parallel_scan only
+ typedef interface6::internal::old_auto_partition_type partition_type;
+ // new implementation just extends existing interface
+ typedef interface6::internal::affinity_partition_type task_partition_type;
+};
} // namespace tbb
+#if defined(_MSC_VER) && !defined(__INTEL_COMPILER)
+ #pragma warning (pop)
+#endif // warning 4244 is back
+#undef __TBB_INITIAL_CHUNKS
+#undef __TBB_RANGE_POOL_CAPACITY
+#undef __TBB_INIT_DEPTH
#endif /* __TBB_partitioner_H */
diff --git a/include/tbb/queuing_mutex.h b/include/tbb/queuing_mutex.h
index fe0d5d9..a7e224b 100644
--- a/include/tbb/queuing_mutex.h
+++ b/include/tbb/queuing_mutex.h
@@ -104,7 +104,7 @@ public:
scoped_lock *next;
//! The local spin-wait variable
- /** Inverted (0 - blocked, 1 - acquired the mutex) for the sake of
+ /** Inverted (0 - blocked, 1 - acquired the mutex) for the sake of
zero-initialization. Defining it as an entire word instead of
a byte seems to help performance slightly. */
uintptr_t going;
@@ -116,8 +116,6 @@ public:
static const bool is_rw_mutex = false;
static const bool is_recursive_mutex = false;
static const bool is_fair_mutex = true;
-
- friend class scoped_lock;
private:
//! The last competitor requesting the lock
atomic<scoped_lock*> q_tail;
diff --git a/include/tbb/queuing_rw_mutex.h b/include/tbb/queuing_rw_mutex.h
index 3c76332..644bdfd 100644
--- a/include/tbb/queuing_rw_mutex.h
+++ b/include/tbb/queuing_rw_mutex.h
@@ -78,11 +78,11 @@ public:
class scoped_lock: internal::no_copy {
//! Initialize fields
void initialize() {
- mutex = NULL;
+ my_mutex = NULL;
#if TBB_USE_ASSERT
- state = 0xFF; // Set to invalid state
- internal::poison_pointer(next);
- internal::poison_pointer(prev);
+ my_state = 0xFF; // Set to invalid state
+ internal::poison_pointer(my_next);
+ internal::poison_pointer(my_prev);
#endif /* TBB_USE_ASSERT */
}
public:
@@ -98,7 +98,7 @@ public:
//! Release lock (if lock is held).
~scoped_lock() {
- if( mutex ) release();
+ if( my_mutex ) release();
}
//! Acquire lock on given mutex.
@@ -119,22 +119,22 @@ public:
private:
//! The pointer to the current mutex to work
- queuing_rw_mutex* mutex;
+ queuing_rw_mutex* my_mutex;
//! The pointer to the previous and next competitors for a mutex
- scoped_lock * prev, * next;
+ scoped_lock *__TBB_atomic my_prev, *__TBB_atomic my_next;
typedef unsigned char state_t;
//! State of the request: reader, writer, active reader, other service states
- atomic<state_t> state;
+ atomic<state_t> my_state;
//! The local spin-wait variable
/** Corresponds to "spin" in the pseudocode but inverted for the sake of zero-initialization */
- unsigned char going;
+ unsigned char __TBB_atomic my_going;
//! A tiny internal lock
- unsigned char internal_lock;
+ unsigned char my_internal_lock;
//! Acquire the internal lock
void acquire_internal_lock();
diff --git a/include/tbb/reader_writer_lock.h b/include/tbb/reader_writer_lock.h
index a5cace9..877234b 100644
--- a/include/tbb/reader_writer_lock.h
+++ b/include/tbb/reader_writer_lock.h
@@ -93,7 +93,7 @@ namespace interface5 {
//! The scoped lock pattern for write locks
/** Scoped locks help avoid the common problem of forgetting to release the lock.
- This type is also serves as the node for queuing locks. */
+ This type also serves as the node for queuing locks. */
class scoped_lock : tbb::internal::no_copy {
public:
friend class reader_writer_lock;
diff --git a/include/tbb/runtime_loader.h b/include/tbb/runtime_loader.h
new file mode 100644
index 0000000..e0d4526
--- /dev/null
+++ b/include/tbb/runtime_loader.h
@@ -0,0 +1,188 @@
+/*
+ Copyright 2005-2011 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_runtime_loader_H
+#define __TBB_runtime_loader_H
+
+#if ! TBB_PREVIEW_RUNTIME_LOADER
+ #error Set TBB_PREVIEW_RUNTIME_LOADER to include runtime_loader.h
+#endif
+
+#include "tbb/tbb_stddef.h"
+#include <climits>
+
+#if _MSC_VER
+ #if ! __TBB_NO_IMPLICIT_LINKAGE
+ #ifdef _DEBUG
+ #pragma comment( linker, "/nodefaultlib:tbb_debug.lib" )
+ #pragma comment( linker, "/defaultlib:tbbproxy_debug.lib" )
+ #else
+ #pragma comment( linker, "/nodefaultlib:tbb.lib" )
+ #pragma comment( linker, "/defaultlib:tbbproxy.lib" )
+ #endif
+ #endif
+#endif
+
+namespace tbb {
+
+namespace interface6 {
+
+//! Load TBB at runtime.
+/*!
+
+\b Usage:
+
+In source code:
+
+\code
+#include "tbb/runtime_loader.h"
+
+char const * path[] = { "<install dir>/lib/ia32", NULL };
+tbb::runtime_loader loader( path );
+
+// Now use TBB.
+\endcode
+
+Link with \c tbbproxy.lib (or \c libtbbproxy.a) instead of \c tbb.lib (\c libtbb.dylib,
+\c libtbb.so).
+
+TBB library will be loaded at runtime from \c <install dir>/lib/ia32 directory.
+
+\b Attention:
+
+All \c runtime_loader 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:
+
+ - Only one TBB library can be loaded per module.
+
+ - 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.
+
+ - \c runtime_loader objects will not work (correctly) in parallel due to absence of
+ syncronization.
+
+*/
+
+class runtime_loader : tbb::internal::no_copy {
+
+ public:
+
+ //! Error mode constants.
+ enum error_mode {
+ em_status, //!< Save status of operation and continue.
+ em_throw, //!< Throw an exception of tbb::runtime_loader::error_code type.
+ em_abort //!< Print message to \c stderr and call \c abort().
+ }; // error_mode
+
+ //! Error codes.
+ enum error_code {
+ ec_ok, //!< No errors.
+ ec_bad_call, //!< Invalid function call (e. g. load() called when TBB is already loaded).
+ ec_bad_arg, //!< Invalid argument passed.
+ ec_bad_lib, //!< Invalid library found (e. g. \c TBB_runtime_version symbol not found).
+ ec_bad_ver, //!< TBB found but version is not suitable.
+ ec_no_lib //!< No suitable TBB library found.
+ }; // error_code
+
+ //! Initialize object but do not load TBB.
+ runtime_loader( error_mode mode = em_abort );
+
+ //! Initialize object and load TBB.
+ /*!
+ See load() for details.
+
+ If error mode is \c em_status, call status() to check whether TBB was loaded or not.
+ */
+ runtime_loader(
+ char const * path[], //!< List of directories to search TBB in.
+ int min_ver = TBB_INTERFACE_VERSION, //!< Minimal suitable version of TBB.
+ int max_ver = INT_MAX, //!< Maximal suitable version of TBB.
+ error_mode mode = em_abort //!< Error mode for this object.
+ );
+
+ //! Destroy object.
+ ~runtime_loader();
+
+ //! Load TBB.
+ /*!
+ The method searches the directories specified in \c path[] 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.
+
+ \b Note:
+
+ For security reasons, avoid using relative directory names. For example, never load
+ TBB from current (\c "."), parent (\c "..") or any other relative directory (like
+ \c "lib" ). Use only absolute directory names (e. g. "/usr/local/lib").
+
+ For the same security reasons, avoid using system default directories (\c "") on
+ Windows. (See http://www.microsoft.com/technet/security/advisory/2269637.mspx for
+ details.)
+
+ Neglecting these rules may cause your program to execute 3-rd party malicious code.
+
+ \b Errors:
+ - \c ec_bad_call - TBB already loaded by this object.
+ - \c ec_bad_arg - \p min_ver and/or \p max_ver negative or zero,
+ or \p min_ver > \p max_ver.
+ - \c ec_bad_ver - TBB of unsuitable version already loaded by another object.
+ - \c ec_no_lib - No suitable library found.
+ */
+ error_code
+ load(
+ char const * path[], //!< List of directories to search TBB in.
+ int min_ver = TBB_INTERFACE_VERSION, //!< Minimal suitable version of TBB.
+ int max_ver = INT_MAX //!< Maximal suitable version of TBB.
+
+ );
+
+
+ //! Report status.
+ /*!
+ If error mode is \c em_status, the function returns status of the last operation.
+ */
+ error_code status();
+
+ private:
+
+ error_mode const my_mode;
+ error_code my_status;
+ bool my_loaded;
+
+}; // class runtime_loader
+
+} // namespace interface6
+
+using interface6::runtime_loader;
+
+} // namespace tbb
+
+#endif /* __TBB_runtime_loader_H */
+
diff --git a/include/tbb/scalable_allocator.h b/include/tbb/scalable_allocator.h
index 65f80b5..27f230e 100644
--- a/include/tbb/scalable_allocator.h
+++ b/include/tbb/scalable_allocator.h
@@ -31,6 +31,9 @@
/** @file */
#include <stddef.h> /* Need ptrdiff_t and size_t from here. */
+#if !_MSC_VER
+#include <stdint.h> /* Need intptr_t from here. */
+#endif
#if !defined(__cplusplus) && __ICC==1100
#pragma warning (push)
@@ -91,6 +94,29 @@ size_t __TBB_EXPORTED_FUNC scalable_msize (void* ptr);
#ifdef __cplusplus
+namespace rml {
+class MemoryPool;
+
+#define MEM_POLICY_DEFINED 1
+typedef void *(*rawAllocType)(intptr_t pool_id, size_t &bytes);
+typedef int (*rawFreeType)(intptr_t pool_id, void* raw_ptr, size_t raw_bytes);
+
+struct MemPoolPolicy {
+ rawAllocType pAlloc;
+ rawFreeType pFree;
+ size_t granularity; // granularity of pAlloc allocations
+ void *pReserved; // reserved for future extensions
+ size_t szReserved; // size of pReserved data
+};
+
+MemoryPool *pool_create(intptr_t pool_id, const MemPoolPolicy* memPoolPolicy);
+bool pool_destroy(MemoryPool* memPool);
+void *pool_malloc(MemoryPool* memPool, size_t size);
+void *pool_realloc(MemoryPool* memPool, void *object, size_t size);
+bool pool_reset(MemoryPool* memPool);
+bool pool_free(MemoryPool *memPool, void *object);
+}
+
#include <new> /* To use new with the placement argument */
/* Ensure that including this header does not cause implicit linkage with TBB */
diff --git a/include/tbb/spin_mutex.h b/include/tbb/spin_mutex.h
index 140c6e9..0d200a1 100644
--- a/include/tbb/spin_mutex.h
+++ b/include/tbb/spin_mutex.h
@@ -46,7 +46,7 @@ namespace tbb {
@ingroup synchronization */
class spin_mutex {
//! 0 if lock is released, 1 if lock is acquired.
- __TBB_Byte flag;
+ __TBB_atomic_flag flag;
public:
//! Construct unacquired lock.
@@ -64,7 +64,7 @@ public:
spin_mutex* my_mutex;
//! Value to store into spin_mutex::flag to unlock the mutex.
- uintptr_t my_unlock_value;
+ __TBB_Flag my_unlock_value;
//! Like acquire, but with ITT instrumentation.
void __TBB_EXPORTED_METHOD internal_acquire( spin_mutex& m );
@@ -122,7 +122,7 @@ public:
#if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT
internal_release();
#else
- __TBB_UnlockByte(my_mutex->flag, static_cast<__TBB_Byte>(my_unlock_value));
+ __TBB_UnlockByte(my_mutex->flag, my_unlock_value);
my_mutex = NULL;
#endif /* TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT */
}
@@ -133,7 +133,7 @@ public:
#if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT
internal_release();
#else
- __TBB_UnlockByte(my_mutex->flag, static_cast<__TBB_Byte>(my_unlock_value));
+ __TBB_UnlockByte(my_mutex->flag, my_unlock_value);
#endif /* TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT */
}
}
diff --git a/include/tbb/task.h b/include/tbb/task.h
index 7b8dab8..a887431 100644
--- a/include/tbb/task.h
+++ b/include/tbb/task.h
@@ -44,7 +44,7 @@ class task_list;
class task_group_context;
#endif /* __TBB_TASK_GROUP_CONTEXT */
-// MSVC does not allow taking the address of a member that was defined
+// MSVC does not allow taking the address of a member that was defined
// privately in task_base and made public in class task via a using declaration.
#if _MSC_VER || (__GNUC__==3 && __GNUC_MINOR__<3)
#define __TBB_TASK_BASE_ACCESS public
@@ -71,8 +71,8 @@ namespace interface5 {
//! Base class for methods that became static in TBB 3.0.
/** 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
+ 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. */
class task_base: tbb::internal::no_copy {
__TBB_TASK_BASE_ACCESS:
@@ -80,7 +80,7 @@ namespace interface5 {
//! Schedule task for execution when a worker becomes available.
static void spawn( task& t );
-
+
//! Spawn multiple tasks and clear list.
static void spawn( task_list& list );
@@ -97,7 +97,7 @@ namespace interface5 {
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. */
static void __TBB_EXPORTED_FUNC destroy( task& victim );
- };
+ };
} // internal
} // interface5
@@ -168,8 +168,14 @@ namespace internal {
//! Memory prefix to a task object.
/** This class is internal to the library.
Do not reference it directly, except within the library itself.
- Fields are ordered in way that preserves backwards compatibility and yields
+ Fields are ordered in way that preserves backwards compatibility and yields
good packing on typical 32-bit and 64-bit platforms.
+
+ In case task prefix size exceeds 32 or 64 bytes on IA32 and Intel64
+ architectures correspondingly, consider dynamic setting of task_alignment
+ and task_prefix_reservation_size based on the maximal operand size supported
+ by the current CPU.
+
@ingroup task_scheduling */
class task_prefix {
private:
@@ -184,34 +190,34 @@ namespace internal {
#if __TBB_TASK_GROUP_CONTEXT
//! Shared context that is used to communicate asynchronous state changes
- /** Currently it is used to broadcast cancellation requests generated both
+ /** Currently it is used to broadcast cancellation requests generated both
by users and as the result of unhandled exceptions in the task::execute()
methods. */
task_group_context *context;
#endif /* __TBB_TASK_GROUP_CONTEXT */
-
+
//! The scheduler that allocated the task, or NULL if the task is big.
/** Small tasks are pooled by the scheduler that allocated the task.
If a scheduler needs to free a small task allocated by another scheduler,
it returns the task to that other scheduler. This policy avoids
- memory space blowup issues for memory allocators that allocate from
+ memory space blowup issues for memory allocators that allocate from
thread-specific pools. */
scheduler* origin;
-#if TBB_PREVIEW_TASK_PRIORITY
+#if __TBB_TASK_PRIORITY
union {
-#endif /* TBB_PREVIEW_TASK_PRIORITY */
+#endif /* __TBB_TASK_PRIORITY */
//! Obsolete. The scheduler that owns the task.
- /** Retained only for the sake of backward binary compatibility.
+ /** Retained only for the sake of backward binary compatibility.
Still used by inline methods in the task.h header. **/
scheduler* owner;
-#if TBB_PREVIEW_TASK_PRIORITY
+#if __TBB_TASK_PRIORITY
//! Pointer to the next offloaded lower priority task.
/** Used to maintain a list of offloaded tasks inside the scheduler. **/
task* next_offloaded;
};
-#endif /* TBB_PREVIEW_TASK_PRIORITY */
+#endif /* __TBB_TASK_PRIORITY */
//! The task whose reference count includes me.
/** In the "blocking style" of programming, this field points to the parent task.
@@ -224,7 +230,7 @@ namespace internal {
the difference of the number of allocated children minus the
number of children that have completed.
In the "blocking style" of programming, this field is one more than the difference. */
- reference_count ref_count;
+ __TBB_atomic reference_count ref_count;
//! Obsolete. Used to be scheduling depth before TBB 2.2
/** Retained only for the sake of backward binary compatibility.
@@ -257,7 +263,7 @@ namespace internal {
#if __TBB_TASK_GROUP_CONTEXT
-#if TBB_PREVIEW_TASK_PRIORITY
+#if __TBB_TASK_PRIORITY
namespace internal {
static const int priority_stride_v4 = INT_MAX / 4;
}
@@ -268,7 +274,7 @@ enum priority_t {
priority_high = priority_normal + internal::priority_stride_v4
};
-#endif /* TBB_PREVIEW_TASK_PRIORITY */
+#endif /* __TBB_TASK_PRIORITY */
#if TBB_USE_CAPTURED_EXCEPTION
class tbb_exception;
@@ -280,25 +286,25 @@ enum priority_t {
class task_scheduler_init;
-//! Used to form groups of tasks
-/** @ingroup task_scheduling
- The context services explicit cancellation requests from user code, and unhandled
- exceptions intercepted during tasks execution. Intercepting an exception results
- in generating internal cancellation requests (which is processed in exactly the
- same way as external ones).
+//! Used to form groups of tasks
+/** @ingroup task_scheduling
+ The context services explicit cancellation requests from user code, and unhandled
+ exceptions intercepted during tasks execution. Intercepting an exception results
+ in generating internal cancellation requests (which is processed in exactly the
+ same way as external ones).
- The context is associated with one or more root tasks and defines the cancellation
- group that includes all the descendants of the corresponding root task(s). Association
+ The context is associated with one or more root tasks and defines the cancellation
+ group that includes all the descendants of the corresponding root task(s). Association
is established when a context object is passed as an argument to the task::allocate_root()
method. See task_group_context::task_group_context for more details.
-
+
The context can be bound to another one, and other contexts can be bound to it,
forming a tree-like structure: parent -> this -> children. Arrows here designate
cancellation propagation direction. If a task in a cancellation group is canceled
all the other tasks in this group and groups bound to it (as children) get canceled too.
- IMPLEMENTATION NOTE:
- When adding new members to task_group_context or changing types of existing ones,
+ IMPLEMENTATION NOTE:
+ When adding new members to task_group_context or changing types of existing ones,
update the size of both padding buffers (_leading_padding and _trailing_padding)
appropriately. See also VERSIONING NOTE at the constructor definition below. **/
class task_group_context : internal::no_copy {
@@ -349,7 +355,7 @@ private:
task_group_context *my_parent;
//! Used to form the thread specific list of contexts without additional memory allocation.
- /** A context is included into the list of the current thread when its binding to
+ /** A context is included into the list of the current thread when its binding to
its parent happens. Any context can be present in the list of one thread only. **/
internal::context_list_node_t my_node;
@@ -358,15 +364,15 @@ private:
//! Leading padding protecting accesses to frequently used members from false sharing.
/** Read accesses to the field my_cancellation_requested are on the hot path inside
- the scheduler. This padding ensures that this field never shares the same cache
+ the scheduler. This padding ensures that this field never shares the same cache
line with a local variable that is frequently written to. **/
char _leading_padding[internal::NFS_MaxLineSize
- 2 * sizeof(uintptr_t)- sizeof(void*) - sizeof(internal::context_list_node_t)
- sizeof(__itt_caller)];
-
+
//! Specifies whether cancellation was request 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.
@@ -382,48 +388,48 @@ private:
//! Internal state (combination of state flags).
uintptr_t my_state;
-#if TBB_PREVIEW_TASK_PRIORITY
+#if __TBB_TASK_PRIORITY
//! Priority level of the task group (in normalized representation)
intptr_t my_priority;
-#endif /* TBB_PREVIEW_TASK_PRIORITY */
+#endif /* __TBB_TASK_PRIORITY */
//! Trailing padding protecting accesses to frequently used members from false sharing
/** \sa _leading_padding **/
char _trailing_padding[internal::NFS_MaxLineSize - 2 * sizeof(uintptr_t) - 2 * sizeof(void*)
-#if TBB_PREVIEW_TASK_PRIORITY
+#if __TBB_TASK_PRIORITY
- sizeof(intptr_t)
-#endif /* TBB_PREVIEW_TASK_PRIORITY */
+#endif /* __TBB_TASK_PRIORITY */
];
public:
//! Default & binding constructor.
- /** By default a bound context is created. That is this context will be bound
- (as child) to the context of the task calling task::allocate_root(this_context)
+ /** By default a bound context is created. That is this context will be bound
+ (as child) to the context of the task calling task::allocate_root(this_context)
method. Cancellation requests passed to the parent context are propagated
to all the contexts bound to it. Similarly priority change is propagated
from the parent context to its children.
If task_group_context::isolated is used as the argument, then the tasks associated
with this context will never be affected by events in any other context.
-
+
Creating isolated contexts involve much less overhead, but they have limited
utility. Normally when an exception occurs in an algorithm that has nested
- ones running, it is desirably to have all the nested algorithms canceled
+ ones running, it is desirably to have all the nested algorithms canceled
as well. Such a behavior requires nested algorithms to use bound contexts.
-
+
There is one good place where using isolated algorithms is beneficial. It is
a master thread. That is if a particular algorithm is invoked directly from
- the master thread (not from a TBB task), supplying it with explicitly
+ the master thread (not from a TBB task), supplying it with explicitly
created isolated context will result in a faster algorithm startup.
-
- VERSIONING NOTE:
- Implementation(s) of task_group_context constructor(s) cannot be made
- entirely out-of-line because the run-time version must be set by the user
- code. This will become critically important for binary compatibility, if
+
+ VERSIONING NOTE:
+ Implementation(s) of task_group_context constructor(s) cannot be made
+ entirely out-of-line because the run-time version must be set by the user
+ code. This will become critically important for binary compatibility, if
we ever have to change the size of the context object.
- Boosting the runtime version will also be necessary if new data fields are
- introduced in the currently unused padding areas and these fields are updated
+ Boosting the runtime version will also be necessary if new data fields are
+ introduced in the currently unused padding areas and these fields are updated
by inline methods. **/
task_group_context ( kind_type relation_with_parent = bound,
uintptr_t traits = default_traits )
@@ -436,22 +442,22 @@ public:
__TBB_EXPORTED_METHOD ~task_group_context ();
//! Forcefully reinitializes the context after the task tree it was associated with is completed.
- /** Because the method assumes that all the tasks that used to be associated with
- this context have already finished, calling it while the context is still
+ /** Because the method assumes that all the tasks that used to be associated with
+ this context have already finished, calling it while the context is still
in use somewhere in the task hierarchy leads to undefined behavior.
-
+
IMPORTANT: This method is not thread safe!
- The method does not change the context's parent if it is set. **/
+ The method does not change the context's parent if it is set. **/
void __TBB_EXPORTED_METHOD reset ();
//! Initiates cancellation of all tasks in this cancellation group and its subordinate groups.
- /** \return false if cancellation has already been requested, true otherwise.
+ /** \return false if cancellation has already been requested, true otherwise.
- Note that canceling never fails. When false is returned, it just means that
+ Note that canceling never fails. When false is returned, it just means that
another thread (or this one) has already sent cancellation request to this
context or to one of its ancestors (if this context is bound). It is guaranteed
- that when this method is concurrently called on the same not yet cancelled
+ that when this method is concurrently called on the same not yet cancelled
context, true will be returned by one and only one invocation. **/
bool __TBB_EXPORTED_METHOD cancel_group_execution ();
@@ -459,24 +465,24 @@ public:
bool __TBB_EXPORTED_METHOD is_group_execution_cancelled () const;
//! Records the pending exception, and cancels the task group.
- /** May be called only from inside a catch-block. If the context is already
- canceled, does nothing.
- The method brings the task group associated with this context exactly into
- the state it would be in, if one of its tasks threw the currently pending
- exception during its execution. In other words, it emulates the actions
+ /** May be called only from inside a catch-block. If the context is already
+ canceled, does nothing.
+ The method brings the task group associated with this context exactly into
+ the state it would be in, if one of its tasks threw the currently pending
+ exception during its execution. In other words, it emulates the actions
of the scheduler's dispatch loop exception handler. **/
void __TBB_EXPORTED_METHOD register_pending_exception ();
-#if TBB_PREVIEW_TASK_PRIORITY
- //! Changes priority of the task grop
+#if __TBB_TASK_PRIORITY
+ //! Changes priority of the task grop
void set_priority ( priority_t );
//! Retrieves current priority of the current task group
priority_t priority () const;
-#endif /* TBB_PREVIEW_TASK_PRIORITY */
+#endif /* __TBB_TASK_PRIORITY */
protected:
- //! Out-of-line part of the constructor.
+ //! Out-of-line part of the constructor.
/** Singled out to ensure backward binary compatibility of the future versions. **/
void __TBB_EXPORTED_METHOD init ();
@@ -490,7 +496,7 @@ private:
static const kind_type dying = kind_type(detached+1);
//! Propagates state change (if any) from an ancestor
- /** Checks if one of this object's ancestors is in a new state, and propagates
+ /** Checks if one of this object's ancestors is in a new state, and propagates
the new state to all its descendants in this object's heritage line. **/
template <typename T>
void propagate_state_from_ancestors ( T task_group_context::*mptr_state, T new_state );
@@ -542,7 +548,7 @@ public:
//! task object is on free list, or is going to be put there, or was just taken off.
freed,
//! task to be recycled as continuation
- recycle
+ recycle
};
//------------------------------------------------------------------------
@@ -595,8 +601,8 @@ public:
/** The caller must guarantee that the task's refcount does not become zero until
after the method execute() returns. Typically, this is done by having
method execute() return a pointer to a child of the task. If the guarantee
- cannot be made, use method recycle_as_safe_continuation instead.
-
+ cannot be made, use method recycle_as_safe_continuation instead.
+
Because of the hazard, this method may be deprecated in the future. */
void recycle_as_continuation() {
__TBB_ASSERT( prefix().state==executing, "execute not running?" );
@@ -605,7 +611,7 @@ public:
//! Recommended to use, safe variant of recycle_as_continuation
/** For safety, it requires additional increment of ref_count.
- With no decendants and ref_count of 1, it has the semantics of recycle_to_reexecute. */
+ With no descendants and ref_count of 1, it has the semantics of recycle_to_reexecute. */
void recycle_as_safe_continuation() {
__TBB_ASSERT( prefix().state==executing, "execute not running?" );
prefix().state = recycle;
@@ -634,7 +640,7 @@ public:
prefix().state = reexecute;
}
- // All depth-related methods are obsolete, and are retained for the sake
+ // All depth-related methods are obsolete, and are retained for the sake
// of backward source compatibility only
intptr_t depth() const {return 0;}
void set_depth( intptr_t ) {}
@@ -655,13 +661,13 @@ public:
}
//! Atomically increment reference count and returns its old value.
- /** Has acquire semantics */
+ /** Has acquire semantics */
void increment_ref_count() {
__TBB_FetchAndIncrementWacquire( &prefix().ref_count );
}
//! Atomically decrement reference count and returns its new value.
- /** Has release semantics. */
+ /** Has release semantics. */
int decrement_ref_count() {
#if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT
return int(internal_decrement_ref_count());
@@ -698,29 +704,29 @@ public:
}
//! Enqueue task for starvation-resistant execution.
-#if TBB_PREVIEW_TASK_PRIORITY
+#if __TBB_TASK_PRIORITY
/** The task will be enqueued on the normal priority level disregarding the
priority of its task group.
-
+
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.
-
+ to the race, which may result in unexpected behavior.
+
Use enqueue() overload with explicit priority value and task::group_priority()
method to implement such priority inheritance when it is really necessary. **/
-#endif /* TBB_PREVIEW_TASK_PRIORITY */
+#endif /* __TBB_TASK_PRIORITY */
static void enqueue( task& t ) {
t.prefix().owner->enqueue( t, NULL );
}
-#if TBB_PREVIEW_TASK_PRIORITY
+#if __TBB_TASK_PRIORITY
//! Enqueue task for starvation-resistant execution on the specified priority level.
static void enqueue( task& t, priority_t p ) {
__TBB_ASSERT( p == priority_low || p == priority_normal || p == priority_high, "Invalid priority level value" );
t.prefix().owner->enqueue( t, (void*)p );
}
-#endif /* TBB_PREVIEW_TASK_PRIORITY */
+#endif /* __TBB_TASK_PRIORITY */
//! The innermost task being executed or destroyed by the current thread at the moment.
static task& __TBB_EXPORTED_FUNC self();
@@ -728,6 +734,14 @@ public:
//! task on whose behalf this task is working, or NULL if this is a root.
task* parent() const {return prefix().parent;}
+ //! sets parent task pointer to specified value
+ void set_parent(task* p) {
+#if __TBB_TASK_GROUP_CONTEXT
+ __TBB_ASSERT(prefix().context == p->prefix().context, "The tasks must be in the same context");
+#endif
+ prefix().parent = p;
+ }
+
#if __TBB_TASK_GROUP_CONTEXT
//! This method is deprecated and will be removed in the future.
/** Use method group() instead. **/
@@ -735,7 +749,7 @@ public:
//! Pointer to the task group descriptor.
task_group_context* group () { return prefix().context; }
-#endif /* __TBB_TASK_GROUP_CONTEXT */
+#endif /* __TBB_TASK_GROUP_CONTEXT */
//! True if task was stolen from the task pool of another thread.
bool is_stolen_task() const {
@@ -764,7 +778,7 @@ public:
//------------------------------------------------------------------------
// Affinity
//------------------------------------------------------------------------
-
+
//! An id as used for specifying affinity.
/** Guaranteed to be integral type. Value of 0 means no affinity. */
typedef internal::affinity_id affinity_id;
@@ -776,8 +790,8 @@ public:
affinity_id affinity() const {return prefix().affinity;}
//! Invoked by scheduler to notify task that it ran on unexpected thread.
- /** Invoked before method execute() runs, if task is stolen, or task has
- affinity but will be executed on another thread.
+ /** Invoked before method execute() runs, if task is stolen, or task has
+ affinity but will be executed on another thread.
The default action does nothing. */
virtual void __TBB_EXPORTED_METHOD note_affinity( affinity_id id );
@@ -792,7 +806,7 @@ public:
traditional usage model where task group context are allocated locally on
the stack inapplicable. Dynamic allocation of context objects is performance
inefficient. Method change_group() allows to make task group context object
- a member of the task class, and then associate it with its containing task
+ a member of the task class, and then associate it with its containing task
object in the latter's constructor. **/
void __TBB_EXPORTED_METHOD change_group ( task_group_context& ctx );
@@ -804,14 +818,14 @@ public:
bool is_cancelled () const { return prefix().context->is_group_execution_cancelled(); }
#endif /* __TBB_TASK_GROUP_CONTEXT */
-#if TBB_PREVIEW_TASK_PRIORITY
+#if __TBB_TASK_PRIORITY
//! Changes priority of the task group this task belongs to.
void set_group_priority ( priority_t p ) { prefix().context->set_priority(p); }
//! Retrieves current priority of the task group this task belongs to.
priority_t group_priority () const { return prefix().context->priority(); }
-#endif /* TBB_PREVIEW_TASK_PRIORITY */
+#endif /* __TBB_TASK_PRIORITY */
private:
friend class interface5::internal::task_base;
@@ -824,7 +838,7 @@ private:
friend class internal::allocate_continuation_proxy;
friend class internal::allocate_child_proxy;
friend class internal::allocate_additional_child_of_proxy;
-
+
//! Get reference to corresponding task_prefix.
/** Version tag prevents loader on Linux from using the wrong symbol in debug builds. **/
internal::task_prefix& prefix( internal::version_tag* = NULL ) const {
diff --git a/include/tbb/task_group.h b/include/tbb/task_group.h
index fd4d552..2e42544 100644
--- a/include/tbb/task_group.h
+++ b/include/tbb/task_group.h
@@ -32,6 +32,8 @@
#include "task.h"
#include "tbb_exception.h"
+#if __TBB_TASK_GROUP_CONTEXT
+
namespace tbb {
namespace internal {
@@ -245,4 +247,6 @@ task_handle<F> make_task( const F& f ) {
} // namespace tbb
+#endif /* __TBB_TASK_GROUP_CONTEXT */
+
#endif /* __TBB_task_group_H */
diff --git a/include/tbb/task_scheduler_init.h b/include/tbb/task_scheduler_init.h
index 2f8658e..576d370 100644
--- a/include/tbb/task_scheduler_init.h
+++ b/include/tbb/task_scheduler_init.h
@@ -59,13 +59,11 @@ namespace internal {
as described in task_scheduler_init::initialize().
@ingroup task_scheduling */
class task_scheduler_init: internal::no_copy {
-#if TBB_USE_EXCEPTIONS
enum ExceptionPropagationMode {
propagation_mode_exact = 1u,
propagation_mode_captured = 2u,
propagation_mode_mask = propagation_mode_exact | propagation_mode_captured
};
-#endif /* TBB_USE_EXCEPTIONS */
/** NULL if not currently initialized. */
internal::scheduler* my_scheduler;
@@ -100,8 +98,7 @@ public:
//! 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_USE_EXCEPTIONS
- // Take two lowest order bits of the stack size argument to communicate
+ // 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
// explicit task group context object. This is necessary because newer
@@ -109,6 +106,7 @@ public:
// by older clients that expect tbb::captured_exception wrapper.
// All zeros mean old client - no preference.
__TBB_ASSERT( !(thread_stack_size & propagation_mode_mask), "Requested stack size is not aligned" );
+#if TBB_USE_EXCEPTIONS
thread_stack_size |= TBB_USE_CAPTURED_EXCEPTION ? propagation_mode_captured : propagation_mode_exact;
#endif /* TBB_USE_EXCEPTIONS */
initialize( number_of_threads, thread_stack_size );
diff --git a/include/tbb/tbb_config.h b/include/tbb/tbb_config.h
index 501538e..8b86b89 100644
--- a/include/tbb/tbb_config.h
+++ b/include/tbb/tbb_config.h
@@ -31,21 +31,49 @@
/** 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
+ - presence of compiler features
- compilation modes
- feature sets
- - workarounds presence
+ - known compiler/platform issues
**/
-/** Compilation modes **/
+#define __TBB_GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)
+
+/** Presence of compiler features **/
+
+#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
+
+/* TODO: The following condition should be extended when new compilers/runtimes
+ with std::exception_ptr support appear. */
+#define __TBB_EXCEPTION_PTR_PRESENT ((_MSC_VER >= 1600 || (__GXX_EXPERIMENTAL_CXX0X__ && __GNUC__==4 && __GNUC_MINOR__>=4)) && !__INTEL_COMPILER)
+
+#if __GNUC__ || __SUNPRO_CC || __IBMCPP__
+ /* ICC defines __GNUC__ and so is covered */
+ #define __TBB_ATTRIBUTE_ALIGNED_PRESENT 1
+#elif _MSC_VER && (_MSC_VER >= 1300 || __INTEL_COMPILER)
+ #define __TBB_DECLSPEC_ALIGN_PRESENT 1
+#endif
+
+#if (__TBB_GCC_VERSION >= 40102) && !defined(__INTEL_COMPILER)
+ /** built-in atomics available in GCC since 4.1.2 **/
+ #define __TBB_GCC_BUILTIN_ATOMICS_PRESENT 1
+#endif
+
+/** User controlled TBB features & modes **/
#ifndef TBB_USE_DEBUG
#ifdef TBB_DO_ASSERT
#define TBB_USE_DEBUG TBB_DO_ASSERT
#else
+#ifdef _DEBUG
+#define TBB_USE_DEBUG _DEBUG
+#else
#define TBB_USE_DEBUG 0
+#endif
#endif /* TBB_DO_ASSERT */
-#else
-#define TBB_DO_ASSERT TBB_USE_DEBUG
#endif /* TBB_USE_DEBUG */
#ifndef TBB_USE_ASSERT
@@ -91,6 +119,25 @@
#endif
#endif /* TBB_IMPLEMENT_CPP0X */
+#ifndef TBB_USE_CAPTURED_EXCEPTION
+ #if __TBB_EXCEPTION_PTR_PRESENT
+ #define TBB_USE_CAPTURED_EXCEPTION 0
+ #else
+ #define TBB_USE_CAPTURED_EXCEPTION 1
+ #endif
+#else /* defined TBB_USE_CAPTURED_EXCEPTION */
+ #if !TBB_USE_CAPTURED_EXCEPTION && !__TBB_EXCEPTION_PTR_PRESENT
+ #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.
+ #endif
+#endif /* defined TBB_USE_CAPTURED_EXCEPTION */
+
+/** Check whether the request to use GCC atomics can be satisfied **/
+#if (TBB_USE_GCC_BUILTINS && !__TBB_GCC_BUILTIN_ATOMICS_PRESENT)
+ #error "GCC atomic built-ins are not supported."
+#endif
+
+/** Internal TBB features & modes **/
+
#ifndef __TBB_DYNAMIC_LOAD_ENABLED
#define __TBB_DYNAMIC_LOAD_ENABLED !__TBB_TASK_CPP_DIRECTLY_INCLUDED
#elif !__TBB_DYNAMIC_LOAD_ENABLED
@@ -102,8 +149,6 @@
#endif
#endif
-/** Feature sets **/
-
#ifndef __TBB_COUNT_TASK_NODES
#define __TBB_COUNT_TASK_NODES TBB_USE_ASSERT
#endif
@@ -112,78 +157,46 @@
#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 */
#ifndef __TBB_TASK_PRIORITY
- #define __TBB_TASK_PRIORITY __TBB_CPF_BUILD
+ #define __TBB_TASK_PRIORITY __TBB_TASK_GROUP_CONTEXT
#endif /* __TBB_TASK_PRIORITY */
#if __TBB_TASK_PRIORITY && !__TBB_TASK_GROUP_CONTEXT
#error __TBB_TASK_PRIORITY requires __TBB_TASK_GROUP_CONTEXT to be enabled
#endif
-#ifdef TBB_PREVIEW_TASK_PRIORITY
- #if TBB_PREVIEW_TASK_PRIORITY
- #define __TBB_NO_IMPLICIT_LINKAGE 1
- #if __TBB_BUILD && !__TBB_TASK_PRIORITY
- #error TBB_PREVIEW_TASK_PRIORITY requires __TBB_TASK_PRIORITY to be enabled during TBB build
- #elif !__TBB_TASK_GROUP_CONTEXT
- #error TBB_PREVIEW_TASK_PRIORITY requires __TBB_TASK_GROUP_CONTEXT to be enabled
- #endif
- #endif
-#else
- #if __TBB_BUILD
- #define TBB_PREVIEW_TASK_PRIORITY __TBB_TASK_PRIORITY
- #endif
-#endif /* TBB_PREVIEW_TASK_PRIORITY */
-
#if !defined(__TBB_SURVIVE_THREAD_SWITCH) && (_WIN32 || _WIN64 || __linux__)
#define __TBB_SURVIVE_THREAD_SWITCH 1
#endif /* __TBB_SURVIVE_THREAD_SWITCH */
-
-/* TODO: The following condition should be extended as soon as new compilers/runtimes
- with std::exception_ptr support appear. */
-#define __TBB_EXCEPTION_PTR_PRESENT (_MSC_VER >= 1600 || __GXX_EXPERIMENTAL_CXX0X__ && (__GNUC__==4 && __GNUC_MINOR__>=4))
-
-
-#ifndef TBB_USE_CAPTURED_EXCEPTION
- #if __TBB_EXCEPTION_PTR_PRESENT
- #define TBB_USE_CAPTURED_EXCEPTION 0
- #else
- #define TBB_USE_CAPTURED_EXCEPTION 1
- #endif
-#else /* defined TBB_USE_CAPTURED_EXCEPTION */
- #if !TBB_USE_CAPTURED_EXCEPTION && !__TBB_EXCEPTION_PTR_PRESENT
- #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.
- #endif
-#endif /* defined TBB_USE_CAPTURED_EXCEPTION */
-
-
#ifndef __TBB_DEFAULT_PARTITIONER
#if TBB_DEPRECATED
/** Default partitioner for parallel loop templates in TBB 1.0-2.1 */
#define __TBB_DEFAULT_PARTITIONER tbb::simple_partitioner
#else
-/** Default partitioner for parallel loop templates in TBB 2.2 */
+/** Default partitioner for parallel loop templates since TBB 2.2 */
#define __TBB_DEFAULT_PARTITIONER tbb::auto_partitioner
-#endif /* TBB_DEFAULT_PARTITIONER */
+#endif /* TBB_DEPRECATED */
#endif /* !defined(__TBB_DEFAULT_PARTITIONER */
-/** Workarounds presence **/
-
-#if __GNUC__==4 && __GNUC_MINOR__>=4 && !defined(__INTEL_COMPILER)
- #define __TBB_GCC_WARNING_SUPPRESSION_ENABLED 1
-#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
removed as soon as the corresponding bugs are fixed or the buggy OS/compiler
versions go out of the support list.
**/
+#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
@@ -197,7 +210,7 @@
#define __TBB_TEMPLATE_FRIENDS_BROKEN 1
#endif
-#if __GLIBC__==2 && __GLIBC_MINOR__==3 || __MINGW32__
+#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. **/
#define __TBB_THROW_ACROSS_MODULE_BOUNDARY_BROKEN 1
@@ -240,4 +253,10 @@
#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)
+ when T has not yet been instantiated. **/
+ #define __TBB_ALIGNOF_NOT_INSTANTIATED_TYPES_BROKEN 1
+#endif
+
#endif /* __TBB_tbb_config_H */
diff --git a/include/tbb/tbb_machine.h b/include/tbb/tbb_machine.h
index bd38d0b..50636e5 100644
--- a/include/tbb/tbb_machine.h
+++ b/include/tbb/tbb_machine.h
@@ -29,29 +29,156 @@
#ifndef __TBB_machine_H
#define __TBB_machine_H
+/** 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:
+
+ __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
+
+ 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
+ futher.
+ 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.
+
+ 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.
+
+ Prerequisites for each architecture port
+ ----------------------------------------
+ The following functions 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.
+
+ __TBB_Yield()
+ Signals OS that the current thread is willing to relinquish the remainder
+ of its time quantum.
+
+ __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).
+
+ __TBB_machine_cmpswp4( volatile void *ptr, int32_t value, int32_t comparand )
+ Must be provided if __TBB_USE_FENCED_ATOMICS is not set.
+
+ __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
+
+ __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.
+
+ __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 Itanium).
+ 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 an empty definition where implied by the architecture
+ either specifically (Itanium) or because generally stronger C++0x "acquire"
+ semantics are enforced (like x86).
+
+ __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.
+ **/
+
#include "tbb_stddef.h"
+namespace tbb {
+namespace internal {
+
+////////////////////////////////////////////////////////////////////////////////
+// Overridable helpers declarations
+//
+// A machine/*.h file may choose to define these templates, otherwise it must
+// request default implementation by setting appropriate __TBB_USE_GENERIC_XXX macro(s).
+//
+template <typename T, std::size_t S>
+struct machine_load_store;
+
+template <typename T, std::size_t S>
+struct machine_load_store_relaxed;
+
+template <typename T, std::size_t S>
+struct machine_load_store_seq_cst;
+//
+// End of overridable helpers declarations
+////////////////////////////////////////////////////////////////////////////////
+
+template<size_t S> struct atomic_selector;
+
+template<> struct atomic_selector<1> {
+ typedef int8_t word;
+ inline static word fetch_store ( volatile void* location, word value );
+};
+
+template<> struct atomic_selector<2> {
+ typedef int16_t word;
+ inline static word fetch_store ( volatile void* location, word value );
+};
+
+template<> struct atomic_selector<4> {
+#if _MSC_VER && !_WIN64
+ // Work-around that avoids spurious /Wp64 warnings
+ typedef intptr_t word;
+#else
+ typedef int32_t word;
+#endif
+ inline static word fetch_store ( volatile void* location, word value );
+};
+
+template<> struct atomic_selector<8> {
+ typedef int64_t word;
+ inline static word fetch_store ( volatile void* location, word value );
+};
+
+}} // namespaces internal, tbb
+
#if _WIN32||_WIN64
#ifdef _MANAGED
#pragma managed(push, off)
#endif
-#if __MINGW64__
-#include "machine/linux_intel64.h"
-extern "C" __declspec(dllimport) int __stdcall SwitchToThread( void );
-#define __TBB_Yield() SwitchToThread()
-#elif __MINGW32__
-#include "machine/linux_ia32.h"
-extern "C" __declspec(dllimport) int __stdcall SwitchToThread( void );
-#define __TBB_Yield() SwitchToThread()
-#elif defined(_M_IX86)
-#include "machine/windows_ia32.h"
-#elif defined(_M_AMD64)
-#include "machine/windows_intel64.h"
-#elif _XBOX
-#include "machine/xbox360_ppc.h"
-#endif
+ #if __MINGW64__ || __MINGW32__
+ extern "C" __declspec(dllimport) int __stdcall SwitchToThread( void );
+ #define __TBB_Yield() SwitchToThread()
+ #if (TBB_USE_GCC_BUILTINS && __TBB_GCC_BUILTIN_ATOMICS_PRESENT)
+ #include "machine/gcc_generic.h"
+ #elif __MINGW64__
+ #include "machine/linux_intel64.h"
+ #elif __MINGW32__
+ #include "machine/linux_ia32.h"
+ #endif
+ #elif defined(_M_IX86)
+ #include "machine/windows_ia32.h"
+ #elif defined(_M_X64)
+ #include "machine/windows_intel64.h"
+ #elif _XBOX
+ #include "machine/xbox360_ppc.h"
+ #endif
#ifdef _MANAGED
#pragma managed(pop)
@@ -59,74 +186,95 @@ extern "C" __declspec(dllimport) int __stdcall SwitchToThread( void );
#elif __linux__ || __FreeBSD__ || __NetBSD__
-#if __i386__
-#include "machine/linux_ia32.h"
-#elif __x86_64__
-#include "machine/linux_intel64.h"
-#elif __ia64__
-#include "machine/linux_ia64.h"
-#elif __powerpc__
-#include "machine/mac_ppc.h"
-#endif
-#include "machine/linux_common.h"
+ #if (TBB_USE_GCC_BUILTINS && __TBB_GCC_BUILTIN_ATOMICS_PRESENT)
+ #include "machine/gcc_generic.h"
+ #elif __i386__
+ #include "machine/linux_ia32.h"
+ #elif __x86_64__
+ #include "machine/linux_intel64.h"
+ #elif __ia64__
+ #include "machine/linux_ia64.h"
+ #elif __powerpc__
+ #include "machine/mac_ppc.h"
+ #elif __TBB_GCC_BUILTIN_ATOMICS_PRESENT
+ #include "machine/gcc_generic.h"
+ #endif
+ #include "machine/linux_common.h"
#elif __APPLE__
-#if __i386__
-#include "machine/linux_ia32.h"
-#elif __x86_64__
-#include "machine/linux_intel64.h"
-#elif __POWERPC__
-#include "machine/mac_ppc.h"
-#endif
-#include "machine/macos_common.h"
+ #if __i386__
+ #include "machine/linux_ia32.h"
+ #elif __x86_64__
+ #include "machine/linux_intel64.h"
+ #elif __POWERPC__
+ #include "machine/mac_ppc.h"
+ #endif
+ #include "machine/macos_common.h"
#elif _AIX
-#include "machine/ibm_aix51.h"
+ #include "machine/ibm_aix51.h"
#elif __sun || __SUNPRO_CC
-#define __asm__ asm
-#define __volatile__ volatile
+ #define __asm__ asm
+ #define __volatile__ volatile
-#if __i386 || __i386__
-#include "machine/linux_ia32.h"
-#elif __x86_64__
-#include "machine/linux_intel64.h"
-#elif __sparc
-#include "machine/sunos_sparc.h"
-#endif
-#include <sched.h>
+ #if __i386 || __i386__
+ #include "machine/linux_ia32.h"
+ #elif __x86_64__
+ #include "machine/linux_intel64.h"
+ #elif __sparc
+ #include "machine/sunos_sparc.h"
+ #endif
+ #include <sched.h>
-#define __TBB_Yield() sched_yield()
+ #define __TBB_Yield() sched_yield()
-#endif /* Sun */
+#endif /* OS selection */
#ifndef __TBB_64BIT_ATOMICS
-#define __TBB_64BIT_ATOMICS 1
+ #define __TBB_64BIT_ATOMICS 1
#endif
-//! Prerequisites for each architecture port
-/** There are no generic implementation for these macros so they have to be implemented
- in each machine architecture specific header.
-
- __TBB_full_memory_fence must prevent all memory operations from being reordered
- across the fence. And all such fences must be totally ordered (or sequentially
- consistent). These fence must affect both compiler and hardware.
-
- __TBB_release_consistency_helper is used to enforce guarantees of acquire or
- release semantics in generic implementations of __TBB_load_with_acquire and
- __TBB_store_with_release below. Depending on the particular combination of
- architecture+compiler it can be a hardware fence, a compiler fence, both or
- nothing. **/
-#if !defined(__TBB_CompareAndSwap4) \
- || !defined(__TBB_CompareAndSwap8) && __TBB_64BIT_ATOMICS \
- || !defined(__TBB_Yield) \
- || !defined(__TBB_full_memory_fence) \
- || !defined(__TBB_release_consistency_helper)
-#error Minimal requirements for tbb_machine.h not satisfied; platform is not supported.
-#endif
+// Special atomic functions
+#if __TBB_USE_FENCED_ATOMICS
+ #define __TBB_machine_cmpswp1 __TBB_machine_cmpswp1full_fence
+ #define __TBB_machine_cmpswp2 __TBB_machine_cmpswp2full_fence
+ #define __TBB_machine_cmpswp4 __TBB_machine_cmpswp4full_fence
+ #define __TBB_machine_cmpswp8 __TBB_machine_cmpswp8full_fence
+
+ #if __TBB_WORDSIZE==8
+ #define __TBB_machine_fetchadd8 __TBB_machine_fetchadd8full_fence
+ #define __TBB_machine_fetchstore8 __TBB_machine_fetchstore8full_fence
+ #define __TBB_FetchAndAddWrelease(P,V) __TBB_machine_fetchadd8release(P,V)
+ #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.
+ #endif /* __TBB_WORDSIZE==4 */
+#else /* !__TBB_USE_FENCED_ATOMICS */
+ #define __TBB_FetchAndAddWrelease(P,V) __TBB_FetchAndAddW(P,V)
+ #define __TBB_FetchAndIncrementWacquire(P) __TBB_FetchAndAddW(P,1)
+ #define __TBB_FetchAndDecrementWrelease(P) __TBB_FetchAndAddW(P,(-1))
+#endif /* !__TBB_USE_FENCED_ATOMICS */
+
+#if __TBB_WORDSIZE==4
+ #define __TBB_CompareAndSwapW(P,V,C) __TBB_machine_cmpswp4(P,V,C)
+ #define __TBB_FetchAndAddW(P,V) __TBB_machine_fetchadd4(P,V)
+ #define __TBB_FetchAndStoreW(P,V) __TBB_machine_fetchstore4(P,V)
+#elif __TBB_WORDSIZE==8
+ #if __TBB_USE_GENERIC_DWORD_LOAD_STORE || __TBB_USE_GENERIC_DWORD_FETCH_ADD || __TBB_USE_GENERIC_DWORD_FETCH_STORE
+ #error These macros should only be used on 32-bit platforms.
+ #endif
+
+ #define __TBB_CompareAndSwapW(P,V,C) __TBB_machine_cmpswp8(P,V,C)
+ #define __TBB_FetchAndAddW(P,V) __TBB_machine_fetchadd8(P,V)
+ #define __TBB_FetchAndStoreW(P,V) __TBB_machine_fetchstore8(P,V)
+#else /* __TBB_WORDSIZE != 8 */
+ #error Unsupported machine word size.
+#endif /* __TBB_WORDSIZE */
#ifndef __TBB_Pause
inline void __TBB_Pause(int32_t) {
@@ -144,7 +292,7 @@ namespace internal {
//! Class that implements exponential backoff.
/** See implementation of spin_wait_while_eq for an example. */
class atomic_backoff : no_copy {
- //! Time delay, in units of "pause" instructions.
+ //! Time delay, in units of "pause" instructions.
/** Should be equal to approximately the number of "pause" instructions
that take the same time as an context switch. */
static const int32_t LOOPS_BEFORE_YIELD = 16;
@@ -215,8 +363,9 @@ inline T __TBB_MaskedCompareAndSwap (volatile T *ptr, T value, T comparand ) {
result = *base; // reload the base value which might change during the pause
uint32_t old_value = ( result & ~mask ) | ( comparand << bitoffset );
uint32_t new_value = ( result & ~mask ) | ( value << bitoffset );
- // __TBB_CompareAndSwap4 presumed to have full fence.
- result = __TBB_CompareAndSwap4( base, new_value, old_value );
+ // __TBB_CompareAndSwap4 presumed to have full fence.
+ // Cast shuts up /Wp64 warning
+ result = (uint32_t)__TBB_machine_cmpswp4( base, new_value, old_value );
if( result==old_value // CAS succeeded
|| ((result^old_value)&mask)!=0 ) // CAS failed and the bits of interest have changed
break;
@@ -227,37 +376,36 @@ inline T __TBB_MaskedCompareAndSwap (volatile T *ptr, T value, T comparand ) {
}
template<size_t S, typename T>
-inline T __TBB_CompareAndSwapGeneric (volatile void *ptr, T value, T comparand ) {
- return __TBB_CompareAndSwapW((T *)ptr,value,comparand);
-}
+inline T __TBB_CompareAndSwapGeneric (volatile void *ptr, T value, T comparand );
template<>
inline uint8_t __TBB_CompareAndSwapGeneric <1,uint8_t> (volatile void *ptr, uint8_t value, uint8_t comparand ) {
-#ifdef __TBB_CompareAndSwap1
- return __TBB_CompareAndSwap1(ptr,value,comparand);
-#else
+#if __TBB_USE_GENERIC_PART_WORD_CAS
return __TBB_MaskedCompareAndSwap<1,uint8_t>((volatile uint8_t *)ptr,value,comparand);
+#else
+ return __TBB_machine_cmpswp1(ptr,value,comparand);
#endif
}
template<>
inline uint16_t __TBB_CompareAndSwapGeneric <2,uint16_t> (volatile void *ptr, uint16_t value, uint16_t comparand ) {
-#ifdef __TBB_CompareAndSwap2
- return __TBB_CompareAndSwap2(ptr,value,comparand);
-#else
+#if __TBB_USE_GENERIC_PART_WORD_CAS
return __TBB_MaskedCompareAndSwap<2,uint16_t>((volatile uint16_t *)ptr,value,comparand);
+#else
+ return __TBB_machine_cmpswp2(ptr,value,comparand);
#endif
}
template<>
-inline uint32_t __TBB_CompareAndSwapGeneric <4,uint32_t> (volatile void *ptr, uint32_t value, uint32_t comparand ) {
- return __TBB_CompareAndSwap4(ptr,value,comparand);
+inline uint32_t __TBB_CompareAndSwapGeneric <4,uint32_t> (volatile void *ptr, uint32_t value, uint32_t comparand ) {
+ // Cast shuts up /Wp64 warning
+ return (uint32_t)__TBB_machine_cmpswp4(ptr,value,comparand);
}
#if __TBB_64BIT_ATOMICS
template<>
-inline uint64_t __TBB_CompareAndSwapGeneric <8,uint64_t> (volatile void *ptr, uint64_t value, uint64_t comparand ) {
- return __TBB_CompareAndSwap8(ptr,value,comparand);
+inline uint64_t __TBB_CompareAndSwapGeneric <8,uint64_t> (volatile void *ptr, uint64_t value, uint64_t comparand ) {
+ return __TBB_machine_cmpswp8(ptr,value,comparand);
}
#endif
@@ -267,8 +415,8 @@ inline T __TBB_FetchAndAddGeneric (volatile void *ptr, T addend) {
T result;
for(;;) {
result = *reinterpret_cast<volatile T *>(ptr);
- // __TBB_CompareAndSwapGeneric presumed to have full fence.
- if( __TBB_CompareAndSwapGeneric<S,T> ( ptr, result+addend, result )==result )
+ // __TBB_CompareAndSwapGeneric presumed to have full fence.
+ if( __TBB_CompareAndSwapGeneric<S,T> ( ptr, result+addend, result )==result )
break;
b.pause();
}
@@ -282,59 +430,275 @@ inline T __TBB_FetchAndStoreGeneric (volatile void *ptr, T value) {
for(;;) {
result = *reinterpret_cast<volatile T *>(ptr);
// __TBB_CompareAndSwapGeneric presumed to have full fence.
- if( __TBB_CompareAndSwapGeneric<S,T> ( ptr, value, result )==result )
+ if( __TBB_CompareAndSwapGeneric<S,T> ( ptr, value, result )==result )
break;
b.pause();
}
return result;
}
+#if __TBB_USE_GENERIC_PART_WORD_CAS
+#define __TBB_machine_cmpswp1 tbb::internal::__TBB_CompareAndSwapGeneric<1,uint8_t>
+#define __TBB_machine_cmpswp2 tbb::internal::__TBB_CompareAndSwapGeneric<2,uint16_t>
+#endif
+
+#if __TBB_USE_GENERIC_FETCH_ADD || __TBB_USE_GENERIC_PART_WORD_FETCH_ADD
+#define __TBB_machine_fetchadd1 tbb::internal::__TBB_FetchAndAddGeneric<1,uint8_t>
+#define __TBB_machine_fetchadd2 tbb::internal::__TBB_FetchAndAddGeneric<2,uint16_t>
+#endif
+
+#if __TBB_USE_GENERIC_FETCH_ADD
+#define __TBB_machine_fetchadd4 tbb::internal::__TBB_FetchAndAddGeneric<4,uint32_t>
+#endif
+
+#if __TBB_USE_GENERIC_FETCH_ADD || __TBB_USE_GENERIC_DWORD_FETCH_ADD
+#define __TBB_machine_fetchadd8 tbb::internal::__TBB_FetchAndAddGeneric<8,uint64_t>
+#endif
+
+#if __TBB_USE_GENERIC_FETCH_STORE || __TBB_USE_GENERIC_PART_WORD_FETCH_STORE
+#define __TBB_machine_fetchstore1 tbb::internal::__TBB_FetchAndStoreGeneric<1,uint8_t>
+#define __TBB_machine_fetchstore2 tbb::internal::__TBB_FetchAndStoreGeneric<2,uint16_t>
+#endif
+
+#if __TBB_USE_GENERIC_FETCH_STORE
+#define __TBB_machine_fetchstore4 tbb::internal::__TBB_FetchAndStoreGeneric<4,uint32_t>
+#endif
+
+#if __TBB_USE_GENERIC_FETCH_STORE || __TBB_USE_GENERIC_DWORD_FETCH_STORE
+#define __TBB_machine_fetchstore8 tbb::internal::__TBB_FetchAndStoreGeneric<8,uint64_t>
+#endif
+
+#if __TBB_USE_FETCHSTORE_AS_FULL_FENCED_STORE
+#define __TBB_MACHINE_DEFINE_ATOMIC_SELECTOR_FETCH_STORE(S) \
+ atomic_selector<S>::word atomic_selector<S>::fetch_store ( volatile void* location, word value ) { \
+ return __TBB_machine_fetchstore##S( location, value ); \
+ }
+
+__TBB_MACHINE_DEFINE_ATOMIC_SELECTOR_FETCH_STORE(1)
+__TBB_MACHINE_DEFINE_ATOMIC_SELECTOR_FETCH_STORE(2)
+__TBB_MACHINE_DEFINE_ATOMIC_SELECTOR_FETCH_STORE(4)
+__TBB_MACHINE_DEFINE_ATOMIC_SELECTOR_FETCH_STORE(8)
+
+#undef __TBB_MACHINE_DEFINE_ATOMIC_SELECTOR_FETCH_STORE
+#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;
+ }
+}
+
+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 = 2305843009213693951;
+ return __TBB_machine_cmpswp8(const_cast<volatile void *>(ptr),anyvalue,anyvalue);
+}
+#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
+ to generate code with appropriate acquire/release semantics.
+ On architectures like IA32, Intel64 (and likely and 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). **/
+template <typename T, size_t S>
+struct machine_load_store {
+ static T load_with_acquire ( const volatile T& location ) {
+ T to_return = location;
+ __TBB_acquire_consistency_helper();
+ return to_return;
+ }
+ static void store_with_release ( volatile T &location, T value ) {
+ __TBB_release_consistency_helper();
+ location = value;
+ }
+};
+
+#if __TBB_WORDSIZE==4 && __TBB_64BIT_ATOMICS
+template <typename T>
+struct machine_load_store<T,8> {
+ static T load_with_acquire ( const volatile T& location ) {
+ return (T)__TBB_machine_load8( (const volatile void*)&location );
+ }
+ static void store_with_release ( volatile T& location, T value ) {
+ __TBB_machine_store8( (volatile void*)&location, (int64_t)value );
+ }
+};
+#endif /* __TBB_WORDSIZE==4 && __TBB_64BIT_ATOMICS */
+#endif /* __TBB_USE_GENERIC_HALF_FENCED_LOAD_STORE */
+
+template <typename T, size_t S>
+struct machine_load_store_seq_cst {
+ static T load ( const volatile T& location ) {
+ __TBB_full_memory_fence();
+ return machine_load_store<T,S>::load_with_acquire( location );
+ }
+#if __TBB_USE_FETCHSTORE_AS_FULL_FENCED_STORE
+ static void store ( volatile T &location, T value ) {
+ atomic_selector<S>::fetch_store( (volatile void*)&location, (typename atomic_selector<S>::word)value );
+ }
+#else /* !__TBB_USE_FETCHSTORE_AS_FULL_FENCED_STORE */
+ static void store ( volatile T &location, T value ) {
+ machine_load_store<T,S>::store_with_release( location, value );
+ __TBB_full_memory_fence();
+ }
+#endif /* !__TBB_USE_FETCHSTORE_AS_FULL_FENCED_STORE */
+};
+
+#if __TBB_WORDSIZE==4 && __TBB_64BIT_ATOMICS
+/** The implementation does not use functions __TBB_machine_load8/store8 as they
+ are not required to be sequentially consistent. **/
+template <typename T>
+struct machine_load_store_seq_cst<T,8> {
+ static T load ( const volatile T& location ) {
+ // 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( (volatile void*)const_cast<volatile T*>(&location), anyvalue, anyvalue );
+ }
+ static void store ( volatile T &location, T value ) {
+ int64_t result = (volatile int64_t&)location;
+ while ( __TBB_machine_cmpswp8((volatile void*)&location, (int64_t)value, result) != result )
+ result = (volatile int64_t&)location;
+ }
+};
+#endif /* __TBB_WORDSIZE==4 && __TBB_64BIT_ATOMICS */
+
+#if __TBB_USE_GENERIC_RELAXED_LOAD_STORE
+// Relaxed operations add volatile qualifier to prevent compiler from optimizing them out.
+/** 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. **/
+template <typename T, size_t S>
+struct machine_load_store_relaxed {
+ static inline T load ( const volatile T& location ) {
+ return location;
+ }
+ static inline void store ( volatile T& location, T value ) {
+ location = value;
+ }
+};
+
+#if __TBB_WORDSIZE==4 && __TBB_64BIT_ATOMICS
+template <typename T>
+struct machine_load_store_relaxed<T,8> {
+ static inline T load ( const volatile T& location ) {
+ return (T)__TBB_machine_load8( (const volatile void*)&location );
+ }
+ static inline void store ( volatile T& location, T value ) {
+ __TBB_machine_store8( (volatile void*)&location, (int64_t)value );
+ }
+};
+#endif /* __TBB_WORDSIZE==4 && __TBB_64BIT_ATOMICS */
+#endif /* __TBB_USE_GENERIC_RELAXED_LOAD_STORE */
+
+template<typename T>
+inline T __TBB_load_with_acquire(const volatile T &location) {
+ return machine_load_store<T,sizeof(T)>::load_with_acquire( location );
+}
+template<typename T, typename V>
+inline void __TBB_store_with_release(volatile T& location, V value) {
+ machine_load_store<T,sizeof(T)>::store_with_release( location, T(value) );
+}
+//! Overload that exists solely to avoid /Wp64 warnings.
+inline void __TBB_store_with_release(volatile size_t& location, size_t value) {
+ machine_load_store<size_t,sizeof(size_t)>::store_with_release( location, value );
+}
+
+template<typename T>
+inline T __TBB_load_full_fence(const volatile T &location) {
+ return machine_load_store_seq_cst<T,sizeof(T)>::load( location );
+}
+template<typename T, typename V>
+inline void __TBB_store_full_fence(volatile T& location, V value) {
+ machine_load_store_seq_cst<T,sizeof(T)>::store( location, T(value) );
+}
+//! Overload that exists solely to avoid /Wp64 warnings.
+inline void __TBB_store_full_fence(volatile size_t& location, size_t value) {
+ machine_load_store_seq_cst<size_t,sizeof(size_t)>::store( location, value );
+}
+
+template<typename T>
+inline T __TBB_load_relaxed (const volatile T& location) {
+ return machine_load_store_relaxed<T,sizeof(T)>::load( const_cast<T&>(location) );
+}
+template<typename T, typename V>
+inline void __TBB_store_relaxed ( volatile T& location, V value ) {
+ machine_load_store_relaxed<T,sizeof(T)>::store( const_cast<T&>(location), T(value) );
+}
+//! Overload that exists solely to avoid /Wp64 warnings.
+inline void __TBB_store_relaxed ( volatile size_t& location, size_t value ) {
+ machine_load_store_relaxed<size_t,sizeof(size_t)>::store( const_cast<size_t&>(location), value );
+}
+
// Macro __TBB_TypeWithAlignmentAtLeastAsStrict(T) should be a type with alignment at least as
-// strict as type T. Type type should have a trivial default constructor and destructor, so that
-// arrays of that type can be declared without initializers.
+// strict as type T. The type should have a trivial default constructor and destructor, so that
+// arrays of that type can be declared without initializers.
// It is correct (but perhaps a waste of space) if __TBB_TypeWithAlignmentAtLeastAsStrict(T) expands
// to a type bigger than T.
// The default definition here works on machines where integers are naturally aligned and the
-// strictest alignment is 16.
+// strictest alignment is 64.
#ifndef __TBB_TypeWithAlignmentAtLeastAsStrict
-#if __GNUC__ || __SUNPRO_CC || __IBMCPP__
-struct __TBB_machine_type_with_strictest_alignment {
- int member[4];
-} __attribute__((aligned(16)));
-#elif _MSC_VER
-__declspec(align(16)) struct __TBB_machine_type_with_strictest_alignment {
- int member[4];
+#if __TBB_ATTRIBUTE_ALIGNED_PRESENT
+
+#define __TBB_DefineTypeWithAlignment(PowerOf2) \
+struct __TBB_machine_type_with_alignment_##PowerOf2 { \
+ uint32_t member[PowerOf2/sizeof(uint32_t)]; \
+} __attribute__((aligned(PowerOf2)));
+#define __TBB_alignof(T) __alignof__(T)
+
+#elif __TBB_DECLSPEC_ALIGN_PRESENT
+
+#define __TBB_DefineTypeWithAlignment(PowerOf2) \
+__declspec(align(PowerOf2)) \
+struct __TBB_machine_type_with_alignment_##PowerOf2 { \
+ uint32_t member[PowerOf2/sizeof(uint32_t)]; \
};
-#else
-#error Must define __TBB_TypeWithAlignmentAtLeastAsStrict(T) or __TBB_machine_type_with_strictest_alignment
+#define __TBB_alignof(T) __alignof(T)
+
+#else /* A compiler with unknown syntax for data alignment */
+#error Must define __TBB_TypeWithAlignmentAtLeastAsStrict(T)
#endif
-template<size_t N> struct type_with_alignment {__TBB_machine_type_with_strictest_alignment member;};
+/* Now declare types aligned to useful powers of two */
+// TODO: Is __TBB_DefineTypeWithAlignment(8) needed on 32 bit platforms?
+__TBB_DefineTypeWithAlignment(16)
+__TBB_DefineTypeWithAlignment(32)
+__TBB_DefineTypeWithAlignment(64)
+
+typedef __TBB_machine_type_with_alignment_64 __TBB_machine_type_with_strictest_alignment;
+
+// Primary template is a declaration of incomplete type so that it fails with unknown alignments
+template<size_t N> struct type_with_alignment;
+
+// Specializations for allowed alignments
template<> struct type_with_alignment<1> { char member; };
template<> struct type_with_alignment<2> { uint16_t member; };
template<> struct type_with_alignment<4> { uint32_t member; };
template<> struct type_with_alignment<8> { uint64_t member; };
+template<> struct type_with_alignment<16> {__TBB_machine_type_with_alignment_16 member; };
+template<> struct type_with_alignment<32> {__TBB_machine_type_with_alignment_32 member; };
+template<> struct type_with_alignment<64> {__TBB_machine_type_with_alignment_64 member; };
-#if _MSC_VER||defined(__GNUC__)&&__GNUC__==3 && __GNUC_MINOR__<=2
+#if __TBB_ALIGNOF_NOT_INSTANTIATED_TYPES_BROKEN
//! 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). */
-template<size_t Size, typename T>
+template<size_t Size, typename T>
struct work_around_alignment_bug {
-#if _MSC_VER
- static const size_t alignment = __alignof(T);
-#else
- static const size_t alignment = __alignof__(T);
-#endif
+ static const size_t alignment = __TBB_alignof(T);
};
#define __TBB_TypeWithAlignmentAtLeastAsStrict(T) tbb::internal::type_with_alignment<tbb::internal::work_around_alignment_bug<sizeof(T),T>::alignment>
-#elif __GNUC__ || __SUNPRO_CC || __IBMCPP__
-#define __TBB_TypeWithAlignmentAtLeastAsStrict(T) tbb::internal::type_with_alignment<__alignof__(T)>
#else
-#define __TBB_TypeWithAlignmentAtLeastAsStrict(T) __TBB_machine_type_with_strictest_alignment
-#endif
-#endif /* ____TBB_TypeWithAlignmentAtLeastAsStrict */
+#define __TBB_TypeWithAlignmentAtLeastAsStrict(T) tbb::internal::type_with_alignment<__TBB_alignof(T)>
+#endif /* __TBB_ALIGNOF_NOT_INSTANTIATED_TYPES_BROKEN */
+
+#endif /* __TBB_TypeWithAlignmentAtLeastAsStrict */
// Template class here is to avoid instantiation of the static data for modules that don't use it
template<typename T>
@@ -366,262 +730,13 @@ const T reverse<T>::byte_table[256] = {
} // namespace internal
} // namespace tbb
-#ifndef __TBB_CompareAndSwap1
-#define __TBB_CompareAndSwap1 tbb::internal::__TBB_CompareAndSwapGeneric<1,uint8_t>
-#endif
-
-#ifndef __TBB_CompareAndSwap2
-#define __TBB_CompareAndSwap2 tbb::internal::__TBB_CompareAndSwapGeneric<2,uint16_t>
-#endif
-
-#ifndef __TBB_CompareAndSwapW
-#define __TBB_CompareAndSwapW tbb::internal::__TBB_CompareAndSwapGeneric<sizeof(ptrdiff_t),ptrdiff_t>
-#endif
-
-#ifndef __TBB_FetchAndAdd1
-#define __TBB_FetchAndAdd1 tbb::internal::__TBB_FetchAndAddGeneric<1,uint8_t>
-#endif
-
-#ifndef __TBB_FetchAndAdd2
-#define __TBB_FetchAndAdd2 tbb::internal::__TBB_FetchAndAddGeneric<2,uint16_t>
-#endif
-
-#ifndef __TBB_FetchAndAdd4
-#define __TBB_FetchAndAdd4 tbb::internal::__TBB_FetchAndAddGeneric<4,uint32_t>
-#endif
-
-#ifndef __TBB_FetchAndAdd8
-#define __TBB_FetchAndAdd8 tbb::internal::__TBB_FetchAndAddGeneric<8,uint64_t>
-#endif
-
-#ifndef __TBB_FetchAndAddW
-#define __TBB_FetchAndAddW tbb::internal::__TBB_FetchAndAddGeneric<sizeof(ptrdiff_t),ptrdiff_t>
-#endif
-
-#ifndef __TBB_FetchAndStore1
-#define __TBB_FetchAndStore1 tbb::internal::__TBB_FetchAndStoreGeneric<1,uint8_t>
-#endif
-
-#ifndef __TBB_FetchAndStore2
-#define __TBB_FetchAndStore2 tbb::internal::__TBB_FetchAndStoreGeneric<2,uint16_t>
-#endif
-
-#ifndef __TBB_FetchAndStore4
-#define __TBB_FetchAndStore4 tbb::internal::__TBB_FetchAndStoreGeneric<4,uint32_t>
-#endif
-
-#ifndef __TBB_FetchAndStore8
-#define __TBB_FetchAndStore8 tbb::internal::__TBB_FetchAndStoreGeneric<8,uint64_t>
-#endif
-
-#ifndef __TBB_FetchAndStoreW
-#define __TBB_FetchAndStoreW tbb::internal::__TBB_FetchAndStoreGeneric<sizeof(ptrdiff_t),ptrdiff_t>
-#endif
-
-#if __TBB_DECL_FENCED_ATOMICS
+// Preserving access to legacy APIs
+using tbb::internal::__TBB_load_with_acquire;
+using tbb::internal::__TBB_store_with_release;
-#ifndef __TBB_CompareAndSwap1__TBB_full_fence
-#define __TBB_CompareAndSwap1__TBB_full_fence __TBB_CompareAndSwap1
-#endif
-#ifndef __TBB_CompareAndSwap1acquire
-#define __TBB_CompareAndSwap1acquire __TBB_CompareAndSwap1__TBB_full_fence
-#endif
-#ifndef __TBB_CompareAndSwap1release
-#define __TBB_CompareAndSwap1release __TBB_CompareAndSwap1__TBB_full_fence
-#endif
-
-#ifndef __TBB_CompareAndSwap2__TBB_full_fence
-#define __TBB_CompareAndSwap2__TBB_full_fence __TBB_CompareAndSwap2
-#endif
-#ifndef __TBB_CompareAndSwap2acquire
-#define __TBB_CompareAndSwap2acquire __TBB_CompareAndSwap2__TBB_full_fence
-#endif
-#ifndef __TBB_CompareAndSwap2release
-#define __TBB_CompareAndSwap2release __TBB_CompareAndSwap2__TBB_full_fence
-#endif
-
-#ifndef __TBB_CompareAndSwap4__TBB_full_fence
-#define __TBB_CompareAndSwap4__TBB_full_fence __TBB_CompareAndSwap4
-#endif
-#ifndef __TBB_CompareAndSwap4acquire
-#define __TBB_CompareAndSwap4acquire __TBB_CompareAndSwap4__TBB_full_fence
-#endif
-#ifndef __TBB_CompareAndSwap4release
-#define __TBB_CompareAndSwap4release __TBB_CompareAndSwap4__TBB_full_fence
-#endif
-
-#ifndef __TBB_CompareAndSwap8__TBB_full_fence
-#define __TBB_CompareAndSwap8__TBB_full_fence __TBB_CompareAndSwap8
-#endif
-#ifndef __TBB_CompareAndSwap8acquire
-#define __TBB_CompareAndSwap8acquire __TBB_CompareAndSwap8__TBB_full_fence
-#endif
-#ifndef __TBB_CompareAndSwap8release
-#define __TBB_CompareAndSwap8release __TBB_CompareAndSwap8__TBB_full_fence
-#endif
-
-#ifndef __TBB_FetchAndAdd1__TBB_full_fence
-#define __TBB_FetchAndAdd1__TBB_full_fence __TBB_FetchAndAdd1
-#endif
-#ifndef __TBB_FetchAndAdd1acquire
-#define __TBB_FetchAndAdd1acquire __TBB_FetchAndAdd1__TBB_full_fence
-#endif
-#ifndef __TBB_FetchAndAdd1release
-#define __TBB_FetchAndAdd1release __TBB_FetchAndAdd1__TBB_full_fence
-#endif
-
-#ifndef __TBB_FetchAndAdd2__TBB_full_fence
-#define __TBB_FetchAndAdd2__TBB_full_fence __TBB_FetchAndAdd2
-#endif
-#ifndef __TBB_FetchAndAdd2acquire
-#define __TBB_FetchAndAdd2acquire __TBB_FetchAndAdd2__TBB_full_fence
-#endif
-#ifndef __TBB_FetchAndAdd2release
-#define __TBB_FetchAndAdd2release __TBB_FetchAndAdd2__TBB_full_fence
-#endif
-
-#ifndef __TBB_FetchAndAdd4__TBB_full_fence
-#define __TBB_FetchAndAdd4__TBB_full_fence __TBB_FetchAndAdd4
-#endif
-#ifndef __TBB_FetchAndAdd4acquire
-#define __TBB_FetchAndAdd4acquire __TBB_FetchAndAdd4__TBB_full_fence
-#endif
-#ifndef __TBB_FetchAndAdd4release
-#define __TBB_FetchAndAdd4release __TBB_FetchAndAdd4__TBB_full_fence
-#endif
-
-#ifndef __TBB_FetchAndAdd8__TBB_full_fence
-#define __TBB_FetchAndAdd8__TBB_full_fence __TBB_FetchAndAdd8
-#endif
-#ifndef __TBB_FetchAndAdd8acquire
-#define __TBB_FetchAndAdd8acquire __TBB_FetchAndAdd8__TBB_full_fence
-#endif
-#ifndef __TBB_FetchAndAdd8release
-#define __TBB_FetchAndAdd8release __TBB_FetchAndAdd8__TBB_full_fence
-#endif
-
-#ifndef __TBB_FetchAndStore1__TBB_full_fence
-#define __TBB_FetchAndStore1__TBB_full_fence __TBB_FetchAndStore1
-#endif
-#ifndef __TBB_FetchAndStore1acquire
-#define __TBB_FetchAndStore1acquire __TBB_FetchAndStore1__TBB_full_fence
-#endif
-#ifndef __TBB_FetchAndStore1release
-#define __TBB_FetchAndStore1release __TBB_FetchAndStore1__TBB_full_fence
-#endif
-
-#ifndef __TBB_FetchAndStore2__TBB_full_fence
-#define __TBB_FetchAndStore2__TBB_full_fence __TBB_FetchAndStore2
-#endif
-#ifndef __TBB_FetchAndStore2acquire
-#define __TBB_FetchAndStore2acquire __TBB_FetchAndStore2__TBB_full_fence
-#endif
-#ifndef __TBB_FetchAndStore2release
-#define __TBB_FetchAndStore2release __TBB_FetchAndStore2__TBB_full_fence
-#endif
-
-#ifndef __TBB_FetchAndStore4__TBB_full_fence
-#define __TBB_FetchAndStore4__TBB_full_fence __TBB_FetchAndStore4
-#endif
-#ifndef __TBB_FetchAndStore4acquire
-#define __TBB_FetchAndStore4acquire __TBB_FetchAndStore4__TBB_full_fence
-#endif
-#ifndef __TBB_FetchAndStore4release
-#define __TBB_FetchAndStore4release __TBB_FetchAndStore4__TBB_full_fence
-#endif
-
-#ifndef __TBB_FetchAndStore8__TBB_full_fence
-#define __TBB_FetchAndStore8__TBB_full_fence __TBB_FetchAndStore8
-#endif
-#ifndef __TBB_FetchAndStore8acquire
-#define __TBB_FetchAndStore8acquire __TBB_FetchAndStore8__TBB_full_fence
-#endif
-#ifndef __TBB_FetchAndStore8release
-#define __TBB_FetchAndStore8release __TBB_FetchAndStore8__TBB_full_fence
-#endif
-
-#endif // __TBB_DECL_FENCED_ATOMICS
-
-// Special atomic functions
-#ifndef __TBB_FetchAndAddWrelease
-#define __TBB_FetchAndAddWrelease __TBB_FetchAndAddW
-#endif
-
-#ifndef __TBB_FetchAndIncrementWacquire
-#define __TBB_FetchAndIncrementWacquire(P) __TBB_FetchAndAddW(P,1)
-#endif
-
-#ifndef __TBB_FetchAndDecrementWrelease
-#define __TBB_FetchAndDecrementWrelease(P) __TBB_FetchAndAddW(P,(-1))
-#endif
-
-template <typename T, size_t S>
-struct __TBB_machine_load_store {
- static inline T load_with_acquire(const volatile T& location) {
- T to_return = location;
- __TBB_release_consistency_helper();
- return to_return;
- }
-
- static inline void store_with_release(volatile T &location, T value) {
- __TBB_release_consistency_helper();
- location = value;
- }
-};
-
-#if __TBB_WORDSIZE==4 && __TBB_64BIT_ATOMICS
-#if _MSC_VER
-using tbb::internal::int64_t;
-#endif
-// On 32-bit platforms, there should be definition of __TBB_Store8 and __TBB_Load8
-#ifndef __TBB_Store8
-inline void __TBB_Store8 (volatile void *ptr, int64_t value) {
- for(;;) {
- int64_t result = *(int64_t *)ptr;
- if( __TBB_CompareAndSwap8(ptr,value,result)==result ) break;
- }
-}
-#endif
-
-#ifndef __TBB_Load8
-inline int64_t __TBB_Load8 (const volatile void *ptr) {
- const int64_t anyvalue = 3264; // Could be anything, just the same for comparand and new value
- return __TBB_CompareAndSwap8(const_cast<volatile void *>(ptr),anyvalue,anyvalue);
-}
-#endif
-
-template <typename T>
-struct __TBB_machine_load_store<T,8> {
- static inline T load_with_acquire(const volatile T& location) {
- T to_return = (T)__TBB_Load8((const volatile void*)&location);
- __TBB_release_consistency_helper();
- return to_return;
- }
-
- static inline void store_with_release(volatile T& location, T value) {
- __TBB_release_consistency_helper();
- __TBB_Store8((volatile void *)&location,(int64_t)value);
- }
-};
-#endif /* __TBB_WORDSIZE==4 */
-
-#ifndef __TBB_load_with_acquire
-template<typename T>
-inline T __TBB_load_with_acquire(const volatile T &location) {
- return __TBB_machine_load_store<T,sizeof(T)>::load_with_acquire(location);
-}
-#endif
-
-#ifndef __TBB_store_with_release
-template<typename T, typename V>
-inline void __TBB_store_with_release(volatile T& location, V value) {
- __TBB_machine_load_store<T,sizeof(T)>::store_with_release(location,T(value));
-}
-//! Overload that exists solely to avoid /Wp64 warnings.
-inline void __TBB_store_with_release(volatile size_t& location, size_t value) {
- __TBB_machine_load_store<size_t,sizeof(size_t)>::store_with_release(location,value);
-}
-#endif
+// Mapping historically used names to the ones expected by atomic_load_store_traits
+#define __TBB_load_acquire __TBB_load_with_acquire
+#define __TBB_store_release __TBB_store_with_release
#ifndef __TBB_Log2
inline intptr_t __TBB_Log2( uintptr_t x ) {
@@ -663,18 +778,19 @@ inline void __TBB_AtomicAND( volatile void *operand, uintptr_t addend ) {
}
#endif
-#ifndef __TBB_Byte
-typedef unsigned char __TBB_Byte;
+#ifndef __TBB_Flag
+typedef unsigned char __TBB_Flag;
#endif
+typedef __TBB_atomic __TBB_Flag __TBB_atomic_flag;
#ifndef __TBB_TryLockByte
-inline bool __TBB_TryLockByte( __TBB_Byte &flag ) {
- return __TBB_CompareAndSwap1(&flag,1,0)==0;
+inline bool __TBB_TryLockByte( __TBB_atomic_flag &flag ) {
+ return __TBB_machine_cmpswp1(&flag,1,0)==0;
}
#endif
#ifndef __TBB_LockByte
-inline uintptr_t __TBB_LockByte( __TBB_Byte& flag ) {
+inline __TBB_Flag __TBB_LockByte( __TBB_atomic_flag& flag ) {
if ( !__TBB_TryLockByte(flag) ) {
tbb::internal::atomic_backoff b;
do {
@@ -694,8 +810,7 @@ inline unsigned char __TBB_ReverseByte(unsigned char src) {
#endif
template<typename T>
-T __TBB_ReverseBits(T src)
-{
+T __TBB_ReverseBits(T src) {
T dst;
unsigned char *original = (unsigned char *) &src;
unsigned char *reversed = (unsigned char *) &dst;
diff --git a/include/tbb/tbb_stddef.h b/include/tbb/tbb_stddef.h
index 2e834ac..7b25555 100644
--- a/include/tbb/tbb_stddef.h
+++ b/include/tbb/tbb_stddef.h
@@ -30,11 +30,11 @@
#define __TBB_tbb_stddef_H
// Marketing-driven product version
-#define TBB_VERSION_MAJOR 3
+#define TBB_VERSION_MAJOR 4
#define TBB_VERSION_MINOR 0
// Engineering-focused interface version
-#define TBB_INTERFACE_VERSION 5006
+#define TBB_INTERFACE_VERSION 6000
#define TBB_INTERFACE_VERSION_MAJOR TBB_INTERFACE_VERSION/1000
// The oldest major interface version still supported
@@ -126,56 +126,65 @@
// tbb_config.h should be included the first since it contains macro definitions used in other headers
#include "tbb_config.h"
-#if _MSC_VER
-// define the parts of stdint.h that are needed, but put them inside tbb::internal
-namespace tbb {
-namespace internal {
- typedef __int8 int8_t;
- typedef __int16 int16_t;
- typedef __int32 int32_t;
- typedef __int64 int64_t;
- typedef unsigned __int8 uint8_t;
- typedef unsigned __int16 uint16_t;
- typedef unsigned __int32 uint32_t;
- typedef unsigned __int64 uint64_t;
-} // namespace internal
-} // namespace tbb
-#else
-#include <stdint.h>
-#endif /* _MSC_VER */
-
#if _MSC_VER >=1400
-#define __TBB_EXPORTED_FUNC __cdecl
-#define __TBB_EXPORTED_METHOD __thiscall
+ #define __TBB_EXPORTED_FUNC __cdecl
+ #define __TBB_EXPORTED_METHOD __thiscall
#else
-#define __TBB_EXPORTED_FUNC
-#define __TBB_EXPORTED_METHOD
+ #define __TBB_EXPORTED_FUNC
+ #define __TBB_EXPORTED_METHOD
#endif
#include <cstddef> /* Need size_t and ptrdiff_t */
#if _MSC_VER
-#define __TBB_tbb_windef_H
-#include "_tbb_windef.h"
-#undef __TBB_tbb_windef_H
+ #define __TBB_tbb_windef_H
+ #include "internal/_tbb_windef.h"
+ #undef __TBB_tbb_windef_H
+#else
+ #include <stdint.h>
#endif
//! The namespace tbb contains all components of the library.
namespace tbb {
-using std::size_t; using std::ptrdiff_t;
+#if _MSC_VER
+ namespace internal {
+ typedef __int8 int8_t;
+ typedef __int16 int16_t;
+ typedef __int32 int32_t;
+ typedef __int64 int64_t;
+ typedef unsigned __int8 uint8_t;
+ typedef unsigned __int16 uint16_t;
+ typedef unsigned __int32 uint32_t;
+ typedef unsigned __int64 uint64_t;
+ } // namespace internal
+#else /* Posix */
+ namespace internal {
+ using ::int8_t;
+ using ::int16_t;
+ using ::int32_t;
+ using ::int64_t;
+ using ::uint8_t;
+ using ::uint16_t;
+ using ::uint32_t;
+ using ::uint64_t;
+ } // namespace internal
+#endif /* Posix */
+
+ using std::size_t;
+ using std::ptrdiff_t;
//! Type for an assertion handler
typedef void(*assertion_handler_type)( const char* filename, int line, const char* expression, const char * comment );
#if TBB_USE_ASSERT
-//! Assert that x is true.
-/** If x is false, print assertion failure message.
- If the comment argument is not NULL, it is printed as part of the failure message.
- The comment argument has no other effect. */
-#define __TBB_ASSERT(predicate,message) ((predicate)?((void)0):tbb::assertion_failure(__FILE__,__LINE__,#predicate,message))
-#define __TBB_ASSERT_EX __TBB_ASSERT
+ //! Assert that x is true.
+ /** If x is false, print assertion failure message.
+ If the comment argument is not NULL, it is printed as part of the failure message.
+ The comment argument has no other effect. */
+ #define __TBB_ASSERT(predicate,message) ((predicate)?((void)0):tbb::assertion_failure(__FILE__,__LINE__,#predicate,message))
+ #define __TBB_ASSERT_EX __TBB_ASSERT
//! Set assertion handler and return previous value of it.
assertion_handler_type __TBB_EXPORTED_FUNC set_assertion_handler( assertion_handler_type new_handler );
@@ -186,14 +195,14 @@ using std::size_t; using std::ptrdiff_t;
Otherwise call the assertion handler. */
void __TBB_EXPORTED_FUNC assertion_failure( const char* filename, int line, const char* expression, const char* comment );
-#else
+#else /* !TBB_USE_ASSERT */
-//! No-op version of __TBB_ASSERT.
-#define __TBB_ASSERT(predicate,comment) ((void)0)
-//! "Extended" version is useful to suppress warnings if a variable is only used with an assert
-#define __TBB_ASSERT_EX(predicate,comment) ((void)(1 && (predicate)))
+ //! No-op version of __TBB_ASSERT.
+ #define __TBB_ASSERT(predicate,comment) ((void)0)
+ //! "Extended" version is useful to suppress warnings if a variable is only used with an assert
+ #define __TBB_ASSERT_EX(predicate,comment) ((void)(1 && (predicate)))
-#endif /* TBB_USE_ASSERT */
+#endif /* !TBB_USE_ASSERT */
//! The function returns the interface version of the TBB shared library being used.
/**
@@ -222,6 +231,27 @@ namespace internal {
@ingroup memory_allocation */
const size_t NFS_MaxLineSize = 128;
+/** Label for data that may be accessed from different threads, and that may eventually become wrapped
+ in a formal atomic type.
+
+ Note that no problems have yet been observed relating to the definition currently being empty,
+ even if at least "volatile" would seem to be in order to avoid data sometimes temporarily hiding
+ in a register (although "volatile" as a "poor man's atomic" lacks several other features of a proper
+ atomic, some of which are now provided instead through specialized functions).
+
+ Note that usage is intentionally compatible with a definition as qualifier "volatile",
+ both as a way to have the compiler help enforce use of the label and to quickly rule out
+ one potential issue.
+
+ Note however that, with some architecture/compiler combinations, e.g. on Itanium, "volatile"
+ also has non-portable memory semantics that are needlessly expensive for "relaxed" operations.
+
+ Note that this must only be applied to data that will not change bit patterns when cast to/from
+ an integral type of the same length; tbb::atomic must be used instead for, e.g., floating-point types.
+
+ TODO: apply wherever relevant **/
+#define __TBB_atomic // intentionally empty, see above
+
template<class T, int S>
struct padded_base : T {
char pad[NFS_MaxLineSize - sizeof(T) % NFS_MaxLineSize];
diff --git a/include/tbb/tbb_thread.h b/include/tbb/tbb_thread.h
index 41890e7..5e71132 100644
--- a/include/tbb/tbb_thread.h
+++ b/include/tbb/tbb_thread.h
@@ -63,7 +63,7 @@ namespace internal {
} // namespace internal
-void swap( internal::tbb_thread_v3& t1, internal::tbb_thread_v3& t2 );
+inline void swap( internal::tbb_thread_v3& t1, internal::tbb_thread_v3& t2 );
namespace internal {
diff --git a/index.html b/index.html
index c128a07..2dae025 100644
--- a/index.html
+++ b/index.html
@@ -33,10 +33,9 @@ To port TBB to a new platform, operating system or architecture, see the <A HREF
<HR>
<p></p>
Copyright © 2005-2011 Intel Corporation. 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>
+Intel is a registered trademark or trademark 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.
</BODY>
diff --git a/src/Makefile b/src/Makefile
index 36aab05..24fd3d0 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -28,7 +28,7 @@ tbb_root?=..
examples_root:=$(tbb_root)/examples
include $(tbb_root)/build/common.inc
-.PHONY: all tbb tbbmalloc test test_no_depends release debug examples clean
+.PHONY: all tbb tbbmalloc tbbproxy test test_no_depends release debug examples clean
all: release debug examples
@@ -36,17 +36,19 @@ tbb: tbb_release tbb_debug
tbbmalloc: tbbmalloc_release tbbmalloc_debug
+tbbproxy: tbbproxy_release tbbproxy_debug
+
rml: rml_release rml_debug
-test: tbbmalloc_test_release rml_test_release test_release tbbmalloc_test_debug rml_test_debug test_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_no_depends: tbbmalloc_test_release_no_depends test_release_no_depends tbbmalloc_test_debug_no_depends test_debug_no_depends
+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
@echo done
-release: tbb_release tbbmalloc_release
+release: tbb_release tbbmalloc_release $(if $(use_proxy),tbbproxy_release)
release: $(call cross_cfg,tbbmalloc_test_release) $(call cross_cfg,test_release)
-debug: tbb_debug tbbmalloc_debug
+debug: tbb_debug tbbmalloc_debug $(if $(use_proxy),tbbproxy_debug)
debug: $(call cross_cfg,tbbmalloc_test_debug) $(call cross_cfg, test_debug)
examples: tbb tbbmalloc examples_debug clean_examples examples_release
@@ -97,11 +99,11 @@ 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) test_release_no_depends
-test_release_no_depends:
- $(MAKE) -C "$(call cross_cfg,$(work_dir)_release)" -r -f $(tbb_root)/build/Makefile.test cfg=release 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:
+ $(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) test_debug_no_depends
+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:
$(MAKE) -C "$(call cross_cfg,$(work_dir)_debug)" -r -f $(tbb_root)/build/Makefile.test cfg=debug tbb_root=$(tbb_root)
@@ -131,11 +133,30 @@ 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:
- $(MAKE) -C "$(call cross_cfg,$(work_dir)_release)" -r -f $(tbb_root)/build/Makefile.tbbmalloc cfg=release malloc_test tbb_root=$(tbb_root)
+ $(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:
- $(MAKE) -C "$(call cross_cfg,$(work_dir)_debug)" -r -f $(tbb_root)/build/Makefile.tbbmalloc cfg=debug malloc_test tbb_root=$(tbb_root)
+ $(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
+.PHONY: tbbproxy_test tbbproxy_test_release tbbproxy_test_debug tbbproxy_test_release_no_depends tbbproxy_test_debug_no_depends
+
+tbbproxy_release: mkdir_release tbb_release
+ $(MAKE) -C "$(work_dir)_release" -r -f $(tbb_root)/build/Makefile.tbbproxy cfg=release tbbproxy tbb_root=$(tbb_root)
+
+tbbproxy_debug: mkdir_debug tbb_debug
+ $(MAKE) -C "$(work_dir)_debug" -r -f $(tbb_root)/build/Makefile.tbbproxy cfg=debug tbbproxy tbb_root=$(tbb_root)
+
+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:
+ $(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:
+ $(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
.PHONY: rml_test_release_no_depends rml_test_debug_no_depends
diff --git a/src/index.html b/src/index.html
index a57588a..3a89fab 100644
--- a/src/index.html
+++ b/src/index.html
@@ -67,10 +67,9 @@ This directory contains the source code and unit tests for Threading Building Bl
<A HREF="../index.html">Up to parent directory</A>
<p></p>
Copyright © 2005-2011 Intel Corporation. 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>
+Intel is a registered trademark or trademark 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.
</BODY>
diff --git a/src/old/concurrent_queue_v2.h b/src/old/concurrent_queue_v2.h
index bb1385a..994128f 100644
--- a/src/old/concurrent_queue_v2.h
+++ b/src/old/concurrent_queue_v2.h
@@ -52,21 +52,20 @@ class concurrent_queue_base: no_copy {
friend class concurrent_queue_rep;
friend struct micro_queue;
-#ifdef __IBMCPP__
- // In C++ 2003, friend micro_queue's rights do not extend to pop_finalizer's
- // nested class member variable my_page. So, strictly speaking, this assumes C++0x.
- friend class micro_queue::pop_finalizer;
-#endif
friend class concurrent_queue_iterator_rep;
friend class concurrent_queue_iterator_base;
-protected:
+ // In C++ 1998/2003 (but quite likely not beyond), friend micro_queue's rights
+ // do not apply to the declaration of micro_queue::pop_finalizer::my_page,
+ // as a member of a class nested within that friend class, so...
+public:
//! Prefix on a page
struct page {
page* next;
uintptr_t mask;
};
+protected:
//! Capacity of the queue
ptrdiff_t my_capacity;
diff --git a/src/old/concurrent_vector_v2.h b/src/old/concurrent_vector_v2.h
index 2b44449..68f7547 100644
--- a/src/old/concurrent_vector_v2.h
+++ b/src/old/concurrent_vector_v2.h
@@ -97,11 +97,11 @@ namespace internal {
struct segment_t {
/** Declared volatile because in weak memory model, must have ld.acq/st.rel */
void* volatile array;
-#if TBB_DO_ASSERT
+#if TBB_USE_ASSERT
~segment_t() {
__TBB_ASSERT( !array, "should have been set to NULL by clear" );
}
-#endif /* TBB_DO_ASSERT */
+#endif /* TBB_USE_ASSERT */
};
atomic<segment_t*> my_segment;
diff --git a/src/old/spin_rw_mutex_v2.h b/src/old/spin_rw_mutex_v2.h
index 23a4330..8bab4ae 100644
--- a/src/old/spin_rw_mutex_v2.h
+++ b/src/old/spin_rw_mutex_v2.h
@@ -72,12 +72,12 @@ public:
//! Construct unacquired mutex.
spin_rw_mutex() : state(0) {}
-#if TBB_DO_ASSERT
+#if TBB_USE_ASSERT
//! Destructor asserts if the mutex is acquired, i.e. state is zero.
~spin_rw_mutex() {
__TBB_ASSERT( !state, "destruction of an acquired mutex");
};
-#endif /* TBB_DO_ASSERT */
+#endif /* TBB_USE_ASSERT */
//! The scoped locking pattern
/** It helps to avoid the common problem of forgetting to release lock.
@@ -123,11 +123,11 @@ public:
spin_rw_mutex *m = mutex;
mutex = NULL;
if( is_writer ) {
-#if TBB_DO_THREADING_TOOLS||TBB_DO_ASSERT
+#if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT
internal_release_writer(m);
#else
m->state = 0;
-#endif /* TBB_DO_THREADING_TOOLS||TBB_DO_ASSERT */
+#endif /* TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT */
} else {
internal_release_reader(m);
}
@@ -135,7 +135,7 @@ public:
//! Downgrade writer to become a reader.
bool downgrade_to_reader() {
-#if TBB_DO_THREADING_TOOLS||TBB_DO_ASSERT
+#if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT
__TBB_ASSERT( mutex, "lock is not acquired" );
__TBB_ASSERT( is_writer, "not a writer" );
internal_downgrade(mutex);
diff --git a/src/perf/perf.h b/src/perf/perf.h
index 0c13b9d..42ff1d1 100644
--- a/src/perf/perf.h
+++ b/src/perf/perf.h
@@ -26,7 +26,6 @@
the GNU General Public License.
*/
-
#ifndef __tbb_perf_h__
#define __tbb_perf_h__
diff --git a/src/perf/time_hash_map.cpp b/src/perf/time_hash_map.cpp
index b3a5535..9b86ed1 100644
--- a/src/perf/time_hash_map.cpp
+++ b/src/perf/time_hash_map.cpp
@@ -60,7 +60,7 @@
#include "tbb/spin_rw_mutex.h"
#include "tbb/aligned_space.h"
#include "tbb/atomic.h"
-#include "tbb/_concurrent_unordered_internal.h"
+#include "tbb/internal/_concurrent_unordered_impl.h"
// for test
#include "tbb/spin_mutex.h"
#include "time_framework.h"
diff --git a/src/perf/time_hash_map_fill.cpp b/src/perf/time_hash_map_fill.cpp
index 01e1aa5..3d3996f 100644
--- a/src/perf/time_hash_map_fill.cpp
+++ b/src/perf/time_hash_map_fill.cpp
@@ -69,7 +69,7 @@ int MAX_TABLE_SIZE = 2000000;
#include "tbb/spin_rw_mutex.h"
#include "tbb/aligned_space.h"
#include "tbb/atomic.h"
-#include "tbb/_concurrent_unordered_internal.h"
+#include "tbb/internal/_concurrent_unordered_impl.h"
// for test
#include "tbb/spin_mutex.h"
#include "time_framework.h"
diff --git a/src/perf/time_hash_map_fill.html b/src/perf/time_hash_map_fill.html
index f5f1864..2f36d1e 100644
--- a/src/perf/time_hash_map_fill.html
+++ b/src/perf/time_hash_map_fill.html
@@ -111,10 +111,9 @@ In addition, a size of the source array correlates with input rates in order to
<A HREF="../index.html">Up to parent directory</A>
<p></p>
Copyright © 2005-2011 Intel Corporation. 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>
+Intel is a registered trademark or trademark 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.
</BODY>
diff --git a/src/rml/client/index.html b/src/rml/client/index.html
index 8a22f54..4807347 100644
--- a/src/rml/client/index.html
+++ b/src/rml/client/index.html
@@ -32,10 +32,9 @@ This directory has source code that must be statically linked into an RML client
<A HREF="../index.html">Up to parent directory</A>
<p></p>
Copyright © 2005-2011 Intel Corporation. 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>
+Intel is a registered trademark or trademark 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.
</BODY>
diff --git a/src/rml/include/index.html b/src/rml/include/index.html
index a580ac5..3de3a77 100644
--- a/src/rml/include/index.html
+++ b/src/rml/include/index.html
@@ -19,10 +19,9 @@ This directory has the include files for the Resource Management Layer (RML).
<A HREF="../index.html">Up to parent directory</A>
<p></p>
Copyright © 2005-2011 Intel Corporation. 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>
+Intel is a registered trademark or trademark 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.
</BODY>
diff --git a/src/rml/index.html b/src/rml/index.html
index e390620..8a3f350 100644
--- a/src/rml/index.html
+++ b/src/rml/index.html
@@ -21,10 +21,9 @@ The subdirectories pertain to the Resource Management Layer (RML).
<A HREF="../index.html">Up to parent directory</A>
<p></p>
Copyright © 2005-2011 Intel Corporation. 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>
+Intel is a registered trademark or trademark 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.
</BODY>
diff --git a/src/rml/server/index.html b/src/rml/server/index.html
index cb61e8e..27ea108 100644
--- a/src/rml/server/index.html
+++ b/src/rml/server/index.html
@@ -8,10 +8,9 @@ This directory has source code internal to the server.
<A HREF="../index.html">Up to parent directory</A>
<p></p>
Copyright © 2005-2011 Intel Corporation. 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>
+Intel is a registered trademark or trademark 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.
</BODY>
diff --git a/src/rml/server/thread_monitor.h b/src/rml/server/thread_monitor.h
index 9e690c9..c5d8467 100644
--- a/src/rml/server/thread_monitor.h
+++ b/src/rml/server/thread_monitor.h
@@ -45,6 +45,8 @@
#endif
#include <stdio.h>
#include "tbb/itt_notify.h"
+#include "tbb/atomic.h"
+#include "tbb/semaphore.h"
// All platform-specific threading support is in this header.
@@ -70,8 +72,7 @@ namespace internal {
#if DO_ITT_NOTIFY
static const ::tbb::tchar *SyncType_RML = _T("%Constant");
-static const ::tbb::tchar *SyncObj_ThreadMonitorLock = _T("RML Lock"),
- *SyncObj_ThreadMonitor = _T("RML Thr Monitor");
+static const ::tbb::tchar *SyncObj_ThreadMonitor = _T("RML Thr Monitor");
#endif /* DO_ITT_NOTIFY */
//! Monitor with limited two-phase commit form of wait.
@@ -80,10 +81,14 @@ class thread_monitor {
public:
class cookie {
friend class thread_monitor;
- unsigned long long my_version;
+ tbb::atomic<size_t> my_epoch;
};
- thread_monitor();
- ~thread_monitor();
+ thread_monitor() : spurious(false) {
+ my_cookie.my_epoch = 0;
+ ITT_SYNC_CREATE(&my_sema, SyncType_RML, SyncObj_ThreadMonitor);
+ in_wait = false;
+ }
+ ~thread_monitor() {}
//! If a thread is waiting or started a two-phase wait, notify it.
/** Can be called by any thread. */
@@ -119,14 +124,12 @@ public:
private:
cookie my_cookie;
-#if USE_WINTHREAD
- CRITICAL_SECTION critical_section;
- HANDLE event;
-#elif USE_PTHREAD
- pthread_mutex_t my_mutex;
- pthread_cond_t my_cond;
+ tbb::atomic<bool> in_wait;
+ bool spurious;
+ tbb::internal::binary_semaphore my_sema;
+#if USE_PTHREAD
static void check( int error_code, const char* routine );
-#endif /* USE_PTHREAD */
+#endif
};
#if USE_WINTHREAD
@@ -155,47 +158,6 @@ inline void thread_monitor::launch( thread_routine_type thread_routine, void* ar
inline void thread_monitor::yield() {
SwitchToThread();
}
-
-inline thread_monitor::thread_monitor() {
- event = CreateEvent( NULL, /*manualReset=*/true, /*initialState=*/false, NULL );
- InitializeCriticalSection( &critical_section );
- ITT_SYNC_CREATE(&event, SyncType_RML, SyncObj_ThreadMonitor);
- ITT_SYNC_CREATE(&critical_section, SyncType_RML, SyncObj_ThreadMonitorLock);
- my_cookie.my_version = 0;
-}
-
-inline thread_monitor::~thread_monitor() {
- // Fake prepare/acquired pair for Intel(R) Parallel Amplifier to correctly attribute the operations below
- ITT_NOTIFY( sync_prepare, &event );
- CloseHandle( event );
- DeleteCriticalSection( &critical_section );
- ITT_NOTIFY( sync_acquired, &event );
-}
-
-inline void thread_monitor::notify() {
- EnterCriticalSection( &critical_section );
- ++my_cookie.my_version;
- SetEvent( event );
- LeaveCriticalSection( &critical_section );
-}
-
-inline void thread_monitor::prepare_wait( cookie& c ) {
- EnterCriticalSection( &critical_section );
- c = my_cookie;
-}
-
-inline void thread_monitor::commit_wait( cookie& c ) {
- ResetEvent( event );
- LeaveCriticalSection( &critical_section );
- while( my_cookie.my_version==c.my_version ) {
- WaitForSingleObject( event, INFINITE );
- ResetEvent( event );
- }
-}
-
-inline void thread_monitor::cancel_wait() {
- LeaveCriticalSection( &critical_section );
-}
#endif /* USE_WINTHREAD */
#if USE_PTHREAD
@@ -212,9 +174,8 @@ inline void thread_monitor::launch( void* (*thread_routine)(void*), void* arg, s
// 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");
- }
+ 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" );
@@ -223,43 +184,35 @@ inline void thread_monitor::launch( void* (*thread_routine)(void*), void* arg, s
inline void thread_monitor::yield() {
sched_yield();
}
-
-inline thread_monitor::thread_monitor() {
- check( pthread_cond_init(&my_cond,NULL), "pthread_cond_init" );
- check( pthread_mutex_init(&my_mutex,NULL), "pthread_mutex_init" );
- ITT_SYNC_CREATE(&my_cond, SyncType_RML, SyncObj_ThreadMonitor);
- ITT_SYNC_CREATE(&my_mutex, SyncType_RML, SyncObj_ThreadMonitorLock);
- my_cookie.my_version = 0;
-}
-
-inline thread_monitor::~thread_monitor() {
- pthread_cond_destroy(&my_cond);
- pthread_mutex_destroy(&my_mutex);
-}
+#endif /* USE_PTHREAD */
inline void thread_monitor::notify() {
- check( pthread_mutex_lock( &my_mutex ), "pthread_mutex_lock" );
- ++my_cookie.my_version;
- check( pthread_mutex_unlock( &my_mutex ), "pthread_mutex_unlock" );
- check( pthread_cond_signal(&my_cond), "pthread_cond_signal" );
+ my_cookie.my_epoch = my_cookie.my_epoch + 1;
+ bool do_signal = in_wait.fetch_and_store( false );
+ if( do_signal )
+ my_sema.V();
}
inline void thread_monitor::prepare_wait( cookie& c ) {
- check( pthread_mutex_lock( &my_mutex ), "pthread_mutex_lock" );
+ if( spurious ) {
+ spurious = false;
+ // consumes a spurious posted signal. don't wait on my_sema.
+ my_sema.P();
+ }
c = my_cookie;
+ in_wait = true;
+ __TBB_full_memory_fence();
}
inline void thread_monitor::commit_wait( cookie& c ) {
- while( my_cookie.my_version==c.my_version ) {
- pthread_cond_wait( &my_cond, &my_mutex );
- }
- check( pthread_mutex_unlock( &my_mutex ), "pthread_mutex_unlock" );
+ bool do_it = ( c.my_epoch == my_cookie.my_epoch);
+ if( do_it ) my_sema.P();
+ else cancel_wait();
}
inline void thread_monitor::cancel_wait() {
- check( pthread_mutex_unlock( &my_mutex ), "pthread_mutex_unlock" );
+ spurious = ! in_wait.fetch_and_store( false );
}
-#endif /* USE_PTHREAD */
} // namespace internal
} // namespace rml
diff --git a/src/rml/test/test_thread_monitor.cpp b/src/rml/test/test_thread_monitor.cpp
index 747bda6..f486d6b 100644
--- a/src/rml/test/test_thread_monitor.cpp
+++ b/src/rml/test/test_thread_monitor.cpp
@@ -29,6 +29,7 @@
#include "thread_monitor.h"
#include "harness.h"
#include "harness_memory.h"
+#include "tbb/semaphore.cpp"
class ThreadState {
void loop();
diff --git a/src/tbb/arena.cpp b/src/tbb/arena.cpp
index 5eff384..b9efae9 100644
--- a/src/tbb/arena.cpp
+++ b/src/tbb/arena.cpp
@@ -49,9 +49,7 @@ void arena::process( generic_scheduler& s ) {
__TBB_ASSERT( is_alive(my_guard), NULL );
__TBB_ASSERT( governor::is_set(&s), NULL );
__TBB_ASSERT( !s.my_innermost_running_task, NULL );
-#if __TBB_TASK_PRIORITY
__TBB_ASSERT( !s.my_dispatching_task, NULL );
-#endif /* __TBB_TASK_PRIORITY */
__TBB_ASSERT( my_num_slots != 1, NULL );
// Start search for an empty slot from the one we occupied the last time
@@ -97,12 +95,10 @@ void arena::process( generic_scheduler& s ) {
// A side effect of receive_or_steal_task is that my_innermost_running_task can be set.
// But for the outermost dispatch loop of a worker it has to be NULL.
s.my_innermost_running_task = NULL;
-#if __TBB_TASK_PRIORITY
__TBB_ASSERT( !s.my_dispatching_task, NULL );
-#endif /* __TBB_TASK_PRIORITY */
s.local_wait_for_all(*s.my_dummy_task,t);
}
- __TBB_ASSERT ( my_slots[index].head == my_slots[index].tail, "Worker cannot leave arena while its task pool is not empty" );
+ __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
@@ -135,9 +131,7 @@ void arena::process( generic_scheduler& s ) {
s.my_inbox.detach();
__TBB_ASSERT( s.my_inbox.is_idle_state(true), NULL );
__TBB_ASSERT( !s.my_innermost_running_task, NULL );
-#if __TBB_TASK_PRIORITY
__TBB_ASSERT( !s.my_dispatching_task, NULL );
-#endif /* __TBB_TASK_PRIORITY */
__TBB_ASSERT( is_alive(my_guard), NULL );
quit:
// In contrast to earlier versions of TBB (before 3.0 U5) now it is possible
@@ -307,7 +301,7 @@ inline bool arena::may_have_tasks ( generic_scheduler* s, arena_slot& slot, bool
bool arena::is_out_of_work() {
// TODO: rework it to return at least a hint about where a task was found; better if the task itself.
for(;;) {
- pool_state_t snapshot = prefix().my_pool_state;
+ pool_state_t snapshot = my_pool_state;
switch( snapshot ) {
case SNAPSHOT_EMPTY:
return true;
@@ -315,7 +309,7 @@ bool arena::is_out_of_work() {
// Use unique id for "busy" in order to avoid ABA problems.
const pool_state_t busy = pool_state_t(this);
// Request permission to take snapshot
- if( prefix().my_pool_state.compare_and_swap( busy, SNAPSHOT_FULL )==SNAPSHOT_FULL ) {
+ 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
// any moment by a thread that spawns/enqueues new task.
@@ -330,9 +324,12 @@ bool arena::is_out_of_work() {
#endif /* __TBB_TASK_PRIORITY */
size_t k;
for( k=0; k<n; ++k ) {
- if( my_slots[k].task_pool != EmptyTaskPool && my_slots[k].head < my_slots[k].tail )
+ if( my_slots[k].task_pool != EmptyTaskPool &&
+ __TBB_load_relaxed(my_slots[k].head) < __TBB_load_relaxed(my_slots[k].tail) )
+ {
// k-th primary task pool is nonempty and does contain tasks.
break;
+ }
}
__TBB_ASSERT( k <= n, NULL );
bool work_absent = k == n;
@@ -379,7 +376,7 @@ bool arena::is_out_of_work() {
}
#endif /* __TBB_TASK_PRIORITY */
// Test and test-and-set.
- if( prefix().my_pool_state==busy ) {
+ if( my_pool_state==busy ) {
#if __TBB_TASK_PRIORITY
bool no_fifo_tasks = my_task_stream[top_priority].empty();
work_absent = work_absent && (!dequeuing_possible || no_fifo_tasks)
@@ -394,7 +391,7 @@ bool arena::is_out_of_work() {
if ( my_market->lower_arena_priority(*this, top_priority - 1, top_priority)
&& !my_task_stream[top_priority].empty() )
{
- atomic_update( my_skipped_fifo_priority, top_priority, std::less<uintptr_t>());
+ atomic_update( my_skipped_fifo_priority, top_priority, std::less<intptr_t>());
}
}
else if ( !tasks_present && !my_orphaned_tasks && no_fifo_tasks ) {
@@ -402,7 +399,7 @@ bool arena::is_out_of_work() {
// save current demand value before setting SNAPSHOT_EMPTY,
// to avoid race with advertise_new_work.
int current_demand = (int)my_max_num_workers;
- if( prefix().my_pool_state.compare_and_swap( SNAPSHOT_EMPTY, busy )==busy ) {
+ if( my_pool_state.compare_and_swap( SNAPSHOT_EMPTY, busy )==busy ) {
// 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 );
@@ -431,7 +428,7 @@ bool arena::is_out_of_work() {
#endif /* __TBB_TASK_PRIORITY */
}
// Undo previous transition SNAPSHOT_FULL-->busy, unless another thread undid it.
- prefix().my_pool_state.compare_and_swap( SNAPSHOT_FULL, busy );
+ my_pool_state.compare_and_swap( SNAPSHOT_FULL, busy );
}
}
return false;
diff --git a/src/tbb/arena.h b/src/tbb/arena.h
index acf783a..d4d0075 100644
--- a/src/tbb/arena.h
+++ b/src/tbb/arena.h
@@ -54,7 +54,6 @@ namespace internal {
class governor;
class arena;
-class generic_scheduler;
template<typename SchedulerTraits> class custom_scheduler;
//------------------------------------------------------------------------
@@ -182,8 +181,6 @@ private:
//! Constructor
arena ( market&, unsigned max_num_workers );
- arena& prefix() const { return const_cast<arena&>(*this); }
-
//! Allocate an instance of arena.
static arena& allocate_arena( market&, unsigned max_num_workers );
@@ -210,7 +207,7 @@ private:
__TBB_ASSERT( 0<id, "affinity id must be positive integer" );
__TBB_ASSERT( id <= my_num_slots, "affinity id out of bounds" );
- return ((mail_outbox*)&prefix())[-(int)id];
+ return ((mail_outbox*)this)[-(int)id];
}
//! Completes arena shutdown, destructs and deallocates it.
@@ -311,7 +308,7 @@ template<bool Spawned> void arena::advertise_new_work() {
if( my_max_num_workers==0 ) {
my_max_num_workers = 1;
my_mandatory_concurrency = true;
- prefix().my_pool_state = SNAPSHOT_FULL;
+ my_pool_state = SNAPSHOT_FULL;
my_market->adjust_demand( *this, 1 );
return;
}
@@ -325,16 +322,16 @@ template<bool Spawned> void arena::advertise_new_work() {
// fence might hurt overall performance more than it helps, because the fence would be executed
// on every task pool release, even when stealing does not occur. Since TBB allows parallelism,
// but never promises parallelism, the missed wakeup is not a correctness problem.
- pool_state_t snapshot = prefix().my_pool_state;
+ pool_state_t snapshot = my_pool_state;
if( is_busy_or_empty(snapshot) ) {
// Attempt to mark as full. The compare_and_swap below is a little unusual because the
// result is compared to a value that can be different than the comparand argument.
- if( prefix().my_pool_state.compare_and_swap( SNAPSHOT_FULL, snapshot )==SNAPSHOT_EMPTY ) {
+ if( my_pool_state.compare_and_swap( SNAPSHOT_FULL, snapshot )==SNAPSHOT_EMPTY ) {
if( snapshot!=SNAPSHOT_EMPTY ) {
// This thread read "busy" into snapshot, and then another thread transitioned
// my_pool_state to "empty" in the meantime, which caused the compare_and_swap above
// to fail. Attempt to transition my_pool_state from "empty" to "full".
- if( prefix().my_pool_state.compare_and_swap( SNAPSHOT_FULL, SNAPSHOT_EMPTY )!=SNAPSHOT_EMPTY ) {
+ if( my_pool_state.compare_and_swap( SNAPSHOT_FULL, SNAPSHOT_EMPTY )!=SNAPSHOT_EMPTY ) {
// Some other thread transitioned my_pool_state from "empty", and hence became
// responsible for waking up workers.
return;
diff --git a/src/tbb/cilk-tbb-interop.h b/src/tbb/cilk-tbb-interop.h
index c13e40f..b50e5f1 100644
--- a/src/tbb/cilk-tbb-interop.h
+++ b/src/tbb/cilk-tbb-interop.h
@@ -26,6 +26,8 @@
the GNU General Public License.
*/
+/* The API to enable interoperability between Intel(R) Cilk(tm) Plus and TBB. */
+
#ifndef CILK_TBB_INTEROP_H
#define CILK_TBB_INTEROP_H
@@ -63,8 +65,8 @@ typedef __cilk_tbb_retcode (*__cilk_tbb_pfn_unwatch_stacks)(void *data);
/* Each thunk structure has two pointers: "routine" and "data".
The caller of the thunk invokes *routine, passing "data" as the void* parameter. */
-/* Thunk invoked by Cilk when it changes the relationship between a stack and a thread.
- It does not matter what stack the thunk runs on.
+/* Thunk invoked by Intel Cilk Plus runtime (cilkrts) when it changes the relationship
+ between a stack and a thread. It does not matter what stack the thunk runs on.
The thread (not fiber) on which the thunk runs is important.
CILK_TBB_STACK_ORPHAN
@@ -106,9 +108,9 @@ struct __cilk_tbb_unwatch_thunk {
void* data;
};
-/* Called by TBB, defined by Cilk.
- Requests that callee invoke __cilk_tbb_stack_op_thunk when it orphans a stack.
- Callee sets *u to a thunk that TBB should call when it is no longer interested in watching the stack. */
+/* Defined by cilkrts, called by TBB.
+ Requests that cilkrts invoke __cilk_tbb_stack_op_thunk when it orphans a stack.
+ cilkrts sets *u to a thunk that TBB should call when it is no longer interested in watching the stack. */
CILK_EXPORT
__cilk_tbb_retcode __cilkrts_watch_stack(struct __cilk_tbb_unwatch_thunk* u,
struct __cilk_tbb_stack_op_thunk o);
diff --git a/src/tbb/concurrent_monitor.cpp b/src/tbb/concurrent_monitor.cpp
index 637d1b7..b155b6d 100644
--- a/src/tbb/concurrent_monitor.cpp
+++ b/src/tbb/concurrent_monitor.cpp
@@ -40,8 +40,8 @@ void concurrent_monitor::prepare_wait( thread_context& thr, void* ctx ) {
thr.context = ctx;
thr.in_waitset = true;
{
- tbb::spin_mutex::scoped_lock l( mutex_ec );
- thr.epoch = epoch;
+ spin_mutex::scoped_lock l( mutex_ec );
+ __TBB_store_relaxed( thr.epoch, __TBB_load_relaxed(epoch) );
waitset_ec.add( (waitset_t::node_t*)&thr );
}
atomic_fence();
@@ -65,31 +65,31 @@ void concurrent_monitor::cancel_wait( thread_context& thr ) {
}
void concurrent_monitor::notify_one_relaxed() {
- if( waitset_ec.size()==0 )
+ if( waitset_ec.empty() )
return;
waitset_node_t* n;
const waitset_node_t* end = waitset_ec.end();
{
tbb::spin_mutex::scoped_lock l( mutex_ec );
- epoch = epoch + 1;
+ __TBB_store_relaxed( epoch, __TBB_load_relaxed(epoch) + 1 );
n = waitset_ec.front();
if( n!=end ) {
waitset_ec.remove( *n );
to_thread_context(n)->in_waitset = false;
}
}
- if( n!=end )
+ if( n!=end )
to_thread_context(n)->sema.V();
}
void concurrent_monitor::notify_all_relaxed() {
- if( waitset_ec.size()==0 )
+ if( waitset_ec.empty() )
return;
dllist_t temp;
const waitset_node_t* end;
{
tbb::spin_mutex::scoped_lock l( mutex_ec );
- epoch = epoch + 1;
+ __TBB_store_relaxed( epoch, __TBB_load_relaxed(epoch) + 1 );
waitset_ec.flush_to( temp );
end = temp.end();
for( waitset_node_t* n=temp.front(); n!=end; n=n->next )
diff --git a/src/tbb/concurrent_monitor.h b/src/tbb/concurrent_monitor.h
index e1fbdd9..0792e5f 100644
--- a/src/tbb/concurrent_monitor.h
+++ b/src/tbb/concurrent_monitor.h
@@ -32,67 +32,68 @@
#include "tbb/tbb_stddef.h"
#include "tbb/atomic.h"
#include "tbb/spin_mutex.h"
+
#include "semaphore.h"
namespace tbb {
namespace internal {
//! Circular doubly-linked list with sentinel
-/** head.next points to the front and head.prev points to the back */
+/** head.next points to the front and head.prev points to the back */
class circular_doubly_linked_list_with_sentinel : no_copy {
-public:
+public:
struct node_t {
- node_t* next;
- node_t* prev;
- node_t() : next(NULL), prev(NULL) {}
+ node_t* next;
+ node_t* prev;
+ explicit node_t() : next((node_t*)(uintptr_t)0xcdcdcdcd), prev((node_t*)(uintptr_t)0xcdcdcdcd) {}
};
// ctor
circular_doubly_linked_list_with_sentinel() {clear();}
// dtor
~circular_doubly_linked_list_with_sentinel() {__TBB_ASSERT( head.next==&head && head.prev==&head, "the list is not empty" );}
-
- inline size_t size() const {return count;}
- inline bool empty() const {return size()==0;}
- inline node_t* front() const {return head.next;}
- inline node_t* last() const {return head.prev;}
- inline node_t* begin() const {return front();}
+
+ inline size_t size() const {return count;}
+ inline bool empty() const {return size()==0;}
+ inline node_t* front() const {return head.next;}
+ inline node_t* last() const {return head.prev;}
+ inline node_t* begin() const {return front();}
inline const node_t* end() const {return &head;}
//! add to the back of the list
inline void add( node_t* n ) {
- count = count + 1;
- n->prev = head.prev;
- n->next = &head;
- head.prev->next = n;
+ __TBB_store_relaxed(count, __TBB_load_relaxed(count) + 1);
+ n->prev = head.prev;
+ n->next = &head;
+ head.prev->next = n;
head.prev = n;
}
-
- //! remove node 'n' from the 'this' list
+
+ //! remove node 'n'
inline void remove( node_t& n ) {
- count = count - 1;
+ __TBB_store_relaxed(count, __TBB_load_relaxed(count) - 1);
n.prev->next = n.next;
n.next->prev = n.prev;
- }
+ }
- //! move all elements to 'lst' and initiallize the 'this' list
+ //! move all elements to 'lst' and initialize the 'this' list
inline void flush_to( circular_doubly_linked_list_with_sentinel& lst ) {
- if( count>0 ) {
- lst.count = count;
- lst.head.next = head.next;
+ if( const size_t l_count = __TBB_load_relaxed(count) ) {
+ __TBB_store_relaxed(lst.count, l_count);
+ lst.head.next = head.next;
lst.head.prev = head.prev;
head.next->prev = &lst.head;
head.prev->next = &lst.head;
clear();
}
}
-
+
#if !TBB_USE_DEBUG
-private:
+private:
#endif
- atomic<size_t> count;
+ __TBB_atomic size_t count;
node_t head;
- void clear() {count = 0; head.next = &head; head.prev = &head;}
+ void clear() {head.next = &head; head.prev = &head;__TBB_store_relaxed(count, 0);}
};
typedef circular_doubly_linked_list_with_sentinel waitset_t;
@@ -112,23 +113,23 @@ public:
thread_context() : spurious(false), context(NULL) {epoch = 0; in_waitset = false;}
~thread_context() { if( spurious ) sema.P(); }
private:
- semaphore sema;
- tbb::atomic<unsigned> epoch;
+ binary_semaphore sema;
+ __TBB_atomic unsigned epoch;
tbb::atomic<bool> in_waitset;
bool spurious;
void* context;
};
//! ctor
- concurrent_monitor() {epoch = 0;}
+ concurrent_monitor() {__TBB_store_relaxed(epoch, 0);}
//! prepare wait by inserting 'thr' into the wailt queue
void prepare_wait( thread_context& thr, void* ctx = 0 );
- //! Commit wait if even count has not changed; otherwise, cancel wait.
- /** Returns true of commited; false if canceled. */
+ //! Commit wait if event count has not changed; otherwise, cancel wait.
+ /** Returns true if committed, false if canceled. */
inline bool commit_wait( thread_context& thr ) {
- bool do_it = thr.epoch==epoch;
+ const bool do_it = thr.epoch == __TBB_load_relaxed(epoch);
// this check is just an optimization
if( do_it ) {
thr.sema.P();
@@ -143,39 +144,39 @@ public:
//! Notify one thread about the event
void notify_one() {atomic_fence(); notify_one_relaxed();}
-
+
//! Notify one thread about the event. Relaxed version.
void notify_one_relaxed();
//! Notify all waiting threads of the event
void notify_all() {atomic_fence(); notify_all_relaxed();}
-
+
//! Notify all waiting threads of the event; Relaxed version
void notify_all_relaxed();
//! Notify waiting threads of the event that satisfies the given predicate
template<typename P> void notify( const P& predicate ) {atomic_fence(); notify_relaxed( predicate );}
-
+
//! Notify waiting threads of the event that satisfies the given predicate; Relaxed version
template<typename P> void notify_relaxed( const P& predicate );
private:
tbb::spin_mutex mutex_ec;
waitset_t waitset_ec;
- tbb::atomic<unsigned> epoch;
+ __TBB_atomic unsigned epoch;
thread_context* to_thread_context( waitset_node_t* n ) { return static_cast<thread_context*>(n); }
};
-template<typename P>
+template<typename P>
void concurrent_monitor::notify_relaxed( const P& predicate ) {
- if( waitset_ec.size()==0 )
+ if( waitset_ec.empty() )
return;
dllist_t temp;
waitset_node_t* nxt;
const waitset_node_t* end = waitset_ec.end();
{
tbb::spin_mutex::scoped_lock l( mutex_ec );
- epoch = epoch + 1;
+ __TBB_store_relaxed(epoch, __TBB_load_relaxed(epoch) + 1);
for( waitset_node_t* n=waitset_ec.last(); n!=end; n=nxt ) {
nxt = n->prev;
thread_context* thr = to_thread_context( n );
@@ -186,7 +187,7 @@ void concurrent_monitor::notify_relaxed( const P& predicate ) {
}
}
}
-
+
end = temp.end();
for( waitset_node_t* n=temp.front(); n!=end; n=nxt ) {
nxt = n->next;
diff --git a/src/tbb/concurrent_queue.cpp b/src/tbb/concurrent_queue.cpp
index ae86be6..2923131 100644
--- a/src/tbb/concurrent_queue.cpp
+++ b/src/tbb/concurrent_queue.cpp
@@ -29,7 +29,9 @@
#include "tbb/tbb_stddef.h"
#include "tbb/tbb_machine.h"
#include "tbb/tbb_exception.h"
-#include "tbb/_concurrent_queue_internal.h"
+// Define required to satisfy test in internal file.
+#define __TBB_concurrent_queue_H
+#include "tbb/internal/_concurrent_queue_impl.h"
#include "concurrent_monitor.h"
#include "itt_notify.h"
#include <new>
diff --git a/src/tbb/custom_scheduler.h b/src/tbb/custom_scheduler.h
index 47c5adc..2be052d 100644
--- a/src/tbb/custom_scheduler.h
+++ b/src/tbb/custom_scheduler.h
@@ -41,7 +41,7 @@ namespace internal {
on the 32-way Altix and 4-way (*2 for HT) fxqlin04. */
#if __TBB_ipf
static const long PauseTime = 1500;
-#else
+#else
static const long PauseTime = 80;
#endif
@@ -79,7 +79,7 @@ class custom_scheduler: private generic_scheduler {
/*override*/
void local_wait_for_all( task& parent, task* child );
- //! Entry point from client code to the scheduler loop that dispatches tasks.
+ //! Entry point from client code to the scheduler loop that dispatches tasks.
/** The method is virtual, but the *this object is used only for sake of dispatching on the correct vtable,
not necessarily the correct *this object. The correct *this object is looked up in TLS. */
/*override*/
@@ -103,6 +103,8 @@ class custom_scheduler: private generic_scheduler {
if( __TBB_FetchAndDecrementWrelease(&p.ref_count) > 1 ) // more references exist
return;
}
+ // Ordering on p.ref_count (superfluous if SchedulerTraits::has_slow_atomic)
+ __TBB_control_consistency_helper();
__TBB_ASSERT(p.ref_count==0, "completion of task caused predecessor's reference count to underflow");
if( SchedulerTraits::itt_possible )
ITT_NOTIFY(sync_acquired, &p.ref_count);
@@ -127,7 +129,7 @@ public:
//! Try getting a task from the mailbox or stealing from another scheduler.
/** Returns the stolen task or NULL if all attempts fail. */
- /* override */ task* receive_or_steal_task( reference_count&, bool );
+ /* override */ task* receive_or_steal_task( __TBB_atomic reference_count& completion_ref_count, bool return_if_no_work );
}; // class custom_scheduler<>
@@ -136,10 +138,24 @@ public:
//------------------------------------------------------------------------
template<typename SchedulerTraits>
-task* custom_scheduler<SchedulerTraits>::receive_or_steal_task( reference_count& completion_ref_count,
+task* custom_scheduler<SchedulerTraits>::receive_or_steal_task( __TBB_atomic reference_count& completion_ref_count,
bool return_if_no_work ) {
task* t = NULL;
+ bool outermost_dispatch_level = return_if_no_work || master_outermost_level();
my_inbox.set_is_idle( true );
+#if __TBB_TASK_PRIORITY
+ if ( return_if_no_work && my_arena->my_skipped_fifo_priority ) {
+ // This thread can dequeue FIFO tasks, and some priority levels of
+ // FIFO tasks have been bypassed (to prevent deadlock caused by
+ // dynamic priority changes in nested task group hierarchy).
+ intptr_t skipped_priority = my_arena->my_skipped_fifo_priority;
+ if ( my_arena->my_skipped_fifo_priority.compare_and_swap(0, skipped_priority) == skipped_priority &&
+ skipped_priority > my_arena->my_top_priority )
+ {
+ my_market->update_arena_priority( *my_arena, skipped_priority );
+ }
+ }
+#endif /* __TBB_TASK_PRIORITY */
// 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) {
@@ -153,13 +169,14 @@ task* custom_scheduler<SchedulerTraits>::receive_or_steal_task( reference_count&
ITT_NOTIFY(sync_acquired, &completion_ref_count);
}
__TBB_ASSERT( !t, NULL );
+ __TBB_control_consistency_helper(); // on ref_count
break; // exit stealing loop and return;
}
__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
+ // 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 )
@@ -172,7 +189,7 @@ task* custom_scheduler<SchedulerTraits>::receive_or_steal_task( reference_count&
}
// 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 ( return_if_no_work && (t=dequeue_task()) ) {
+ else if ( outermost_dispatch_level && (t = dequeue_task()) ) {
// just proceed with the obtained task
}
#if __TBB_TASK_PRIORITY
@@ -185,9 +202,9 @@ task* custom_scheduler<SchedulerTraits>::receive_or_steal_task( reference_count&
// 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
+ // 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
+ // 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 )
@@ -195,8 +212,13 @@ task* custom_scheduler<SchedulerTraits>::receive_or_steal_task( reference_count&
t = steal_task( *victim );
if( !t ) goto fail;
if( is_proxy(*t) ) {
- t = strip_proxy((task_proxy*)t);
- if( !t ) goto fail;
+ 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 );
}
t->prefix().extra_state |= es_task_is_stolen;
@@ -256,7 +278,7 @@ fail:
task** link = NULL;
// Get local counter out of the way (we've just brought in external tasks)
my_local_reload_epoch = 0;
- t = reload_tasks( orphans, link, *my_ref_top_priority );
+ t = reload_tasks( orphans, link, effective_reference_priority() );
if ( orphans ) {
*link = my_offloaded_tasks;
if ( !my_offloaded_tasks )
@@ -289,7 +311,7 @@ fail:
}
if ( my_offloaded_tasks ) {
// Safeguard against any sloppiness in managing reload epoch
- // counter (e.g. on the hot path bacause of performnace reasons).
+ // counter (e.g. on the hot path bacause of performance reasons).
my_local_reload_epoch = 0;
// Break the deadlock caused by a higher priority dispatch loop
// stealing and offloading a lower priority task. Priority check
@@ -315,7 +337,7 @@ void custom_scheduler<SchedulerTraits>::local_wait_for_all( task& parent, task*
__TBB_ASSERT( governor::is_set(this), NULL );
__TBB_ASSERT( parent.ref_count() >= (child && child->parent() == &parent ? 2 : 1), "ref_count is too small" );
assert_task_pool_valid();
- // Using parent's refcount in sync_prepare (in the stealing loop below) is
+ // Using parent's refcount in sync_prepare (in the stealing loop below) is
// a workaround for TP. We need to name it here to display correctly in Ampl.
if( SchedulerTraits::itt_possible )
ITT_SYNC_CREATE(&parent.prefix().ref_count, SyncType_Scheduler, SyncObj_TaskStealingLoop);
@@ -324,9 +346,9 @@ void custom_scheduler<SchedulerTraits>::local_wait_for_all( task& parent, task*
#endif /* __TBB_TASK_GROUP_CONTEXT */
task* t = child;
// Constant all_local_work_done is an unreacheable refcount value that prevents
- // early quitting the dispatch loop. It is defined to be in the middle of the range
+ // early quitting the dispatch loop. It is defined to be in the middle of the range
// of negative values representable by the reference_count type.
- static const reference_count
+ static const reference_count
// For normal dispatch loops
parents_work_done = 1,
// For termination dispatch loops in masters
@@ -338,11 +360,9 @@ void custom_scheduler<SchedulerTraits>::local_wait_for_all( task& parent, task*
// When entering nested parallelism level market level counter
// must be replaced with the one local to this arena.
volatile uintptr_t *old_ref_reload_epoch = my_ref_reload_epoch;
+#endif /* __TBB_TASK_PRIORITY */
task* old_dispatching_task = my_dispatching_task;
my_dispatching_task = my_innermost_running_task;
-#else /* !__TBB_TASK_PRIORITY */
- task* old_innermost_running_task = my_innermost_running_task;
-#endif /* __TBB_TASK_PRIORITY */
if( master_outermost_level() ) {
// We are in the outermost task dispatch loop of a master thread,
__TBB_ASSERT( !is_worker(), NULL );
@@ -370,7 +390,7 @@ void custom_scheduler<SchedulerTraits>::local_wait_for_all( task& parent, task*
for(;;) {
// Middle loop retrieves tasks from the local task pool.
do {
- // Inner loop evaluates tasks coming from nesting loops and those returned
+ // Inner loop evaluates tasks coming from nesting loops and those returned
// by just executed tasks (bypassing spawn or enqueue calls).
while(t) {
__TBB_ASSERT( my_inbox.is_idle_state(false), NULL );
@@ -378,7 +398,7 @@ void custom_scheduler<SchedulerTraits>::local_wait_for_all( task& parent, task*
__TBB_ASSERT( t->prefix().owner, NULL );
assert_task_valid(*t);
#if __TBB_TASK_GROUP_CONTEXT && TBB_USE_ASSERT
- if ( !t->prefix().context->my_cancellation_requested )
+ if ( !t->prefix().context->my_cancellation_requested )
#endif
__TBB_ASSERT( 1L<<t->state() & (1L<<task::allocated|1L<<task::ready|1L<<task::reexecute), NULL );
assert_task_pool_valid();
@@ -389,7 +409,7 @@ void custom_scheduler<SchedulerTraits>::local_wait_for_all( task& parent, task*
if ( p != my_arena->my_top_priority ) {
my_market->update_arena_priority( *my_arena, p );
}
- if ( p < *my_ref_top_priority ) {
+ if ( p < effective_reference_priority() ) {
if ( !my_offloaded_tasks ) {
my_offloaded_task_list_tail_link = &t->prefix().next_offloaded;
// Erase possible reference to the owner scheduler (next_offloaded is a union member)
@@ -402,7 +422,7 @@ void custom_scheduler<SchedulerTraits>::local_wait_for_all( task& parent, task*
continue;
}
else {
- // Mark arena as full to unlock arena priority level adjustment
+ // Mark arena as full to unlock arena priority level adjustment
// by arena::is_out_of_work(), and ensure worker's presence.
my_arena->advertise_new_work<false>();
}
@@ -440,7 +460,7 @@ void custom_scheduler<SchedulerTraits>::local_wait_for_all( task& parent, task*
}
}
assert_task_pool_valid();
- switch( task::state_type(t->prefix().state) ) {
+ switch( t->state() ) {
case task::executing: {
task* s = t->parent();
__TBB_ASSERT( my_innermost_running_task==t, NULL );
@@ -489,80 +509,53 @@ void custom_scheduler<SchedulerTraits>::local_wait_for_all( task& parent, task*
} // end of scheduler bypass loop
assert_task_pool_valid();
- if ( parent.prefix().ref_count == quit_point )
- break;
- if ( in_arena() )
+ if ( parent.prefix().ref_count == quit_point ) {
+ __TBB_ASSERT( quit_point != all_local_work_done, NULL );
+ __TBB_control_consistency_helper(); // on ref_count
+ goto done;
+ }
+ if ( in_arena() ) {
t = get_task();
- else
- __TBB_ASSERT( my_arena_slot->head == 0 && my_arena_slot->tail == 0, NULL );
+ }
+ else {
+ __TBB_ASSERT( is_quiescent_local_task_pool_reset(), NULL );
+ break;
+ }
__TBB_ASSERT(!t || !is_proxy(*t),"unexpected proxy");
assert_task_pool_valid();
} while( t ); // end of local task pool retrieval loop
#if __TBB_TASK_PRIORITY
stealing_ground:
- task* &dispatching_task = my_dispatching_task;
- if ( worker_outermost_level() && my_arena->my_skipped_fifo_priority ) {
- // This thread can dequeue FIFO tasks, and some priority levels of
- // FIFO tasks have been bypassed (to prevent deadlock caused by
- // dynamic priority changes in nested task group hierarchy).
- intptr_t skipped_priority = my_arena->my_skipped_fifo_priority;
- if ( my_arena->my_skipped_fifo_priority.compare_and_swap(0, skipped_priority) == skipped_priority &&
- skipped_priority > my_arena->my_top_priority )
- {
- my_market->update_arena_priority( *my_arena, skipped_priority );
- }
- }
-#else /* !__TBB_TASK_PRIORITY */
- task* &dispatching_task = old_innermost_running_task;
#endif /* __TBB_TASK_PRIORITY */
if ( quit_point == all_local_work_done ) {
- __TBB_ASSERT( my_arena_slot == &my_dummy_slot
- && my_arena_slot->head == 0 && my_arena_slot->tail == 0, NULL );
- my_innermost_running_task = dispatching_task;
-#if __TBB_TASK_PRIORITY
+ __TBB_ASSERT( !in_arena() && is_quiescent_local_task_pool_reset(), NULL );
+ my_innermost_running_task = my_dispatching_task;
my_dispatching_task = old_dispatching_task;
+#if __TBB_TASK_PRIORITY
my_ref_top_priority = old_ref_top_priority;
my_ref_reload_epoch = old_ref_reload_epoch;
#endif /* __TBB_TASK_PRIORITY */
return;
}
- __TBB_ASSERT( my_arena->my_max_num_workers > 0 || my_market->my_ref_count > 1
- || parent.prefix().ref_count == 1, "deadlock detected" );
+ // The following assertion may be falsely triggered in the presence of enqueued tasks
+ //__TBB_ASSERT( my_arena->my_max_num_workers > 0 || my_market->my_ref_count > 1
+ // || parent.prefix().ref_count == 1, "deadlock detected" );
+
// 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, !dispatching_task );
- if (!t) {
- my_innermost_running_task = dispatching_task;
-#if __TBB_TASK_PRIORITY
- my_dispatching_task = old_dispatching_task;
- my_ref_top_priority = old_ref_top_priority;
- my_ref_reload_epoch = old_ref_reload_epoch;
-#endif /* __TBB_TASK_PRIORITY */
- 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() && !dispatching_task,
- "Worker thread exits nested dispatch loop prematurely" );
- return;
- }
- parent.prefix().ref_count = 0;
- }
-#if TBB_USE_ASSERT
- parent.prefix().extra_state &= ~es_ref_count_active;
-#endif /* TBB_USE_ASSERT */
+ t = receive_or_steal_task( parent.prefix().ref_count, !my_dispatching_task );
+ if ( !t )
goto done;
- }
- __TBB_ASSERT(t,NULL);
__TBB_ASSERT(!is_proxy(*t),"unexpected proxy");
} // end of infinite stealing loop
- __TBB_ASSERT( false, "Must never get here" );
#if __TBB_TASK_GROUP_CONTEXT && TBB_USE_EXCEPTIONS
+ __TBB_ASSERT( false, "Must never get here" );
} // end of try-block
TbbCatchAll( t->prefix().context );
// Complete post-processing ...
- if( task::state_type(t->prefix().state) == task::recycle ) {
+ if( t->state() == task::recycle ) {
// ... for tasks recycled with recycle_as_safe_continuation
t->prefix().state = task::allocated;
// for safe continuation, need to atomically decrement ref_count;
@@ -576,16 +569,34 @@ stealing_ground:
}
}
} // end of infinite EH loop
-#endif /* __TBB_TASK_GROUP_CONTEXT && TBB_USE_EXCEPTIONS */
__TBB_ASSERT( false, "Must never get here too" );
+#endif /* __TBB_TASK_GROUP_CONTEXT && TBB_USE_EXCEPTIONS */
done:
+ my_innermost_running_task = my_dispatching_task;
+ my_dispatching_task = old_dispatching_task;
+#if __TBB_TASK_PRIORITY
+ my_ref_top_priority = old_ref_top_priority;
+ my_ref_reload_epoch = old_ref_reload_epoch;
+#endif /* __TBB_TASK_PRIORITY */
+ 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,
+ "Worker thread exits nested dispatch loop prematurely" );
+ return;
+ }
+ parent.prefix().ref_count = 0;
+ }
+#if TBB_USE_ASSERT
+ parent.prefix().extra_state &= ~es_ref_count_active;
+#endif /* TBB_USE_ASSERT */
#if __TBB_TASK_GROUP_CONTEXT
__TBB_ASSERT(parent.prefix().context && default_context(), NULL);
task_group_context* parent_ctx = parent.prefix().context;
if ( parent_ctx->my_cancellation_requested ) {
task_group_context::exception_container_type *pe = parent_ctx->my_exception;
if ( master_outermost_level() && parent_ctx == default_context() ) {
- // We are in the outermost task dispatch loop of a master thread, and
+ // We are in the outermost task dispatch loop of a master thread, and
// the whole task tree has been collapsed. So we may clear cancellation data.
parent_ctx->my_cancellation_requested = 0;
// TODO: Add assertion that master's dummy task context does not have children
@@ -594,9 +605,9 @@ done:
if ( pe )
pe->throw_self();
}
- __TBB_ASSERT(!is_worker() || !CancellationInfoPresent(*my_dummy_task),
+ __TBB_ASSERT(!is_worker() || !CancellationInfoPresent(*my_dummy_task),
"Worker's dummy task context modified");
- __TBB_ASSERT(!master_outermost_level() || !CancellationInfoPresent(*my_dummy_task),
+ __TBB_ASSERT(!master_outermost_level() || !CancellationInfoPresent(*my_dummy_task),
"Unexpected exception or cancellation data in the master's dummy task");
#endif /* __TBB_TASK_GROUP_CONTEXT */
assert_task_pool_valid();
diff --git a/src/tbb/dynamic_link.cpp b/src/tbb/dynamic_link.cpp
index 7ea9197..e1b228c 100644
--- a/src/tbb/dynamic_link.cpp
+++ b/src/tbb/dynamic_link.cpp
@@ -215,16 +215,16 @@ void dynamic_unlink( dynamic_link_handle handle ) {
dlclose( handle );
#endif
(void)handle;
-#endif /* !__TBB_DYNAMIC_LOAD_ENABLED */
+#endif /* __TBB_DYNAMIC_LOAD_ENABLED */
}
}
#if __TBB_BUILD
-// 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
+// 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<>.
#define MAX_LOADED_MODULES 8 // The number of maximum possible modules which can be loaded
@@ -242,7 +242,6 @@ public:
const size_t ind = my_size++;
LIBRARY_ASSERT( ind < MAX_LOADED_MODULES, "Too many modules are loaded" );
my_handles[ind] = handle;
-
}
void free_handles() {
@@ -256,7 +255,9 @@ public:
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 _WIN32||_WIN64
+#if ! __TBB_DYNAMIC_LOAD_ENABLED
+ dynamic_link_handle library_handle = NULL;
+#elif _WIN32||_WIN64
dynamic_link_handle library_handle = GetModuleHandle( library );
#else
dynamic_link_handle library_handle = dlopen( NULL, RTLD_LAZY );
@@ -320,8 +321,6 @@ bool dynamic_link( const char* library, const dynamic_link_descriptor descriptor
#if __TBB_DYNAMIC_LOAD_ENABLED || __TBB_TASK_CPP_DIRECTLY_INCLUDED
if ( !library_handle ) {
#if _WIN32||_WIN64
- // 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)
#if _XBOX
library_handle = LoadLibrary (library);
#else
@@ -331,6 +330,8 @@ bool dynamic_link( const char* library, const dynamic_link_descriptor descriptor
char path[ len ];
size_t rc = abs_path( library, path, len );
if ( 0 < rc && rc < len ) {
+ // 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);
SetErrorMode (prev_mode);
diff --git a/src/tbb/governor.cpp b/src/tbb/governor.cpp
index 3a6b0c0..5547c64 100644
--- a/src/tbb/governor.cpp
+++ b/src/tbb/governor.cpp
@@ -44,6 +44,7 @@ namespace internal {
//------------------------------------------------------------------------
#if __TBB_SURVIVE_THREAD_SWITCH
+// Suuport for interoperability with Intel(R) Cilk(tm) Plus.
#if _WIN32
#define CILKLIB_NAME "cilkrts20.dll"
@@ -68,7 +69,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 Cilk and consequently does not need interop.
+ // thread does not use cilkrts and consequently does not need interop.
return dynamic_link( CILKLIB_NAME, CilkLinkTable, 1 );
}
#endif /* __TBB_SURVIVE_THREAD_SWITCH */
@@ -84,7 +85,7 @@ void governor::acquire_resources () {
int status = theTLS.create();
#endif
if( status )
- handle_perror(status, "TBB failed to initialize TLS storage\n");
+ handle_perror(status, "TBB failed to initialize task scheduler TLS\n");
::rml::factory::status_type res = theRMLServerFactory.open();
UsePrivateRML = res != ::rml::factory::st_success;
@@ -98,7 +99,7 @@ void governor::release_resources () {
#endif
int status = theTLS.destroy();
if( status )
- handle_perror(status, "TBB failed to destroy TLS storage");
+ handle_perror(status, "TBB failed to destroy task scheduler TLS");
dynamic_unlink_all();
}
@@ -120,16 +121,15 @@ rml::tbb_server* governor::create_rml_server ( rml::tbb_client& client ) {
}
void governor::sign_on(generic_scheduler* s) {
- __TBB_ASSERT( !s->my_registered, NULL );
- s->my_registered = true;
+ __TBB_ASSERT( !theTLS.get(), NULL );
theTLS.set(s);
#if __TBB_SURVIVE_THREAD_SWITCH
- __cilk_tbb_stack_op_thunk o;
- o.routine = &stack_op_handler;
- o.data = s;
if( watch_stack_handler ) {
+ __cilk_tbb_stack_op_thunk o;
+ o.routine = &stack_op_handler;
+ o.data = s;
if( (*watch_stack_handler)(&s->my_cilk_unwatch_thunk, o) ) {
- // Failed to register with Cilk, make sure we are clean
+ // Failed to register with cilkrts, make sure we are clean
s->my_cilk_unwatch_thunk.routine = NULL;
}
#if TBB_USE_ASSERT
@@ -141,16 +141,13 @@ void governor::sign_on(generic_scheduler* s) {
}
void governor::sign_off(generic_scheduler* s) {
- if( s->my_registered ) {
- __TBB_ASSERT( theTLS.get()==s || (!s->is_worker() && !theTLS.get()), "attempt to unregister a wrong scheduler instance" );
- theTLS.set(NULL);
- s->my_registered = false;
+ __TBB_ASSERT( theTLS.get()==s, "attempt to unregister a wrong scheduler instance" );
+ theTLS.set(NULL);
#if __TBB_SURVIVE_THREAD_SWITCH
- __cilk_tbb_unwatch_thunk &ut = s->my_cilk_unwatch_thunk;
- if ( ut.routine )
- (*ut.routine)(ut.data);
+ __cilk_tbb_unwatch_thunk &ut = s->my_cilk_unwatch_thunk;
+ if ( ut.routine )
+ (*ut.routine)(ut.data);
#endif /* __TBB_SURVIVE_THREAD_SWITCH */
- }
}
generic_scheduler* governor::init_scheduler( unsigned num_threads, stack_size_type stack_size, bool auto_init ) {
@@ -183,16 +180,12 @@ 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) ) {
- if ( !theTLS.get() && !s->local_task_pool_empty() ) {
- // This thread's TLS slot is already cleared. But in order to execute
- // remaining tasks cleanup_master() will need TLS correctly set.
- // So we temporarily restore its value.
+ // If the TLS slot is already cleared by OS or underlying concurrency
+ // runtime, restore its value.
+ if ( !theTLS.get() )
theTLS.set(s);
- s->cleanup_master();
- theTLS.set(NULL);
- }
- else
- s->cleanup_master();
+ s->cleanup_master();
+ __TBB_ASSERT( !theTLS.get(), "cleanup_master has not cleared its TLS slot" );
}
}
}
@@ -275,8 +268,8 @@ void task_scheduler_init::initialize( int number_of_threads ) {
void task_scheduler_init::initialize( int number_of_threads, stack_size_type thread_stack_size ) {
#if __TBB_TASK_GROUP_CONTEXT && TBB_USE_EXCEPTIONS
uintptr_t new_mode = thread_stack_size & propagation_mode_mask;
- thread_stack_size &= ~(stack_size_type)propagation_mode_mask;
#endif
+ thread_stack_size &= ~(stack_size_type)propagation_mode_mask;
if( number_of_threads!=deferred ) {
__TBB_ASSERT( !my_scheduler, "task_scheduler_init already initialized" );
__TBB_ASSERT( number_of_threads==-1 || number_of_threads>=1,
diff --git a/src/tbb/ia64-gas/ia64_misc.s b/src/tbb/ia64-gas/ia64_misc.s
index 77ca492..497918c 100644
--- a/src/tbb/ia64-gas/ia64_misc.s
+++ b/src/tbb/ia64-gas/ia64_misc.s
@@ -33,3 +33,75 @@ __TBB_get_bsp:
mov r8=ar.bsp
br.ret.sptk.many b0
.endp __TBB_get_bsp#
+
+ .section .text
+ .align 16
+ .proc __TBB_machine_load8_relaxed#
+ .global __TBB_machine_load8_relaxed#
+__TBB_machine_load8_relaxed:
+ ld8 r8=[r32]
+ br.ret.sptk.many b0
+ .endp __TBB_machine_load8_relaxed#
+
+ .section .text
+ .align 16
+ .proc __TBB_machine_store8_relaxed#
+ .global __TBB_machine_store8_relaxed#
+__TBB_machine_store8_relaxed:
+ st8 [r32]=r33
+ br.ret.sptk.many b0
+ .endp __TBB_machine_store8_relaxed#
+
+ .section .text
+ .align 16
+ .proc __TBB_machine_load4_relaxed#
+ .global __TBB_machine_load4_relaxed#
+__TBB_machine_load4_relaxed:
+ ld4 r8=[r32]
+ br.ret.sptk.many b0
+ .endp __TBB_machine_load4_relaxed#
+
+ .section .text
+ .align 16
+ .proc __TBB_machine_store4_relaxed#
+ .global __TBB_machine_store4_relaxed#
+__TBB_machine_store4_relaxed:
+ st4 [r32]=r33
+ br.ret.sptk.many b0
+ .endp __TBB_machine_store4_relaxed#
+
+ .section .text
+ .align 16
+ .proc __TBB_machine_load2_relaxed#
+ .global __TBB_machine_load2_relaxed#
+__TBB_machine_load2_relaxed:
+ ld2 r8=[r32]
+ br.ret.sptk.many b0
+ .endp __TBB_machine_load2_relaxed#
+
+ .section .text
+ .align 16
+ .proc __TBB_machine_store2_relaxed#
+ .global __TBB_machine_store2_relaxed#
+__TBB_machine_store2_relaxed:
+ st2 [r32]=r33
+ br.ret.sptk.many b0
+ .endp __TBB_machine_store2_relaxed#
+
+ .section .text
+ .align 16
+ .proc __TBB_machine_load1_relaxed#
+ .global __TBB_machine_load1_relaxed#
+__TBB_machine_load1_relaxed:
+ ld1 r8=[r32]
+ br.ret.sptk.many b0
+ .endp __TBB_machine_load1_relaxed#
+
+ .section .text
+ .align 16
+ .proc __TBB_machine_store1_relaxed#
+ .global __TBB_machine_store1_relaxed#
+__TBB_machine_store1_relaxed:
+ st1 [r32]=r33
+ br.ret.sptk.many b0
+ .endp __TBB_machine_store1_relaxed#
diff --git a/src/tbb/ibm_aix51/atomic_support.c b/src/tbb/ibm_aix51/atomic_support.c
index ed128fc..e9cadfc 100644
--- a/src/tbb/ibm_aix51/atomic_support.c
+++ b/src/tbb/ibm_aix51/atomic_support.c
@@ -37,14 +37,14 @@
int32_t __TBB_machine_cas_32 (volatile void* ptr, int32_t value, int32_t comparand) {
__asm__ __volatile__ ("sync\n"); /* memory release operation */
compare_and_swap ((atomic_p) ptr, &comparand, value);
- __asm__ __volatile__ ("sync\n"); /* memory acquire operation */
+ __asm__ __volatile__ ("isync\n"); /* memory acquire operation */
return comparand;
}
int64_t __TBB_machine_cas_64 (volatile void* ptr, int64_t value, int64_t comparand) {
__asm__ __volatile__ ("sync\n"); /* memory release operation */
compare_and_swaplp ((atomic_l) ptr, &comparand, value);
- __asm__ __volatile__ ("sync\n"); /* memory acquire operation */
+ __asm__ __volatile__ ("isync\n"); /* memory acquire operation */
return comparand;
}
@@ -52,4 +52,12 @@ void __TBB_machine_flush () {
__asm__ __volatile__ ("sync\n");
}
+void __TBB_machine_lwsync () {
+ __asm__ __volatile__ ("lwsync\n");
+}
+
+void __TBB_machine_isync () {
+ __asm__ __volatile__ ("isync\n");
+}
+
#endif /* __GNUC__ */
diff --git a/src/tbb/index.html b/src/tbb/index.html
index 5def5fe..c9dbfbe 100644
--- a/src/tbb/index.html
+++ b/src/tbb/index.html
@@ -22,10 +22,9 @@ This directory contains the source code of the TBB core components.
<A HREF="../index.html">Up to parent directory</A>
<p></p>
Copyright © 2005-2011 Intel Corporation. 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>
+Intel is a registered trademark or trademark 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.
</BODY>
diff --git a/src/tbb/itt_notify.h b/src/tbb/itt_notify.h
index 1c26792..3d4a041 100644
--- a/src/tbb/itt_notify.h
+++ b/src/tbb/itt_notify.h
@@ -102,7 +102,7 @@ namespace tbb {
// const_cast<void*>() is necessary to cast off volatility
#define ITT_NOTIFY(name,obj) __itt_notify_##name(const_cast<void*>(static_cast<volatile void*>(obj)))
#define ITT_THREAD_SET_NAME(name) __itt_thread_set_name(name)
-#define ITT_SYNC_CREATE(obj, type, name) __itt_sync_create(obj, type, name, 2)
+#define ITT_SYNC_CREATE(obj, type, name) __itt_sync_create((void*)(obj), type, name, 2)
#define ITT_SYNC_RENAME(obj, name) __itt_sync_rename(obj, name)
#define ITT_STACK_CREATE(obj) obj = __itt_stack_caller_create()
#if __TBB_TASK_GROUP_CONTEXT
diff --git a/src/tbb/lin64ipf-tbb-export.lst b/src/tbb/lin64ipf-tbb-export.lst
index ef25e8f..1facd71 100644
--- a/src/tbb/lin64ipf-tbb-export.lst
+++ b/src/tbb/lin64ipf-tbb-export.lst
@@ -381,5 +381,13 @@ __TBB_SYMBOL( __TBB_machine_lg )
__TBB_SYMBOL( __TBB_machine_lockbyte )
__TBB_SYMBOL( __TBB_machine_pause )
__TBB_SYMBOL( __TBB_machine_trylockbyte )
+__TBB_SYMBOL( __TBB_machine_load8_relaxed )
+__TBB_SYMBOL( __TBB_machine_store8_relaxed )
+__TBB_SYMBOL( __TBB_machine_load4_relaxed )
+__TBB_SYMBOL( __TBB_machine_store4_relaxed )
+__TBB_SYMBOL( __TBB_machine_load2_relaxed )
+__TBB_SYMBOL( __TBB_machine_store2_relaxed )
+__TBB_SYMBOL( __TBB_machine_load1_relaxed )
+__TBB_SYMBOL( __TBB_machine_store1_relaxed )
#undef __TBB_SYMBOL
diff --git a/src/tbb/mac32-tbb-export.lst b/src/tbb/mac32-tbb-export.lst
index 6294c0a..169e63f 100644
--- a/src/tbb/mac32-tbb-export.lst
+++ b/src/tbb/mac32-tbb-export.lst
@@ -74,6 +74,7 @@ __TBB_SYMBOL( _ZN3tbb4task7destroyERS0_ )
#endif
// Exception handling in task scheduler
+#if __TBB_TASK_GROUP_CONTEXT
__TBB_SYMBOL( _ZNK3tbb8internal32allocate_root_with_context_proxy8allocateEm )
__TBB_SYMBOL( _ZNK3tbb8internal32allocate_root_with_context_proxy4freeERNS_4taskE )
__TBB_SYMBOL( _ZN3tbb4task12change_groupERNS_18task_group_contextE )
@@ -105,6 +106,7 @@ __TBB_SYMBOL( _ZTVN3tbb18captured_exceptionE )
__TBB_SYMBOL( _ZTIN3tbb13tbb_exceptionE )
__TBB_SYMBOL( _ZTSN3tbb13tbb_exceptionE )
__TBB_SYMBOL( _ZTVN3tbb13tbb_exceptionE )
+#endif /* __TBB_TASK_GROUP_CONTEXT */
// Symbols for exceptions thrown from TBB
__TBB_SYMBOL( _ZN3tbb8internal33throw_bad_last_alloc_exception_v4Ev )
@@ -176,7 +178,9 @@ __TBB_SYMBOL( _ZN3tbb8pipeline10add_filterERNS_6filterE )
__TBB_SYMBOL( _ZN3tbb8pipeline12inject_tokenERNS_4taskE )
__TBB_SYMBOL( _ZN3tbb8pipeline13remove_filterERNS_6filterE )
__TBB_SYMBOL( _ZN3tbb8pipeline3runEm )
+#if __TBB_TASK_GROUP_CONTEXT
__TBB_SYMBOL( _ZN3tbb8pipeline3runEmRNS_18task_group_contextE )
+#endif
__TBB_SYMBOL( _ZN3tbb8pipeline5clearEv )
__TBB_SYMBOL( _ZN3tbb19thread_bound_filter12process_itemEv )
__TBB_SYMBOL( _ZN3tbb19thread_bound_filter16try_process_itemEv )
diff --git a/src/tbb/mac64-tbb-export.lst b/src/tbb/mac64-tbb-export.lst
index 7232c84..660c5be 100644
--- a/src/tbb/mac64-tbb-export.lst
+++ b/src/tbb/mac64-tbb-export.lst
@@ -74,6 +74,7 @@ __TBB_SYMBOL( _ZN3tbb4task7destroyERS0_ )
#endif
// Exception handling in task scheduler
+#if __TBB_TASK_GROUP_CONTEXT
__TBB_SYMBOL( _ZNK3tbb8internal32allocate_root_with_context_proxy8allocateEm )
__TBB_SYMBOL( _ZNK3tbb8internal32allocate_root_with_context_proxy4freeERNS_4taskE )
__TBB_SYMBOL( _ZN3tbb4task12change_groupERNS_18task_group_contextE )
@@ -105,6 +106,7 @@ __TBB_SYMBOL( _ZTVN3tbb18captured_exceptionE )
__TBB_SYMBOL( _ZTIN3tbb13tbb_exceptionE )
__TBB_SYMBOL( _ZTSN3tbb13tbb_exceptionE )
__TBB_SYMBOL( _ZTVN3tbb13tbb_exceptionE )
+#endif /* __TBB_TASK_GROUP_CONTEXT */
// Symbols for exceptions thrown from TBB
__TBB_SYMBOL( _ZN3tbb8internal33throw_bad_last_alloc_exception_v4Ev )
@@ -172,7 +174,9 @@ __TBB_SYMBOL( _ZN3tbb8pipeline10add_filterERNS_6filterE )
__TBB_SYMBOL( _ZN3tbb8pipeline12inject_tokenERNS_4taskE )
__TBB_SYMBOL( _ZN3tbb8pipeline13remove_filterERNS_6filterE )
__TBB_SYMBOL( _ZN3tbb8pipeline3runEm )
+#if __TBB_TASK_GROUP_CONTEXT
__TBB_SYMBOL( _ZN3tbb8pipeline3runEmRNS_18task_group_contextE )
+#endif
__TBB_SYMBOL( _ZN3tbb8pipeline5clearEv )
__TBB_SYMBOL( _ZN3tbb19thread_bound_filter12process_itemEv )
__TBB_SYMBOL( _ZN3tbb19thread_bound_filter16try_process_itemEv )
diff --git a/src/tbb/mailbox.h b/src/tbb/mailbox.h
index 18e3a0c..e0d4eae 100644
--- a/src/tbb/mailbox.h
+++ b/src/tbb/mailbox.h
@@ -37,11 +37,13 @@
namespace tbb {
namespace internal {
+class generic_scheduler;
class mail_outbox;
struct task_proxy : public task {
- static const intptr_t pool_bit = 1;
- static const intptr_t mailbox_bit = 2;
+ static const intptr_t pool_bit = 1<<0;
+ static const intptr_t mailbox_bit = 1<<1;
+ static const intptr_t location_mask = pool_bit | mailbox_bit;
/* All but two low-order bits represent a (task*).
Two low-order bits mean:
1 = proxy is/was/will be in task pool
@@ -49,20 +51,57 @@ struct task_proxy : public task {
intptr_t task_and_tag;
//! Pointer to next task_proxy in a mailbox
- task_proxy* next_in_mailbox;
+ task_proxy *__TBB_atomic next_in_mailbox;
//! Mailbox to which this was mailed.
mail_outbox* outbox;
-};
+
+ //! True if the proxy is stored both in its sender's pool and in the destination mailbox.
+ static bool is_shared ( intptr_t tat ) {
+ return (tat & location_mask) == location_mask;
+ }
+
+ //! Returns a pointer to the encapsulated task or NULL.
+ static task* task_ptr ( intptr_t tat ) {
+ return (task*)(tat & ~location_mask);
+ }
+
+ //! Returns a pointer to the encapsulated task or NULL, and frees proxy if necessary.
+ template<intptr_t from_bit>
+ inline task* extract_task () {
+ __TBB_ASSERT( prefix().extra_state == es_task_proxy, "Normal task misinterpreted as a proxy?" );
+ intptr_t tat = __TBB_load_with_acquire(task_and_tag);
+ __TBB_ASSERT( tat == from_bit || (is_shared(tat) && task_ptr(tat)),
+ "Proxy's tag cannot specify both locations if the proxy "
+ "was retrieved from one of its original locations" );
+ if ( tat != from_bit ) {
+ const intptr_t cleaner_bit = location_mask & ~from_bit;
+ // Attempt to transition the proxy to the "empty" state with
+ // cleaner_bit specifying entity responsible for its eventual freeing.
+ if ( __TBB_CompareAndSwapW( &task_and_tag, cleaner_bit, tat ) == tat ) {
+ // Successfully grabbed the task, and left new owner with the job of freeing the proxy
+ return task_ptr(tat);
+ }
+ }
+ // Proxied task has already been claimed from another proxy location.
+ __TBB_ASSERT( task_and_tag == from_bit, "Empty proxy cannot contain non-zero task pointer" );
+ poison_pointer(outbox);
+ poison_pointer(next_in_mailbox);
+ poison_value(task_and_tag);
+ return NULL;
+ }
+}; // struct task_proxy
//! Internal representation of mail_outbox, without padding.
class unpadded_mail_outbox {
protected:
+ typedef task_proxy*__TBB_atomic proxy_ptr;
+
//! Pointer to first task_proxy in mailbox, or NULL if box is empty.
- task_proxy* my_first;
+ proxy_ptr my_first;
//! Pointer to pointer that will point to next item in the queue. Never NULL.
- task_proxy** my_last;
+ proxy_ptr* __TBB_atomic my_last;
//! Owner of mailbox is not executing a task, and has drained its own task pool.
bool my_is_idle;
@@ -70,33 +109,31 @@ protected:
//! Class representing where mail is put.
/** Padded to occupy a cache line. */
-class mail_outbox: unpadded_mail_outbox {
+class mail_outbox : unpadded_mail_outbox {
char pad[NFS_MaxLineSize-sizeof(unpadded_mail_outbox)];
task_proxy* internal_pop() {
- //! No fence on load of my_first, because if it is NULL, there's nothing further to read from another thread.
- task_proxy* first = my_first;
- if( first ) {
- // There is a first item in the mailbox. See if there is a second.
- if( task_proxy* second = __TBB_load_with_acquire(first->next_in_mailbox) ) {
- // There are at least two items, so first item can be popped easily.
- __TBB_store_with_release( my_first, second );
+ task_proxy* const first = __TBB_load_relaxed(my_first);
+ if( !first )
+ return NULL;
+ __TBB_control_consistency_helper(); // on my_first
+ // There is a first item in the mailbox. See if there is a second.
+ if( task_proxy* second = first->next_in_mailbox ) {
+ // There are at least two items, so first item can be popped easily.
+ my_first = second;
+ } 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 )
+ {
+ // Successfully transitioned mailbox from having one item to having none.
+ __TBB_ASSERT(!first->next_in_mailbox,NULL);
} else {
- // There is only one item. Some care is required to pop it.
- my_first = NULL;
- if( (task_proxy**)__TBB_CompareAndSwapW(&my_last, (intptr_t)&my_first,
- (intptr_t)&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);
- } else {
- // Some other thread updated my_last but has not filled in result->next_in_mailbox
- // Wait until first item points to second item.
- atomic_backoff backoff;
- while( !(second=const_cast<volatile task_proxy*>(first)->next_in_mailbox) )
- backoff.pause();
- my_first = second;
- }
+ // Some other thread updated my_last but has not filled in first->next_in_mailbox
+ // Wait until first item points to second item.
+ for( atomic_backoff backoff; !(second = first->next_in_mailbox); backoff.pause() );
+ my_first = second;
}
}
return first;
@@ -109,15 +146,15 @@ public:
void push( task_proxy& t ) {
__TBB_ASSERT(&t, NULL);
t.next_in_mailbox = NULL;
- task_proxy** link = (task_proxy**)__TBB_FetchAndStoreW(&my_last,(intptr_t)&t.next_in_mailbox);
+ proxy_ptr * const link = (proxy_ptr *)__TBB_FetchAndStoreW(&my_last,(intptr_t)&t.next_in_mailbox);
// No release fence required for the next store, because there are no memory operations
// between the previous fully fenced atomic operation and the store.
- *link = &t;
+ __TBB_store_relaxed(*link, &t);
}
//! Construct *this as a mailbox from zeroed memory.
- /** Raise assertion if *this is not previously zeored, or sizeof(this) is wrong.
- This method is provided instead of a full constructor since we know the objecxt
+ /** Raise assertion if *this is not previously zeroed, or sizeof(this) is wrong.
+ This method is provided instead of a full constructor since we know the object
will be constructed in zeroed memory. */
void construct() {
__TBB_ASSERT( sizeof(*this)==NFS_MaxLineSize, NULL );
diff --git a/src/tbb/market.cpp b/src/tbb/market.cpp
index 9514f61..cb0e9dd 100644
--- a/src/tbb/market.cpp
+++ b/src/tbb/market.cpp
@@ -189,16 +189,19 @@ arena* market::arena_in_need ( arena_list_type &arenas, arena_list_type::iterato
}
void market::update_allotment ( arena_list_type& arenas, int workers_demand, int max_workers ) {
- if ( !workers_demand )
- return;
+ __TBB_ASSERT( workers_demand, NULL );
+ max_workers = min(workers_demand, max_workers);
int carry = 0;
#if TBB_USE_ASSERT
int assigned = 0;
#endif /* TBB_USE_ASSERT */
- max_workers = min( max_workers, workers_demand );
arena_list_type::iterator it = arenas.begin();
for ( ; it != arenas.end(); ++it ) {
arena& a = *it;
+ if ( a.my_num_workers_requested <= 0 ) {
+ __TBB_ASSERT( !a.my_num_workers_allotted, NULL );
+ continue;
+ }
int tmp = a.my_num_workers_requested * max_workers + carry;
int allotted = tmp / workers_demand;
carry = tmp % workers_demand;
@@ -216,7 +219,15 @@ inline void market::update_global_top_priority ( intptr_t newPriority ) {
GATHER_STATISTIC( ++governor::local_scheduler_if_initialized()->my_counters.market_prio_switches );
my_global_top_priority = newPriority;
my_priority_levels[newPriority].workers_available = my_max_num_workers;
- __TBB_store_with_release( my_global_reload_epoch, my_global_reload_epoch + 1 );
+ advance_global_reload_epoch();
+}
+
+inline void market::reset_global_priority () {
+ my_global_bottom_priority = normalized_normal_priority;
+ update_global_top_priority(normalized_normal_priority);
+#if __TBB_TRACK_PRIORITY_LEVEL_SATURATION
+ my_lowest_populated_level = normalized_normal_priority;
+#endif /* __TBB_TRACK_PRIORITY_LEVEL_SATURATION */
}
arena* market::arena_in_need (
@@ -254,113 +265,107 @@ arena* market::arena_in_need (
}
void market::update_allotment ( intptr_t highest_affected_priority ) {
- intptr_t i = highest_affected_priority;
- while ( i >= my_global_bottom_priority ) {
+ intptr_t i = highest_affected_priority;
+ int available = my_priority_levels[i].workers_available;
+#if __TBB_TRACK_PRIORITY_LEVEL_SATURATION
+ my_lowest_populated_level = my_global_bottom_priority;
+#endif /* __TBB_TRACK_PRIORITY_LEVEL_SATURATION */
+ for ( ; i >= my_global_bottom_priority; --i ) {
priority_level_info &pl = my_priority_levels[i];
- update_allotment( pl.arenas, pl.workers_requested, pl.workers_available );
- int available = pl.workers_available - pl.workers_requested;
+ pl.workers_available = available;
+ if ( pl.workers_requested ) {
+ update_allotment( pl.arenas, pl.workers_requested, available );
+ available -= pl.workers_requested;
+ if ( available < 0 ) {
+ available = 0;
#if __TBB_TRACK_PRIORITY_LEVEL_SATURATION
- if ( available <= 0 && pl.workers_available )
- my_lowest_populated_level = i;
+ my_lowest_populated_level = i;
#endif /* __TBB_TRACK_PRIORITY_LEVEL_SATURATION */
- if ( --i >= 0 )
- my_priority_levels[i].workers_available = available;
+ break;
+ }
+ }
+ }
+ __TBB_ASSERT( i <= my_global_bottom_priority || !available, NULL );
+ for ( --i; i >= my_global_bottom_priority; --i ) {
+ priority_level_info &pl = my_priority_levels[i];
+ pl.workers_available = 0;
+ arena_list_type::iterator it = pl.arenas.begin();
+ for ( ; it != pl.arenas.end(); ++it ) {
+ __TBB_ASSERT( it->my_num_workers_requested || !it->my_num_workers_allotted, NULL );
+ it->my_num_workers_allotted = 0;
+ }
}
}
#endif /* __TBB_TASK_PRIORITY */
-/** The balancing algorithm may be liable to data races. However the aberrations
- caused by the races are not fatal and generally only temporarily affect fairness
- of the workers distribution among arenas. **/
void market::adjust_demand ( arena& a, int delta ) {
__TBB_ASSERT( theMarket, "market instance was destroyed prematurely?" );
if ( !delta )
return;
my_arenas_list_mutex.lock();
+ int prev_req = a.my_num_workers_requested;
a.my_num_workers_requested += delta;
- if ( a.my_num_workers_requested == 0 )
+ if ( a.my_num_workers_requested <= 0 ) {
a.my_num_workers_allotted = 0;
+ if ( prev_req <= 0 ) {
+ my_arenas_list_mutex.unlock();
+ return;
+ }
+ delta = -prev_req;
+ }
+ __TBB_ASSERT( prev_req >= 0, "Part-size request to RML?" );
#if __TBB_TASK_PRIORITY
intptr_t p = a.my_top_priority;
priority_level_info &pl = my_priority_levels[p];
pl.workers_requested += delta;
- if ( a.my_num_workers_requested == 0 ) {
+ __TBB_ASSERT( pl.workers_requested >= 0, NULL );
+ __TBB_ASSERT( a.my_num_workers_requested >= 0, NULL );
+ 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 );
update_arena_top_priority( a, normalized_normal_priority );
}
a.my_bottom_priority = normalized_normal_priority;
}
- if ( p > my_global_top_priority ) {
- __TBB_ASSERT( a.my_num_workers_requested > 0, NULL );
- 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;
- update_allotment( p - 1 );
- }
- else if ( p == my_global_top_priority ) {
- // Requested number of workers may transitory drop below zero
- if ( pl.workers_requested <= 0 ) {
+ if ( p == my_global_top_priority ) {
+ if ( !pl.workers_requested ) {
while ( --p >= my_global_bottom_priority && !my_priority_levels[p].workers_requested )
continue;
- if ( p < my_global_bottom_priority ) {
- my_global_bottom_priority = normalized_normal_priority;
- update_global_top_priority(normalized_normal_priority);
-#if __TBB_TRACK_PRIORITY_LEVEL_SATURATION
- my_lowest_populated_level = normalized_normal_priority;
-#endif /* __TBB_TRACK_PRIORITY_LEVEL_SATURATION */
- }
+ if ( p < my_global_bottom_priority )
+ reset_global_priority();
else
update_global_top_priority(p);
}
update_allotment( my_global_top_priority );
}
+ else if ( p > my_global_top_priority ) {
+ __TBB_ASSERT( pl.workers_requested > 0, NULL );
+ 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;
+ update_allotment( p - 1 );
+ }
else if ( p == my_global_bottom_priority ) {
- // Requested number of workers may transitory drop below zero
- if ( pl.workers_requested <= 0 ) {
+ if ( !pl.workers_requested ) {
while ( ++p <= my_global_top_priority && !my_priority_levels[p].workers_requested )
continue;
- if ( p < num_priority_levels ) {
- TBB_TRACE(( "adjust_demand(%p, %d): change global bottom prio %ld -> %ld\n", &a, delta, (long)my_global_bottom_priority, (long)p ));
+ if ( p > my_global_top_priority )
+ reset_global_priority();
+ else {
my_global_bottom_priority = p;
#if __TBB_TRACK_PRIORITY_LEVEL_SATURATION
my_lowest_populated_level = max( my_lowest_populated_level, p );
#endif /* __TBB_TRACK_PRIORITY_LEVEL_SATURATION */
}
- else {
- my_global_bottom_priority = normalized_normal_priority;
- update_global_top_priority(normalized_normal_priority);
-#if __TBB_TRACK_PRIORITY_LEVEL_SATURATION
- my_lowest_populated_level = normalized_normal_priority;
-#endif /* __TBB_TRACK_PRIORITY_LEVEL_SATURATION */
- }
}
else
update_allotment( p );
}
else if ( p < my_global_bottom_priority ) {
__TBB_ASSERT( a.my_num_workers_requested > 0, NULL );
- int available = my_priority_levels[my_global_bottom_priority].workers_available
- - my_priority_levels[my_global_bottom_priority].workers_requested;
- if ( available > 0 ) {
- do {
- __TBB_ASSERT( (my_global_bottom_priority - 1 == p) || !my_priority_levels[my_global_bottom_priority - 1].workers_requested, NULL );
- my_priority_levels[my_global_bottom_priority - 1].workers_available = available;
- } while ( --my_global_bottom_priority > p );
- __TBB_ASSERT( pl.workers_requested == a.my_num_workers_requested, NULL );
- a.my_num_workers_allotted = min(available, pl.workers_requested);
-#if __TBB_TRACK_PRIORITY_LEVEL_SATURATION
- my_lowest_populated_level = p;
-#endif
- }
- else {
- __TBB_ASSERT( !a.my_num_workers_allotted, NULL );
- do {
- __TBB_ASSERT( !my_priority_levels[my_global_bottom_priority].workers_requested, NULL );
- my_priority_levels[my_global_bottom_priority].workers_available = 0;
- } while ( --my_global_bottom_priority > p );
- }
- __TBB_ASSERT( p == my_global_bottom_priority, NULL );
+ int prev_bottom = my_global_bottom_priority;
+ my_global_bottom_priority = p;
+ update_allotment( prev_bottom );
}
else {
__TBB_ASSERT( my_global_bottom_priority < p && p < my_global_top_priority, NULL );
@@ -440,6 +445,7 @@ void market::update_arena_top_priority ( arena& a, intptr_t new_priority ) {
#endif /* __TBB_TRACK_PRIORITY_LEVEL_SATURATION */
prev_level.workers_requested -= a.my_num_workers_requested;
new_level.workers_requested += a.my_num_workers_requested;
+ __TBB_ASSERT( prev_level.workers_requested >= 0 && new_level.workers_requested >= 0, NULL );
}
bool market::lower_arena_priority ( arena& a, intptr_t new_priority, intptr_t old_priority ) {
@@ -449,23 +455,20 @@ bool market::lower_arena_priority ( arena& a, intptr_t new_priority, intptr_t ol
return false;
}
__TBB_ASSERT( a.my_top_priority > new_priority, NULL );
+ __TBB_ASSERT( my_global_top_priority >= a.my_top_priority, NULL );
intptr_t p = a.my_top_priority;
update_arena_top_priority( a, new_priority );
- if ( a.my_num_workers_requested ) {
+ if ( a.my_num_workers_requested > 0 ) {
if ( my_global_bottom_priority > new_priority ) {
- TBB_TRACE(( " -> global bottom prio %ld -> %ld\n", (long)my_global_bottom_priority, (long)new_priority ));
my_global_bottom_priority = new_priority;
}
- if ( p == my_global_top_priority && my_priority_levels[p].workers_requested <= 0 ) {
- while ( --p >= my_global_bottom_priority && my_priority_levels[p].workers_requested <= 0 )
- continue;
+ if ( p == my_global_top_priority && !my_priority_levels[p].workers_requested ) {
+ // Global top level became empty
+ for ( --p; !my_priority_levels[p].workers_requested; --p ) continue;
__TBB_ASSERT( p >= my_global_bottom_priority, NULL );
update_global_top_priority(p);
}
-#if __TBB_TRACK_PRIORITY_LEVEL_SATURATION
- if ( p >= my_lowest_populated_level )
-#endif /* __TBB_TRACK_PRIORITY_LEVEL_SATURATION */
- update_allotment( p );
+ update_allotment( p );
}
assert_market_valid();
return true;
@@ -478,32 +481,43 @@ bool market::update_arena_priority ( arena& a, intptr_t new_priority ) {
return false;
}
else if ( a.my_top_priority > new_priority ) {
- if ( a.my_bottom_priority > new_priority ) {
- TBB_TRACE(( " -> bottom prio %ld -> %ld)\n", (long)a.my_bottom_priority, (long)new_priority ));
+ if ( a.my_bottom_priority > new_priority )
a.my_bottom_priority = new_priority;
- }
assert_market_valid();
return false;
}
+ intptr_t p = a.my_top_priority;
+ intptr_t highest_affected_level = max(p, new_priority);
update_arena_top_priority( a, new_priority );
- if ( a.my_num_workers_requested ) {
+ if ( a.my_num_workers_requested > 0 ) {
if ( my_global_top_priority < new_priority ) {
update_global_top_priority(new_priority);
}
+ else if ( my_global_top_priority == new_priority ) {
+ advance_global_reload_epoch();
+ }
else {
- if ( my_global_top_priority == new_priority )
- ++my_global_reload_epoch;
- // Previous arena priority may have been at my_global_bottom_priority level,
- // thus check if my_global_bottom_priority needs to be updated.
- while ( !my_priority_levels[my_global_bottom_priority].workers_requested ) {
- TBB_TRACE(( " -> global bottom prio %ld -> %ld)\n", (long)my_global_bottom_priority, (long)my_global_bottom_priority + 1 ));
- ++my_global_bottom_priority;
+ __TBB_ASSERT( new_priority < my_global_top_priority, NULL );
+ __TBB_ASSERT( new_priority > my_global_bottom_priority, NULL );
+ if ( p == my_global_top_priority && !my_priority_levels[p].workers_requested ) {
+ // Global top level became empty
+ __TBB_ASSERT( my_global_bottom_priority < p, NULL );
+ for ( --p; !my_priority_levels[p].workers_requested; --p ) continue;
+ __TBB_ASSERT( p >= new_priority, NULL );
+ update_global_top_priority(p);
+ highest_affected_level = p;
}
}
-#if __TBB_TRACK_PRIORITY_LEVEL_SATURATION
- if ( new_priority >= my_lowest_populated_level )
-#endif /* __TBB_TRACK_PRIORITY_LEVEL_SATURATION */
- update_allotment( new_priority );
+ if ( p == my_global_bottom_priority ) {
+ // Arena priority was increased from the global bottom level.
+ __TBB_ASSERT( p < new_priority, NULL ); // n
+ __TBB_ASSERT( new_priority <= my_global_top_priority, NULL );
+ while ( !my_priority_levels[my_global_bottom_priority].workers_requested )
+ ++my_global_bottom_priority;
+ __TBB_ASSERT( my_global_bottom_priority <= new_priority, NULL );
+ __TBB_ASSERT( my_priority_levels[my_global_bottom_priority].workers_requested > 0, NULL );
+ }
+ update_allotment( highest_affected_level );
}
assert_market_valid();
return true;
diff --git a/src/tbb/market.h b/src/tbb/market.h
index e3f229f..827149a 100644
--- a/src/tbb/market.h
+++ b/src/tbb/market.h
@@ -183,11 +183,19 @@ private:
deviate from the calculated value. **/
void update_allotment ( intptr_t highest_affected_priority );
- //! Changes arena's top and bottom priority boundaries if necessary
+ //! Changes arena's top priority and updates affected priority levels info in the market.
void update_arena_top_priority ( arena& a, intptr_t newPriority );
+ //! Changes market's global top priority and related settings.
inline void update_global_top_priority ( intptr_t newPriority );
+ //! Resets empty market's global top and bottom priority to the normal level.
+ inline void reset_global_priority ();
+
+ inline void advance_global_reload_epoch () {
+ __TBB_store_with_release( my_global_reload_epoch, my_global_reload_epoch + 1 );
+ }
+
void assert_market_valid () const {
__TBB_ASSERT( (my_priority_levels[my_global_top_priority].workers_requested > 0
&& !my_priority_levels[my_global_top_priority].arenas.empty())
@@ -200,7 +208,10 @@ private:
//! Recalculates the number of workers assigned to each arena in the list.
/** The actual number of workers servicing a particular arena may temporarily
deviate from the calculated value. **/
- void update_allotment () { update_allotment( my_arenas, my_total_demand, (int)my_max_num_workers ); }
+ void update_allotment () {
+ if ( my_total_demand )
+ update_allotment( my_arenas, my_total_demand, (int)my_max_num_workers );
+ }
//! Returns next arena that needs more workers, or NULL.
arena* arena_in_need () {
diff --git a/src/tbb/queuing_mutex.cpp b/src/tbb/queuing_mutex.cpp
index 7c00337..5481f7f 100644
--- a/src/tbb/queuing_mutex.cpp
+++ b/src/tbb/queuing_mutex.cpp
@@ -53,7 +53,10 @@ void queuing_mutex::scoped_lock::acquire( queuing_mutex& m )
scoped_lock* pred = m.q_tail.fetch_and_store<tbb::release>(this);
if( pred ) {
ITT_NOTIFY(sync_prepare, mutex);
+#if TBB_USE_ASSERT
+ __TBB_control_consistency_helper(); // on "m.q_tail"
__TBB_ASSERT( !pred->next, "the predecessor has another successor!");
+#endif
pred->next = this;
spin_wait_while_eq( going, 0ul );
}
@@ -74,20 +77,18 @@ bool queuing_mutex::scoped_lock::try_acquire( queuing_mutex& m )
next = NULL;
going = 0;
- if( m.q_tail ) return false;
// The CAS must have release semantics, because we are
// "sending" the fields initialized above to other processors.
- scoped_lock* pred = m.q_tail.compare_and_swap<tbb::release>(this, NULL);
+ if( m.q_tail.compare_and_swap<tbb::release>(this, NULL) )
+ return false;
// Force acquire so that user's critical section receives correct values
// from processor that was previously in the user's critical section.
// try_acquire should always have acquire semantic, even if failed.
__TBB_load_with_acquire(going);
- if( !pred ) {
- mutex = &m;
- ITT_NOTIFY(sync_acquired, mutex);
- return true;
- } else return false;
+ mutex = &m;
+ ITT_NOTIFY(sync_acquired, mutex);
+ return true;
}
//! A method to release queuing_mutex lock
diff --git a/src/tbb/queuing_rw_mutex.cpp b/src/tbb/queuing_rw_mutex.cpp
index 882bc6e..27eceb3 100644
--- a/src/tbb/queuing_rw_mutex.cpp
+++ b/src/tbb/queuing_rw_mutex.cpp
@@ -58,7 +58,7 @@ enum state_t_flags {
const unsigned char RELEASED = 0;
const unsigned char ACQUIRED = 1;
-
+
template<typename T>
inline atomic<T>& as_atomic( T& t ) {
return *(atomic<T>*)&t;
@@ -66,7 +66,7 @@ inline atomic<T>& as_atomic( T& t ) {
inline bool queuing_rw_mutex::scoped_lock::try_acquire_internal_lock()
{
- return as_atomic(internal_lock).compare_and_swap<tbb::acquire>(ACQUIRED,RELEASED) == RELEASED;
+ return as_atomic(my_internal_lock).compare_and_swap<tbb::acquire>(ACQUIRED,RELEASED) == RELEASED;
}
inline void queuing_rw_mutex::scoped_lock::acquire_internal_lock()
@@ -80,12 +80,12 @@ inline void queuing_rw_mutex::scoped_lock::acquire_internal_lock()
inline void queuing_rw_mutex::scoped_lock::release_internal_lock()
{
- __TBB_store_with_release(internal_lock,RELEASED);
+ __TBB_store_with_release(my_internal_lock,RELEASED);
}
inline void queuing_rw_mutex::scoped_lock::wait_for_release_of_internal_lock()
{
- spin_wait_until_eq(internal_lock, RELEASED);
+ spin_wait_until_eq(my_internal_lock, RELEASED);
}
inline void queuing_rw_mutex::scoped_lock::unblock_or_wait_on_internal_lock( uintptr_t flag ) {
@@ -105,7 +105,7 @@ inline void queuing_rw_mutex::scoped_lock::unblock_or_wait_on_internal_lock( uin
template<typename T>
class tricky_atomic_pointer: no_copy {
public:
- typedef typename atomic_rep<sizeof(T*)>::word word;
+ typedef typename atomic_selector<sizeof(T*)>::word word;
template<memory_semantics M>
static T* fetch_and_add( T* volatile * location, word addend ) {
@@ -145,8 +145,8 @@ typedef tricky_atomic_pointer<queuing_rw_mutex::scoped_lock> tricky_pointer;
static const tricky_pointer::word FLAG = 0x1;
inline
-uintptr_t get_flag( queuing_rw_mutex::scoped_lock* ptr ) {
- return uintptr_t(tricky_pointer(ptr)&FLAG);
+uintptr_t get_flag( queuing_rw_mutex::scoped_lock* ptr ) {
+ return uintptr_t(ptr) & FLAG;
}
//------------------------------------------------------------------------
@@ -155,29 +155,31 @@ uintptr_t get_flag( queuing_rw_mutex::scoped_lock* ptr ) {
void queuing_rw_mutex::scoped_lock::acquire( queuing_rw_mutex& m, bool write )
{
- __TBB_ASSERT( !this->mutex, "scoped_lock is already holding a mutex");
+ __TBB_ASSERT( !my_mutex, "scoped_lock is already holding a mutex");
// Must set all fields before the fetch_and_store, because once the
// fetch_and_store executes, *this becomes accessible to other threads.
- mutex = &m;
- prev = NULL;
- next = NULL;
- going = 0;
- state = state_t(write ? STATE_WRITER : STATE_READER);
- internal_lock = RELEASED;
+ my_mutex = &m;
+ __TBB_store_relaxed(my_prev , (scoped_lock*)0);
+ __TBB_store_relaxed(my_next , (scoped_lock*)0);
+ __TBB_store_relaxed(my_going, 0);
+ my_state = state_t(write ? STATE_WRITER : STATE_READER);
+ my_internal_lock = RELEASED;
queuing_rw_mutex::scoped_lock* pred = m.q_tail.fetch_and_store<tbb::release>(this);
if( write ) { // Acquiring for write
if( pred ) {
- ITT_NOTIFY(sync_prepare, mutex);
+ ITT_NOTIFY(sync_prepare, my_mutex);
pred = tricky_pointer(pred) & ~FLAG;
- __TBB_ASSERT( !( tricky_pointer(pred) & FLAG ), "use of corrupted pointer!" );
- __TBB_ASSERT( !pred->next, "the predecessor has another successor!");
- // ensure release semantics on IPF
- __TBB_store_with_release(pred->next,this);
- spin_wait_until_eq(going, 1);
+ __TBB_ASSERT( !( uintptr_t(pred) & FLAG ), "use of corrupted pointer!" );
+#if TBB_USE_ASSERT
+ __TBB_control_consistency_helper(); // on "m.q_tail"
+ __TBB_ASSERT( !__TBB_load_relaxed(pred->my_next), "the predecessor has another successor!");
+#endif
+ __TBB_store_with_release(pred->my_next,this);
+ spin_wait_until_eq(my_going, 1);
}
} else { // Acquiring for read
@@ -186,135 +188,134 @@ void queuing_rw_mutex::scoped_lock::acquire( queuing_rw_mutex& m, bool write )
#endif
if( pred ) {
unsigned short pred_state;
- __TBB_ASSERT( !this->prev, "the predecessor is already set" );
- if( tricky_pointer(pred)&FLAG ) {
+ __TBB_ASSERT( !__TBB_load_relaxed(my_prev), "the predecessor is already set" );
+ if( uintptr_t(pred) & FLAG ) {
/* this is only possible if pred is an upgrading reader and it signals us to wait */
pred_state = STATE_UPGRADE_WAITING;
pred = tricky_pointer(pred) & ~FLAG;
} else {
- // Load pred->state now, because once pred->next becomes
+ // Load pred->my_state now, because once pred->my_next becomes
// non-NULL, we must assume that *pred might be destroyed.
- pred_state = pred->state.compare_and_swap<tbb::acquire>(STATE_READER_UNBLOCKNEXT, STATE_READER);
+ pred_state = pred->my_state.compare_and_swap<tbb::acquire>(STATE_READER_UNBLOCKNEXT, STATE_READER);
}
- this->prev = pred;
- __TBB_ASSERT( !( tricky_pointer(pred) & FLAG ), "use of corrupted pointer!" );
- __TBB_ASSERT( !pred->next, "the predecessor has another successor!");
- // ensure release semantics on IPF
- __TBB_store_with_release(pred->next,this);
+ __TBB_store_relaxed(my_prev, pred);
+ __TBB_ASSERT( !( uintptr_t(pred) & FLAG ), "use of corrupted pointer!" );
+#if TBB_USE_ASSERT
+ __TBB_control_consistency_helper(); // on "m.q_tail"
+ __TBB_ASSERT( !__TBB_load_relaxed(pred->my_next), "the predecessor has another successor!");
+#endif
+ __TBB_store_with_release(pred->my_next,this);
if( pred_state != STATE_ACTIVEREADER ) {
#if DO_ITT_NOTIFY
sync_prepare_done = true;
- ITT_NOTIFY(sync_prepare, mutex);
+ ITT_NOTIFY(sync_prepare, my_mutex);
#endif
- spin_wait_until_eq(going, 1);
+ spin_wait_until_eq(my_going, 1);
}
}
- unsigned short old_state = state.compare_and_swap<tbb::acquire>(STATE_ACTIVEREADER, STATE_READER);
+ unsigned short old_state = my_state.compare_and_swap<tbb::acquire>(STATE_ACTIVEREADER, STATE_READER);
if( old_state!=STATE_READER ) {
#if DO_ITT_NOTIFY
if( !sync_prepare_done )
- ITT_NOTIFY(sync_prepare, mutex);
+ ITT_NOTIFY(sync_prepare, my_mutex);
#endif
// Failed to become active reader -> need to unblock the next waiting reader first
- __TBB_ASSERT( state==STATE_READER_UNBLOCKNEXT, "unexpected state" );
- spin_wait_while_eq(next, (scoped_lock*)NULL);
- /* state should be changed before unblocking the next otherwise it might finish
+ __TBB_ASSERT( my_state==STATE_READER_UNBLOCKNEXT, "unexpected state" );
+ spin_wait_while_eq(my_next, (scoped_lock*)NULL);
+ /* my_state should be changed before unblocking the next otherwise it might finish
and another thread can get our old state and left blocked */
- state = STATE_ACTIVEREADER;
- // ensure release semantics on IPF
- __TBB_store_with_release(next->going,1);
+ my_state = STATE_ACTIVEREADER;
+ __TBB_store_with_release(my_next->my_going,1);
}
}
- ITT_NOTIFY(sync_acquired, mutex);
+ ITT_NOTIFY(sync_acquired, my_mutex);
// Force acquire so that user's critical section receives correct values
// from processor that was previously in the user's critical section.
- __TBB_load_with_acquire(going);
+ __TBB_load_with_acquire(my_going);
}
bool queuing_rw_mutex::scoped_lock::try_acquire( queuing_rw_mutex& m, bool write )
{
- __TBB_ASSERT( !this->mutex, "scoped_lock is already holding a mutex");
+ __TBB_ASSERT( !my_mutex, "scoped_lock is already holding a mutex");
+
+ if( load<relaxed>(m.q_tail) )
+ return false; // Someone already took the lock
// Must set all fields before the fetch_and_store, because once the
// fetch_and_store executes, *this becomes accessible to other threads.
- prev = NULL;
- next = NULL;
- going = 0;
- state = state_t(write ? STATE_WRITER : STATE_ACTIVEREADER);
- internal_lock = RELEASED;
+ __TBB_store_relaxed(my_prev, (scoped_lock*)0);
+ __TBB_store_relaxed(my_next, (scoped_lock*)0);
+ __TBB_store_relaxed(my_going, 0); // TODO: remove dead assignment?
+ my_state = state_t(write ? STATE_WRITER : STATE_ACTIVEREADER);
+ my_internal_lock = RELEASED;
- if( m.q_tail ) return false;
// The CAS must have release semantics, because we are
// "sending" the fields initialized above to other processors.
- queuing_rw_mutex::scoped_lock* pred = m.q_tail.compare_and_swap<tbb::release>(this, NULL);
-
+ if( m.q_tail.compare_and_swap<tbb::release>(this, NULL) )
+ return false; // Someone already took the lock
// Force acquire so that user's critical section receives correct values
// from processor that was previously in the user's critical section.
// try_acquire should always have acquire semantic, even if failed.
- __TBB_load_with_acquire(going);
-
- if( !pred ) {
- mutex = &m;
- ITT_NOTIFY(sync_acquired, mutex);
- return true;
- } else return false;
-
+ __TBB_load_with_acquire(my_going);
+ my_mutex = &m;
+ ITT_NOTIFY(sync_acquired, my_mutex);
+ return true;
}
void queuing_rw_mutex::scoped_lock::release( )
{
- __TBB_ASSERT(this->mutex!=NULL, "no lock acquired");
+ __TBB_ASSERT(my_mutex!=NULL, "no lock acquired");
- ITT_NOTIFY(sync_releasing, mutex);
+ ITT_NOTIFY(sync_releasing, my_mutex);
- if( state == STATE_WRITER ) { // Acquired for write
+ if( my_state == STATE_WRITER ) { // Acquired for write
- // The logic below is the same as "writerUnlock", but restructured to remove "return" in the middle of routine.
- // In the statement below, acquire semantics of reading 'next' is required
- // so that following operations with fields of 'next' are safe.
- scoped_lock* n = __TBB_load_with_acquire(next);
+ // The logic below is the same as "writerUnlock", but elides
+ // "return" from the middle of the routine.
+ // In the statement below, acquire semantics of reading my_next is required
+ // so that following operations with fields of my_next are safe.
+ scoped_lock* n = __TBB_load_with_acquire(my_next);
if( !n ) {
- if( this == mutex->q_tail.compare_and_swap<tbb::release>(NULL, this) ) {
+ if( this == my_mutex->q_tail.compare_and_swap<tbb::release>(NULL, this) ) {
// this was the only item in the queue, and the queue is now empty.
goto done;
}
- spin_wait_while_eq( next, (scoped_lock*)NULL );
- n = next;
+ spin_wait_while_eq( my_next, (scoped_lock*)NULL );
+ n = __TBB_load_with_acquire(my_next);
}
- n->going = 2; // protect next queue node from being destroyed too early
- if( n->state==STATE_UPGRADE_WAITING ) {
+ __TBB_store_relaxed(n->my_going, 2); // protect next queue node from being destroyed too early
+ if( n->my_state==STATE_UPGRADE_WAITING ) {
// the next waiting for upgrade means this writer was upgraded before.
acquire_internal_lock();
- queuing_rw_mutex::scoped_lock* tmp = tricky_pointer::fetch_and_store<tbb::release>(&(n->prev), NULL);
- n->state = STATE_UPGRADE_LOSER;
- __TBB_store_with_release(n->going,1);
+ queuing_rw_mutex::scoped_lock* tmp = tricky_pointer::fetch_and_store<tbb::release>(&(n->my_prev), NULL);
+ n->my_state = STATE_UPGRADE_LOSER;
+ __TBB_store_with_release(n->my_going,1);
unblock_or_wait_on_internal_lock(get_flag(tmp));
} else {
- __TBB_ASSERT( state & (STATE_COMBINED_WAITINGREADER | STATE_WRITER), "unexpected state" );
- __TBB_ASSERT( !( tricky_pointer(n->prev) & FLAG ), "use of corrupted pointer!" );
- n->prev = NULL;
- // ensure release semantics on IPF
- __TBB_store_with_release(n->going,1);
+ __TBB_ASSERT( my_state & (STATE_COMBINED_WAITINGREADER | STATE_WRITER), "unexpected state" );
+ __TBB_ASSERT( !( uintptr_t(__TBB_load_relaxed(n->my_prev)) & FLAG ), "use of corrupted pointer!" );
+ __TBB_store_relaxed(n->my_prev, (scoped_lock*)0);
+ __TBB_store_with_release(n->my_going,1);
}
} else { // Acquired for read
queuing_rw_mutex::scoped_lock *tmp = NULL;
retry:
- // Addition to the original paper: Mark this->prev as in use
- queuing_rw_mutex::scoped_lock *pred = tricky_pointer::fetch_and_add<tbb::acquire>(&(this->prev), FLAG);
+ // Addition to the original paper: Mark my_prev as in use
+ queuing_rw_mutex::scoped_lock *pred = tricky_pointer::fetch_and_add<tbb::acquire>(&my_prev, FLAG);
if( pred ) {
if( !(pred->try_acquire_internal_lock()) )
{
// Failed to acquire the lock on pred. The predecessor either unlinks or upgrades.
// In the second case, it could or could not know my "in use" flag - need to check
- tmp = tricky_pointer::compare_and_swap<tbb::release>(&(this->prev), pred, tricky_pointer(pred)|FLAG );
- if( !(tricky_pointer(tmp)&FLAG) ) {
- // Wait for the predecessor to change this->prev (e.g. during unlink)
- spin_wait_while_eq( this->prev, tricky_pointer(pred)|FLAG );
+ tmp = tricky_pointer::compare_and_swap<tbb::release>(&my_prev, pred, tricky_pointer(pred) | FLAG );
+ if( !(uintptr_t(tmp) & FLAG) ) {
+ // Wait for the predecessor to change my_prev (e.g. during unlink)
+ spin_wait_while_eq( my_prev, tricky_pointer(pred)|FLAG );
// Now owner of pred is waiting for _us_ to release its lock
pred->release_internal_lock();
}
@@ -323,178 +324,177 @@ retry:
tmp = NULL;
goto retry;
}
- __TBB_ASSERT(pred && pred->internal_lock==ACQUIRED, "predecessor's lock is not acquired");
- this->prev = pred;
+ __TBB_ASSERT(pred && pred->my_internal_lock==ACQUIRED, "predecessor's lock is not acquired");
+ __TBB_store_relaxed(my_prev, pred);
acquire_internal_lock();
- __TBB_store_with_release(pred->next,reinterpret_cast<scoped_lock *>(NULL));
+ __TBB_store_with_release(pred->my_next,reinterpret_cast<scoped_lock *>(NULL));
- if( !next && this != mutex->q_tail.compare_and_swap<tbb::release>(pred, this) ) {
- spin_wait_while_eq( next, (void*)NULL );
+ if( !__TBB_load_relaxed(my_next) && this != my_mutex->q_tail.compare_and_swap<tbb::release>(pred, this) ) {
+ spin_wait_while_eq( my_next, (void*)NULL );
}
- __TBB_ASSERT( !get_flag(next), "use of corrupted pointer" );
+ __TBB_ASSERT( !get_flag(__TBB_load_relaxed(my_next)), "use of corrupted pointer" );
- // ensure acquire semantics of reading 'next'
- if( __TBB_load_with_acquire(next) ) { // I->next != nil
+ // ensure acquire semantics of reading 'my_next'
+ if( scoped_lock *const l_next = __TBB_load_with_acquire(my_next) ) { // I->next != nil, TODO: rename to n after clearing up and adapting the n in the comment two lines below
// Equivalent to I->next->prev = I->prev but protected against (prev[n]&FLAG)!=0
- tmp = tricky_pointer::fetch_and_store<tbb::release>(&(next->prev), pred);
+ tmp = tricky_pointer::fetch_and_store<tbb::release>(&(l_next->my_prev), pred);
// I->prev->next = I->next;
- __TBB_ASSERT(this->prev==pred, NULL);
- __TBB_store_with_release(pred->next,next);
+ __TBB_ASSERT(__TBB_load_relaxed(my_prev)==pred, NULL);
+ __TBB_store_with_release(pred->my_next, my_next);
}
// Safe to release in the order opposite to acquiring which makes the code simplier
pred->release_internal_lock();
} else { // No predecessor when we looked
acquire_internal_lock(); // "exclusiveLock(&I->EL)"
- // ensure acquire semantics of reading 'next'
- scoped_lock* n = __TBB_load_with_acquire(next);
+ scoped_lock* n = __TBB_load_with_acquire(my_next);
if( !n ) {
- if( this != mutex->q_tail.compare_and_swap<tbb::release>(NULL, this) ) {
- spin_wait_while_eq( next, (scoped_lock*)NULL );
- n = next;
+ if( this != my_mutex->q_tail.compare_and_swap<tbb::release>(NULL, this) ) {
+ spin_wait_while_eq( my_next, (scoped_lock*)NULL );
+ n = __TBB_load_relaxed(my_next);
} else {
goto unlock_self;
}
}
- n->going = 2; // protect next queue node from being destroyed too early
- tmp = tricky_pointer::fetch_and_store<tbb::release>(&(n->prev), NULL);
- // ensure release semantics on IPF
- __TBB_store_with_release(n->going,1);
+ __TBB_store_relaxed(n->my_going, 2); // protect next queue node from being destroyed too early
+ tmp = tricky_pointer::fetch_and_store<tbb::release>(&(n->my_prev), NULL);
+ __TBB_store_with_release(n->my_going,1);
}
unlock_self:
unblock_or_wait_on_internal_lock(get_flag(tmp));
}
done:
- spin_wait_while_eq( going, 2 );
+ spin_wait_while_eq( my_going, 2 );
initialize();
}
bool queuing_rw_mutex::scoped_lock::downgrade_to_reader()
{
- __TBB_ASSERT( state==STATE_WRITER, "no sense to downgrade a reader" );
+ __TBB_ASSERT( my_state==STATE_WRITER, "no sense to downgrade a reader" );
- ITT_NOTIFY(sync_releasing, mutex);
+ ITT_NOTIFY(sync_releasing, my_mutex);
- // ensure acquire semantics of reading 'next'
- if( ! __TBB_load_with_acquire(next) ) {
- state = STATE_READER;
- if( this==mutex->q_tail ) {
- unsigned short old_state = state.compare_and_swap<tbb::release>(STATE_ACTIVEREADER, STATE_READER);
+ if( ! __TBB_load_with_acquire(my_next) ) {
+ my_state = STATE_READER;
+ if( this==my_mutex->q_tail ) {
+ unsigned short old_state = my_state.compare_and_swap<tbb::release>(STATE_ACTIVEREADER, STATE_READER);
if( old_state==STATE_READER ) {
- goto downgrade_done;
+ // Downgrade completed
+ return true;
}
}
/* wait for the next to register */
- spin_wait_while_eq( next, (void*)NULL );
+ spin_wait_while_eq( my_next, (void*)NULL );
}
- __TBB_ASSERT( next, "still no successor at this point!" );
- if( next->state & STATE_COMBINED_WAITINGREADER )
- __TBB_store_with_release(next->going,1);
- else if( next->state==STATE_UPGRADE_WAITING )
+ scoped_lock *const n = __TBB_load_relaxed(my_next);
+ __TBB_ASSERT( n, "still no successor at this point!" );
+ if( n->my_state & STATE_COMBINED_WAITINGREADER )
+ __TBB_store_with_release(n->my_going,1);
+ else if( n->my_state==STATE_UPGRADE_WAITING )
// the next waiting for upgrade means this writer was upgraded before.
- next->state = STATE_UPGRADE_LOSER;
- state = STATE_ACTIVEREADER;
-
-downgrade_done:
+ n->my_state = STATE_UPGRADE_LOSER;
+ my_state = STATE_ACTIVEREADER;
return true;
}
bool queuing_rw_mutex::scoped_lock::upgrade_to_writer()
{
- __TBB_ASSERT( state==STATE_ACTIVEREADER, "only active reader can be upgraded" );
+ __TBB_ASSERT( my_state==STATE_ACTIVEREADER, "only active reader can be upgraded" );
queuing_rw_mutex::scoped_lock * tmp;
queuing_rw_mutex::scoped_lock * me = this;
- ITT_NOTIFY(sync_releasing, mutex);
- state = STATE_UPGRADE_REQUESTED;
+ ITT_NOTIFY(sync_releasing, my_mutex);
+ my_state = STATE_UPGRADE_REQUESTED;
requested:
- __TBB_ASSERT( !( tricky_pointer(next) & FLAG ), "use of corrupted pointer!" );
+ __TBB_ASSERT( !(uintptr_t(__TBB_load_relaxed(my_next)) & FLAG), "use of corrupted pointer!" );
acquire_internal_lock();
- if( this != mutex->q_tail.compare_and_swap<tbb::release>(tricky_pointer(me)|FLAG, this) ) {
- spin_wait_while_eq( next, (void*)NULL );
+ if( this != my_mutex->q_tail.compare_and_swap<tbb::release>(tricky_pointer(me)|FLAG, this) ) {
+ spin_wait_while_eq( my_next, (void*)NULL );
queuing_rw_mutex::scoped_lock * n;
- n = tricky_pointer::fetch_and_add<tbb::acquire>(&(this->next), FLAG);
- unsigned short n_state = n->state;
+ n = tricky_pointer::fetch_and_add<tbb::acquire>(&my_next, FLAG);
+ unsigned short n_state = n->my_state;
/* the next reader can be blocked by our state. the best thing to do is to unblock it */
if( n_state & STATE_COMBINED_WAITINGREADER )
- __TBB_store_with_release(n->going,1);
- tmp = tricky_pointer::fetch_and_store<tbb::release>(&(n->prev), this);
+ __TBB_store_with_release(n->my_going,1);
+ tmp = tricky_pointer::fetch_and_store<tbb::release>(&(n->my_prev), this);
unblock_or_wait_on_internal_lock(get_flag(tmp));
if( n_state & (STATE_COMBINED_READER | STATE_UPGRADE_REQUESTED) ) {
// save n|FLAG for simplicity of following comparisons
tmp = tricky_pointer(n)|FLAG;
atomic_backoff backoff;
- while(next==tmp) {
- if( state & STATE_COMBINED_UPGRADING ) {
- if( __TBB_load_with_acquire(next)==tmp )
- next = n;
+ while(__TBB_load_relaxed(my_next)==tmp) {
+ if( my_state & STATE_COMBINED_UPGRADING ) {
+ if( __TBB_load_with_acquire(my_next)==tmp )
+ __TBB_store_relaxed(my_next, n);
goto waiting;
}
backoff.pause();
}
- __TBB_ASSERT(next!=(tricky_pointer(n)|FLAG), NULL);
+ __TBB_ASSERT(__TBB_load_relaxed(my_next) != (tricky_pointer(n)|FLAG), NULL);
goto requested;
} else {
__TBB_ASSERT( n_state & (STATE_WRITER | STATE_UPGRADE_WAITING), "unexpected state");
- __TBB_ASSERT( (tricky_pointer(n)|FLAG)==next, NULL);
- next = n;
+ __TBB_ASSERT( (tricky_pointer(n)|FLAG) == __TBB_load_relaxed(my_next), NULL);
+ __TBB_store_relaxed(my_next, n);
}
} else {
/* We are in the tail; whoever comes next is blocked by q_tail&FLAG */
release_internal_lock();
- } // if( this != mutex->q_tail... )
- state.compare_and_swap<tbb::acquire>(STATE_UPGRADE_WAITING, STATE_UPGRADE_REQUESTED);
+ } // if( this != my_mutex->q_tail... )
+ my_state.compare_and_swap<tbb::acquire>(STATE_UPGRADE_WAITING, STATE_UPGRADE_REQUESTED);
waiting:
- __TBB_ASSERT( !( tricky_pointer(next) & FLAG ), "use of corrupted pointer!" );
- __TBB_ASSERT( state & STATE_COMBINED_UPGRADING, "wrong state at upgrade waiting_retry" );
+ __TBB_ASSERT( !( intptr_t(__TBB_load_relaxed(my_next)) & FLAG ), "use of corrupted pointer!" );
+ __TBB_ASSERT( my_state & STATE_COMBINED_UPGRADING, "wrong state at upgrade waiting_retry" );
__TBB_ASSERT( me==this, NULL );
- ITT_NOTIFY(sync_prepare, mutex);
- /* if noone was blocked by the "corrupted" q_tail, turn it back */
- mutex->q_tail.compare_and_swap<tbb::release>( this, tricky_pointer(me)|FLAG );
+ ITT_NOTIFY(sync_prepare, my_mutex);
+ /* if no one was blocked by the "corrupted" q_tail, turn it back */
+ my_mutex->q_tail.compare_and_swap<tbb::release>( this, tricky_pointer(me)|FLAG );
queuing_rw_mutex::scoped_lock * pred;
- pred = tricky_pointer::fetch_and_add<tbb::acquire>(&(this->prev), FLAG);
+ pred = tricky_pointer::fetch_and_add<tbb::acquire>(&my_prev, FLAG);
if( pred ) {
bool success = pred->try_acquire_internal_lock();
- pred->state.compare_and_swap<tbb::release>(STATE_UPGRADE_WAITING, STATE_UPGRADE_REQUESTED);
+ pred->my_state.compare_and_swap<tbb::release>(STATE_UPGRADE_WAITING, STATE_UPGRADE_REQUESTED);
if( !success ) {
- tmp = tricky_pointer::compare_and_swap<tbb::release>(&(this->prev), pred, tricky_pointer(pred)|FLAG );
- if( tricky_pointer(tmp)&FLAG ) {
- spin_wait_while_eq(this->prev, pred);
- pred = this->prev;
+ tmp = tricky_pointer::compare_and_swap<tbb::release>(&my_prev, pred, tricky_pointer(pred)|FLAG );
+ if( uintptr_t(tmp) & FLAG ) {
+ spin_wait_while_eq(my_prev, pred);
+ pred = __TBB_load_relaxed(my_prev);
} else {
- spin_wait_while_eq( this->prev, tricky_pointer(pred)|FLAG );
+ spin_wait_while_eq( my_prev, tricky_pointer(pred)|FLAG );
pred->release_internal_lock();
}
} else {
- this->prev = pred;
+ __TBB_store_relaxed(my_prev, pred);
pred->release_internal_lock();
- spin_wait_while_eq(this->prev, pred);
- pred = this->prev;
+ spin_wait_while_eq(my_prev, pred);
+ pred = __TBB_load_relaxed(my_prev);
}
if( pred )
goto waiting;
} else {
- // restore the corrupted prev field for possible further use (e.g. if downgrade back to reader)
- this->prev = pred;
+ // restore the corrupted my_prev field for possible further use (e.g. if downgrade back to reader)
+ __TBB_store_relaxed(my_prev, pred);
}
- __TBB_ASSERT( !pred && !this->prev, NULL );
+ __TBB_ASSERT( !pred && !__TBB_load_relaxed(my_prev), NULL );
// additional lifetime issue prevention checks
// wait for the successor to finish working with my fields
wait_for_release_of_internal_lock();
// now wait for the predecessor to finish working with my fields
- spin_wait_while_eq( going, 2 );
- // there is an acquire semantics statement in the end of spin_wait_while_eq.
+ spin_wait_while_eq( my_going, 2 );
+
+ // Acquire critical section indirectly from previous owner or directly from predecessor (TODO: not clear).
+ __TBB_control_consistency_helper(); // on either "my_mutex->q_tail" or "my_going" (TODO: not clear)
- bool result = ( state != STATE_UPGRADE_LOSER );
- state = STATE_WRITER;
- going = 1;
+ bool result = ( my_state != STATE_UPGRADE_LOSER );
+ my_state = STATE_WRITER;
+ __TBB_store_relaxed(my_going, 1);
- ITT_NOTIFY(sync_acquired, mutex);
+ ITT_NOTIFY(sync_acquired, my_mutex);
return result;
}
diff --git a/src/tbb/scheduler.cpp b/src/tbb/scheduler.cpp
index c6a0205..21874a8 100644
--- a/src/tbb/scheduler.cpp
+++ b/src/tbb/scheduler.cpp
@@ -39,10 +39,14 @@
namespace tbb {
namespace internal {
+//------------------------------------------------------------------------
+// Library initialization
+//------------------------------------------------------------------------
+
/** Defined in tbb_main.cpp **/
extern generic_scheduler* (*AllocateSchedulerPtr)( arena*, size_t index );
-inline generic_scheduler* allocate_scheduler ( arena* a, size_t index ) {
+inline generic_scheduler* allocate_scheduler ( arena* a, size_t index ) {
return AllocateSchedulerPtr(a, index);
}
@@ -52,7 +56,7 @@ spin_mutex the_context_state_propagation_mutex;
uintptr_t the_context_state_propagation_epoch = 0;
//! Context to be associated with dummy tasks of worker threads schedulers.
-/** It is never used for its direct purpose, and is introduced solely for the sake
+/** It is never used for its direct purpose, and is introduced solely for the sake
of avoiding one extra conditional branch in the end of wait_for_all method. **/
static task_group_context dummy_context(task_group_context::isolated);
#endif /* __TBB_TASK_GROUP_CONTEXT */
@@ -80,7 +84,7 @@ scheduler::~scheduler( ) {}
//------------------------------------------------------------------------
#if _MSC_VER && !defined(__INTEL_COMPILER)
- // Suppress overzealous compiler warning about using 'this' in base initializer list.
+ // Suppress overzealous compiler warning about using 'this' in base initializer list.
#pragma warning(push)
#pragma warning(disable:4355)
#endif
@@ -98,7 +102,6 @@ generic_scheduler::generic_scheduler( arena* a, size_t index )
, my_dummy_task(NULL)
, my_ref_count(1)
, my_affinity_id(0)
- , my_registered(false)
, my_auto_initialized(false)
#if __TBB_SCHEDULER_OBSERVER
, my_local_last_observer_proxy(NULL)
@@ -111,8 +114,8 @@ generic_scheduler::generic_scheduler( arena* a, size_t index )
#if __TBB_TASK_GROUP_CONTEXT
, my_local_ctx_list_update(0)
#endif /* __TBB_TASK_GROUP_CONTEXT */
-#if __TBB_TASK_PRIORITY
, my_dispatching_task(NULL)
+#if __TBB_TASK_PRIORITY
, my_ref_top_priority(NULL)
, my_offloaded_tasks(NULL)
, my_offloaded_task_list_tail_link(NULL)
@@ -129,7 +132,8 @@ generic_scheduler::generic_scheduler( arena* a, size_t index )
{
my_dummy_slot.task_pool = allocate_task_pool(min_task_pool_size);
__TBB_ASSERT( my_task_pool_size == min_task_pool_size, NULL );
- my_dummy_slot.head = my_dummy_slot.tail = 0;
+ __TBB_store_relaxed(my_dummy_slot.head, 0);
+ __TBB_store_relaxed(my_dummy_slot.tail, 0);
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;
@@ -154,27 +158,31 @@ 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 );
- __TBB_ASSERT( my_arena_slot->head <= my_arena_slot->tail, NULL );
- for ( size_t i = 0; i < my_arena_slot->head; ++i )
+ 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 );
+ for ( size_t i = 0; i < H; ++i )
__TBB_ASSERT( tp[i] == poisoned_ptr, "Task pool corrupted" );
- for ( size_t i = my_arena_slot->head; i < my_arena_slot->tail; ++i ) {
+ for ( size_t i = H; i < T; ++i ) {
__TBB_ASSERT( (uintptr_t)tp[i] + 1 > 1u, "nil or invalid task pointer in the deque" );
__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 = my_arena_slot->tail; i < my_task_pool_size; ++i )
+ for ( size_t i = T; i < 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 > 1 */
+#endif /* TBB_USE_ASSERT */
void generic_scheduler::init_stack_info () {
- // Stacks are growing top-down. Highest address is called "stack base",
+ // Stacks are growing top-down. Highest address is called "stack base",
// and the lowest is "stack limit".
__TBB_ASSERT( !my_stealing_threshold, "Stealing threshold has already been calculated" );
size_t stack_size = my_market->worker_stack_size();
@@ -186,7 +194,7 @@ void generic_scheduler::init_stack_info () {
#endif
__TBB_ASSERT( &pteb < pteb->StackBase && &pteb > pteb->StackLimit, "invalid stack info in TEB" );
__TBB_ASSERT( stack_size >0, "stack_size not initialized?" );
- // When a thread is created with the attribute STACK_SIZE_PARAM_IS_A_RESERVATION, stack limit
+ // When a thread is created with the attribute STACK_SIZE_PARAM_IS_A_RESERVATION, stack limit
// in the TIB points to the committed part of the stack only. This renders the expression
// "(uintptr_t)pteb->StackBase / 2 + (uintptr_t)pteb->StackLimit / 2" virtually useless.
// Thus for worker threads we use the explicit stack size we used while creating them.
@@ -198,9 +206,9 @@ void generic_scheduler::init_stack_info () {
else
my_stealing_threshold = (uintptr_t)pteb->StackBase - MByte / 2;
#else /* USE_PTHREAD */
- // There is no portable way to get stack base address in Posix, so we use
- // non-portable method (on all modern Linux) or the simplified approach
- // based on the common sense assumptions. The most important assumption
+ // There is no portable way to get stack base address in Posix, so we use
+ // non-portable method (on all modern Linux) or the simplified approach
+ // based on the common sense assumptions. The most important assumption
// is that the main thread's stack size is not less than that of other threads.
void *stack_base = &stack_size;
#if __TBB_ipf
@@ -231,7 +239,7 @@ void generic_scheduler::init_stack_info () {
stack_size = np_stack_size;
#endif /* !__TBB_ipf */
}
- // We are either in the main thread or this thread stack
+ // We are either in the main thread or this thread stack
// is bigger that that of the main one. As we cannot discern
// these cases we fall back to the default (heuristic) values.
}
@@ -249,10 +257,11 @@ void generic_scheduler::init_stack_info () {
#endif /* USE_PTHREAD */
}
+#if __TBB_TASK_GROUP_CONTEXT
/** The function uses synchronization scheme similar to the one in the destructor
of task_group_context augmented with interlocked state change of each context
object. The purpose of this algo is to prevent threads doing nonlocal context
- destruction from accessing destroyed owner-scheduler instance still pointed to
+ destruction from accessing destroyed owner-scheduler instance still pointed to
by the context object. **/
void generic_scheduler::cleanup_local_context_list () {
// Detach contexts remaining in the local list
@@ -262,7 +271,7 @@ void generic_scheduler::cleanup_local_context_list () {
{
// This is just a definition. Actual lock is acquired only in case of conflict.
spin_mutex::scoped_lock lock;
- // Full fence prevents reordering of store to my_local_ctx_list_update with
+ // 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
@@ -287,12 +296,10 @@ void generic_scheduler::cleanup_local_context_list () {
if ( wait_for_concurrent_destroyers_to_leave )
spin_wait_until_eq( my_nonlocal_ctx_list_update, 0u );
}
+#endif /* __TBB_TASK_GROUP_CONTEXT */
void generic_scheduler::free_scheduler() {
- if( in_arena() ) {
- acquire_task_pool();
- leave_arena();
- }
+ __TBB_ASSERT( !in_arena(), NULL );
#if __TBB_TASK_GROUP_CONTEXT
cleanup_local_context_list();
#endif /* __TBB_TASK_GROUP_CONTEXT */
@@ -306,7 +313,7 @@ void generic_scheduler::free_scheduler() {
deallocate_task(*t);
++k;
}
- if( my_return_list==plugged_return_list() )
+ if( my_return_list==plugged_return_list() )
break;
my_free_list = (task*)__TBB_FetchAndStoreW( &my_return_list, (intptr_t)plugged_return_list() );
}
@@ -322,7 +329,7 @@ void generic_scheduler::free_scheduler() {
NFS_Free( this );
}
-task& generic_scheduler::allocate_task( size_t number_of_bytes,
+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;
@@ -378,10 +385,10 @@ void generic_scheduler::free_nonlocal_small_task( task& t ) {
__TBB_ASSERT( &s!=this, NULL );
for(;;) {
task* old = s.my_return_list;
- if( old==plugged_return_list() )
+ if( old==plugged_return_list() )
break;
// Atomically insert t at head of s.my_return_list
- t.prefix().next = old;
+ 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);
@@ -396,28 +403,44 @@ void generic_scheduler::free_nonlocal_small_task( task& t ) {
}
}
-void generic_scheduler::grow_task_pool( size_t new_size ) {
- if ( new_size < 2 * my_task_pool_size )
- new_size = 2 * my_task_pool_size;
- task** new_pool = allocate_task_pool( new_size ); // updates my_task_pool_size
- task** old_pool = my_dummy_slot.task_pool;
- acquire_task_pool(); // requires the old my_dummy_slot.task_pool value
- size_t new_tail = my_arena_slot->tail - my_arena_slot->head;
- __TBB_ASSERT( my_arena_slot->tail <= my_task_pool_size, "new task pool is too short" );
- memcpy( new_pool, old_pool + my_arena_slot->head, new_tail * sizeof(task*) );
- my_arena_slot->head = 0;
- my_dummy_slot.task_pool = new_pool;
- // Tail is updated last to minimize probability of a thread making arena
- // snapshot being misguided into thinking that this task pool is empty.
- my_arena_slot->tail = new_tail;
- release_task_pool(); // updates the task pool pointer in our arena slot
- free_task_pool( old_pool );
+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 )
+ 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;
+ // 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 ) {
+ // 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 );
+ 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*) );
+ commit_relocated_tasks(T);
+ free_task_pool( old_pool );
+ }
assert_task_pool_valid();
+ return T;
}
-/** ATTENTION:
- This method is mostly the same as generic_scheduler::lock_task_pool(), with
- a little different logic of slot state checks (slot is either locked or points
+/** ATTENTION:
+ This method is mostly the same as generic_scheduler::lock_task_pool(), with
+ a little different logic of slot state checks (slot is either locked or points
to our task pool).
Thus if either of them is changed, consider changing the counterpart as well. **/
inline void generic_scheduler::acquire_task_pool() const {
@@ -428,19 +451,19 @@ inline void generic_scheduler::acquire_task_pool() const {
for(;;) {
#if TBB_USE_ASSERT
__TBB_ASSERT( my_arena_slot == my_arena->my_slots + my_arena_index, "invalid arena slot index" );
- // Local copy of the arena slot task pool pointer is necessary for the next
+ // 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?" );
#endif
- if( my_arena_slot->task_pool != LockedTaskPool &&
- __TBB_CompareAndSwapW( &my_arena_slot->task_pool, (intptr_t)LockedTaskPool,
+ 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 )
{
// We acquired our own slot
ITT_NOTIFY(sync_acquired, my_arena_slot);
break;
- }
+ }
else if( !sync_prepare_done ) {
// Start waiting
ITT_NOTIFY(sync_prepare, my_arena_slot);
@@ -461,10 +484,10 @@ inline void generic_scheduler::release_task_pool() const {
__TBB_store_with_release( my_arena_slot->task_pool, my_dummy_slot.task_pool );
}
-/** ATTENTION:
- This method is mostly the same as generic_scheduler::acquire_task_pool(),
- with a little different logic of slot state checks (slot can be empty, locked
- or point to any task pool other than ours, and asynchronous transitions between
+/** ATTENTION:
+ This method is mostly the same as generic_scheduler::acquire_task_pool(),
+ with a little different logic of slot state checks (slot can be empty, locked
+ or point to any task pool other than ours, and asynchronous transitions between
all these states are possible).
Thus if any of them is changed, consider changing the counterpart as well **/
inline task** generic_scheduler::lock_task_pool( arena_slot* victim_arena_slot ) const {
@@ -482,8 +505,8 @@ inline task** generic_scheduler::lock_task_pool( arena_slot* victim_arena_slot )
ITT_NOTIFY(sync_cancel, victim_arena_slot);
break;
}
- if( victim_task_pool != LockedTaskPool &&
- __TBB_CompareAndSwapW( &victim_arena_slot->task_pool,
+ 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 )
{
// We've locked victim's task pool
@@ -499,13 +522,13 @@ inline task** generic_scheduler::lock_task_pool( arena_slot* victim_arena_slot )
// Someone else acquired a lock, so pause and do exponential backoff.
backoff.pause();
}
- __TBB_ASSERT( victim_task_pool == EmptyTaskPool ||
- (victim_arena_slot->task_pool == LockedTaskPool && victim_task_pool != LockedTaskPool),
+ __TBB_ASSERT( victim_task_pool == EmptyTaskPool ||
+ (victim_arena_slot->task_pool == LockedTaskPool && victim_task_pool != LockedTaskPool),
"not really locked victim's task pool?" );
return victim_task_pool;
} // generic_scheduler::lock_task_pool
-inline void generic_scheduler::unlock_task_pool( arena_slot* victim_arena_slot,
+inline void generic_scheduler::unlock_task_pool( arena_slot* victim_arena_slot,
task** victim_task_pool ) const {
__TBB_ASSERT( victim_arena_slot, "empty victim arena slot pointer" );
__TBB_ASSERT( victim_arena_slot->task_pool == LockedTaskPool, "victim arena slot is not locked" );
@@ -526,14 +549,16 @@ inline task* generic_scheduler::prepare_for_spawning( task* t ) {
}
#endif /* TBB_USE_ASSERT */
affinity_id dst_thread = t->prefix().affinity;
- __TBB_ASSERT( dst_thread == 0 || is_version_3_task(*t), "backwards compatibility to TBB 2.0 tasks is broken" );
+ __TBB_ASSERT( dst_thread == 0 || is_version_3_task(*t),
+ "backwards compatibility to TBB 2.0 tasks is broken" );
if( dst_thread != 0 && dst_thread != my_affinity_id ) {
- task_proxy& proxy = (task_proxy&)allocate_task( sizeof(task_proxy),
+ task_proxy& proxy = (task_proxy&)allocate_task( sizeof(task_proxy),
__TBB_CONTEXT_ARG(NULL, NULL) );
// Mark as a proxy
proxy.prefix().extra_state = es_task_proxy;
proxy.outbox = &my_arena->mailbox(dst_thread);
- proxy.task_and_tag = intptr_t(t)|3;
+ // Mark proxy as present in both locations (sender's task pool and destination mailbox)
+ proxy.task_and_tag = intptr_t(t) | task_proxy::location_mask;
#if __TBB_TASK_PRIORITY
proxy.prefix().context = t->prefix().context;
#endif /* __TBB_TASK_PRIORITY */
@@ -549,12 +574,11 @@ inline task* generic_scheduler::prepare_for_spawning( task* t ) {
But doing so would force us to publish class scheduler in the headers. */
void generic_scheduler::local_spawn( task& first, task*& next ) {
__TBB_ASSERT( governor::is_set(this), NULL );
- assert_task_pool_valid();
if ( &first.prefix().next == &next ) {
// Single task is being spawned
- prepare_task_pool( 1 );
- my_dummy_slot.task_pool[my_arena_slot->tail] = prepare_for_spawning( &first );
- commit_spawned_tasks( my_arena_slot->tail + 1 );
+ size_t T = prepare_task_pool( 1 );
+ my_dummy_slot.task_pool[T] = prepare_for_spawning( &first );
+ commit_spawned_tasks( T + 1 );
}
else {
// Task list is being spawned
@@ -572,10 +596,9 @@ void generic_scheduler::local_spawn( task& first, task*& next ) {
break;
}
size_t num_tasks = tasks.size();
- prepare_task_pool( num_tasks );
- assert_task_pool_valid();
- tasks.copy_memory( my_dummy_slot.task_pool + my_arena_slot->tail );
- commit_spawned_tasks( my_arena_slot->tail + num_tasks );
+ size_t T = prepare_task_pool( num_tasks );
+ tasks.copy_memory( my_dummy_slot.task_pool + T );
+ commit_spawned_tasks( T + num_tasks );
}
if ( !in_arena() )
enter_arena();
@@ -594,7 +617,7 @@ void generic_scheduler::local_spawn_root_and_wait( task& first, task*& next ) {
t->prefix().parent = &dummy;
if( &t->prefix().next==&next ) break;
#if __TBB_TASK_GROUP_CONTEXT
- __TBB_ASSERT( t->prefix().context == t->prefix().next->prefix().context,
+ __TBB_ASSERT( t->prefix().context == t->prefix().next->prefix().context,
"all the root tasks in list must share the same context");
#endif /* __TBB_TASK_GROUP_CONTEXT */
}
@@ -606,43 +629,15 @@ void generic_scheduler::local_spawn_root_and_wait( task& first, task*& next ) {
inline task* generic_scheduler::get_mailbox_task() {
__TBB_ASSERT( my_affinity_id>0, "not in arena" );
- task* result = NULL;
- while( task_proxy* t = my_inbox.pop() ) {
- intptr_t tat = __TBB_load_with_acquire(t->task_and_tag);
- __TBB_ASSERT( tat==task_proxy::mailbox_bit || (tat==(tat|3)&&tat!=3), NULL );
- if( tat!=task_proxy::mailbox_bit && __TBB_CompareAndSwapW( &t->task_and_tag, task_proxy::pool_bit, tat )==tat ) {
- // Successfully grabbed the task, and left pool seeker with job of freeing the proxy.
+ 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 = (task*)(tat & ~3);
- result->prefix().extra_state |= es_task_is_stolen; // mark task as stolen
- break;
+ result->prefix().extra_state |= es_task_is_stolen;
+ return result;
}
- free_task_proxy( *t );
+ // We have exclusive access to the proxy, and can destroy it.
+ free_task<small_task>(*tp);
}
- return result;
-}
-
-inline task* generic_scheduler::strip_proxy( task_proxy* tp ) {
- __TBB_ASSERT( tp->prefix().extra_state==es_task_proxy, NULL );
- intptr_t tat = __TBB_load_with_acquire(tp->task_and_tag);
- if( (tat&3)==3 ) {
- // proxy is shared by a pool and a mailbox.
- // Attempt to transition it to "empty proxy in mailbox" state.
- if( __TBB_CompareAndSwapW( &tp->task_and_tag, task_proxy::mailbox_bit, tat )==tat ) {
- // Successfully grabbed the task, and left the mailbox with the job of freeing the proxy.
- return (task*)(tat&~3);
- }
- __TBB_ASSERT( tp->task_and_tag==task_proxy::pool_bit, NULL );
- } else {
- // We have exclusive access to the proxy
- __TBB_ASSERT( (tat&3)==task_proxy::pool_bit, "task did not come from pool?" );
- __TBB_ASSERT ( !(tat&~3), "Empty proxy in the pool contains non-zero task pointer" );
- }
-#if TBB_USE_ASSERT
- tp->prefix().state = task::allocated;
-#endif
- free_task_proxy( *tp );
- // Another thread grabbed the underlying task via their mailbox
return NULL;
}
@@ -685,7 +680,6 @@ void generic_scheduler::local_enqueue( task& t
if ( p != my_arena->my_top_priority )
my_market->update_arena_priority( *my_arena, p );
#endif /* __TBB_TASK_PRIORITY */
- assert_task_pool_valid();
}
inline task* generic_scheduler::dequeue_task() {
@@ -713,58 +707,58 @@ task* generic_scheduler::winnow_task_pool () {
GATHER_STATISTIC( ++my_counters.prio_winnowings );
__TBB_ASSERT( in_arena(), NULL );
__TBB_ASSERT( my_offloaded_tasks, "At least one task is expected to be already offloaded" );
- // To eliminate possible sinking of the store to the indicator below the subsequent
- // store to my_arena_slot->tail, the stores should've either been separated
- // by full fence or both use release fences. And resetting indicator should've
- // been done with release fence. But since this is just an optimization, and
- // the corresponding checking sequence in arena::is_out_of_work() is not atomic
+ // To eliminate possible sinking of the store to the indicator below the subsequent
+ // store to my_arena_slot->tail, the stores should've either been separated
+ // by full fence or both use release fences. And resetting indicator should've
+ // been done with release fence. But since this is just an optimization, and
+ // the corresponding checking sequence in arena::is_out_of_work() is not atomic
// anyway, fences aren't used, so that not to penalize warmer path.
auto_indicator indicator(my_pool_reshuffling_pending);
// The purpose of the synchronization algorithm here is for the owner thread
// to avoid locking task pool most of the time.
- size_t orig_tail = my_arena_slot->tail;
- my_arena_slot->tail = my_arena_slot->head - 1;
+ size_t T0 = __TBB_load_relaxed(my_arena_slot->tail);
+ __TBB_store_relaxed( my_arena_slot->tail, __TBB_load_relaxed(my_arena_slot->head) - 1 );
atomic_fence();
- size_t h = my_arena_slot->head;
- __TBB_ASSERT( (intptr_t)my_arena_slot->tail <= (intptr_t)orig_tail, NULL);
- __TBB_ASSERT( (intptr_t)h >= (intptr_t)my_arena_slot->tail
- || (h == orig_tail && my_arena_slot->tail == orig_tail), NULL );
+ size_t H = __TBB_load_relaxed(my_arena_slot->head);
+ size_t T = __TBB_load_relaxed(my_arena_slot->tail);
+ __TBB_ASSERT( (intptr_t)T <= (intptr_t)T0, NULL);
+ __TBB_ASSERT( (intptr_t)H >= (intptr_t)T || (H == T0 && T == T0), NULL );
bool acquired = false;
- if ( h == my_arena_slot->tail ) {
+ if ( H == T ) {
// Either no contention with thieves during arbitration protocol execution or ...
- if ( h >= orig_tail ) {
+ if ( H >= T0 ) {
// ... the task pool got empty
reset_deque_and_leave_arena( /*locked=*/false );
return NULL;
}
}
else {
- // Contention with thieves detected. Now without taking lock it is impossible
- // to define the current head value because of its jitter caused by continuing
+ // Contention with thieves detected. Now without taking lock it is impossible
+ // to define the current head value because of its jitter caused by continuing
// stealing attempts (the pool is not locked so far).
acquired = true;
acquire_task_pool();
- h = my_arena_slot->head;
- if ( h >= orig_tail ) {
+ H = __TBB_load_relaxed(my_arena_slot->head);
+ if ( H >= T0 ) {
reset_deque_and_leave_arena( /*locked=*/true );
return NULL;
}
}
size_t src,
- dst = orig_tail;
- // Find the first task to offload.
- for ( src = h; src < orig_tail; ++src ) {
+ dst = T0;
+ // Find the first task to offload.
+ for ( src = H; src < T0; ++src ) {
task &t = *my_dummy_slot.task_pool[src];
intptr_t p = priority(t);
if ( p < *my_ref_top_priority ) {
- // Position of the first offloaded task will be the starting point
+ // Position of the first offloaded task will be the starting point
// for relocation of subsequent tasks that survive winnowing.
dst = src;
offload_task( t, p );
break;
}
}
- for ( ++src; src < orig_tail; ++src ) {
+ for ( ++src; src < T0; ++src ) {
task &t = *my_dummy_slot.task_pool[src];
intptr_t p = priority(t);
if ( p < *my_ref_top_priority )
@@ -772,24 +766,24 @@ task* generic_scheduler::winnow_task_pool () {
else
my_dummy_slot.task_pool[dst++] = &t;
}
- __TBB_ASSERT( orig_tail >= dst, NULL );
- task *t = h < dst ? my_dummy_slot.task_pool[--dst] : NULL;
- if ( h == dst ) {
+ __TBB_ASSERT( T0 >= dst, NULL );
+ task *t = H < dst ? my_dummy_slot.task_pool[--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 );
- my_arena_slot->tail = dst;
+ __TBB_ASSERT( !is_poisoned(my_dummy_slot.task_pool[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_dummy_slot.task_pool[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, orig_tail );
+ fill_with_canary_pattern( my_dummy_slot.task_pool, dst, T0 );
assert_task_pool_valid();
return t;
}
@@ -832,16 +826,17 @@ task* generic_scheduler::reload_tasks ( task*& offloaded_tasks, task**& offloade
size_t num_tasks = tasks.size();
if ( num_tasks ) {
GATHER_STATISTIC( ++my_counters.prio_tasks_reloaded );
- prepare_task_pool( num_tasks );
- tasks.copy_memory( my_dummy_slot.task_pool + my_arena_slot->tail );
+ size_t T = prepare_task_pool( num_tasks );
+ tasks.copy_memory( my_dummy_slot.task_pool + T );
if ( --num_tasks ) {
- commit_spawned_tasks( my_arena_slot->tail + num_tasks );
+ commit_spawned_tasks( T += num_tasks );
enter_arena();
my_arena->advertise_new_work</*Spawned=*/true>();
}
- __TBB_ASSERT( my_arena_slot->tail < my_task_pool_size, NULL );
- t = my_dummy_slot.task_pool[my_arena_slot->tail];
- poison_pointer(my_dummy_slot.task_pool[my_arena_slot->tail]);
+ __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]);
assert_task_pool_valid();
}
return t;
@@ -853,11 +848,11 @@ task* generic_scheduler::reload_tasks () {
if ( my_local_reload_epoch == reload_epoch )
return NULL;
__TBB_ASSERT( my_offloaded_tasks, NULL );
- intptr_t top_priority = *my_ref_top_priority;
+ intptr_t top_priority = effective_reference_priority();
__TBB_ASSERT( (uintptr_t)top_priority < (uintptr_t)num_priority_levels, NULL );
task *t = reload_tasks( my_offloaded_tasks, my_offloaded_task_list_tail_link, top_priority );
if ( my_offloaded_tasks && (my_arena->my_bottom_priority >= top_priority || !my_arena->my_num_workers_requested) ) {
- // Safeguard against deliberately relaxed synchronization while checking
+ // Safeguard against deliberately relaxed synchronization while checking
// for the presence of work in arena (so that not to impact hot paths).
// Arena may be reset to empty state when offloaded low priority tasks
// are still present. This results in both bottom and top priority bounds
@@ -878,37 +873,45 @@ task* generic_scheduler::reload_tasks () {
inline task* generic_scheduler::get_task() {
__TBB_ASSERT( in_arena(), NULL );
task* result = NULL;
+ size_t T = __TBB_load_relaxed(my_arena_slot->tail); // mirror
retry:
- --my_arena_slot->tail;
+ __TBB_store_relaxed(my_arena_slot->tail, --T);
atomic_fence();
- if ( (intptr_t)my_arena_slot->head > (intptr_t)my_arena_slot->tail ) {
+ if ( (intptr_t)__TBB_load_relaxed(my_arena_slot->head) > (intptr_t)T ) {
acquire_task_pool();
- if ( (intptr_t)my_arena_slot->head <= (intptr_t)my_arena_slot->tail ) {
+ 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 just acquired lock.
- result = my_dummy_slot.task_pool[my_arena_slot->tail];
+ // Task pool pointer from our arena slot is garbled by above taken lock.
+ result = my_dummy_slot.task_pool[T];
__TBB_ASSERT( !is_poisoned(result), NULL );
- poison_pointer( my_dummy_slot.task_pool[my_arena_slot->tail] );
+ poison_pointer( my_dummy_slot.task_pool[T] );
}
- else
- __TBB_ASSERT ( my_arena_slot->head == my_arena_slot->tail + 1, "victim/thief arbitration algorithm failure" );
- if ( (intptr_t)my_arena_slot->head < (intptr_t)my_arena_slot->tail )
+ else {
+ __TBB_ASSERT ( H == __TBB_load_relaxed(my_arena_slot->head)
+ && T == __TBB_load_relaxed(my_arena_slot->tail)
+ && H == T + 1, "victim/thief arbitration algorithm failure" );
+ }
+ if ( (intptr_t)H < (intptr_t)T )
release_task_pool();
else
reset_deque_and_leave_arena( /*locked=*/true );
}
else {
- result = my_dummy_slot.task_pool[my_arena_slot->tail];
+ __TBB_control_consistency_helper(); // on my_arena_slot->head
+ result = my_dummy_slot.task_pool[T];
__TBB_ASSERT( !is_poisoned(result), NULL );
- poison_pointer( my_dummy_slot.task_pool[my_arena_slot->tail] );
+ poison_pointer( my_dummy_slot.task_pool[T] );
}
if( result && is_proxy(*result) ) {
- result = strip_proxy((task_proxy*)result);
+ task_proxy &tp = *(task_proxy*)result;
+ result = tp.extract_task<task_proxy::pool_bit>();
if( !result ) {
+ // Proxy was empty, so it's our responsibility to free it
+ free_task<small_task>(tp);
if ( in_arena() )
goto retry;
- __TBB_ASSERT( my_arena_slot->head == 0 && my_arena_slot->tail == 0, NULL );
+ __TBB_ASSERT( is_quiescent_local_task_pool_reset(), NULL );
return NULL;
}
GATHER_STATISTIC( ++my_counters.proxies_executed );
@@ -918,7 +921,7 @@ retry:
my_innermost_running_task = result;
result->note_affinity(my_affinity_id);
}
- __TBB_ASSERT( result || my_arena_slot->head == 0 && my_arena_slot->tail == 0, NULL );
+ __TBB_ASSERT( result || is_quiescent_local_task_pool_reset(), NULL );
return result;
} // generic_scheduler::get_task
@@ -926,43 +929,49 @@ task* generic_scheduler::steal_task( arena_slot& victim_slot ) {
task** victim_pool = lock_task_pool( &victim_slot );
if ( !victim_pool )
return NULL;
- const size_t none = ~size_t(0);
- size_t first_skipped_proxy = none;
task* result = NULL;
+ size_t H = __TBB_load_relaxed(victim_slot.head); // mirror
+ const size_t H0 = H;
retry:
- ++victim_slot.head;
+ __TBB_store_relaxed( victim_slot.head, ++H );
atomic_fence();
- if ( (intptr_t)victim_slot.head > (intptr_t)victim_slot.tail ) {
+ if ( (intptr_t)H > (intptr_t)__TBB_load_relaxed(victim_slot.tail) ) {
+ // Stealing attempt failed, deque contents has not been changed by us
GATHER_STATISTIC( ++my_counters.thief_backoffs );
- --victim_slot.head;
+ __TBB_store_relaxed( victim_slot.head, /*dead: H = */ H0 );
+ __TBB_ASSERT ( !result, NULL );
}
else {
- // If one of the supported architectures allows speculative execution
- // of fences (as part of branch prediction mechanics), acquire fence
- // should go up to the victim_slot.tail load.
- result = victim_pool[__TBB_load_with_acquire(victim_slot.head) - 1];
+ __TBB_control_consistency_helper(); // on victim_slot.tail
+ result = victim_pool[H-1];
__TBB_ASSERT( !is_poisoned(result), NULL );
if( is_proxy(*result) ) {
task_proxy& tp = *static_cast<task_proxy*>(result);
- // If task will likely be grabbed by whom it was mailed to, skip it.
- if( (tp.task_and_tag & 3) == 3 && tp.outbox->recipient_is_idle() ) {
+ // If mailed task is likely to be grabbed by its destination thread, skip it.
+ if ( task_proxy::is_shared(tp.task_and_tag) && tp.outbox->recipient_is_idle() )
+ {
GATHER_STATISTIC( ++my_counters.proxies_bypassed );
- if ( first_skipped_proxy == none )
- first_skipped_proxy = victim_slot.head - 1;
result = NULL;
goto retry;
}
}
- poison_pointer(victim_pool[victim_slot.head - 1]);
- }
- if ( first_skipped_proxy != none ) {
- if ( result ) {
- victim_pool[victim_slot.head - 1] = victim_pool[first_skipped_proxy];
- poison_pointer( victim_pool[first_skipped_proxy] );
- __TBB_store_with_release( victim_slot.head, first_skipped_proxy + 1 );
+ __TBB_ASSERT( result, NULL );
+ const size_t H1 = H0 + 1;
+ if ( H1 < H ) {
+ // Some proxies in the task pool have been bypassed. Need to close
+ // the hole left by the stolen task. The following variant:
+ // victim_pool[H-1] = victim_pool[H0];
+ // is of constant time, but creates a potential for degrading stealing
+ // mechanism efficiency and growing owner's stack size too much because
+ // of moving earlier split off (and thus larger) chunks closer to owner's
+ // end of the deque (tail).
+ // So we use linear time variant that is likely to be amortized to be
+ // near-constant time, though, and preserves stealing efficiency premises.
+ // These changes in the deque must be released to the owner.
+ memmove( victim_pool + H1, victim_pool + H0, (H - H1) * sizeof(task*) );
+ __TBB_store_with_release( victim_slot.head, /*dead: H = */ H1 );
}
- else
- __TBB_store_with_release( victim_slot.head, first_skipped_proxy );
+ poison_pointer( victim_pool[H0] );
}
unlock_task_pool( &victim_slot, victim_pool );
return result;
@@ -970,20 +979,23 @@ retry:
inline void generic_scheduler::do_enter_arena() {
my_arena_slot = &my_arena->my_slots[my_arena_index];
- __TBB_ASSERT ( my_arena_slot->head == my_arena_slot->tail, "task deque of a free slot must be empty" );
- __TBB_ASSERT ( my_dummy_slot.head < my_dummy_slot.tail, "entering arena without tasks to share" );
- my_arena_slot->head = my_dummy_slot.head;
- my_arena_slot->tail = my_dummy_slot.tail;
+ __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.
- my_dummy_slot.head = my_dummy_slot.tail = 0;
+ __TBB_store_relaxed(my_dummy_slot.head, /*dead: H =*/ 0);
+ __TBB_store_relaxed(my_dummy_slot.tail, /*dead: T =*/ 0);
}
void generic_scheduler::enter_arena() {
__TBB_ASSERT ( my_arena, "no arena: initialization not completed?" );
- __TBB_ASSERT ( !in_arena(), "thread is already in arena?" );
+ __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();
@@ -994,12 +1006,12 @@ void generic_scheduler::leave_arena() {
// Do not reset my_arena_index. It will be used to (attempt to) re-acquire the slot next time
__TBB_ASSERT( &my_arena->my_slots[my_arena_index] == my_arena_slot, "arena slot and slot index mismatch" );
__TBB_ASSERT ( my_arena_slot->task_pool == LockedTaskPool, "Task pool must be locked when leaving arena" );
- __TBB_ASSERT ( my_arena_slot->tail == my_arena_slot->head, "Cannot leave arena when the task pool is not empty" );
+ __TBB_ASSERT ( is_quiescent_local_task_pool_empty(), "Cannot leave arena when the task pool is not empty" );
ITT_NOTIFY(sync_releasing, &my_arena->my_slots[my_arena_index]);
- // No release fence is necessary here as this assignment precludes external
+ // No release fence is necessary here as this assignment precludes external
// accesses to the local task pool when becomes visible. Thus it is harmless
// if it gets hoisted above preceding local bookkeeping manipulations.
- my_arena_slot->task_pool = EmptyTaskPool;
+ __TBB_store_relaxed( my_arena_slot->task_pool, EmptyTaskPool );
my_arena_slot = &my_dummy_slot;
}
@@ -1023,17 +1035,15 @@ 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;
s->my_innermost_running_task = &t;
-#if __TBB_TASK_PRIORITY
s->my_dispatching_task = &t;
-#endif /* __TBB_TASK_PRIORITY */
t.prefix().ref_count = 1;
governor::sign_on(s);
__TBB_ASSERT( &task::self()==&t, "governor::sign_on failed?" );
#if __TBB_TASK_GROUP_CONTEXT
// 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
+ // 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 =
+ t.prefix().context = a.my_master_default_ctx =
new ( NFS_Allocate(sizeof(task_group_context), 1, NULL) ) task_group_context(task_group_context::isolated);
#endif /* __TBB_TASK_GROUP_CONTEXT */
s->my_market = a.my_market;
@@ -1052,8 +1062,8 @@ generic_scheduler* generic_scheduler::create_master( arena& a ) {
#if __TBB_TASK_PRIORITY
// In the current implementation master threads continue processing even when
// there are other masters with higher priority. Only TBB worker threads are
- // redistributed between arenas based on the latters' priority. Thus master
- // threads use arena's top priority as a reference point (in contrast to workers
+ // redistributed between arenas based on the latters' priority. Thus master
+ // threads use arena's top priority as a reference point (in contrast to workers
// that use my_market->my_global_top_priority).
s->my_ref_top_priority = &s->my_arena->my_top_priority;
s->my_ref_reload_epoch = &s->my_arena->my_reload_epoch;
@@ -1075,7 +1085,8 @@ void generic_scheduler::cleanup_worker( void* arg, bool is_worker ) {
// 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 || s.my_arena_slot->head >= s.my_arena_slot->tail,
+ __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();
}
@@ -1086,10 +1097,22 @@ void generic_scheduler::cleanup_master() {
#if __TBB_SCHEDULER_OBSERVER
s.notify_exit_observers(/*is_worker=*/false);
#endif /* __TBB_SCHEDULER_OBSERVER */
- if ( !local_task_pool_empty() ) {
- __TBB_ASSERT ( governor::is_set(this), "TLS slot is cleared before the task pool cleanup" );
- s.local_wait_for_all( *s.my_dummy_task, NULL );
- __TBB_ASSERT ( governor::is_set(this), "Other thread reused our TLS key during the task pool cleanup" );
+ if( in_arena() ) {
+ acquire_task_pool();
+ if ( my_arena_slot->task_pool == EmptyTaskPool ||
+ __TBB_load_relaxed(my_arena_slot->head) >= __TBB_load_relaxed(my_arena_slot->tail) )
+ {
+ // Local task pool is empty
+ leave_arena();
+ }
+ else {
+ // Master's local task pool may e.g. contain proxies of affinitized tasks.
+ release_task_pool();
+ __TBB_ASSERT ( governor::is_set(this), "TLS slot is cleared before the task pool cleanup" );
+ s.local_wait_for_all( *s.my_dummy_task, NULL );
+ __TBB_ASSERT( !in_arena(), NULL );
+ __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 );
@@ -1101,7 +1124,7 @@ void generic_scheduler::cleanup_master() {
#endif /* __TBB_STATISTICS */
#if __TBB_TASK_PRIORITY
__TBB_ASSERT( a->my_slots[0].my_scheduler, NULL );
- // Master's scheduler may be locked by a worker taking arena snapshot or by
+ // 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 )
__TBB_Yield();
@@ -1112,7 +1135,7 @@ void generic_scheduler::cleanup_master() {
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
- // after introducing arena-per-master logic and fire-and-forget tasks doing
+ // after introducing arena-per-master logic and fire-and-forget tasks doing
// so can result either in arena's premature destruction (at least without
// additional costly checks in workers) or in unnecessary arena state changes
// (and ensuing workers migration).
@@ -1135,3 +1158,76 @@ void generic_scheduler::cleanup_master() {
} // namespace internal
} // namespace tbb
+/*
+ Comments:
+
+1. The premise of the cancellation support implementation is that cancellations are
+ not part of the hot path of the program execution. Therefore all changes in its
+ implementation in order to reduce the overhead of the cancellation control flow
+ should be done only in ways that do not increase overhead of the normal execution.
+
+ In general contexts are used by all threads and their descendants are created in
+ different threads as well. In order to minimize impact of the cross-thread tree
+ maintenance (first of all because of the synchronization), the tree of contexts
+ is split into pieces, each of which is handled by the only thread. Such pieces
+ are represented as lists of contexts, members of which are contexts that were
+ bound to their parents in the given thread.
+
+ The context tree maintenance and cancellation propagation algorithms is designed
+ in such a manner that cross-thread access to a context list will take place only
+ when cancellation signal is sent (by user or when an exception happens), and
+ synchronization is necessary only then. Thus the normal execution flow (without
+ exceptions and cancellation) remains free from any synchronization done on
+ behalf of exception handling and cancellation support.
+
+2. Consider parallel cancellations at the different levels of the context tree:
+
+ Ctx1 <- Cancelled by Thread1 |- Thread2 started processing
+ | |
+ Ctx2 |- Thread1 started processing
+ | T1 |- Thread2 finishes and syncs up local counters
+ Ctx3 <- Cancelled by Thread2 |
+ | |- Ctx5 is bound to Ctx2
+ Ctx4 |
+ T2 |- Thread1 reaches Ctx2
+
+ Thread-propagator of each cancellation increments global counter. However the thread
+ propagating the cancellation from the outermost context (Thread1) may be the last
+ to finish. Which means that the local counters may be synchronized earlier (by Thread2,
+ at Time1) than it propagated cancellation into Ctx2 (at time Time2). If a new context
+ (Ctx5) is created and bound to Ctx2 between Time1 and Time2, checking its parent only
+ (Ctx2) may result in cancellation request being lost.
+
+ This issue is solved by doing the whole propagation under the lock.
+
+ If we need more concurrency while processing parallel cancellations, we could try
+ the following modification of the propagation algorithm:
+
+ advance global counter and remember it
+ for each thread:
+ scan thread's list of contexts
+ for each thread:
+ sync up its local counter only if the global counter has not been changed
+
+ However this version of the algorithm requires more analysis and verification.
+
+3. There is no portable way to get stack base address in Posix, however
+ the modern Linux versions provide pthread_attr_np API that can be used
+ to obtain thread's stack size and base address. Unfortunately even this
+ function does not provide enough information for the main thread on IA64
+ (RSE spill area and memory stack are allocated as two separate discontinuous
+ chunks of memory), and there is no portable way to discern the main and
+ the secondary threads.
+ Thus for MacOS and IA64 Linux we use the TBB worker stack size for all
+ threads and use the current stack top as the stack base. This simplified
+ approach is based on the following assumptions:
+ 1) If the default stack size is insufficient for the user app needs,
+ the required amount will be explicitly specified by the user at
+ the point of the TBB scheduler initialization (as an argument to
+ tbb::task_scheduler_init constructor).
+ 2) When a master thread initializes the scheduler, it has enough space
+ on its stack. Here "enough" means "at least as much as worker threads
+ have".
+ 3) If the user app strives to conserve the memory by cutting stack size,
+ it should do this for TBB workers too (as in the #1).
+*/
diff --git a/src/tbb/scheduler.h b/src/tbb/scheduler.h
index a85003d..a5f14f8 100644
--- a/src/tbb/scheduler.h
+++ b/src/tbb/scheduler.h
@@ -69,8 +69,8 @@ class task_scheduler_observer_v3;
class observer_proxy;
#endif /* __TBB_SCHEDULER_OBSERVER */
-//! Cilk-style task scheduler.
-/** None of the fields here are every read or written by threads other than
+//! Work stealing task scheduler.
+/** None of the fields here are ever read or written by threads other than
the thread that creates the instance.
Class generic_scheduler is an abstract base class that contains most of the scheduler,
@@ -116,11 +116,15 @@ class generic_scheduler: public scheduler, public ::rml::job {
//! 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. **/
- mutable arena_slot* my_arena_slot;
+ arena_slot* my_arena_slot;
inline bool in_arena () const;
- inline bool local_task_pool_empty () const;
+ inline bool is_local_task_pool_quiescent () const;
+
+ inline bool is_quiescent_local_task_pool_empty () const;
+
+ inline bool is_quiescent_local_task_pool_reset () const;
//! The market I am in
market* my_market;
@@ -159,9 +163,6 @@ class generic_scheduler: public scheduler, public ::rml::job {
/* A couple of bools can be located here because space is otherwise just padding after my_affinity_id. */
- //! True if this is assigned to thread local storage by registering with governor.
- bool my_registered;
-
//! True if *this was created by automatic TBB initialization
bool my_auto_initialized;
@@ -211,15 +212,21 @@ class generic_scheduler: public scheduler, public ::rml::job {
inline void reset_deque_and_leave_arena ( bool locked );
//! Locks victim's task pool, and returns pointer to it. The pointer can be NULL.
+ /** Garbles victim_arena_slot->task_pool for the duration of the lock. **/
task** lock_task_pool( arena_slot* victim_arena_slot ) const;
//! Unlocks victim's task pool
+ /** Restores victim_arena_slot->task_pool munged by lock_task_pool. **/
void unlock_task_pool( arena_slot* victim_arena_slot, task** victim_task_pool ) const;
//! 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. **/
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. **/
void release_task_pool() const;
//! Checks if t is affinitized to another thread, and if so, bundles it as proxy.
@@ -229,6 +236,10 @@ class generic_scheduler: public scheduler, public ::rml::job {
//! Makes newly spawned tasks visible to thieves
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. **/
+ inline void commit_relocated_tasks( size_t new_tail );
+
//! Get a task from the local pool.
/** Called only by the pool owner.
Returns the pointer to the task or NULL if the pool is empty.
@@ -236,10 +247,12 @@ class generic_scheduler: public scheduler, public ::rml::job {
task* get_task();
//! Attempt to get a task from the mailbox.
- /** Called only by the thread that owns *this.
- Gets a task only if there is one not yet executed by another thread.
- If successful, unlinks the task and returns a pointer to it.
- Otherwise returns NULL. */
+ /** Gets a task only if it has not been executed by its sender or a thief
+ that has stolen it from the sender's task pool. Otherwise returns NULL.
+
+ This method is intended to be used only by the thread extracting the proxy
+ from its mailbox. (In contrast to local task pool, mailbox can be read only
+ by its owner). **/
task* get_mailbox_task();
//! True if t is a task_proxy
@@ -247,10 +260,6 @@ class generic_scheduler: public scheduler, public ::rml::job {
return t.prefix().extra_state==es_task_proxy;
}
- //! Extracts task pointer from task_proxy, and frees the proxy.
- /** Return NULL if underlying task was claimed by mailbox. */
- task* strip_proxy( task_proxy* result );
-
//! Get a task from the starvation-resistant task stream of the current arena.
/** Returns the pointer to the task, or NULL if the attempt was unsuccessful.
The latter case does not mean that the stream is drained, however. **/
@@ -273,11 +282,9 @@ class generic_scheduler: public scheduler, public ::rml::job {
}
//! 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. **/
- inline void prepare_task_pool( size_t n );
-
- //! Grow ready task deque to at least n elements.
- void grow_task_pool( size_t n );
+ /** If necessary relocates existing task pointers or grows the ready task deque.
+ Returns (possible updated) tail index (not accounting for n). **/
+ size_t prepare_task_pool( size_t n );
//! Initialize a scheduler for a master thread.
static generic_scheduler* create_master( arena& a );
@@ -298,12 +305,16 @@ protected:
//! Check that internal data structures are in consistent state.
/** Raises __TBB_ASSERT failure if inconsistency is found. */
void assert_task_pool_valid () const;
- static void fill_with_canary_pattern ( task** task_pool, size_t first, size_t last );
#else
void assert_task_pool_valid() const {}
- static void fill_with_canary_pattern ( task**, size_t, size_t ) {}
#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 );
@@ -337,8 +348,6 @@ public:
template<free_task_hint h>
void free_task( task& t );
- inline void free_task_proxy( task_proxy& tp );
-
//! Return task object to the memory allocator.
inline void deallocate_task( task& t );
@@ -351,6 +360,7 @@ public:
dispatch loop (one of wait_for_all methods) invoked directly from that thread. **/
inline bool master_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.
@@ -358,6 +368,7 @@ public:
Note that the default context of a worker thread is never accessed by
user code (directly or indirectly). **/
inline task_group_context* default_context ();
+#endif /* __TBB_TASK_GROUP_CONTEXT */
//! Returns number of worker threads in the arena this thread belongs to.
unsigned number_of_workers_in_my_arena();
@@ -375,9 +386,10 @@ public:
//! List of small tasks that have been returned to this scheduler by other schedulers.
task* my_return_list;
- //! Try getting a task from the mailbox or stealing from another scheduler.
- /** Redirects to a customization. */
- virtual task* receive_or_steal_task( reference_count&, bool ) = 0;
+ //! Try getting a task from other threads (via mailbox, stealing, FIFO queue, orphans adoption).
+ /** Returns obtained task or NULL if all attempts fail. */
+ virtual task* receive_or_steal_task( __TBB_atomic reference_count& completion_ref_count,
+ bool return_if_no_work ) = 0;
//! Free a small task t that that was allocated by a different scheduler
void free_nonlocal_small_task( task& t );
@@ -407,14 +419,17 @@ public:
lock-free. **/
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;
- // 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;
+ //! Returns reference priority used to decide whether a task should be offloaded.
+ inline intptr_t effective_reference_priority () const;
//! Latest known highest priority of tasks in the market or arena.
/** Master threads currently tracks only tasks in their arenas, while workers
@@ -481,7 +496,7 @@ private:
#if __TBB_SURVIVE_THREAD_SWITCH
__cilk_tbb_unwatch_thunk my_cilk_unwatch_thunk;
#if TBB_USE_ASSERT
- //! State values used to check interface contract with Cilk runtime.
+ //! State values used to check interface contract with cilkrts.
/** Names of cs_running...cs_freed derived from state machine diagram in cilk-tbb-interop.h */
enum cilk_state_t {
cs_none=0xF000, // Start at nonzero value so that we can detect use of zeroed memory.
@@ -532,17 +547,30 @@ inline bool generic_scheduler::in_arena () const {
return my_arena_slot != &my_dummy_slot;
}
-inline bool generic_scheduler::local_task_pool_empty () const {
- return my_arena_slot->task_pool == EmptyTaskPool || my_arena_slot->head >= my_arena_slot->tail;
+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;
+}
+
+inline bool generic_scheduler::is_quiescent_local_task_pool_empty () const {
+ __TBB_ASSERT( is_local_task_pool_quiescent(), "Task pool is not quiescent" );
+ return __TBB_load_relaxed(my_arena_slot->head) == __TBB_load_relaxed(my_arena_slot->tail);
}
+inline bool generic_scheduler::is_quiescent_local_task_pool_reset () const {
+ __TBB_ASSERT( is_local_task_pool_quiescent(), "Task pool is not quiescent" );
+ 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_innermost_running_task == my_dummy_task;
+ return my_dispatching_task == my_dummy_task;
}
+#if __TBB_TASK_GROUP_CONTEXT
inline task_group_context* generic_scheduler::default_context () {
return my_dummy_task->prefix().context;
}
+#endif /* __TBB_TASK_GROUP_CONTEXT */
inline void generic_scheduler::attach_mailbox( affinity_id id ) {
__TBB_ASSERT(id>0,NULL);
@@ -558,16 +586,7 @@ inline unsigned generic_scheduler::number_of_workers_in_my_arena() {
return my_arena->my_max_num_workers;
}
-inline void generic_scheduler::free_task_proxy( task_proxy& tp ) {
-#if TBB_USE_ASSERT
- poison_pointer( tp.outbox );
- poison_pointer( tp.next_in_mailbox );
- tp.task_and_tag = 0xDEADBEEF;
-#endif /* TBB_USE_ASSERT */
- free_task<small_task>(tp);
-}
-
- //! Return task object to the memory allocator.
+//! Return task object to the memory allocator.
inline void generic_scheduler::deallocate_task( task& t ) {
#if TBB_USE_ASSERT
task_prefix& p = t.prefix();
@@ -590,7 +609,8 @@ inline intptr_t generic_scheduler::get_task_node_count( bool count_arena_workers
inline void generic_scheduler::reset_deque_and_leave_arena ( bool locked ) {
if ( !locked )
acquire_task_pool();
- my_arena_slot->tail = my_arena_slot->head = 0;
+ __TBB_store_relaxed( my_arena_slot->tail, 0 );
+ __TBB_store_relaxed( my_arena_slot->head, 0 );
leave_arena();
}
@@ -604,30 +624,6 @@ inline task** generic_scheduler::allocate_task_pool( size_t n ) {
return new_pool;
}
-inline void generic_scheduler::prepare_task_pool( size_t num_tasks ) {
- if ( my_arena_slot->tail + num_tasks <= my_task_pool_size )
- return;
- // 1 compensates for head possibly temporarily incremented by a thief
- size_t new_size = my_arena_slot->tail - my_arena_slot->head + num_tasks + 1;
- // 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 ) {
- // Relocate the busy part to the deque beginning
- acquire_task_pool();
- size_t new_tail = my_arena_slot->tail - my_arena_slot->head;
- memmove( my_dummy_slot.task_pool, my_dummy_slot.task_pool + my_arena_slot->head, new_tail * sizeof(task*) );
- fill_with_canary_pattern( my_dummy_slot.task_pool, new_tail, my_arena_slot->tail );
- my_arena_slot->head = 0;
- // Tail is updated last to minimize probability of a thread making arena
- // snapshot being misguided into thinking that this task pool is empty.
- my_arena_slot->tail = new_tail;
- release_task_pool();
- }
- else
- grow_task_pool( my_task_pool_size + num_tasks );
-}
-
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);
@@ -636,6 +632,16 @@ inline void generic_scheduler::commit_spawned_tasks( size_t new_tail ) {
__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,
+ "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
+ // snapshot being misguided into thinking that this task pool is empty.
+ __TBB_store_relaxed( my_arena_slot->tail, new_tail );
+ release_task_pool();
+}
+
template<free_task_hint h>
void generic_scheduler::free_task( task& t ) {
GATHER_STATISTIC(--my_counters.active_tasks);
@@ -643,11 +649,9 @@ void generic_scheduler::free_task( task& t ) {
// Verify that optimization hints are correct.
__TBB_ASSERT( h!=small_local_task || p.origin==this, NULL );
__TBB_ASSERT( !(h&small_task) || p.origin, NULL );
-#if TBB_USE_ASSERT
- p.depth = 0xDEADBEEF;
- p.ref_count = 0xDEADBEEF;
+ poison_value(p.depth);
+ poison_value(p.ref_count);
poison_pointer(p.owner);
-#endif /* TBB_USE_ASSERT */
__TBB_ASSERT( 1L<<t.state() & (1L<<task::executing|1L<<task::allocated), NULL );
p.state = task::freed;
if( h==small_local_task || p.origin==this ) {
@@ -667,6 +671,18 @@ 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
+ // changes). But when there are enough workers to service (even if only partially)
+ // a lower priority arena, they should use arena's priority as a reference, lest
+ // be trapped in a futile spinning (because market's priority would prohibit
+ // executing ANY tasks in this arena).
+ return !worker_outermost_level() ||
+ my_arena->my_num_workers_allotted < my_arena->num_workers_active()
+ ? *my_ref_top_priority : my_arena->my_top_priority;
+}
+
inline void generic_scheduler::offload_task ( task& t, intptr_t p ) {
GATHER_STATISTIC( ++my_counters.prio_tasks_offloaded );
__TBB_ASSERT( my_offloaded_task_list_tail_link && !*my_offloaded_task_list_tail_link, NULL );
diff --git a/src/tbb/scheduler_common.h b/src/tbb/scheduler_common.h
index d9d0e06..f5f089c 100644
--- a/src/tbb/scheduler_common.h
+++ b/src/tbb/scheduler_common.h
@@ -58,8 +58,8 @@
#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.
+// 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.
// The first argument is just a convenience allowing to keep comma before the macro usage.
#if __TBB_TASK_GROUP_CONTEXT
#define __TBB_CONTEXT_ARG(arg1, context) arg1, context
@@ -76,7 +76,7 @@
#if _MSC_VER && !defined(__INTEL_COMPILER)
// Workaround for overzealous compiler warnings
- // These particular warnings are so ubiquitous that no attempt is made to narrow
+ // These particular warnings are so ubiquitous that no attempt is made to narrow
// the scope of the warnings.
#pragma warning (disable: 4100 4127 4312 4244 4267 4706)
#endif
@@ -84,6 +84,8 @@
namespace tbb {
namespace internal {
+class generic_scheduler;
+
#if __TBB_TASK_PRIORITY
static const intptr_t num_priority_levels = 3;
static const intptr_t normalized_normal_priority = (num_priority_levels - 1) / 2;
@@ -105,24 +107,26 @@ inline intptr_t& priority ( task& t ) {
}
#endif /* __TBB_TASK_PRIORITY */
+#if __TBB_TASK_GROUP_CONTEXT
//! Task group state change propagation global epoch
-/** Together with generic_scheduler::my_context_state_propagation_epoch forms
+/** Together with generic_scheduler::my_context_state_propagation_epoch forms
cross-thread signaling mechanism that allows to avoid locking at the hot path
of normal execution flow.
- When a descendant task group context is registered or unregistered, the global
+ When a descendant task group context is registered or unregistered, the global
and local epochs are compared. If they differ, a state change is being propagated,
and thus registration/deregistration routines take slower branch that may block
- (at most one thread of the pool can be blocked at any moment). Otherwise the
+ (at most one thread of the pool can be blocked at any moment). Otherwise the
control path is lock-free and fast. **/
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;
+#endif /* __TBB_TASK_GROUP_CONTEXT */
//! Alignment for a task object
-const size_t task_alignment = 16;
+const size_t task_alignment = 32;
//! Number of bytes reserved for a task prefix
/** If not exactly sizeof(task_prefix), the extra bytes *precede* the task_prefix. */
@@ -144,14 +148,14 @@ enum task_extra_state {
//! Optimization hint to free_task that enables it omit unnecessary tests and code.
enum free_task_hint {
- //! No hint
+ //! No hint
no_hint=0,
//! Task is known to have been allocated by this scheduler
local_task=1,
//! Task is known to be a small task.
/** Task should be returned to the free list of *some* scheduler, possibly not this scheduler. */
small_task=2,
- //! Bitwise-OR of local_task and small_task.
+ //! Bitwise-OR of local_task and small_task.
/** Task should be returned to free list of this scheduler. */
small_local_task=3
};
@@ -162,17 +166,16 @@ enum free_task_hint {
#if TBB_USE_ASSERT
-static const uintptr_t venom =
+static const uintptr_t venom =
#if __TBB_WORDSIZE == 8
0xDDEEAADDDEADBEEF;
#else
0xDEADBEEF;
#endif
-
-/** In contrast to poison_pointer() and assert_task_valid() poison_value() is a macro
- because the variable used as its argument may be undefined in release builds. **/
-#define poison_value(g) (g = venom)
+/** Crazy conversion is necessary to shut up insane MS compiler. **/
+template <typename T>
+void poison_value ( T& val ) { val = *(T*)(uintptr_t*)&venom; }
/** Expected to be used in assertions only, thus no empty form is defined. **/
inline bool is_alive( uintptr_t v ) { return v != venom; }
@@ -188,6 +191,8 @@ inline void assert_task_valid( const task& task ) {
#else /* !TBB_USE_ASSERT */
+/** In contrast to debug version poison_value() is a macro here because
+ the variable used as its argument may be undefined in release builds. **/
#define poison_value(g) ((void)0)
inline void assert_task_valid( const task& ) {}
@@ -198,6 +203,7 @@ inline void assert_task_valid( const task& ) {}
// Helpers
//------------------------------------------------------------------------
+#if __TBB_TASK_GROUP_CONTEXT
inline bool ConcurrentWaitsEnabled ( task& t ) {
return (t.prefix().context->my_version_and_traits & task_group_context::concurrent_wait) != 0;
}
@@ -206,12 +212,11 @@ inline bool CancellationInfoPresent ( task& t ) {
return t.prefix().context->my_cancellation_requested != 0;
}
-#if __TBB_TASK_GROUP_CONTEXT
#if TBB_USE_CAPTURED_EXCEPTION
inline tbb_exception* TbbCurrentException( task_group_context*, tbb_exception* src) { return src->move(); }
inline tbb_exception* TbbCurrentException( task_group_context*, captured_exception* src) { return src; }
#else
- // Using macro instead of an inline function here allows to avoid evaluation of the
+ // Using macro instead of an inline function here allows to avoid evaluation of the
// TbbCapturedException expression when exact propagation is enabled for the context.
#define TbbCurrentException(context, TbbCapturedException) \
context->my_version_and_traits & task_group_context::exact_exception \
@@ -233,6 +238,11 @@ inline bool CancellationInfoPresent ( task& t ) {
} catch ( ... ) { \
TbbRegisterCurrentException( context, captured_exception::allocate("...", "Unidentified exception") );\
}
+
+#else /* !__TBB_TASK_GROUP_CONTEXT */
+
+inline bool ConcurrentWaitsEnabled ( task& t ) { return false; }
+
#endif /* __TBB_TASK_GROUP_CONTEXT */
//------------------------------------------------------------------------
@@ -248,18 +258,18 @@ struct arena_slot {
/** Also is used to specify if the slot is empty or locked:
0 - empty
-1 - locked **/
- task** task_pool;
+ task* *__TBB_atomic task_pool;
//! Index of the first ready task in the deque.
/** Modified by thieves, and by the owner during compaction/reallocation **/
- size_t head;
+ __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*)];
//! Index of the element following the last ready task in the deque.
/** Modified by the owner thread. **/
- size_t tail;
+ __TBB_atomic size_t tail;
//! Hints provided for operations with the container of starvation-resistant tasks.
/** Modified by the owner thread (during these operations). **/
diff --git a/src/tbb/semaphore.cpp b/src/tbb/semaphore.cpp
new file mode 100644
index 0000000..f69af7f
--- /dev/null
+++ b/src/tbb/semaphore.cpp
@@ -0,0 +1,101 @@
+/*
+ Copyright 2005-2011 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 "semaphore.h"
+#if _WIN32||_WIN64
+#if defined(RTL_SRWLOCK_INIT)
+#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)
+
+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);
+}
+
+void WINAPI acquire_binsem_using_event( SRWLOCK* h_ )
+{
+ srwl_or_handle* shptr = (srwl_or_handle*) h_;
+ WaitForSingleObject( shptr->h, INFINITE );
+}
+
+void WINAPI release_binsem_using_event( SRWLOCK* h_ )
+{
+ srwl_or_handle* shptr = (srwl_or_handle*) h_;
+ SetEvent( shptr->h );
+}
+
+static void (WINAPI *__TBB_init_binsem)( SRWLOCK* ) = (void (WINAPI *)(SRWLOCK*))&init_binsem_using_event;
+static void (WINAPI *__TBB_acquire_binsem)( SRWLOCK* ) = (void (WINAPI *)(SRWLOCK*))&acquire_binsem_using_event;
+static void (WINAPI *__TBB_release_binsem)( SRWLOCK* ) = (void (WINAPI *)(SRWLOCK*))&release_binsem_using_event;
+
+//! Table describing the how to link the handlers.
+static const dynamic_link_descriptor SRWLLinkTable[] = {
+ DLD(InitializeSRWLock, __TBB_init_binsem),
+ DLD(AcquireSRWLockExclusive, __TBB_acquire_binsem),
+ DLD(ReleaseRWLockExclusive, __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 );
+}
+
+binary_semaphore::binary_semaphore() {
+ atomic_do_once( &init_concmon_module, concmon_module_inited );
+
+ __TBB_init_binsem( &my_sem.lock );
+ if( (uintptr_t)__TBB_init_binsem!=(uintptr_t)&init_binsem_using_event )
+ P();
+}
+
+binary_semaphore::~binary_semaphore() {
+ if( (uintptr_t)__TBB_init_binsem==(uintptr_t)&init_binsem_using_event )
+ CloseHandle( my_sem.h );
+}
+
+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 */
+
+} // namespace internal
+} // namespace tbb
diff --git a/src/tbb/semaphore.h b/src/tbb/semaphore.h
index dc1d3e7..70d85e5 100644
--- a/src/tbb/semaphore.h
+++ b/src/tbb/semaphore.h
@@ -126,6 +126,134 @@ private:
};
#endif /* _WIN32||_WIN64 */
+
+//! for performance reasons, we want specialied binary_semaphore
+#if _WIN32||_WIN64
+#if !defined(RTL_SRWLOCK_INIT)
+//! 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); }
+ //! dtor
+ ~binary_semaphore() { CloseHandle( my_sem ); }
+ //! wait/acquire
+ void P() {WaitForSingleObject( my_sem, INFINITE ); }
+ //! post/release
+ void V() {SetEvent( my_sem );}
+private:
+ HANDLE my_sem;
+};
+#else /* defined(RTL_SRWLOCK_INIT) */
+
+union srwl_or_handle {
+ SRWLOCK lock;
+ HANDLE h;
+};
+
+//! binary_semaphore for concurrent_monitor
+class binary_semaphore : no_copy {
+public:
+ //! ctor
+ binary_semaphore();
+ //! dtor
+ ~binary_semaphore();
+ //! wait/acquire
+ void P();
+ //! post/release
+ void V();
+private:
+ srwl_or_handle my_sem;
+};
+#endif /* !defined(RTL_SRWLOCK_INIT) */
+#elif __APPLE__
+//! binary_semaphore for concurrent monitor
+class binary_semaphore : no_copy {
+public:
+ //! ctor
+ binary_semaphore() : my_sem(0) {
+ kern_return_t ret = semaphore_create( mach_task_self(), &my_sem, SYNC_POLICY_FIFO, 0 );
+ __TBB_ASSERT_EX( ret==err_none, "failed to create a semaphore" );
+ }
+ //! dtor
+ ~binary_semaphore() {
+ kern_return_t ret = semaphore_destroy( mach_task_self(), my_sem );
+ __TBB_ASSERT_EX( ret==err_none, NULL );
+ }
+ //! wait/acquire
+ void P() {
+ int ret;
+ do {
+ ret = semaphore_wait( my_sem );
+ } while( ret==KERN_ABORTED );
+ __TBB_ASSERT( ret==KERN_SUCCESS, "semaphore_wait() failed" );
+ }
+ //! post/release
+ void V() { semaphore_signal( my_sem ); }
+private:
+ semaphore_t my_sem;
+};
+#else /* Linux/Unix */
+
+#if __TBB_USE_FUTEX
+class binary_semaphore : no_copy {
+public:
+ //! ctor
+ binary_semaphore() { my_sem = 1; }
+ //! dtor
+ ~binary_semaphore() {}
+ //! wait/acquire
+ void P() {
+ int s;
+ if( (s = my_sem.compare_and_swap( 1, 0 ))!=0 ) {
+ if( s!=2 )
+ s = my_sem.fetch_and_store( 2 );
+ while( s!=0 ) {
+ futex_wait( &my_sem, 2 );
+ s = my_sem.fetch_and_store( 2 );
+ }
+ }
+ }
+ //! post/release
+ void V() {
+ __TBB_ASSERT( my_sem>=1, "multiple V()'s in a row?" );
+ if( my_sem--!=1 ) {
+ //if old value was 2
+ my_sem = 0;
+ futex_wakeup_one( &my_sem );
+ }
+ }
+private:
+ atomic<int> my_sem;
+};
+#else
+typedef uint32_t sem_count_t;
+//! binary_semaphore for concurrent monitor
+class binary_semaphore : no_copy {
+public:
+ //! ctor
+ binary_semaphore() {
+ int ret = sem_init( &my_sem, /*shared among threads*/ 0, 0 );
+ __TBB_ASSERT_EX( !ret, NULL );
+ }
+ //! dtor
+ ~binary_semaphore() {
+ int ret = sem_destroy( &my_sem );
+ __TBB_ASSERT_EX( !ret, NULL );
+ }
+ //! wait/acquire
+ void P() {
+ while( sem_wait( &my_sem )!=0 )
+ __TBB_ASSERT( errno==EINTR, NULL );
+ }
+ //! post/release
+ void V() { sem_post( &my_sem ); }
+private:
+ sem_t my_sem;
+};
+#endif /* __TBB_USE_FUTEX */
+#endif /* _WIN32||_WIN64 */
+
} // namespace internal
} // namespace tbb
diff --git a/src/tbb/spin_mutex.cpp b/src/tbb/spin_mutex.cpp
index 2dda139..6e6d38c 100644
--- a/src/tbb/spin_mutex.cpp
+++ b/src/tbb/spin_mutex.cpp
@@ -46,7 +46,7 @@ void spin_mutex::scoped_lock::internal_release() {
__TBB_ASSERT( !(my_unlock_value&1), "corrupted scoped_lock?" );
ITT_NOTIFY(sync_releasing, my_mutex);
- __TBB_UnlockByte(my_mutex->flag, static_cast<__TBB_Byte>(my_unlock_value));
+ __TBB_UnlockByte(my_mutex->flag, my_unlock_value);
my_mutex = NULL;
}
diff --git a/src/tbb/task.cpp b/src/tbb/task.cpp
index 920ce4a..ffe797f 100644
--- a/src/tbb/task.cpp
+++ b/src/tbb/task.cpp
@@ -75,11 +75,11 @@ 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) );
- // Supported usage model prohibits concurrent initial binding. Thus we do not
+ // 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 ) {
- // If we are in the outermost task dispatch loop of a master thread, then
- // there is nothing to bind this context to, and we skip the binding part
+ // If we are in the outermost task dispatch loop of a master thread, then
+ // there is nothing to bind this context to, and we skip the binding part
// treating the context as isolated.
if ( s->my_innermost_running_task == s->my_dummy_task )
my_context.my_kind = task_group_context::isolated;
@@ -177,7 +177,7 @@ void affinity_partitioner_base_v3::resize( unsigned factor ) {
memset( my_array, 0, sizeof(affinity_id)*new_size );
my_size = new_size;
}
- }
+ }
}
} // namespace internal
@@ -218,7 +218,7 @@ bool task::is_owned_by_current_thread() const {
}
void interface5::internal::task_base::destroy( task& victim ) {
- // 1 may be a guard reference for wait_for_all, which was not reset because
+ // 1 may be a guard reference for wait_for_all, which was not reset because
// of concurrent_wait mode or because prepared root task was not actually used
// for spawning tasks (as in structured_task_group).
__TBB_ASSERT( (intptr_t)victim.prefix().ref_count <= 1, "Task being destroyed must not have children" );
@@ -228,7 +228,7 @@ void interface5::internal::task_base::destroy( task& victim ) {
if( parent ) {
__TBB_ASSERT( parent->state()==task::allocated, "attempt to destroy child of running or corrupted parent?" );
parent->internal_decrement_ref_count();
- // Despite last reference to *parent removed, it should not be destroyed (documented behavior).
+ // Even if the last reference to *parent is removed, it should not be spawned (documented behavior).
}
governor::local_scheduler()->free_task<no_hint>( victim );
}
@@ -244,7 +244,7 @@ void task::spawn_and_wait_for_all( task_list& list ) {
s->local_wait_for_all( *this, t );
}
-/** Defined out of line so that compiler does not replicate task's vtable.
+/** Defined out of line so that compiler does not replicate task's vtable.
It's pointless to define it inline anyway, because all call sites to it are virtual calls
that the compiler is unlikely to optimize. */
void task::note_affinity( affinity_id ) {
@@ -255,8 +255,8 @@ void task::change_group ( task_group_context& ctx ) {
prefix().context = &ctx;
if ( ctx.my_kind == task_group_context::binding_required ) {
internal::generic_scheduler* s = governor::local_scheduler();
- // If we are in the outermost task dispatch loop of a master thread, then
- // there is nothing to bind this context to, and we skip the binding part
+ // If we are in the outermost task dispatch loop of a master thread, then
+ // there is nothing to bind this context to, and we skip the binding part
// treating the context as isolated.
if ( s->my_innermost_running_task == s->my_dummy_task )
ctx.my_kind = task_group_context::isolated;
diff --git a/src/tbb/tbb_main.cpp b/src/tbb/tbb_main.cpp
index 3985f24..f2c2ccf 100644
--- a/src/tbb/tbb_main.cpp
+++ b/src/tbb/tbb_main.cpp
@@ -60,7 +60,7 @@ market::global_market_mutex_type market::theMarketMutex;
//! Counter of references to global shared resources such as TLS.
atomic<int> __TBB_InitOnce::count;
-__TBB_InitOnce::mutex_type __TBB_InitOnce::InitializationLock;
+__TBB_atomic_flag __TBB_InitOnce::InitializationLock;
//! Flag that is set to true after one-time initializations are done.
bool __TBB_InitOnce::InitializationDone;
diff --git a/src/tbb/tbb_main.h b/src/tbb/tbb_main.h
index ae165ef..759ba9a 100644
--- a/src/tbb/tbb_main.h
+++ b/src/tbb/tbb_main.h
@@ -59,14 +59,12 @@ class __TBB_InitOnce {
//! Specifies if the one-time initializations has been done.
static bool InitializationDone;
- // Scenarios are possible when tools interop has to be initialized before the
- // TBB itself. This imposes a requirement that the global initialization lock
- // has to support valid static initialization, and does not issue any tool
- // notifications in any build mode.
- typedef __TBB_Byte mutex_type;
-
- // Global initialization lock
- static mutex_type InitializationLock;
+ //! Global initialization lock
+ /** Scenarios are possible when tools interop has to be initialized before the
+ TBB itself. This imposes a requirement that the global initialization lock
+ has to support valid static initialization, and does not issue any tool
+ notifications in any build mode. **/
+ static __TBB_atomic_flag InitializationLock;
public:
static void lock() { __TBB_LockByte( InitializationLock ); }
diff --git a/src/tbb/tbb_misc.cpp b/src/tbb/tbb_misc.cpp
index b06a05c..955d47b 100644
--- a/src/tbb/tbb_misc.cpp
+++ b/src/tbb/tbb_misc.cpp
@@ -213,7 +213,7 @@ done:;
extern "C" void __TBB_machine_store8_slow( volatile void *ptr, int64_t value ) {
for( tbb::internal::atomic_backoff b;; b.pause() ) {
int64_t tmp = *(int64_t*)ptr;
- if( __TBB_CompareAndSwap8(ptr,value,tmp)==tmp )
+ if( __TBB_machine_cmpswp8(ptr,value,tmp)==tmp )
break;
}
}
diff --git a/src/tbb/tbb_misc.h b/src/tbb/tbb_misc.h
index 403c86e..fa00b5d 100644
--- a/src/tbb/tbb_misc.h
+++ b/src/tbb/tbb_misc.h
@@ -157,10 +157,10 @@ public:
//! Atomically replaces value of dst with newValue if they satisfy condition of compare predicate
/** Return value semantics is the same as for CAS. **/
template<typename T1, typename T2, class Pred>
-T1 atomic_update ( tbb::atomic<T1>& dst, const T2& newValue, Pred compare ) {
+T1 atomic_update ( tbb::atomic<T1>& dst, T2 newValue, Pred compare ) {
T1 oldValue = dst;
while ( compare(oldValue, newValue) ) {
- if ( dst.compare_and_swap(newValue, oldValue) == oldValue )
+ if ( dst.compare_and_swap((T1)newValue, oldValue) == oldValue )
break;
oldValue = dst;
}
diff --git a/src/tbb/tbb_misc_ex.cpp b/src/tbb/tbb_misc_ex.cpp
index 0c463a0..2abd5db 100644
--- a/src/tbb/tbb_misc_ex.cpp
+++ b/src/tbb/tbb_misc_ex.cpp
@@ -43,6 +43,7 @@
#include <sys/sysinfo.h>
#include <string.h>
#include <sched.h>
+#include <errno.h>
#elif __sun
#include <sys/sysinfo.h>
#include <unistd.h>
@@ -121,8 +122,13 @@ static void initialize_hardware_concurrency_info () {
int availableProcs = 0;
int numMasks = 1;
#if __linux__
- int maxProcs = get_nprocs();
+#if __TBB_MAIN_THREAD_AFFINITY_BROKEN
+ int maxProcs = INT_MAX; // To check the entire mask.
+ int pid = 0; // Get the mask of the calling thread.
+#else
+ int maxProcs = sysconf(_SC_NPROCESSORS_ONLN);
int pid = getpid();
+#endif
cpu_set_t *processMask;
const size_t BasicMaskSize = sizeof(cpu_set_t);
for (;;) {
@@ -166,10 +172,11 @@ static void initialize_hardware_concurrency_info () {
process_mask = processMask;
}
else {
- availableProcs = maxProcs;
+ availableProcs = (maxProcs == INT_MAX) ? sysconf(_SC_NPROCESSORS_ONLN) : maxProcs;
delete[] processMask;
}
theNumProcs = availableProcs > 0 ? availableProcs : 1; // Fail safety strap
+ __TBB_ASSERT( theNumProcs <= sysconf(_SC_NPROCESSORS_ONLN), NULL );
}
int AvailableHwConcurrency() {
diff --git a/src/tbbmalloc/Customize.h b/src/tbbmalloc/Customize.h
index 51c2810..de458c3 100644
--- a/src/tbbmalloc/Customize.h
+++ b/src/tbbmalloc/Customize.h
@@ -69,17 +69,32 @@ extern "C" void mallocProcessShutdownNotification(void);
There are no methods "acquire" or "release". The scoped_lock must be used
in a strict block-scoped locking pattern. Omitting these methods permitted
- further simplication. */
+ further simplification. */
class MallocMutex : tbb::internal::no_copy {
- __TBB_Byte value;
+ __TBB_atomic_flag value;
public:
class scoped_lock : tbb::internal::no_copy {
- const __TBB_Byte unlock_value;
+ __TBB_Flag unlock_value;
MallocMutex& mutex;
public:
- scoped_lock( MallocMutex& m ) : unlock_value( __TBB_LockByte(m.value)), mutex(m) {}
- ~scoped_lock() { __TBB_UnlockByte(mutex.value, unlock_value); }
+ 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;
+ if (block) {
+ unlock_value = __TBB_LockByte(m.value);
+ if (locked) *locked = true;
+ } else {
+ if (bool res = __TBB_TryLockByte(m.value)) {
+ unlock_value = 0;
+ if (locked) *locked = true;
+ } else
+ if (locked) *locked = false;
+ }
+ }
+ ~scoped_lock() {
+ if (!unlock_value) __TBB_UnlockByte(mutex.value, unlock_value);
+ }
};
friend class scoped_lock;
};
@@ -88,7 +103,7 @@ inline intptr_t AtomicIncrement( volatile intptr_t& counter ) {
return __TBB_FetchAndAddW( &counter, 1 )+1;
}
-inline uintptr_t AtomicAdd( volatile uintptr_t& counter, uintptr_t value ) {
+inline uintptr_t AtomicAdd( volatile intptr_t& counter, intptr_t value ) {
return __TBB_FetchAndAddW( &counter, value );
}
@@ -104,6 +119,22 @@ inline void FencedStore( volatile intptr_t &location, intptr_t value ) {
__TBB_store_with_release(location, value);
}
+inline void SpinWaitWhileEq(const volatile intptr_t &location, const intptr_t value) {
+ tbb::internal::spin_wait_while_eq(location, value);
+}
+
+inline intptr_t BitScanRev(uintptr_t x) {
+ return !x? -1 : __TBB_Log2(x);
+}
+
+inline void AtomicOr(volatile void *operand, uintptr_t addend) {
+ __TBB_AtomicOR(operand, addend);
+}
+
+inline void AtomicAnd(volatile void *operand, uintptr_t addend) {
+ __TBB_AtomicAND(operand, addend);
+}
+
#define USE_DEFAULT_MEMORY_MAPPING 1
// To support malloc replacement with LD_PRELOAD
diff --git a/src/tbbmalloc/LifoList.h b/src/tbbmalloc/LifoList.h
deleted file mode 100644
index 45eb363..0000000
--- a/src/tbbmalloc/LifoList.h
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- Copyright 2005-2011 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 _itt_common_malloc_LifoList_H_
-#define _itt_common_malloc_LifoList_H_
-
-#include "TypeDefinitions.h"
-#include <string.h> // for memset()
-
-//! Checking the synchronization method
-/** FINE_GRAIN_LOCKS is the only variant for now; should be defined for LifoList */
-#ifndef FINE_GRAIN_LOCKS
-#define FINE_GRAIN_LOCKS
-#endif
-
-namespace rml {
-
-namespace internal {
-
-class LifoList {
-public:
- inline LifoList();
- inline void push(void** ptr);
- inline void* pop(void);
- inline void pushList(void **head, void **tail);
-
-private:
- void * top;
-#ifdef FINE_GRAIN_LOCKS
- MallocMutex lock;
-#endif /* FINE_GRAIN_LOCKS */
-};
-
-#ifdef FINE_GRAIN_LOCKS
-/* LifoList assumes zero initialization so a vector of it can be created
- * by just allocating some space with no call to constructor.
- * On Linux, it seems to be necessary to avoid linking with C++ libraries.
- *
- * By usage convention there is no race on the initialization. */
-LifoList::LifoList( ) : top(NULL)
-{
- // MallocMutex assumes zero initialization
- memset(&lock, 0, sizeof(MallocMutex));
-}
-
-void LifoList::push( void **ptr )
-{
- MallocMutex::scoped_lock scoped_cs(lock);
- *ptr = top;
- top = ptr;
-}
-
-void LifoList::pushList( void **head, void **tail )
-{
- MallocMutex::scoped_lock scoped_cs(lock);
- *tail = top;
- top = head;
-}
-
-void * LifoList::pop( )
-{
- void **result=NULL;
- if (!top) goto done;
- {
- MallocMutex::scoped_lock scoped_cs(lock);
- if (!top) goto done;
- result = (void **) top;
- top = *result;
- }
- *result = NULL;
-done:
- return result;
-}
-
-#endif /* FINE_GRAIN_LOCKS */
-
-} // namespace internal
-} // namespace rml
-
-#endif /* _itt_common_malloc_LifoList_H_ */
-
diff --git a/src/tbbmalloc/MapMemory.h b/src/tbbmalloc/MapMemory.h
index ee18082..8065a3c 100644
--- a/src/tbbmalloc/MapMemory.h
+++ b/src/tbbmalloc/MapMemory.h
@@ -29,6 +29,17 @@
#ifndef _itt_shared_malloc_MapMemory_H
#define _itt_shared_malloc_MapMemory_H
+#include <stdlib.h>
+
+void *ErrnoPreservingMalloc(size_t bytes)
+{
+ int prevErrno = errno;
+ void *ret = malloc( bytes );
+ if (!ret)
+ errno = prevErrno;
+ return ret;
+}
+
#if __linux__ || __APPLE__ || __sun || __FreeBSD__
#if __sun && !defined(_XPG4_2)
@@ -48,17 +59,24 @@
void* MapMemory (size_t bytes)
{
void* result = 0;
+ int prevErrno = errno;
#ifndef MAP_ANONYMOUS
// Mac OS* X defines MAP_ANON, which is deprecated in Linux.
#define MAP_ANONYMOUS MAP_ANON
#endif /* MAP_ANONYMOUS */
- result = mmap(result, bytes, (PROT_READ | PROT_WRITE), MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
+ result = mmap(NULL, bytes, (PROT_READ | PROT_WRITE), MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
+ if (result==MAP_FAILED)
+ errno = prevErrno;
return result==MAP_FAILED? 0: result;
}
int UnmapMemory(void *area, size_t bytes)
{
- return munmap(area, bytes);
+ int prevErrno = errno;
+ int ret = munmap(area, bytes);
+ if (-1 == ret)
+ errno = prevErrno;
+ return ret;
}
#elif (_WIN32 || _WIN64) && !_XBOX
@@ -78,12 +96,11 @@ int UnmapMemory(void *area, size_t bytes)
}
#else
-#include <stdlib.h>
#define MEMORY_MAPPING_USES_MALLOC 1
void* MapMemory (size_t bytes)
{
- return malloc( bytes );
+ return ErrnoPreservingMalloc( bytes );
}
int UnmapMemory(void *area, size_t bytes)
diff --git a/src/tbbmalloc/backend.cpp b/src/tbbmalloc/backend.cpp
index 68e904a..8916fb1 100644
--- a/src/tbbmalloc/backend.cpp
+++ b/src/tbbmalloc/backend.cpp
@@ -26,23 +26,9 @@
the GNU General Public License.
*/
-// intrin.h available since VS2005
-#if defined(_MSC_VER) && _MSC_VER >= 1400
-#define __TBB_HAS_INTRIN_H 1
-#else
-#define __TBB_HAS_INTRIN_H 0
-#endif
-
-#if __TBB_HAS_INTRIN_H
-#include <intrin.h> /* for __cpuid */
-#endif
-
+#include <string.h> /* for memset */
+#include <errno.h>
#include "tbbmalloc_internal.h"
-//! Define the main synchronization method
-/** It should be specified before including LifoList.h */
-#define FINE_GRAIN_LOCKS
-#include "LifoList.h"
-
namespace rml {
namespace internal {
@@ -56,6 +42,16 @@ namespace internal {
/*********** Code to acquire memory from the OS or other executive ****************/
+/*
+ syscall/malloc can set non-zero errno in case of failure,
+ but later allocator might be able to find memory to fulfil the request.
+ And we do not want changing of errno by successful scalable_malloc call.
+ To support this, restore old errno in (get|free)RawMemory, and set errno
+ in frontend just before returning to user code.
+ Please note: every syscall/libc call used inside scalable_malloc that
+ sets errno must be protected this way, not just memory allocation per se.
+*/
+
#if USE_DEFAULT_MEMORY_MAPPING
#include "MapMemory.h"
#else
@@ -69,26 +65,32 @@ void* getRawMemory (size_t size, bool useMapMem = false)
{
void *object;
- if (useMapMem)
+ if (useMapMem)
object = MapMemory(size);
else
#if MALLOC_CHECK_RECURSION
if (RecursiveMallocCallProtector::noRecursion())
- object = malloc(size);
- else if ( rml::internal::original_malloc_found )
+ object = ErrnoPreservingMalloc(size);
+ else if ( rml::internal::original_malloc_found ) {
+ int prevErrno = errno;
object = (*rml::internal::original_malloc_ptr)(size);
- else
+ if (!object)
+ errno = prevErrno;
+ } else
object = MapMemory(size);
#else
- object = malloc(size);
+ object = MallocNoErrno(size);
#endif /* MALLOC_CHECK_RECURSION */
+
return object;
}
-void freeRawMemory (void *object, size_t size, bool useMapMem)
+bool freeRawMemory (void *object, size_t size, bool useMapMem)
{
+ bool unmapFailed = false;
+
if (useMapMem)
- UnmapMemory(object, size);
+ unmapFailed = UnmapMemory(object, size);
else
#if MALLOC_CHECK_RECURSION
if (RecursiveMallocCallProtector::noRecursion())
@@ -96,180 +98,919 @@ void freeRawMemory (void *object, size_t size, bool useMapMem)
else if ( rml::internal::original_malloc_found )
(*rml::internal::original_free_ptr)(object);
else
- UnmapMemory(object, size);
+ unmapFailed = UnmapMemory(object, size);
#else
free(object);
#endif /* MALLOC_CHECK_RECURSION */
+
+ return unmapFailed;
}
#else /* USE_MALLOC_FOR_LARGE_OBJECT */
-void* getRawMemory (size_t size, bool = false) { return MapMemory(size); }
+void* getRawMemory (size_t size, bool = false) {
+ int myErr = errno;
+ void *ret = MapMemory(size);
+ errno = myErr;
+ return ret;
+}
-void freeRawMemory (void *object, size_t size, bool) {
- UnmapMemory(object, size);
+bool freeRawMemory (void *object, size_t size, bool) {
+ return UnmapMemory(object, size);
}
#endif /* USE_MALLOC_FOR_LARGE_OBJECT */
+void *Backend::getRawMem(size_t &size, bool useMapMem) const
+{
+ if (extMemPool->userPool()) {
+ if (size_t rem = size % extMemPool->granularity) {
+ size += extMemPool->granularity - rem;
+ }
+ MALLOC_ASSERT(0 == size % extMemPool->granularity, ASSERT_TEXT);
+
+ return (*extMemPool->rawAlloc)(extMemPool->poolId, size);
+ }
+ return getRawMemory(size, useMapMem);
+}
+
+void Backend::freeRawMem(void *object, size_t size, bool useMapMem) const
+{
+ if (extMemPool->userPool())
+ (*extMemPool->rawFree)(extMemPool->poolId, object, size);
+ else
+ freeRawMemory(object, size, useMapMem);
+}
+
/********* End memory acquisition code ********************************/
-static unsigned int getCPUid()
+// Protected object size. After successful locking returns size of locked block.
+// and releasing requires setting block size.
+class GuardedSize : tbb::internal::no_copy {
+ uintptr_t value;
+public:
+ enum State {
+ LOCKED,
+ COAL_BLOCK, // block is coalescing now
+ MAX_LOCKED_VAL = COAL_BLOCK,
+ LAST_REGION_BLOCK, // used to mark last block in region
+ // values after this are "normal" block sizes
+ MAX_SPEC_VAL = LAST_REGION_BLOCK
+ };
+
+ void initLocked() { value = LOCKED; }
+ void makeCoalscing() {
+ MALLOC_ASSERT(value == LOCKED, ASSERT_TEXT);
+ value = COAL_BLOCK;
+ }
+ size_t tryLock(State state) {
+ size_t szVal, sz;
+ MALLOC_ASSERT(state <= MAX_LOCKED_VAL, ASSERT_TEXT);
+ for (;;) {
+ sz = FencedLoad((intptr_t&)value);
+ if (sz <= MAX_LOCKED_VAL)
+ break;
+ szVal = AtomicCompareExchange((intptr_t&)value, state, sz);
+
+ if (szVal==sz)
+ break;
+ }
+ return sz;
+ }
+ void unlock(size_t size) {
+ MALLOC_ASSERT(value <= MAX_LOCKED_VAL, "The lock is not locked");
+ MALLOC_ASSERT(size > MAX_LOCKED_VAL, ASSERT_TEXT);
+ FencedStore((intptr_t&)value, size);
+ }
+};
+
+struct MemRegion {
+ MemRegion *next, // keep all regions in any pool to release all them on
+ *prev; // pool destroying, 2-linked list to release individual
+ // regions.
+ size_t allocSz, // got from poll callback
+ blockSz; // initial and maximal inner block size
+};
+
+// this data must be unmodified while block is in use, so separate it
+class BlockMutexes {
+protected:
+ GuardedSize myL, // lock for me
+ leftL; // lock for left neighbor
+};
+
+class FreeBlock : BlockMutexes {
+public:
+ static const size_t minBlockSize;
+
+ FreeBlock *prev, // in 2-linked list related to bin
+ *next,
+ *nextToFree; // used to form a queue during coalescing
+ // valid only when block is in processing, i.e. one is not free and not
+ size_t sizeTmp; // used outside of backend
+ int myBin; // bin that is owner of the block
+ bool aligned;
+ bool blockInBin; // this block in myBin already
+
+ FreeBlock *rightNeig(size_t sz) const {
+ MALLOC_ASSERT(sz, ASSERT_TEXT);
+ return (FreeBlock*)((uintptr_t)this+sz);
+ }
+ FreeBlock *leftNeig(size_t sz) const {
+ MALLOC_ASSERT(sz, ASSERT_TEXT);
+ return (FreeBlock*)((uintptr_t)this - sz);
+ }
+
+ void initHeader() { myL.initLocked(); leftL.initLocked(); }
+ void setMeFree(size_t size) { myL.unlock(size); }
+ size_t trySetMeUsed(GuardedSize::State s) { return myL.tryLock(s); }
+
+ void setLeftFree(size_t sz) { leftL.unlock(sz); }
+ size_t trySetLeftUsed(GuardedSize::State s) { return leftL.tryLock(s); }
+
+ size_t tryLockBlock() {
+ size_t rSz, sz = trySetMeUsed(GuardedSize::LOCKED);
+
+ if (sz <= GuardedSize::MAX_LOCKED_VAL)
+ return false;
+ rSz = rightNeig(sz)->trySetLeftUsed(GuardedSize::LOCKED);
+ if (rSz <= GuardedSize::MAX_LOCKED_VAL) {
+ setMeFree(sz);
+ return false;
+ }
+ MALLOC_ASSERT(rSz == sz, ASSERT_TEXT);
+ return sz;
+ }
+ void markCoalescing(size_t blockSz) {
+ myL.makeCoalscing();
+ rightNeig(blockSz)->leftL.makeCoalscing();
+ sizeTmp = blockSz;
+ nextToFree = NULL;
+ }
+ void markUsed() {
+ myL.initLocked();
+ rightNeig(sizeTmp)->leftL.initLocked();
+ nextToFree = NULL;
+ }
+ static void markBlocks(FreeBlock *fBlock, int num, size_t size) {
+ for (int i=1; i<num; i++) {
+ fBlock = (FreeBlock*)((uintptr_t)fBlock + size);
+ fBlock->initHeader();
+ }
+ }
+};
+
+// Last block in any region. Its "size" field is GuardedSize::LAST_REGION_BLOCK,
+// This kind of blocks used to find region header
+// and have a possibility to return region back to OS
+struct LastFreeBlock : public FreeBlock {
+ MemRegion *memRegion;
+};
+
+const size_t FreeBlock::minBlockSize = sizeof(FreeBlock);
+
+void CoalRequestQ::putBlock(FreeBlock *fBlock)
{
- unsigned int id;
-
-#if (__ARCH_x86_32||__ARCH_x86_64) && (__linux__||__APPLE__||__FreeBSD__||__NetBSD__||__sun||__MINGW32__)
- int res;
- #if __ARCH_x86_32
- /* EBX used for PIC support. Having EAX in output operands
- prevents ICC from crash like in __TBB_ICC_ASM_VOLATILE_BROKEN. */
- int _eax, _ecx, _edx;
- __asm__ ("xchgl %%ebx, %1\n\t"
- "cpuid\n\t"
- "xchgl %%ebx, %1\n\t"
- : "=a" (_eax), "=r" (res)
- : "a" (1) : "ecx", "edx");
- #else
- __asm__ ("cpuid\n\t"
- : "=b" (res)
- : "a" (1) );
- #endif // __ARCH_x86_32
- id = (res >> 24) & 0xff;
-#elif _WIN32 || _WIN64
- #if __TBB_HAS_INTRIN_H
- int CPUInfo[4];
- __cpuid(CPUInfo, 1);
- id = (CPUInfo[1] >> 24) & 0xff;
- #else
- int res;
- _asm {
- push ebx
- push ecx
- mov eax,1
- cpuid
- mov res,ebx
- pop ecx
- pop ebx
+ MALLOC_ASSERT(fBlock->sizeTmp >= FreeBlock::minBlockSize, ASSERT_TEXT);
+ fBlock->markUsed();
+
+ for (;;) {
+ FreeBlock *myBlToFree = (FreeBlock*)FencedLoad((intptr_t&)blocksToFree);
+
+ fBlock->nextToFree = myBlToFree;
+ if (myBlToFree ==
+ (FreeBlock*)AtomicCompareExchange((intptr_t&)blocksToFree,
+ (intptr_t)fBlock,
+ (intptr_t)myBlToFree))
+ return;
}
- id = (res >> 24) & 0xff;
- #endif
-# else
- id = getThreadId();
-#endif
- return id;
}
+FreeBlock *CoalRequestQ::getAll()
+{
+ for (;;) {
+ FreeBlock *myBlToFree = (FreeBlock*)FencedLoad((intptr_t&)blocksToFree);
+
+ if (!myBlToFree)
+ return NULL;
+ else {
+ if (myBlToFree ==
+ (FreeBlock*)AtomicCompareExchange((intptr_t&)blocksToFree,
+ 0, (intptr_t)myBlToFree))
+ return myBlToFree;
+ else
+ continue;
+ }
+ }
+}
-/*
- * To decrease contention for free blocks, free blocks are split, and access
- * to them is based on process number.
- */
-const int numOfFreeBlockLists = 4;
+// 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.
+FreeBlock *Backend::IndexedBins::getBlock(int binIdx, ProcBlocks *procBlocks,
+ size_t size, bool res16Kaligned, bool alignedBin, bool wait,
+ int *binLocked)
+{
+ Bin *b = &freeBins[binIdx];
+try_next:
+ FreeBlock *fBlock = NULL;
+ if (b->head) {
+ bool locked;
+ MallocMutex::scoped_lock scopedLock(b->tLock, wait, &locked);
+
+ if (!locked) {
+ if (binLocked) (*binLocked)++;
+ return NULL;
+ }
-/*
- * This is a LIFO linked list that one can init, push or pop from
- */
-static LifoList freeBlockList[numOfFreeBlockLists];
+ for (FreeBlock *curr = b->head; curr; curr = curr->next) {
+ size_t szBlock = curr->tryLockBlock();
+ if (!szBlock) {
+ goto try_next;
+ }
+
+ if (alignedBin || !res16Kaligned) {
+ size_t splitSz = szBlock - size;
+ // If we got a block as split result,
+ // it must have a room for control structures.
+ if (szBlock >= size && (splitSz >= FreeBlock::minBlockSize ||
+ !splitSz))
+ fBlock = curr;
+ } else {
+ void *newB = alignUp(curr, blockSize);
+ uintptr_t rightNew = (uintptr_t)newB + size;
+ uintptr_t rightCurr = (uintptr_t)curr + szBlock;
+ // appropriate size, and left and right split results
+ // are either big enough or non-exitent
+ if (rightNew <= rightCurr
+ && (newB==curr ||
+ (uintptr_t)newB-(uintptr_t)curr >= FreeBlock::minBlockSize)
+ && (rightNew==rightCurr ||
+ rightCurr - rightNew >= FreeBlock::minBlockSize))
+ fBlock = curr;
+ }
+ if (fBlock) {
+ // consume must be called before result of removing from a bin
+ // is visible externally.
+ procBlocks->consume();
+ if (alignedBin && res16Kaligned &&
+ Backend::sizeToBin(szBlock-size) == Backend::sizeToBin(szBlock)) {
+ // free remainder of fBlock stay in same bin,
+ // so no need to remove it from the bin
+ // TODO: add more "still here" cases
+ 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");
+ fBlock->initHeader();
+ fBlock->setLeftFree(szBlock - size);
+ newFBlock->setMeFree(szBlock - size);
+
+ fBlock->sizeTmp = size;
+ } else {
+ b->removeBlock(fBlock);
+ if (freeBins[binIdx].empty())
+ bitMask.set(binIdx, false);
+ fBlock->sizeTmp = szBlock;
+ }
+ break;
+ } else { // block size is not valid, search for next block in the bin
+ curr->setMeFree(szBlock);
+ curr->rightNeig(szBlock)->setLeftFree(szBlock);
+ }
+ }
+ }
+ return fBlock;
+}
-FreeBlocks freeBlocks;
+void Backend::Bin::removeBlock(FreeBlock *fBlock)
+{
+ if (head == fBlock)
+ head = fBlock->next;
+ if (fBlock->prev)
+ fBlock->prev->next = fBlock->next;
+ if (fBlock->next)
+ fBlock->next->prev = fBlock->prev;
+}
-bool FreeBlocks::bootstrap(RawAlloc myAlloc, RawFree myFree, size_t /*myReqSize*/)
+void Backend::IndexedBins::addBlock(int binIdx, FreeBlock *fBlock, size_t blockSz)
{
- if (!myAlloc && !myFree) {
- rawAlloc = getRawMemory;
- rawFree = freeRawMemory;
- // Get virtual memory in pieces of this size: 0x0100000 is 1 megabyte decimal
- memReqSize = 0x0100000;
- } else
- MALLOC_ASSERT(0, "Not implemented yet.");
- return mallocBigBlock();
+ Bin *b = &freeBins[binIdx];
+
+ fBlock->myBin = binIdx;
+ fBlock->aligned = toAlignedBin(fBlock, blockSz);
+ fBlock->prev = NULL;
+ MallocMutex::scoped_lock scopedLock(b->tLock);
+ fBlock->next = b->head;
+ b->head = fBlock;
+ if (fBlock->next)
+ fBlock->next->prev = fBlock;
+ bitMask.set(binIdx, true);
}
-BlockI *FreeBlocks::get(bool startup)
+bool Backend::IndexedBins::tryAddBlock(int binIdx, FreeBlock *fBlock, size_t blockSz)
{
- BlockI *bigBlock;
- // must not call getCPUid during malloc initialization
- // because getCPUid can call malloc
- const unsigned myFreeList = startup? 0 : getCPUid()%numOfFreeBlockLists;
- unsigned currListIdx = myFreeList;
-
- do {
- if (bigBlock = (BlockI *) freeBlockList[currListIdx].pop()) {
- MALLOC_ITT_SYNC_ACQUIRED(freeBlockList+currListIdx);
- break;
+ bool locked;
+ Bin *b = &freeBins[binIdx];
+
+ fBlock->myBin = binIdx;
+ fBlock->aligned = toAlignedBin(fBlock, blockSz);
+ fBlock->prev = NULL;
+
+ MallocMutex::scoped_lock scopedLock(b->tLock, /*wait=*/false, &locked);
+ if (!locked)
+ return false;
+ fBlock->next = b->head;
+ b->head = fBlock;
+ if (fBlock->next)
+ fBlock->next->prev = fBlock;
+ bitMask.set(binIdx, true);
+ return true;
+}
+
+void Backend::IndexedBins::reset()
+{
+ for (int i=0; i<Backend::freeBinsNum; i++)
+ freeBins[i].reset();
+ bitMask.reset();
+}
+
+void Backend::IndexedBins::lockRemoveBlock(int binIdx, FreeBlock *fBlock)
+{
+ MallocMutex::scoped_lock scopedLock(freeBins[binIdx].tLock);
+ freeBins[binIdx].removeBlock(fBlock);
+ if (freeBins[binIdx].empty())
+ bitMask.set(binIdx, false);
+}
+
+// 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,
+ int *binLocked)
+{
+ FreeBlock *fBlock =
+ freeLargeBins.getBlock(binIdx, &procBlocks, num*size, res16Kaligned,
+ /*alignedBin=*/false, /*wait=*/false, binLocked);
+ if (fBlock) {
+ if (res16Kaligned) {
+ size_t fBlockSz = fBlock->sizeTmp;
+ uintptr_t fBlockEnd = (uintptr_t)fBlock + fBlockSz;
+ FreeBlock *newB = alignUp(fBlock, blockSize);
+ FreeBlock *rightPart = (FreeBlock*)((uintptr_t)newB + num*size);
+
+ // Space to use is in the middle,
+ // ... return free right part
+ if ((uintptr_t)rightPart != fBlockEnd) {
+ rightPart->initHeader(); // to prevent coalescing rightPart with fBlock
+ coalescAndPut(rightPart, fBlockEnd - (uintptr_t)rightPart);
+ }
+ // ... and free left part
+ if (newB != fBlock) {
+ newB->initHeader(); // to prevent coalescing fBlock with newB
+ coalescAndPut(fBlock, (uintptr_t)newB - (uintptr_t)fBlock);
+ }
+
+ fBlock = newB;
+ MALLOC_ASSERT(isAligned(fBlock, blockSize), ASSERT_TEXT);
+ } else {
+ if (size_t splitSz = fBlock->sizeTmp - num*size) {
+ // split block and return free right part
+ FreeBlock *splitB = (FreeBlock*)((uintptr_t)fBlock + num*size);
+ splitB->initHeader();
+ coalescAndPut(splitB, splitSz);
+ }
}
- currListIdx = (currListIdx+1) % numOfFreeBlockLists;
- } while (currListIdx != myFreeList);
+ procBlocks.signal();
+ FreeBlock::markBlocks(fBlock, num, size);
+ }
- while (!bigBlock) {
- /* We are out of blocks so go to the OS and get another one */
- if (!mallocBigBlock()) return NULL;
+ return fBlock;
+}
- bigBlock = (BlockI *) freeBlockList[myFreeList].pop();
- if (bigBlock)
- MALLOC_ITT_SYNC_ACQUIRED(freeBlockList+myFreeList);
+// try to allocate size Byte block from any of 16KB-alined spaces.
+// res16Kaligned is true if result must be 16KN alined
+FreeBlock *Backend::getFromAlignedSpace(int binIdx, int num, size_t size,
+ bool res16Kaligned, bool wait, int *binLocked)
+{
+ FreeBlock *fBlock =
+ freeAlignedBins.getBlock(binIdx, &procBlocks, num*size, res16Kaligned,
+ /*alignedBin=*/true, wait, binLocked);
+
+ if (fBlock) {
+ if (fBlock->sizeTmp != num*size) { // i.e., need to split the block
+ FreeBlock *newAlgnd;
+ size_t newSz;
+
+ if (res16Kaligned) {
+ newAlgnd = fBlock;
+ fBlock = (FreeBlock*)((uintptr_t)newAlgnd + newAlgnd->sizeTmp
+ - num*size);
+ MALLOC_ASSERT(isAligned(fBlock, blockSize), "Invalid free block");
+ fBlock->initHeader();
+ newSz = newAlgnd->sizeTmp - num*size;
+ } else {
+ newAlgnd = (FreeBlock*)((uintptr_t)fBlock + num*size);
+ newSz = fBlock->sizeTmp - num*size;
+ newAlgnd->initHeader();
+ }
+ coalescAndPut(newAlgnd, newSz);
+ }
+ procBlocks.signal();
+ MALLOC_ASSERT(!res16Kaligned || isAligned(fBlock, blockSize), ASSERT_TEXT);
+ FreeBlock::markBlocks(fBlock, num, size);
}
+ return fBlock;
+}
- return bigBlock;
+void Backend::correctMaxRequestSize(size_t requestSize)
+{
+ if (requestSize < maxBinedSize) {
+ for (size_t oldMax = FencedLoad((intptr_t&)maxRequestedSize);
+ requestSize > oldMax; ) {
+ size_t val = AtomicCompareExchange((intptr_t&)maxRequestedSize,
+ requestSize, oldMax);
+ if (val == oldMax)
+ break;
+ oldMax = val;
+ }
+ }
}
-void FreeBlocks::put(BlockI *ptr, bool startup)
+// try to allocate size Byte block in available bins
+// res16Kaligned is true if result must be 16KB aligned
+void *Backend::genericGetBlock(int num, size_t size, bool res16Kaligned, bool startup)
{
- unsigned myFreeList = startup? 0 : getCPUid()%numOfFreeBlockLists;
- MALLOC_ITT_SYNC_RELEASING(freeBlockList+myFreeList);
- freeBlockList[myFreeList].push((void **)ptr);
+ // after (soft|hard)CachesCleanup we can get memory in large bins,
+ // while after addNewRegion only in ALGN_SPACE_BIN. This flag
+ // is for large bins update status.
+ bool largeBinsUpdated = true;
+ void *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->fixedSizePool()? 0 : 2;
+
+ correctMaxRequestSize(totalReqSize);
+ scanCoalescQ(/*forceCoalescQDrop=*/false);
+
+ for (;;) {
+ const intptr_t startModifiedCnt = procBlocks.getNumOfMods();
+ int numOfLockedBins;
+
+ for (;;) {
+ numOfLockedBins = 0;
+
+ // TODO: try different bin search order
+ if (res16Kaligned) {
+ if (!block)
+ for (int i=freeAlignedBins.getMinNonemptyBin(nativeBin);
+ i<freeBinsNum;
+ i=freeAlignedBins.getMinNonemptyBin(i+1))
+ if (block = getFromAlignedSpace(i, num, size, /*res16Kaligned=*/true, /*wait=*/false, &numOfLockedBins))
+ break;
+ if (!block && largeBinsUpdated)
+ for (int i=freeLargeBins.getMinNonemptyBin(nativeBin);
+ i<freeBinsNum; i=freeLargeBins.getMinNonemptyBin(i+1))
+ if (block = getFromBin(i, num, size, /*res16Kaligned=*/true, &numOfLockedBins))
+ break;
+ } else {
+ if (largeBinsUpdated)
+ for (int i=freeLargeBins.getMinNonemptyBin(nativeBin);
+ i<freeBinsNum; i=freeLargeBins.getMinNonemptyBin(i+1))
+ if (block = getFromBin(i, num, size, /*res16Kaligned=*/false, &numOfLockedBins))
+ break;
+ if (!block)
+ for (int i=freeAlignedBins.getMinNonemptyBin(nativeBin);
+ i<freeBinsNum;
+ i=freeAlignedBins.getMinNonemptyBin(i+1))
+ if (block = getFromAlignedSpace(i, num, size, /*res16Kaligned=*/false, /*wait=*/false, &numOfLockedBins))
+ break;
+ }
+ if (block || numOfLockedBins<=lockedBinsThreshold)
+ break;
+ }
+ if (block)
+ break;
+
+ 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 other ways to extend the backend.
+ if (procBlocks.waitTillSignalled(startModifiedCnt)
+ // semaphore is protecting adding more more memory from OS
+ || memExtendingSema.wait())
+ continue;
+
+ if (startModifiedCnt != procBlocks.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 =
+ alignUp(4*FencedLoad((intptr_t&)maxRequestedSize), 1024*1024);
+ if (size == blockSize || regSz_sizeBased < maxBinedSize) {
+ const size_t extendingRegionSize = maxBinedSize;
+ for (unsigned idx=0; idx<4; idx++) {
+ size_t binSize =
+ addNewRegion(extendingRegionSize);
+ if (!binSize)
+ break;
+ if (binSize > maxBinSize)
+ maxBinSize = binSize;
+ }
+ } else {
+ maxBinSize = addNewRegion(regSz_sizeBased);
+ }
+ 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)
+ return NULL;
+
+ if (!maxBinSize) { // no regions have been added, try to clean cache
+ if (extMemPool->hardCachesCleanup())
+ largeBinsUpdated = true;
+ else {
+ if (procBlocks.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;
}
-void FreeBlocks::putList(BlockI *head, BlockI *tail)
+LargeMemoryBlock *Backend::getLargeBlock(size_t size, bool startup)
{
- unsigned myFreeList = getCPUid()%numOfFreeBlockLists;
- MALLOC_ITT_SYNC_RELEASING(freeBlockList+myFreeList);
- freeBlockList[myFreeList].pushList((void**)head, (void**)tail);
+ bool directRawMemCall = false;
+ void *lmb;
+
+ if (size >= maxBinedSize && !extMemPool->fixedSizePool()) {
+ directRawMemCall = true;
+ if (! (lmb = getRawMem(size, /*useMapMem=*/true))) {
+ bool hardCleanupDone = false;
+
+ // try to clean caches, hoping to find memory after it
+ if (!extMemPool->softCachesCleanup()) {
+ if (!extMemPool->hardCachesCleanup())
+ return NULL;
+ hardCleanupDone = true;
+ }
+ if (! (lmb = getRawMem(size, /*useMapMem=*/true))) {
+ if (hardCleanupDone || !extMemPool->hardCachesCleanup())
+ return NULL;
+ if (! (lmb = getRawMem(size, /*useMapMem=*/true))) {
+ // our last chance is to get the block from bins
+ lmb = genericGetBlock(1, size, /*res16Kaligned=*/false,
+ startup);
+ if (!lmb) return NULL;
+ directRawMemCall = false;
+ }
+ }
+ }
+ } else
+ lmb = genericGetBlock(1, size, /*res16Kaligned=*/false, startup);
+
+ LargeMemoryBlock *res = (LargeMemoryBlock*)lmb;
+ if (res) {
+ res->directRawMemCall = directRawMemCall;
+ res->unalignedSize = size;
+ }
+ return res;
}
-/*
- * Big Blocks are the blocks we get from the OS or some similar place using getMemory above.
- * They are placed on the freeBlockList once they are acquired.
- */
-bool FreeBlocks::mallocBigBlock()
+void Backend::removeBlockFromBin(FreeBlock *fBlock)
{
-/* Divide the big block into smaller bigBlocks that hold that many blocks.
- * This is done since we really need a lot of blocks on the freeBlockList
- * or there will be contention problems.
- */
- const unsigned int blocksPerBigBlock = 16/numOfFreeBlockLists;
+ if (fBlock->myBin != Backend::NO_BIN)
+ if (fBlock->aligned)
+ freeAlignedBins.lockRemoveBlock(fBlock->myBin, fBlock);
+ else
+ freeLargeBins.lockRemoveBlock(fBlock->myBin, fBlock);
+}
- void *unalignedBigBlock = (*rawAlloc)(memReqSize, /*useMapMem=*/true);
+void Backend::genericPutBlock(FreeBlock *fBlock, size_t blockSz,
+ bool directRawMemCall)
+{
+ if (blockSz >= maxBinedSize && !extMemPool->fixedSizePool()
+ && directRawMemCall)
+ freeRawMem(fBlock, blockSz, /*useMapMem=*/true);
+ else {
+ procBlocks.consume();
+ coalescAndPut(fBlock, blockSz);
+ procBlocks.signal();
+ }
+}
- if (!unalignedBigBlock) {
- TRACEF(( "[ScalableMalloc trace] in mallocBigBlock, getMemory returns 0\n" ));
- /* We can't get any more memory from the OS or executive */
- return false;
+void Backend::releaseRegion(MemRegion *memRegion)
+{
+ {
+ MallocMutex::scoped_lock lock(regionListLock);
+ if (regionList == memRegion)
+ regionList = memRegion->next;
+ if (memRegion->next)
+ memRegion->next->prev = memRegion->prev;
+ if (memRegion->prev)
+ memRegion->prev->next = memRegion->next;
+ }
+ freeRawMem(memRegion, memRegion->allocSz, /*useMapMem=*/true);
+}
+
+// coalesce fBlock with its neighborhood
+FreeBlock *Backend::doCoalesc(FreeBlock *fBlock, MemRegion **mRegion)
+{
+ FreeBlock *resBlock = fBlock;
+ size_t resSize = fBlock->sizeTmp;
+ MemRegion *memRegion = NULL;
+
+ fBlock->markCoalescing(resSize);
+ resBlock->blockInBin = false;
+
+ // coalesing with left neighbor
+ size_t leftSz = fBlock->trySetLeftUsed(GuardedSize::COAL_BLOCK);
+ if (leftSz != GuardedSize::LOCKED) {
+ if (leftSz == GuardedSize::COAL_BLOCK) {
+ coalescQ.putBlock(fBlock);
+ return NULL;
+ } else {
+ FreeBlock *left = fBlock->leftNeig(leftSz);
+ size_t lSz = left->trySetMeUsed(GuardedSize::COAL_BLOCK);
+ if (lSz <= GuardedSize::MAX_LOCKED_VAL) {
+ fBlock->setLeftFree(leftSz); // rollback
+ coalescQ.putBlock(fBlock);
+ return NULL;
+ } else {
+ MALLOC_ASSERT(lSz == leftSz, "Invalid header");
+ left->blockInBin = true;
+ resBlock = left;
+ resSize += leftSz;
+ resBlock->sizeTmp = resSize;
+ }
+ }
+ }
+ // coalesing with right neighbor
+ FreeBlock *right = fBlock->rightNeig(fBlock->sizeTmp);
+ size_t rightSz = right->trySetMeUsed(GuardedSize::COAL_BLOCK);
+ if (rightSz != GuardedSize::LOCKED) {
+ // LastFreeBlock is on the right side
+ if (GuardedSize::LAST_REGION_BLOCK == rightSz) {
+ right->setMeFree(GuardedSize::LAST_REGION_BLOCK);
+ memRegion = static_cast<LastFreeBlock*>(right)->memRegion;
+ } else if (GuardedSize::COAL_BLOCK == rightSz) {
+ if (resBlock->blockInBin) {
+ resBlock->blockInBin = false;
+ removeBlockFromBin(resBlock);
+ }
+ coalescQ.putBlock(resBlock);
+ return NULL;
+ } else {
+ size_t rSz = right->rightNeig(rightSz)->
+ trySetLeftUsed(GuardedSize::COAL_BLOCK);
+ if (rSz <= GuardedSize::MAX_LOCKED_VAL) {
+ right->setMeFree(rightSz); // rollback
+ if (resBlock->blockInBin) {
+ resBlock->blockInBin = false;
+ removeBlockFromBin(resBlock);
+ }
+ coalescQ.putBlock(resBlock);
+ return NULL;
+ } else {
+ MALLOC_ASSERT(rSz == rightSz, "Invalid header");
+ removeBlockFromBin(right);
+ resSize += rightSz;
+
+ // Is LastFreeBlock on the right side of right?
+ FreeBlock *nextRight = right->rightNeig(rightSz);
+ size_t nextRightSz = nextRight->
+ trySetMeUsed(GuardedSize::COAL_BLOCK);
+ if (nextRightSz > GuardedSize::MAX_LOCKED_VAL) {
+ if (nextRightSz == GuardedSize::LAST_REGION_BLOCK)
+ memRegion = static_cast<LastFreeBlock*>(nextRight)->memRegion;
+
+ nextRight->setMeFree(nextRightSz);
+ }
+ }
+ }
}
+ if (memRegion) {
+ MALLOC_ASSERT((uintptr_t)memRegion + memRegion->allocSz >=
+ (uintptr_t)right + sizeof(LastFreeBlock), ASSERT_TEXT);
+ MALLOC_ASSERT((uintptr_t)memRegion < (uintptr_t)resBlock, ASSERT_TEXT);
+ *mRegion = memRegion;
+ } else
+ *mRegion = NULL;
+ resBlock->sizeTmp = resSize;
+ return resBlock;
+}
+
+void Backend::coalescAndPutList(FreeBlock *list, bool forceCoalescQDrop, bool doStat)
+{
+ FreeBlock *helper;
+ MemRegion *memRegion;
+ int alignedSpaceIdx = -1;
+
+ for (;list; list = helper) {
+ helper = list->nextToFree;
+ FreeBlock *toRet = doCoalesc(list, &memRegion);
+ if (!toRet)
+ continue;
+
+ if (memRegion && memRegion->blockSz == toRet->sizeTmp
+ && !extMemPool->fixedSizePool()) {
+ // release the region, because there is no used blocks in it
+ if (toRet->blockInBin)
+ removeBlockFromBin(toRet);
+
+ releaseRegion(memRegion);
+ } else {
+ size_t currSz = toRet->sizeTmp;
+ int bin = sizeToBin(currSz);
+ bool toAligned = toAlignedBin(toRet, currSz);
+ bool needAddToBin = true;
+
+ if (toRet->blockInBin) {
+ // is it stay in same bin?
+ if (toRet->myBin == bin && toRet->aligned == toAligned)
+ needAddToBin = false;
+ else {
+ toRet->blockInBin = false;
+ removeBlockFromBin(toRet);
+ }
+ }
+
+ // not stay in same bin, or bin-less, add it
+ if (needAddToBin) {
+ toRet->prev = toRet->next = toRet->nextToFree = NULL;
+ toRet->myBin = NO_BIN;
+ toRet->sizeTmp = 0;
+
+ // 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 (!(toAligned?
+ freeAlignedBins.tryAddBlock(bin, toRet, currSz) :
+ freeLargeBins.tryAddBlock(bin, toRet, currSz))) {
+ toRet->sizeTmp = currSz;
+ coalescQ.putBlock(toRet);
+ continue;
+ }
+ }
+ }
+ // Free (possibly coalesced) free block.
+ // Adding to bin must be done before this point,
+ // because after a block is free it can be coalesced, and
+ // using its pointer became unsafe.
+ // Remember that coalescing is not done under any global lock.
+ toRet->setMeFree(currSz);
+ toRet->rightNeig(currSz)->setLeftFree(currSz);
+ }
+ }
+}
+
+// Coalesce fBlock and add it back to a bin;
+// processing delayed coalescing requests.
+void Backend::coalescAndPut(FreeBlock *fBlock, size_t blockSz)
+{
+ fBlock->sizeTmp = blockSz;
+ fBlock->nextToFree = NULL;
- void *alignedBigBlock = alignUp(unalignedBigBlock, blockSize);
- void *bigBlockCeiling = (void*)((uintptr_t)unalignedBigBlock + memReqSize);
+ coalescAndPutList(fBlock, /*forceCoalescQDrop=*/false, /*doStat=*/false);
+}
- size_t bigBlockSplitSize = blocksPerBigBlock * blockSize;
+bool Backend::scanCoalescQ(bool forceCoalescQDrop)
+{
+ FreeBlock *currCoalescList = coalescQ.getAll();
- BlockI *splitBlock = (BlockI*)alignedBigBlock;
+ if (currCoalescList)
+ coalescAndPutList(currCoalescList, forceCoalescQDrop, /*doStat=*/true);
+ return currCoalescList;
+}
- // distribute alignedBigBlock between all freeBlockList elements
- for (unsigned currListIdx = 0;
- ((uintptr_t)splitBlock + blockSize) <= (uintptr_t)bigBlockCeiling;
- currListIdx = (currListIdx+1) % numOfFreeBlockLists) {
- void *splitEdge = (void*)((uintptr_t)splitBlock + bigBlockSplitSize);
- if( splitEdge > bigBlockCeiling) {
- splitEdge = alignDown(bigBlockCeiling, blockSize);
+size_t Backend::initRegion(MemRegion *region, size_t rawSize)
+{
+ FreeBlock *fBlock = (FreeBlock *)((uintptr_t)region + sizeof(MemRegion));
+ // right bound is 16KB-aligned, keep LastFreeBlock after it
+ size_t blockSz =
+ alignDown((uintptr_t)region + rawSize - sizeof(LastFreeBlock), blockSize)
+ - ((uintptr_t)region + sizeof(MemRegion));
+ if (blockSz < blockSize) return 0;
+ MALLOC_ASSERT(isAligned((uintptr_t)fBlock+blockSz, blockSize), ASSERT_TEXT);
+
+ fBlock->initHeader();
+ fBlock->setMeFree(blockSz);
+
+ LastFreeBlock *lastBl = static_cast<LastFreeBlock*>(fBlock->rightNeig(blockSz));
+ lastBl->initHeader();
+ lastBl->setMeFree(GuardedSize::LAST_REGION_BLOCK);
+ lastBl->setLeftFree(blockSz);
+ lastBl->myBin = NO_BIN;
+ lastBl->memRegion = region;
+
+ unsigned targetBin = sizeToBin(blockSz);
+ region->allocSz = rawSize;
+ region->blockSz = blockSz;
+ if (toAlignedBin(fBlock, blockSz)) {
+ freeAlignedBins.addBlock(targetBin, fBlock, blockSz);
+ } else {
+ freeLargeBins.addBlock(targetBin, fBlock, blockSz);
+ }
+ return blockSz;
+}
+
+size_t Backend::addNewRegion(size_t rawSize)
+{
+ size_t binSize;
+ // to guarantee that header is not overwritten in used blocks
+ MALLOC_ASSERT(sizeof(BlockMutexes) <= sizeof(BlockI), ASSERT_TEXT);
+ // to guarantee that block length is not conflicting with
+ // special values of GuardedSize
+ MALLOC_ASSERT(FreeBlock::minBlockSize > GuardedSize::MAX_SPEC_VAL, ASSERT_TEXT);
+
+ MemRegion *region = (MemRegion*)getRawMem(rawSize, /*useMapMem=*/true);
+ // it's rough estimation, but enough to do correct check after alignment
+ if (!region || rawSize < sizeof(MemRegion)+blockSize) {
+ return 0;
+ }
+
+ {
+ region->prev = NULL;
+ MallocMutex::scoped_lock lock(regionListLock);
+ region->next = regionList;
+ regionList = region;
+ if (regionList->next)
+ regionList->next->prev = regionList;
+ }
+ if (! (binSize = initRegion(region, rawSize))) {
+ {
+ MallocMutex::scoped_lock lock(regionListLock);
+ if (regionList == region)
+ regionList = region->next;
+ if (region->next)
+ region->next->prev = region->prev;
+ if (region->prev)
+ region->prev->next = region->next;
}
- ((BlockI*)splitBlock)->initialize(splitEdge);
- MALLOC_ITT_SYNC_RELEASING(freeBlockList+currListIdx);
- freeBlockList[currListIdx].push((void**) splitBlock);
- splitBlock = (BlockI*)splitEdge;
+ freeRawMem(region, rawSize, /*useMapMem=*/true);
+ return 0;
}
+ procBlocks.pureSignal();
- TRACEF(( "[ScalableMalloc trace] in mallocBigBlock returning 1\n" ));
+ return binSize;
+}
+
+bool Backend::reset()
+{
+ MemRegion *curr;
+
+ MALLOC_ASSERT(extMemPool->userPool(), "Only user pool can be reset.");
+
+ freeLargeBins.reset();
+ freeAlignedBins.reset();
+
+ for (curr = regionList; curr; curr = curr->next)
+ if (!initRegion(curr, curr->allocSz))
+ return false;
return true;
}
+bool Backend::destroy()
+{
+ MALLOC_ASSERT(extMemPool->userPool(), "Only user pool can be destroyed.");
+ while (regionList) {
+ MemRegion *helper = regionList->next;
+ (*extMemPool->rawFree)(extMemPool->poolId, regionList,
+ regionList->allocSz);
+ regionList = helper;
+ }
+ return true;
+}
+
+size_t Backend::Bin::countFreeBlocks()
+{
+ size_t cnt = 0;
+ for (FreeBlock *fb = head; fb; fb = fb->next)
+ cnt++;
+ return cnt;
+}
+
+
} } // namespaces
diff --git a/src/tbbmalloc/backref.cpp b/src/tbbmalloc/backref.cpp
index c20084f..f699e28 100644
--- a/src/tbbmalloc/backref.cpp
+++ b/src/tbbmalloc/backref.cpp
@@ -38,7 +38,7 @@ namespace internal {
/* Each 16KB 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 {
+struct BackRefBlock : public BlockI {
BackRefBlock *nextForUse; // the next in the chain of blocks with free items
FreeObject *bumpPtr; // bump pointer moves from the end to the beginning of the block
FreeObject *freeList;
@@ -50,11 +50,12 @@ struct BackRefBlock {
BackRefBlock(BackRefBlock *blockToUse, int myNum) :
nextForUse(NULL), bumpPtr((FreeObject*)((uintptr_t)blockToUse + blockSize - sizeof(void*))),
freeList(NULL), allocatedCount(0), myNum(myNum), addedToForUse(false) {
+ memset(&blockMutex, 0, sizeof(MallocMutex));
// index in BackRefMaster must fit to uint16_t
- MALLOC_ASSERT(!(myNum >> 16), ASSERT_TEXT);
+ MALLOC_ASSERT(!(myNum >> 16), ASSERT_TEXT);
}
- // when BackRefMaster::findFreeBlock() calls getRawBlock,
+ // when BackRefMaster::findFreeBlock() calls get16KBlock
// BackRefBlock::bytes is used implicitly
static const int bytes = blockSize;
};
@@ -70,6 +71,7 @@ struct BackRefMaster {
static const size_t bytes = 64*1024;
static const int dataSz;
+ Backend *backend;
BackRefBlock *active; // if defined, use it for allocations
BackRefBlock *listForUse; // the chain of data blocks with free items
int lastUsed; // index of the last used block
@@ -86,13 +88,19 @@ const int BackRefMaster::dataSz
static MallocMutex backRefMutex;
static BackRefMaster *backRefMaster;
-bool initBackRefMaster()
+bool initBackRefMaster(Backend *backend)
{
// reserve space for master table and 4 leaves taking into account VirtualAlloc allocation granularity
// MapMemory is forced because the function runs during startup.
const int leaves = 4;
- if (! (backRefMaster = (BackRefMaster*)getRawMemory(BackRefMaster::bytes+leaves*BackRefBlock::bytes, /*useMapMem=*/true)))
+ const size_t masterSize = BackRefMaster::bytes+leaves*BackRefBlock::bytes;
+
+ backRefMaster = (BackRefMaster*)getRawMemory(masterSize, /*useMapMem=*/true);
+ if (!backRefMaster)
+ backRefMaster = (BackRefMaster*)backend->getLargeBlock(masterSize, /*startup=*/true);
+ if (! backRefMaster)
return false;
+ backRefMaster->backend = backend;
backRefMaster->listForUse = NULL;
for (int i=0; i<leaves; i++) {
BackRefBlock *bl = (BackRefBlock *)((uintptr_t)backRefMaster + BackRefMaster::bytes + i*BackRefBlock::bytes);
@@ -115,7 +123,8 @@ void BackRefMaster::addBackRefBlockToList(BackRefBlock *bl)
void BackRefMaster::addEmptyBackRefBlock(BackRefBlock *newBl)
{
- memset(newBl, 0, BackRefBlock::bytes);
+ memset((char*)newBl+sizeof(BackRefBlock), 0,
+ BackRefBlock::bytes-sizeof(BackRefBlock));
new (newBl) BackRefBlock(newBl, lastUsed);
backRefBl[lastUsed] = newBl;
}
@@ -124,18 +133,20 @@ BackRefBlock *BackRefMaster::findFreeBlock()
{
if (active->allocatedCount < BR_MAX_CNT)
return active;
-
+
if (listForUse) { // use released list
active = listForUse;
listForUse = listForUse->nextForUse;
MALLOC_ASSERT(active->addedToForUse, ASSERT_TEXT);
active->addedToForUse = false;
} else if (lastUsed-1 < backRefMaster->dataSz) { // allocate new data node
- // TODO: this block is never released, so can prevent re-using
- // of the memory it belong to in the backend,
- // getRawMemory can be used instead.
- BackRefBlock *newBl =
- (BackRefBlock*)BlockI::getRawBlock( /*startup=*/!isMallocInitializedExt() );
+ // This block is never released, so can prevent releasing of a region
+ // if it's received from the backend, so prefer getRawMemory using.
+ BackRefBlock *newBl = (BackRefBlock*)
+ getRawMemory(BackRefBlock::bytes,
+ /*useMapMem=*/!isMallocInitializedExt());
+ if (!newBl)
+ newBl = (BackRefBlock*)backend->get16KBlock(1, /*startup=*/!isMallocInitializedExt());
if (!newBl) return NULL;
lastUsed++;
backRefMaster->addEmptyBackRefBlock(newBl);
@@ -149,7 +160,7 @@ void *getBackRef(BackRefIdx backRefIdx)
{
// !backRefMaster means no initialization done, so it can't be valid memory
if (!backRefMaster || backRefIdx.getMaster() > backRefMaster->lastUsed
- || backRefIdx.getOffset() >= BR_MAX_CNT)
+ || backRefIdx.getOffset() >= BR_MAX_CNT)
return NULL;
return *(void**)((uintptr_t)backRefMaster->backRefBl[backRefIdx.getMaster()]
+ sizeof(BackRefBlock)+backRefIdx.getOffset()*sizeof(void*));
@@ -184,9 +195,13 @@ BackRefIdx BackRefIdx::newBackRef(bool largeObj)
if (blockToUse->freeList) {
toUse = (void**)blockToUse->freeList;
blockToUse->freeList = blockToUse->freeList->next;
+ MALLOC_ASSERT(!blockToUse->freeList ||
+ ((uintptr_t)blockToUse->freeList>=(uintptr_t)blockToUse
+ && (uintptr_t)blockToUse->freeList <
+ (uintptr_t)blockToUse + blockSize), ASSERT_TEXT);
} else if (blockToUse->allocatedCount < BR_MAX_CNT) {
toUse = (void**)blockToUse->bumpPtr;
- blockToUse->bumpPtr =
+ blockToUse->bumpPtr =
(FreeObject*)((uintptr_t)blockToUse->bumpPtr - sizeof(void*));
if (blockToUse->allocatedCount == BR_MAX_CNT-1) {
MALLOC_ASSERT((uintptr_t)blockToUse->bumpPtr
@@ -200,7 +215,7 @@ BackRefIdx BackRefIdx::newBackRef(bool largeObj)
} // end of lock scope
} while (!toUse);
res.master = blockToUse->myNum;
- uintptr_t offset =
+ uintptr_t offset =
((uintptr_t)toUse - ((uintptr_t)blockToUse + sizeof(BackRefBlock)))/sizeof(void*);
// Is offset too big?
MALLOC_ASSERT(!(offset >> 15), ASSERT_TEXT);
@@ -212,15 +227,22 @@ BackRefIdx BackRefIdx::newBackRef(bool largeObj)
void removeBackRef(BackRefIdx backRefIdx)
{
- MALLOC_ASSERT(backRefIdx.getMaster()<=backRefMaster->lastUsed
+ MALLOC_ASSERT(!backRefIdx.isInvalid(), ASSERT_TEXT);
+ MALLOC_ASSERT(backRefIdx.getMaster()<=backRefMaster->lastUsed
&& backRefIdx.getOffset()<BR_MAX_CNT, ASSERT_TEXT);
BackRefBlock *currBlock = backRefMaster->backRefBl[backRefIdx.getMaster()];
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);
{
MallocMutex::scoped_lock lock(currBlock->blockMutex);
freeObj->next = currBlock->freeList;
+ MALLOC_ASSERT(!freeObj->next ||
+ ((uintptr_t)freeObj->next > (uintptr_t)currBlock
+ && (uintptr_t)freeObj->next <
+ (uintptr_t)currBlock + blockSize), ASSERT_TEXT);
currBlock->freeList = freeObj;
currBlock->allocatedCount--;
}
diff --git a/src/tbbmalloc/frontend.cpp b/src/tbbmalloc/frontend.cpp
index cb22139..4fa15e7 100644
--- a/src/tbbmalloc/frontend.cpp
+++ b/src/tbbmalloc/frontend.cpp
@@ -29,24 +29,21 @@
#include "tbbmalloc_internal.h"
#include <errno.h>
+#include <new> /* for placement new */
+#include <string.h> /* for memset */
//! Define the main synchronization method
-/** It should be specified before including LifoList.h */
#define FINE_GRAIN_LOCKS
-#include "LifoList.h"
#if USE_PTHREAD
#define TlsSetValue_func pthread_setspecific
#define TlsGetValue_func pthread_getspecific
- typedef pthread_key_t tls_key_t;
#include <sched.h>
inline void do_yield() {sched_yield();}
#elif USE_WINTHREAD
- #include "tbb/machine/windows_api.h"
#define TlsSetValue_func TlsSetValue
#define TlsGetValue_func TlsGetValue
- typedef DWORD tls_key_t;
inline void do_yield() {SwitchToThread();}
#else
@@ -60,9 +57,11 @@
void mallocThreadShutdownNotification(void* arg);
namespace rml {
+class MemoryPool;
namespace internal {
class Block;
+class MemoryPool;
#if MALLOC_CHECK_RECURSION
@@ -124,8 +123,9 @@ class BootStrapBlocks {
Block *bootStrapBlockUsed;
FreeObject *bootStrapObjectList;
public:
- void *allocate(size_t size);
+ void *allocate(MemoryPool *memPool, size_t size);
void free(void* ptr);
+ void reset();
};
class ThreadId {
@@ -176,6 +176,44 @@ bool operator==(const ThreadId &id1, const ThreadId &id2) {
unsigned int getThreadId() { return ThreadId::get().id; }
+/*********** Code to provide thread ID and a thread-local void pointer **********/
+
+TLSKey::TLSKey()
+{
+#if USE_WINTHREAD
+ TLS_pointer_key = TlsAlloc();
+#else
+ int status = pthread_key_create( &TLS_pointer_key, mallocThreadShutdownNotification );
+ if ( status ) {
+ fprintf (stderr, "The memory manager cannot create tls key during initialization; exiting \n");
+ exit(1);
+ }
+#endif /* USE_WINTHREAD */
+}
+
+TLSKey::~TLSKey()
+{
+#if USE_WINTHREAD
+ TlsFree(TLS_pointer_key);
+#else
+ int status1 = pthread_key_delete(TLS_pointer_key);
+ if ( status1 ) {
+ fprintf (stderr, "The memory manager cannot delete tls key during; exiting \n");
+ exit(1);
+ }
+#endif /* USE_WINTHREAD */
+}
+
+inline TLSData* TLSKey::getThreadMallocTLS() const
+{
+ return (TLSData *)TlsGetValue_func( TLS_pointer_key );
+}
+
+inline void TLSKey::setThreadMallocTLS( TLSData * newvalue ) {
+ RecursiveMallocCallProtector scoped;
+ TlsSetValue_func( TLS_pointer_key, newvalue );
+}
+
/* The 'next' field in the block header has to maintain some invariants:
* it needs to be on a 16K boundary and the first field in the block.
* Any value stored there needs to have the lower 14 bits set to 0
@@ -190,12 +228,82 @@ unsigned int getThreadId() { return ThreadId::get().id; }
*/
class Bin;
class StartupBlock;
-struct TLSData;
+class TLSData;
+
+class LifoList {
+public:
+ inline LifoList();
+ inline void push(Block *block);
+ inline Block *pop();
+
+private:
+ Block *top;
+#ifdef FINE_GRAIN_LOCKS
+ MallocMutex lock;
+#endif /* FINE_GRAIN_LOCKS */
+};
+
+/*
+ * When a block that is not completely free is returned for reuse by other threads
+ * this is where the block goes.
+ *
+ * LifoList assumes zero initialization; so below its constructors are omitted,
+ * to avoid linking with C++ libraries on Linux.
+ */
+
+class OrphanedBlocks {
+ LifoList bins[numBlockBinLimit];
+public:
+ Block *get(Bin* bin, unsigned int size);
+ void put(Bin* bin, Block *block);
+ void reset();
+};
-class LocalBlockFields : public BlockI {
+class MemoryPool {
+ static MallocMutex memPoolListLock;
+
+ MemoryPool(); // deny
+public:
+#if USE_WINTHREAD
+ // list of all active pools is used under Windows to release
+ // all TLS data on thread termination
+ MemoryPool *next,
+ *prev;
+#endif
+ ExtMemoryPool extMemPool;
+ OrphanedBlocks orphanedBlocks;
+ BootStrapBlocks bootStrapBlocks;
+
+ bool init(intptr_t poolId, const MemPoolPolicy* memPoolPolicy);
+ void reset();
+ void destroy();
+
+ void initTLS() { new (&extMemPool.tlsPointerKey) TLSKey(); }
+ TLSData *getTLS() { return extMemPool.tlsPointerKey.getThreadMallocTLS(); }
+ void clearTLS() { extMemPool.tlsPointerKey.setThreadMallocTLS(NULL); }
+ Bin *getAllocationBin(size_t size);
+ Block *getEmptyBlock(size_t size);
+ void returnEmptyBlock(Block *block, bool poolTheBlock);
+};
+
+MallocMutex MemoryPool::memPoolListLock;
+static char defaultMemPool_space[sizeof(MemoryPool)];
+static MemoryPool *defaultMemPool = (MemoryPool *)defaultMemPool_space;
+
+// 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:
+ FreeObject *publicFreeList;
+ Block *nextPrivatizable;
+};
+
+class LocalBlockFields : public GlobalBlockFields {
protected:
- Block *next; /* This field needs to be on a 16K boundary and the first field in the block
- for LIFO lists to work. */
+ size_t __pad_local_fields[(blockHeaderAlignment -
+ sizeof(GlobalBlockFields))/sizeof(size_t)];
+
+ Block *next;
Block *previous; /* Use double linked list to speed up removal */
unsigned int objectSize;
ThreadId owner;
@@ -205,55 +313,58 @@ protected:
unsigned int allocatedCount; /* Number of objects allocated (obviously by the owning thread) */
bool isFull;
- friend void *BootStrapBlocks::allocate(size_t size);
+ friend void *BootStrapBlocks::allocate(MemoryPool *memPool, size_t size);
friend class FreeBlockPool;
friend class StartupBlock;
- friend void BlockI::initialize(void *bumpPtr);
+ friend class LifoList;
+ friend Block *MemoryPool::getEmptyBlock(size_t size);
};
class Block : public LocalBlockFields {
- size_t __pad_local_fields[(blockHeaderAlignment-sizeof(LocalBlockFields))/sizeof(size_t)];
- FreeObject *publicFreeList;
- Block *nextPrivatizable;
- size_t __pad_public_fields[(blockHeaderAlignment-2*sizeof(void*))/sizeof(size_t)];
-
+ size_t __pad_public_fields[(2*blockHeaderAlignment -
+ sizeof(LocalBlockFields))/sizeof(size_t)];
public:
- static Block *getEmpty(size_t size);
-
inline FreeObject* allocate();
inline FreeObject *allocateFromFreeList();
inline bool emptyEnoughToUse();
bool freeListNonNull() { return freeList; }
void freePublicObject(FreeObject *objectToFree);
- inline void freeOwnObject(FreeObject *objectToFree);
- void returnEmpty(bool poolTheBlock);
+ inline void freeOwnObject(MemoryPool *memPool, FreeObject *objectToFree);
+ void makeEmpty();
void privatizePublicFreeList();
void restoreBumpPtr();
void privatizeOrphaned(Bin *bin);
void shareOrphaned(const Bin *bin);
- unsigned int getSize() const { return objectSize; }
+ unsigned int getSize() const {
+ MALLOC_ASSERT(isStartupAllocObject() || objectSize<minLargeObjectSize,
+ "Invalid object size");
+ return objectSize;
+ }
const BackRefIdx *getBackRefIdx() const { return &backRefIdx; }
bool ownBlock() const { return owner.own(); }
bool isStartupAllocObject() const { return objectSize == startupAllocObjSizeMark; }
inline FreeObject *findObjectToFree(void *object) const;
- bool checkFreePrecond() const { return allocatedCount>0; }
+ bool checkFreePrecond(void *object) const {
+ return allocatedCount>0
+ && allocatedCount <= (blockSize-sizeof(Block))/objectSize
+ && (!bumpPtr || object>bumpPtr);
+ }
const BackRefIdx *getBackRef() const { return &backRefIdx; }
+ void initEmptyBlock(Bin* tlsBin, size_t size);
protected:
- static Block *getRaw(bool startup);
void cleanBlockHeader();
private:
static const float emptyEnoughRatio; /* "Reactivate" a block if this share of its objects is free. */
inline FreeObject *allocateFromBumpPtr();
- void initEmptyBlock(size_t size);
inline FreeObject *findAllocatedObject(const void *address) const;
inline bool isProperlyPlaced(const void *object) const;
friend class Bin;
friend void ::mallocThreadShutdownNotification(void* arg);
- friend BlockI *BlockI::getRawBlock(bool startup);
+ friend void MemoryPool::destroy();
};
const float Block::emptyEnoughRatio = 1.0 / 4.0;
@@ -263,21 +374,24 @@ class Bin {
Block *mailbox;
MallocMutex mailLock;
- static TLSData* createTLS();
public:
- static inline Bin* getAllocationBin(size_t size);
-
inline Block* getActiveBlock() const { return activeBlk; }
+ bool activeBlockUnused() const { return activeBlk && !activeBlk->allocatedCount; }
inline void setActiveBlock(Block *block);
inline Block* setPreviousBlockActive();
Block* getPublicFreeListBlock();
void moveBlockToBinFront(Block *block);
- void processLessUsedBlock(Block *block);
+ void processLessUsedBlock(MemoryPool *memPool, Block *block);
void outofTLSBin (Block* block);
void verifyTLSBin (size_t size) const;
void pushTLSBin(Block* block);
+ void verifyInitState() const {
+ MALLOC_ASSERT( activeBlk == 0, ASSERT_TEXT );
+ MALLOC_ASSERT( mailbox == 0, ASSERT_TEXT );
+ }
+
friend void ::mallocThreadShutdownNotification(void* arg);
friend void Block::freePublicObject (FreeObject *objectToFree);
};
@@ -329,46 +443,91 @@ const uint32_t numBlockBins = minFittingIndex+numFittingBins;
const uint32_t minLargeObjectSize = fittingSize5 + 1;
/*
- * When a block that is not completely free is returned for reuse by other threads
- * this is where the block goes.
- *
- * LifoList assumes zero initialization; so below its constructors are omitted,
- * to avoid linking with C++ libraries on Linux.
- */
-
-class OrphanedBlocks {
- LifoList bins[numBlockBinLimit];
-public:
- Block *get(Bin* bin, unsigned int size);
- void put(Bin* bin, Block *block);
-};
-
-static char globalBinSpace[sizeof(LifoList)*numBlockBinLimit];
-static OrphanedBlocks *orphanedBlocks = (OrphanedBlocks*)globalBinSpace;
-
-/*
* Per-thread pool of 16KB blocks. Idea behind it is to not share with other
* threads memory that are likely in local cache(s) of our CPU.
*/
class FreeBlockPool {
- Block *head;
- Block *tail;
- int size;
+ Block *head;
+ Block *tail;
+ int size;
+ Backend *backend;
+ bool lastAccessMiss;
void insertBlock(Block *block);
public:
static const int POOL_HIGH_MARK = 32;
static const int POOL_LOW_MARK = 8;
- Block *getBlock();
+ class ResOfGet {
+ ResOfGet();
+ public:
+ Block* block;
+ bool lastAccMiss;
+ ResOfGet(Block *b, bool lastAccMiss) : block(b), lastAccMiss(lastAccMiss) {}
+ };
+
+ // allocated in zero-initialized memory
+ FreeBlockPool(Backend *backend) : backend(backend) {}
+ ResOfGet getBlock();
void returnBlock(Block *block);
- void releaseAllBlocks();
+ bool releaseAllBlocks();
};
-struct TLSData {
+class TLSData {
+#if USE_PTHREAD
+ MemoryPool *memPool;
+#endif
+public:
Bin bin[numBlockBinLimit];
FreeBlockPool pool;
+#if USE_PTHREAD
+ TLSData(MemoryPool *memPool, Backend *backend) : memPool(memPool), pool(backend) {}
+ MemoryPool *getMemPool() const { return memPool; }
+#else
+ TLSData(MemoryPool * /*memPool*/, Backend *backend) : pool(backend) {}
+#endif
};
+TLSData *TLSKey::createTLS(MemoryPool *memPool, Backend *backend)
+{
+ MALLOC_ASSERT( sizeof(TLSData) >= sizeof(Bin) * numBlockBins + sizeof(FreeBlockPool), ASSERT_TEXT );
+ TLSData* tls = (TLSData*) memPool->bootStrapBlocks.allocate(memPool, sizeof(TLSData));
+ if ( !tls )
+ return NULL;
+ new(tls) TLSData(memPool, backend);
+ /* the block contains zeroes after bootStrapMalloc, so bins are initialized */
+#if MALLOC_DEBUG
+ for (uint32_t i = 0; i < numBlockBinLimit; i++)
+ tls->bin[i].verifyInitState();
+#endif
+ setThreadMallocTLS(tls);
+ return tls;
+}
+
+bool ExtMemoryPool::release16KBCaches()
+{
+ bool released = false;
+ TLSData *tlsData = tlsPointerKey.getThreadMallocTLS();
+
+ if (tlsData) {
+ released = tlsData->pool.releaseAllBlocks();
+
+ // active blocks can be not used, so return them to backend
+ for (int 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
+ if (!userPool())
+ removeBackRef(*(block->getBackRefIdx()));
+ backend.put16KBlock(block, /*startup=*/false);
+
+ released = true;
+ }
+ }
+ return released;
+}
+
+
#if MALLOC_CHECK_RECURSION
MallocMutex RecursiveMallocCallProtector::rmc_mutex;
pthread_t RecursiveMallocCallProtector::owner_thread;
@@ -380,27 +539,12 @@ bool RecursiveMallocCallProtector::canUsePthread;
#endif
-/*********** Code to provide thread ID and a thread-local void pointer **********/
-
-static tls_key_t TLS_pointer_key;
-
-static inline TLSData* getThreadMallocTLS() {
- TLSData *result;
- result = (TLSData *)TlsGetValue_func( TLS_pointer_key );
-// The assert below is incorrect: with lazy initialization, it fails on the first call of the function.
-// MALLOC_ASSERT( result, "Memory allocator not initialized" );
- return result;
-}
-
-static inline void setThreadMallocTLS( TLSData * newvalue ) {
- RecursiveMallocCallProtector scoped;
- TlsSetValue_func( TLS_pointer_key, newvalue );
-}
-
/*********** End code to provide thread ID and a TLS pointer **********/
static void *internalMalloc(size_t size);
-static void internalFree(void *object);
+static void internalFree(void *object);
+static void *internalPoolMalloc(rml::MemoryPool* mPool, size_t size);
+static bool internalPoolFree(rml::MemoryPool *mPool, void *object);
#if !MALLOC_DEBUG
#if __INTEL_COMPILER || _MSC_VER
@@ -415,7 +559,6 @@ static void internalFree(void *object);
#endif
static NOINLINE( void doInitialization() );
-
ALWAYSINLINE( bool isMallocInitialized() );
#undef ALWAYSINLINE
@@ -517,18 +660,8 @@ static unsigned int getObjectSize (unsigned int size)
return getIndexOrObjectSize</*indexRequest*/false>(size);
}
-/*
- * Initialization code.
- *
- */
-
-/*
- * Forward Refs
- */
-
-static BootStrapBlocks bootStrapBlocks;
-void *BootStrapBlocks::allocate(size_t size)
+void *BootStrapBlocks::allocate(MemoryPool *memPool, size_t size)
{
FreeObject *result;
@@ -542,7 +675,7 @@ void *BootStrapBlocks::allocate(size_t size)
bootStrapObjectList = bootStrapObjectList->next;
} else {
if (!bootStrapBlock) {
- bootStrapBlock = Block::getEmpty(size);
+ bootStrapBlock = memPool->getEmptyBlock(size);
if (!bootStrapBlock) return NULL;
}
result = bootStrapBlock->bumpPtr;
@@ -570,6 +703,12 @@ void BootStrapBlocks::free(void* ptr)
} // Unlock with release
}
+void BootStrapBlocks::reset()
+{
+ bootStrapBlock = bootStrapBlockUsed = NULL;
+ bootStrapObjectList = NULL;
+}
+
#if !(FREELIST_NONBLOCKING)
static MallocMutex publicFreeListLock; // lock for changes of publicFreeList
#endif
@@ -586,18 +725,188 @@ inline bool isNotForUse( void* ptr )
/********* End rough utility code **************/
+#ifdef FINE_GRAIN_LOCKS
+/* LifoList assumes zero initialization so a vector of it can be created
+ * by just allocating some space with no call to constructor.
+ * On Linux, it seems to be necessary to avoid linking with C++ libraries.
+ *
+ * By usage convention there is no race on the initialization. */
+LifoList::LifoList( ) : top(NULL)
+{
+ // MallocMutex assumes zero initialization
+ memset(&lock, 0, sizeof(MallocMutex));
+}
+
+void LifoList::push(Block *block)
+{
+ MallocMutex::scoped_lock scoped_cs(lock);
+ block->next = top;
+ top = block;
+}
+
+Block *LifoList::pop()
+{
+ Block *block=NULL;
+ if (!top) goto done;
+ {
+ MallocMutex::scoped_lock scoped_cs(lock);
+ if (!top) goto done;
+ block = top;
+ top = block->next;
+ }
+done:
+ return block;
+}
+
+#endif /* FINE_GRAIN_LOCKS */
+
/********* 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* tls = extMemPool.tlsPointerKey.getThreadMallocTLS();
+ if( !tls )
+ tls = extMemPool.tlsPointerKey.createTLS(this, &extMemPool.backend);
+ MALLOC_ASSERT( tls, ASSERT_TEXT );
+ return tls->bin + getIndex(size);
+}
+
+/* Return an empty uninitialized block in a non-blocking fashion. */
+Block *MemoryPool::getEmptyBlock(size_t size)
+{
+ FreeBlockPool::ResOfGet resOfGet(NULL, false);
+ Block *result = NULL, *b;
+ TLSData* tls = extMemPool.tlsPointerKey.getThreadMallocTLS();
+
+ if (tls)
+ resOfGet = tls->pool.getBlock();
+ if (resOfGet.block) {
+ result = resOfGet.block;
+ } else {
+ // if previous access missed pool, allocate 2 blocks in advance
+ static const int ALLOC_ON_MISS = 2;
+ int i, num = resOfGet.lastAccMiss? ALLOC_ON_MISS : 1;
+ BackRefIdx backRefIdx[ALLOC_ON_MISS];
+
+ if ( !(result = static_cast<Block*>(
+ extMemPool.backend.get16KBlock(num, /*startup=*/false))) )
+ return NULL;
+ if (!extMemPool.userPool())
+ for (i=0; i<num; i++) {
+ backRefIdx[i] = BackRefIdx::newBackRef(/*largeObj=*/false);
+ if (backRefIdx[i].isInvalid()) {
+ // roll back resource allocation
+ for (int j=0; j<i; j++)
+ removeBackRef(backRefIdx[j]);
+ Block *b;
+ for (b=result, i=0; i<num;
+ b=(Block*)((uintptr_t)b+blockSize), i++)
+ extMemPool.backend.put16KBlock(b, /*startup=*/false);
+ 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
+ if (extMemPool.userPool()) {
+ new (&b->backRefIdx) BackRefIdx();
+ } else {
+ setBackRef(backRefIdx[i], b);
+ b->backRefIdx = backRefIdx[i];
+ }
+ // all but first one go to per-thread pool
+ if (i > 0) {
+ MALLOC_ASSERT(tls, ASSERT_TEXT);
+ tls->pool.returnBlock(b);
+ }
+ }
+ }
+ if (result) {
+ result->initEmptyBlock(tls? tls->bin : NULL, size);
+ STAT_increment(result->owner, getIndex(result->objectSize), allocBlockNew);
+ }
+ return result;
+}
+
+void MemoryPool::returnEmptyBlock(Block *block, bool poolTheBlock)
+{
+ block->makeEmpty();
+ if (poolTheBlock) {
+ extMemPool.tlsPointerKey.getThreadMallocTLS()->pool.returnBlock(block);
+ }
+ else {
+ // 16KB blocks in user's pools not have valid backRefIdx
+ if (!extMemPool.userPool())
+ removeBackRef(*(block->getBackRefIdx()));
+ extMemPool.backend.put16KBlock(block, /*startup=*/false);
+ }
+}
+
+bool MemoryPool::init(intptr_t poolId, const MemPoolPolicy* memPoolPolicy)
+{
+ initTLS();
+ extMemPool.poolId = poolId;
+ extMemPool.rawAlloc = memPoolPolicy->pAlloc;
+ extMemPool.rawFree = memPoolPolicy->pFree;
+ extMemPool.granularity = memPoolPolicy->granularity;
+ if (!extMemPool.backend.bootstrap(&extMemPool)) return false;
+
+#if USE_WINTHREAD
+ {
+ MallocMutex::scoped_lock lock(memPoolListLock);
+ next = defaultMemPool->next;
+ defaultMemPool->next = this;
+ prev = defaultMemPool;
+ if (next)
+ next->prev = this;
+ }
+#endif
+ return true;
+}
+
+void MemoryPool::reset()
+{
+ for (LargeMemoryBlock *lmb = extMemPool.loHead; lmb; ) {
+ removeBackRef(lmb->backRefIdx);
+ lmb = lmb->gNext;
+ }
+ extMemPool.loHead = NULL;
+ bootStrapBlocks.reset();
+ orphanedBlocks.reset();
+ extMemPool.reset();
+
+ initTLS();
+}
+
+void MemoryPool::destroy()
+{
+#if USE_WINTHREAD
+ {
+ MallocMutex::scoped_lock lock(memPoolListLock);
+ // remove itself from global pool list
+ if (prev)
+ prev->next = next;
+ if (next)
+ next->prev = prev;
+ }
+#endif
+ // 16KB blocks do not have backreferencies, only large objects do
+ for (LargeMemoryBlock *lmb = extMemPool.loHead; lmb; ) {
+ removeBackRef(lmb->backRefIdx);
+ lmb = lmb->gNext;
+ }
+ extMemPool.destroy();
+}
+
void Bin::verifyTLSBin (size_t size) const
{
#if MALLOC_DEBUG
/* The debug version verifies the TLSBin as needed */
- Bin* tlsBin = getThreadMallocTLS()->bin;
- uint32_t index = getIndex(size);
uint32_t objSize = getObjectSize(size);
- MALLOC_ASSERT( this == tlsBin+index, ASSERT_TEXT );
-
if (activeBlk) {
MALLOC_ASSERT( activeBlk->owner.own(), ASSERT_TEXT );
MALLOC_ASSERT( activeBlk->objectSize == objSize, ASSERT_TEXT );
@@ -686,34 +995,6 @@ void Bin::outofTLSBin(Block* block)
verifyTLSBin(size);
}
-TLSData* Bin::createTLS()
-{
- MALLOC_ASSERT( sizeof(TLSData) >= sizeof(Bin) * numBlockBins + sizeof(FreeBlockPool), ASSERT_TEXT );
- TLSData* tls = (TLSData*) bootStrapBlocks.allocate(sizeof(TLSData));
- if ( !tls ) return NULL;
- /* the block contains zeroes after bootStrapMalloc, so bins are initialized */
-#if MALLOC_DEBUG
- for (uint32_t i = 0; i < numBlockBinLimit; i++) {
- MALLOC_ASSERT( tls->bin[i].activeBlk == 0, ASSERT_TEXT );
- MALLOC_ASSERT( tls->bin[i].mailbox == 0, ASSERT_TEXT );
- }
-#endif
- setThreadMallocTLS(tls);
- return tls;
-}
-
-/*
- * Return the bin for the given size. If the TLS bin structure is absent, create it.
- */
-Bin* Bin::getAllocationBin(size_t size)
-{
- TLSData* tls = getThreadMallocTLS();
- if( !tls )
- tls = createTLS();
- MALLOC_ASSERT( tls, ASSERT_TEXT );
- return tls->bin + getIndex(size);
-}
-
Block* Bin::getPublicFreeListBlock()
{
Block* block;
@@ -739,10 +1020,6 @@ Block* Bin::getPublicFreeListBlock()
return block;
}
-BlockI *BlockI::getRawBlock(bool startup) { return Block::getRaw(startup); }
-
-void BlockI::initialize(void *ptr) { ((LocalBlockFields*)this)->bumpPtr = (FreeObject*)ptr; }
-
bool Block::emptyEnoughToUse()
{
const float threshold = (blockSize - sizeof(Block)) * (1-emptyEnoughRatio);
@@ -777,24 +1054,25 @@ void Block::restoreBumpPtr()
isFull = 0;
}
-void Block::freeOwnObject(FreeObject *objectToFree)
+void Block::freeOwnObject(MemoryPool *memPool, FreeObject *objectToFree)
{
objectToFree->next = freeList;
freeList = objectToFree;
allocatedCount--;
MALLOC_ASSERT( allocatedCount < (blockSize-sizeof(Block))/objectSize, ASSERT_TEXT );
#if COLLECT_STATISTICS
- if (getActiveBlock(getAllocationBin(block->objectSize)) != block)
+ 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())
- Bin::getAllocationBin(objectSize)->moveBlockToBinFront(this);
+ memPool->getAllocationBin(objectSize)->moveBlockToBinFront(this);
} else {
if (allocatedCount==0 && publicFreeList==NULL)
- Bin::getAllocationBin(objectSize)->processLessUsedBlock(this);
+ memPool->getAllocationBin(objectSize)->
+ processLessUsedBlock(memPool, this);
}
}
@@ -961,13 +1239,12 @@ void Block::cleanBlockHeader()
publicFreeList = NULL;
}
-void Block::initEmptyBlock(size_t size)
+void Block::initEmptyBlock(Bin* tlsBin, size_t size)
{
// Having getIndex and getObjectSize called next to each other
// allows better compiler optimization as they basically share the code.
unsigned int index = getIndex(size);
unsigned int objSz = getObjectSize(size);
- Bin* tlsBin = getThreadMallocTLS()->bin;
cleanBlockHeader();
objectSize = objSz;
@@ -987,7 +1264,7 @@ Block *OrphanedBlocks::get(Bin* bin, unsigned int size)
Block *result;
MALLOC_ASSERT( bin, ASSERT_TEXT );
unsigned int index = getIndex(size);
- result = (Block *) bins[index].pop();
+ result = bins[index].pop();
if (result) {
MALLOC_ITT_SYNC_ACQUIRED(bins+index);
result->privatizeOrphaned(bin);
@@ -1001,7 +1278,13 @@ void OrphanedBlocks::put(Bin* bin, Block *block)
unsigned int index = getIndex(block->getSize());
block->shareOrphaned(bin);
MALLOC_ITT_SYNC_RELEASING(bins+index);
- bins[index].push((void **)block);
+ bins[index].push(block);
+}
+
+void OrphanedBlocks::reset()
+{
+ for (uint32_t i=0; i<numBlockBinLimit; i++)
+ new (bins+i) LifoList();
}
void FreeBlockPool::insertBlock(Block *block)
@@ -1013,16 +1296,20 @@ void FreeBlockPool::insertBlock(Block *block)
tail = block;
}
-Block *FreeBlockPool::getBlock()
+FreeBlockPool::ResOfGet FreeBlockPool::getBlock()
{
- Block *result = head;
+ Block *b = head;
+
if (head) {
size--;
head = head->next;
if (!head)
tail = NULL;
- }
- return result;
+ lastAccessMiss = false;
+ } else
+ lastAccessMiss = true;
+
+ return ResOfGet(b, lastAccessMiss);
}
void FreeBlockPool::returnBlock(Block *block)
@@ -1031,81 +1318,48 @@ void FreeBlockPool::returnBlock(Block *block)
if (size == POOL_HIGH_MARK) {
// release cold blocks and add hot one
Block *headToFree = head,
- *tailToFree = tail;
+ *helper;
for (int i=0; i<POOL_LOW_MARK-2; i++)
headToFree = headToFree->next;
tail = headToFree;
headToFree = headToFree->next;
tail->next = NULL;
size = POOL_LOW_MARK-1;
- for (Block *currBl = headToFree; currBl; currBl = currBl->next)
- removeBackRef(currBl->backRefIdx);
- freeBlocks.putList(headToFree, tailToFree);
+ // 16KB 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, /*startup=*/false);
+ }
}
insertBlock(block);
}
-void FreeBlockPool::releaseAllBlocks()
-{
- if (head) {
- for (Block *currBl = head; currBl; currBl = currBl->next)
- removeBackRef(currBl->backRefIdx);
- freeBlocks.putList(head, tail);
- }
-}
-
-/* Return an empty uninitialized block in a non-blocking fashion. */
-Block *Block::getRaw(bool startup)
+bool FreeBlockPool::releaseAllBlocks()
{
- Block *result = NULL;
- Block *bigBlock;
-
- if (! (bigBlock = static_cast<Block*>(freeBlocks.get(startup)))) return NULL;
+ Block *helper;
+ bool nonEmpty = size;
- // check alignment
- MALLOC_ASSERT( isAligned( bigBlock, blockSize ), ASSERT_TEXT );
- MALLOC_ASSERT( isAligned( bigBlock->bumpPtr, blockSize ), ASSERT_TEXT );
- // block should be at least as big as blockSize; otherwise the previous block can be damaged.
- MALLOC_ASSERT( (uintptr_t)bigBlock->bumpPtr >= (uintptr_t)bigBlock + blockSize, ASSERT_TEXT );
- bigBlock->bumpPtr = (FreeObject *)((uintptr_t)bigBlock->bumpPtr - blockSize);
- result = (Block *)bigBlock->bumpPtr;
- if ( result!=bigBlock ) {
- TRACEF(( "[ScalableMalloc trace] Pushing partial rest of block back on.\n" ));
- freeBlocks.put(bigBlock, startup);
+ for (Block *currBl = head; currBl; currBl=helper) {
+ helper = currBl->next;
+ // 16KB blocks in user's pools not have valid backRefIdx
+ if (!backend->inUserPool())
+ removeBackRef(currBl->backRefIdx);
+ backend->put16KBlock(currBl, /*startup=*/false);
}
+ head = tail = NULL;
+ size = 0;
- return result;
-}
-
-/* Return an empty uninitialized block in a non-blocking fashion. */
-Block *Block::getEmpty(size_t size)
-{
- Block *result = NULL;
- TLSData* tls = getThreadMallocTLS();
- if (tls)
- result = tls->pool.getBlock();
- if (!result) {
- BackRefIdx backRefIdx = BackRefIdx::newBackRef(/*largeObj=*/false);
- if (backRefIdx.isInvalid() || !(result = getRaw(/*startup=*/false)))
- return NULL;
- setBackRef(backRefIdx, result);
- result->backRefIdx = backRefIdx;
- }
- if (result) {
- result->initEmptyBlock(size);
- STAT_increment(result->owner, getIndex(result->objectSize), allocBlockNew);
- }
- return result;
+ return nonEmpty;
}
/* We have a block give it back to the malloc block manager */
-void Block::returnEmpty(bool poolTheBlock)
+void Block::makeEmpty()
{
// it is caller's responsibility to ensure no data is lost before calling this
MALLOC_ASSERT( allocatedCount==0, ASSERT_TEXT );
MALLOC_ASSERT( publicFreeList==NULL, ASSERT_TEXT );
- MALLOC_ASSERT( !poolTheBlock || next == NULL, ASSERT_TEXT );
- MALLOC_ASSERT( !poolTheBlock || previous == NULL, ASSERT_TEXT );
STAT_increment(owner, getIndex(objectSize), freeBlockBack);
cleanBlockHeader();
@@ -1116,14 +1370,6 @@ void Block::returnEmpty(bool poolTheBlock)
owner.invalid();
// for an empty block, bump pointer should point right after the end of the block
bumpPtr = (FreeObject *)((uintptr_t)this + blockSize);
- if (poolTheBlock) {
- MALLOC_ASSERT(getThreadMallocTLS(), "Is TLS still not initialized?");
- getThreadMallocTLS()->pool.returnBlock(this);
- }
- else {
- removeBackRef(backRefIdx);
- freeBlocks.put(this, /*startup=*/false);
- }
}
inline void Bin::setActiveBlock (Block *block)
@@ -1171,6 +1417,7 @@ FreeObject *Block::findObjectToFree(void *object) const
}
#if MALLOC_CHECK_RECURSION
+// TODO: Use deducated heap for this
/*
* It's a special kind of allocation that can be used when malloc is
@@ -1201,7 +1448,8 @@ StartupBlock *StartupBlock::getBlock()
BackRefIdx backRefIdx = BackRefIdx::newBackRef(/*largeObj=*/false);
if (backRefIdx.isInvalid()) return NULL;
- StartupBlock *block = (StartupBlock *)getRaw(/*startup=*/true);
+ StartupBlock *block = static_cast<StartupBlock*>(
+ defaultMemPool->extMemPool.backend.get16KBlock(1, /*startup=*/true));
if (!block) return NULL;
block->cleanBlockHeader();
@@ -1250,7 +1498,7 @@ FreeObject *StartupBlock::allocate(size_t size)
(FreeObject *)((uintptr_t)firstStartupBlock->bumpPtr + reqSize);
}
if (newBlock && newBlockUnused)
- newBlock->returnEmpty(/*poolTheBlock=*/false);
+ defaultMemPool->returnEmptyBlock(newBlock, /*poolTheBlock=*/false);
// keep object size at the negative offset
*((size_t*)result) = size;
@@ -1287,7 +1535,7 @@ void StartupBlock::free(void *ptr)
}
if (blockToRelease) {
blockToRelease->previous = blockToRelease->next = NULL;
- blockToRelease->returnEmpty(/*poolTheBlock=*/false);
+ defaultMemPool->returnEmptyBlock(blockToRelease, /*poolTheBlock=*/false);
}
}
@@ -1328,22 +1576,17 @@ static void initMemoryManager()
MALLOC_ASSERT( 2*blockHeaderAlignment == sizeof(Block), ASSERT_TEXT );
MALLOC_ASSERT( sizeof(FreeObject) == sizeof(void*), ASSERT_TEXT );
+ defaultMemPool->extMemPool.rawAlloc = NULL;
+ defaultMemPool->extMemPool.rawFree = NULL;
+ defaultMemPool->extMemPool.granularity = 4*1024; // i.e., page size
// TODO: add error handling, and on error do something better than exit(1)
- if (!initBackRefMaster() || !freeBlocks.bootstrap(NULL, NULL, 0)) {
+ if (!defaultMemPool->extMemPool.backend.bootstrap(&defaultMemPool->extMemPool)
+ || !initBackRefMaster(&defaultMemPool->extMemPool.backend)) {
fprintf (stderr, "The memory manager cannot access sufficient memory to initialize; exiting \n");
exit(1);
}
-// Create keys for thread-local storage and for thread id
-#if USE_WINTHREAD
- TLS_pointer_key = TlsAlloc();
-#else
- int status1 = pthread_key_create( &TLS_pointer_key, mallocThreadShutdownNotification );
- if ( status1 ) {
- fprintf (stderr, "The memory manager cannot create tls key during initialization; exiting \n");
- exit(1);
- }
-#endif /* USE_WINTHREAD */
- ThreadId::init();
+ defaultMemPool->initTLS();
+ ThreadId::init(); // Create keys for thread id
#if COLLECT_STATISTICS
initStatisticsCollection();
#endif
@@ -1444,12 +1687,12 @@ void Bin::moveBlockToBinFront(Block *block)
pushTLSBin(block);
}
-void Bin::processLessUsedBlock(Block *block)
+void Bin::processLessUsedBlock(MemoryPool *memPool, Block *block)
{
if (block != activeBlk) {
/* We are not actively using this block; return it to the general block pool */
outofTLSBin(block);
- block->returnEmpty(/*poolTheBlock=*/true);
+ memPool->returnEmptyBlock(block, /*poolTheBlock=*/true);
} else {
/* all objects are free - let's restore the bump pointer */
block->restoreBumpPtr();
@@ -1468,13 +1711,15 @@ void Bin::processLessUsedBlock(Block *block)
* alignment plus minLargeObjectSize can't lead to wrapping.
* 4. otherwise, aligned large object is allocated.
*/
-static void *allocateAligned(size_t size, size_t alignment)
+static void *allocateAligned(MemoryPool *memPool, size_t size, size_t alignment)
{
MALLOC_ASSERT( isPowerOfTwo(alignment), ASSERT_TEXT );
+ if (!isMallocInitialized()) doInitialization();
+
void *result;
if (size<=maxSegregatedObjectSize && alignment<=maxSegregatedObjectSize)
- result = internalMalloc(alignUp(size? size: sizeof(size_t), alignment));
+ result = internalPoolMalloc((rml::MemoryPool*)memPool, alignUp(size? size: sizeof(size_t), alignment));
else if (size<minLargeObjectSize) {
if (alignment<=fittingAlignment)
result = internalMalloc(size);
@@ -1490,15 +1735,17 @@ static void *allocateAligned(size_t size, size_t alignment)
if (!isMallocInitialized())
doInitialization();
// take into account only alignment that are higher then natural
- result = mallocLargeObject(size, largeObjectAlignment>alignment?
- largeObjectAlignment: alignment);
+ result = mallocLargeObject(&memPool->extMemPool, size,
+ largeObjectAlignment>alignment?
+ largeObjectAlignment: alignment);
}
MALLOC_ASSERT( isAligned(result, alignment), ASSERT_TEXT );
return result;
}
-static void *reallocAligned(void *ptr, size_t size, size_t alignment = 0)
+static void *reallocAligned(MemoryPool *memPool, void *ptr,
+ size_t size, size_t alignment = 0)
{
void *result;
size_t copySize;
@@ -1511,7 +1758,8 @@ static void *reallocAligned(void *ptr, size_t size, size_t alignment = 0)
return ptr;
} else {
copySize = lmb->objectSize;
- result = alignment ? allocateAligned(size, alignment) : internalMalloc(size);
+ result = alignment ? allocateAligned(memPool, size, alignment) :
+ internalPoolMalloc((rml::MemoryPool*)memPool, size);
}
} else {
Block* block = (Block *)alignDown(ptr, blockSize);
@@ -1519,12 +1767,13 @@ static void *reallocAligned(void *ptr, size_t size, size_t alignment = 0)
if (size <= copySize && (0==alignment || isAligned(ptr, alignment))) {
return ptr;
} else {
- result = alignment ? allocateAligned(size, alignment) : internalMalloc(size);
+ result = alignment ? allocateAligned(memPool, size, alignment) :
+ internalPoolMalloc((rml::MemoryPool*)memPool, size);
}
}
if (result) {
memcpy(result, ptr, copySize<size? copySize: size);
- internalFree(ptr);
+ internalPoolFree((rml::MemoryPool*)memPool, ptr);
}
return result;
}
@@ -1591,11 +1840,12 @@ static inline bool isRecognized (void* ptr)
return isLargeObject(ptr) || isSmallObject(ptr);
}
-static inline void freeSmallObject (void *object)
+static inline void freeSmallObject(MemoryPool *memPool, void *object)
{
/* mask low bits to get the block */
Block *block = (Block *)alignDown(object, blockSize);
- MALLOC_ASSERT( block->checkFreePrecond(), ASSERT_TEXT );
+ MALLOC_ASSERT( block->checkFreePrecond(object),
+ "Possible double free or heap corruption." );
#if MALLOC_CHECK_RECURSION
if (block->isStartupAllocObject()) {
@@ -1606,50 +1856,36 @@ static inline void freeSmallObject (void *object)
FreeObject *objectToFree = block->findObjectToFree(object);
if (block->ownBlock())
- block->freeOwnObject(objectToFree);
+ block->freeOwnObject(memPool, objectToFree);
else /* Slower path to add to the shared list, the allocatedCount is updated by the owner thread in malloc. */
block->freePublicObject(objectToFree);
}
-static void *internalMalloc(size_t size)
+static void *internalPoolMalloc(rml::MemoryPool* mPool, size_t size)
{
Bin* bin;
Block * mallocBlock;
FreeObject *result = NULL;
+ rml::internal::MemoryPool* memPool = (rml::internal::MemoryPool*)mPool;
- if (!size) size = sizeof(size_t);
-
-#if MALLOC_CHECK_RECURSION
- if (RecursiveMallocCallProtector::sameThreadActive()) {
- result = size<minLargeObjectSize? StartupBlock::allocate(size) :
- (FreeObject*)mallocLargeObject(size, blockSize, /*startupAlloc=*/ true);
- if (!result) errno = ENOMEM;
- return result;
- }
-#endif
+ if (!mPool) return NULL;
- if (!isMallocInitialized())
- doInitialization();
+ if (!size) size = sizeof(size_t);
/*
* Use Large Object Allocation
*/
- if (size >= minLargeObjectSize) {
- result = (FreeObject*)mallocLargeObject(size, largeObjectAlignment);
- if (!result) errno = ENOMEM;
- return result;
- }
+ if (size >= minLargeObjectSize)
+ return mallocLargeObject(&memPool->extMemPool, 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 = Bin::getAllocationBin(size);
- if ( !bin ) {
- errno = ENOMEM;
+ bin = memPool->getAllocationBin(size);
+ if ( !bin )
return NULL;
- }
/* Get the block of you want to try to allocate in. */
mallocBlock = bin->getActiveBlock();
@@ -1677,26 +1913,26 @@ static void *internalMalloc(size_t size)
}
/* Else something strange happened, need to retry from the beginning; */
TRACEF(( "[ScalableMalloc trace] Something is wrong: no objects in public free list; reentering.\n" ));
- return internalMalloc(size);
+ return internalPoolMalloc(mPool, size);
}
/*
* no suitable own blocks, try to get a partial block that some other thread has discarded.
*/
- mallocBlock = orphanedBlocks->get(bin, size);
+ mallocBlock = memPool->orphanedBlocks.get(bin, size);
while (mallocBlock) {
bin->pushTLSBin(mallocBlock);
bin->setActiveBlock(mallocBlock); // TODO: move under the below condition?
if( (result = mallocBlock->allocate()) ) {
return result;
}
- mallocBlock = orphanedBlocks->get(bin, size);
+ mallocBlock = memPool->orphanedBlocks.get(bin, size);
}
/*
* else try to get a new empty block
*/
- mallocBlock = Block::getEmpty(size);
+ mallocBlock = memPool->getEmptyBlock(size);
if (mallocBlock) {
bin->pushTLSBin(mallocBlock);
bin->setActiveBlock(mallocBlock);
@@ -1705,26 +1941,48 @@ static void *internalMalloc(size_t size)
}
/* Else something strange happened, need to retry from the beginning; */
TRACEF(( "[ScalableMalloc trace] Something is wrong: no objects in empty block; reentering.\n" ));
- return internalMalloc(size);
+ return internalPoolMalloc(mPool, size);
}
/*
* else nothing works so return NULL
*/
TRACEF(( "[ScalableMalloc trace] No memory found, returning NULL.\n" ));
- errno = ENOMEM;
return NULL;
}
-static void internalFree (void *object) {
- if (!object)
- return;
-
- MALLOC_ASSERT(isRecognized(object), "Invalid pointer in scalable_free detected.");
+static bool internalPoolFree(rml::MemoryPool *mPool, void *object)
+{
+ if (!mPool || !object) return false;
+ rml::internal::MemoryPool* memPool = (rml::internal::MemoryPool*)mPool;
+ MALLOC_ASSERT(memPool->extMemPool.userPool() || isRecognized(object),
+ "Invalid pointer in pool_free detected.");
if (isLargeObject(object))
- freeLargeObject(object);
+ freeLargeObject(&memPool->extMemPool, object);
else
- freeSmallObject(object);
+ freeSmallObject(memPool, object);
+ return true;
+}
+
+static void *internalMalloc(size_t size)
+{
+ if (!size) size = sizeof(size_t);
+
+#if MALLOC_CHECK_RECURSION
+ if (RecursiveMallocCallProtector::sameThreadActive())
+ return size<minLargeObjectSize? StartupBlock::allocate(size) :
+ (FreeObject*)mallocLargeObject(&defaultMemPool->extMemPool, size, blockSize, /*startupAlloc=*/ true);
+#endif
+
+ if (!isMallocInitialized())
+ doInitialization();
+
+ return internalPoolMalloc((rml::MemoryPool*)defaultMemPool, size);
+}
+
+static void internalFree(void *object)
+{
+ internalPoolFree((rml::MemoryPool*)defaultMemPool, object);
}
static size_t internalMsize(void* ptr)
@@ -1752,6 +2010,65 @@ static size_t internalMsize(void* ptr)
}
} // namespace internal
+
+using namespace rml::internal;
+
+rml::MemoryPool *pool_create(intptr_t pool_id, const MemPoolPolicy* memPoolPolicy)
+{
+ if (!isMallocInitialized())
+ doInitialization();
+ if (!memPoolPolicy->pAlloc) return NULL;
+
+ rml::internal::MemoryPool *memPool =
+ (rml::internal::MemoryPool*)internalMalloc((sizeof(rml::internal::MemoryPool)));
+ if (!memPool) return NULL;
+ memset(memPool, 0, sizeof(rml::internal::MemoryPool));
+ if (!memPool->init(pool_id, memPoolPolicy)) {
+ internalFree(memPool);
+ return NULL;
+ }
+
+ return (rml::MemoryPool*)memPool;
+}
+
+bool pool_destroy(rml::MemoryPool* memPool)
+{
+ if (!memPool) return false;
+ ((rml::internal::MemoryPool*)memPool)->destroy();
+ internalFree(memPool);
+
+ return true;
+}
+
+bool pool_reset(rml::MemoryPool* memPool)
+{
+ if (!memPool) return false;
+
+ ((rml::internal::MemoryPool*)memPool)->reset();
+ return true;
+}
+
+void *pool_malloc(rml::MemoryPool* mPool, size_t size)
+{
+ return internalPoolMalloc(mPool, size);
+}
+
+void *pool_realloc(rml::MemoryPool* mPool, void *object, size_t size)
+{
+ if (!object)
+ return internalPoolMalloc(mPool, size);
+ if (!size) {
+ internalPoolFree(mPool, object);
+ return NULL;
+ }
+ return reallocAligned((rml::internal::MemoryPool*)mPool, object, size, 0);
+}
+
+bool pool_free(rml::MemoryPool *mPool, void *object)
+{
+ return internalPoolFree(mPool, object);
+}
+
} // namespace rml
using namespace rml::internal;
@@ -1774,7 +2091,6 @@ static unsigned int threadGoingDownCount = 0;
*/
extern "C" void mallocThreadShutdownNotification(void* arg)
{
- TLSData *tls;
Block *threadBlock;
Block *threadlessBlock;
unsigned int index;
@@ -1784,45 +2100,53 @@ extern "C" void mallocThreadShutdownNotification(void* arg)
TRACEF(( "[ScalableMalloc trace] Thread id %d blocks return start %d\n",
getThreadId(), threadGoingDownCount++ ));
-#ifdef USE_WINTHREAD
- tls = getThreadMallocTLS();
+#if USE_WINTHREAD
+ // The routine is called once, need to walk through all pools on Windows
+ for (MemoryPool *memPool = defaultMemPool; memPool; memPool = memPool->next) {
+ TLSData *tls = memPool->getTLS();
#else
- tls = (TLSData*)arg;
+ // The routine is called for each memPool, just need to get its pointer from TLSData.
+ TLSData *tls = (TLSData*)arg;
+ MemoryPool *memPool = tls->getMemPool();
#endif
- if (tls) {
- Bin *tlsBin = tls->bin;
- tls->pool.releaseAllBlocks();
-
- for (index = 0; index < numBlockBins; index++) {
- if (tlsBin[index].activeBlk==NULL)
- continue;
- threadlessBlock = tlsBin[index].activeBlk->previous;
- while (threadlessBlock) {
- threadBlock = threadlessBlock->previous;
- if (threadlessBlock->allocatedCount==0 && threadlessBlock->publicFreeList==NULL) {
- /* we destroy the thread, so not use its block pool */
- threadlessBlock->returnEmpty(/*poolTheBlock=*/false);
- } else {
- orphanedBlocks->put(tlsBin+index, threadlessBlock);
+ if (tls) {
+ Bin *tlsBin = tls->bin;
+ tls->pool.releaseAllBlocks();
+
+ for (index = 0; index < numBlockBins; index++) {
+ if (tlsBin[index].activeBlk==NULL)
+ continue;
+ threadlessBlock = tlsBin[index].activeBlk->previous;
+ while (threadlessBlock) {
+ threadBlock = threadlessBlock->previous;
+ if (threadlessBlock->allocatedCount==0 && threadlessBlock->publicFreeList==NULL) {
+ /* we destroy the thread, so not use its block pool */
+ memPool->returnEmptyBlock(threadlessBlock, /*poolTheBlock=*/false);
+ } else {
+ memPool->orphanedBlocks.put(tlsBin+index, threadlessBlock);
+ }
+ threadlessBlock = threadBlock;
}
- threadlessBlock = threadBlock;
- }
- threadlessBlock = tlsBin[index].activeBlk;
- while (threadlessBlock) {
- threadBlock = threadlessBlock->next;
- if (threadlessBlock->allocatedCount==0 && threadlessBlock->publicFreeList==NULL) {
- /* we destroy the thread, so not use its block pool */
- threadlessBlock->returnEmpty(/*poolTheBlock=*/false);
- } else {
- orphanedBlocks->put(tlsBin+index, threadlessBlock);
+ threadlessBlock = tlsBin[index].activeBlk;
+ while (threadlessBlock) {
+ threadBlock = threadlessBlock->next;
+ if (threadlessBlock->allocatedCount==0 && threadlessBlock->publicFreeList==NULL) {
+ /* we destroy the thread, so not use its block pool */
+ memPool->returnEmptyBlock(threadlessBlock, /*poolTheBlock=*/false);
+ } else {
+ memPool->orphanedBlocks.put(tlsBin+index, threadlessBlock);
+ }
+ threadlessBlock = threadBlock;
}
- threadlessBlock = threadBlock;
+ tlsBin[index].activeBlk = 0;
}
- tlsBin[index].activeBlk = 0;
+ memPool->bootStrapBlocks.free(tls);
+ memPool->clearTLS();
}
- bootStrapBlocks.free(tls);
- setThreadMallocTLS(NULL);
- }
+
+#if USE_WINTHREAD
+ } // for memPool (Windows only)
+#endif
TRACEF(( "[ScalableMalloc trace] Thread id %d blocks return end\n", getThreadId() ));
}
@@ -1838,11 +2162,12 @@ extern "C" void mallocProcessShutdownNotification(void)
extern "C" void * scalable_malloc(size_t size)
{
- return internalMalloc(size);
+ void *ptr = internalMalloc(size);
+ if (!ptr) errno = ENOMEM;
+ return ptr;
}
-extern "C" void scalable_free (void *object)
-{
+extern "C" void scalable_free (void *object) {
internalFree(object);
}
@@ -1858,9 +2183,9 @@ 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))
- freeLargeObject(object);
+ freeLargeObject(&defaultMemPool->extMemPool, object);
else if (isSmallObject(object))
- freeSmallObject(object);
+ freeSmallObject(defaultMemPool, object);
else if (original_free)
original_free(object);
}
@@ -1879,15 +2204,16 @@ extern "C" void safer_scalable_free (void *object, void (*original_free)(void*))
*/
extern "C" void* scalable_realloc(void* ptr, size_t size)
{
- /* corner cases left out of reallocAligned to not deal with errno there */
- if (!ptr) {
- return internalMalloc(size);
- }
- if (!size) {
+ void *tmp;
+
+ if (!ptr)
+ tmp = internalMalloc(size);
+ else if (!size) {
internalFree(ptr);
return NULL;
- }
- void* tmp = reallocAligned(ptr, size, 0);
+ } else
+ tmp = reallocAligned(defaultMemPool, ptr, size, 0);
+
if (!tmp) errno = ENOMEM;
return tmp;
}
@@ -1898,42 +2224,43 @@ extern "C" void* scalable_realloc(void* ptr, size_t size)
*/
extern "C" void* safer_scalable_realloc (void* ptr, size_t sz, void* original_realloc)
{
+ void *tmp;
+
if (!ptr) {
- return internalMalloc(sz);
- }
- if (isRecognized(ptr)) {
+ tmp = internalMalloc(sz);
+ } else if (isRecognized(ptr)) {
if (!sz) {
internalFree(ptr);
return NULL;
+ } else {
+ tmp = reallocAligned(defaultMemPool, ptr, sz, 0);
}
- void* tmp = reallocAligned(ptr, sz, 0);
- if (!tmp) errno = ENOMEM;
- return tmp;
}
#if USE_WINTHREAD
else if (original_realloc && sz) {
- orig_ptrs *original_ptrs = static_cast<orig_ptrs*>(original_realloc);
- if ( original_ptrs->orig_msize ){
- size_t oldSize = original_ptrs->orig_msize(ptr);
- void *newBuf = internalMalloc(sz);
- if (newBuf) {
- memcpy(newBuf, ptr, sz<oldSize? sz : oldSize);
- if ( original_ptrs->orig_free ){
- original_ptrs->orig_free( ptr );
- }
+ orig_ptrs *original_ptrs = static_cast<orig_ptrs*>(original_realloc);
+ if ( original_ptrs->orig_msize ){
+ size_t oldSize = original_ptrs->orig_msize(ptr);
+ tmp = internalMalloc(sz);
+ if (tmp) {
+ memcpy(tmp, ptr, sz<oldSize? sz : oldSize);
+ if ( original_ptrs->orig_free ){
+ original_ptrs->orig_free( ptr );
}
- return newBuf;
- }
+ }
+ } else
+ tmp = NULL;
}
#else
else if (original_realloc) {
typedef void* (*realloc_ptr_t)(void*,size_t);
realloc_ptr_t original_realloc_ptr;
(void *&)original_realloc_ptr = original_realloc;
- return original_realloc_ptr(ptr,sz);
+ tmp = original_realloc_ptr(ptr,sz);
}
#endif
- return NULL;
+ if (!tmp) errno = ENOMEM;
+ return tmp;
}
/********* End code for scalable_realloc ***********/
@@ -1954,6 +2281,8 @@ extern "C" void * scalable_calloc(size_t nobj, size_t size)
void* result = internalMalloc(arraySize);
if (result)
memset(result, 0, arraySize);
+ else
+ errno = ENOMEM;
return result;
}
@@ -1965,7 +2294,7 @@ extern "C" int scalable_posix_memalign(void **memptr, size_t alignment, size_t s
{
if ( !isPowerOfTwoMultiple(alignment, sizeof(void*)) )
return EINVAL;
- void *result = allocateAligned(size, alignment);
+ void *result = allocateAligned(defaultMemPool, size, alignment);
if (!result)
return ENOMEM;
*memptr = result;
@@ -1978,28 +2307,27 @@ extern "C" void * scalable_aligned_malloc(size_t size, size_t alignment)
errno = EINVAL;
return NULL;
}
- void* tmp = allocateAligned(size, alignment);
- if (!tmp)
- errno = ENOMEM;
+ void *tmp = allocateAligned(defaultMemPool, size, alignment);
+ if (!tmp) errno = ENOMEM;
return tmp;
}
extern "C" void * scalable_aligned_realloc(void *ptr, size_t size, size_t alignment)
{
- /* corner cases left out of reallocAligned to not deal with errno there */
if (!isPowerOfTwo(alignment)) {
errno = EINVAL;
return NULL;
}
- if (!ptr) {
- return allocateAligned(size, alignment);
- }
- if (!size) {
- internalFree(ptr);
+ void *tmp;
+
+ if (!ptr)
+ tmp = allocateAligned(defaultMemPool, size, alignment);
+ else if (!size) {
+ scalable_free(ptr);
return NULL;
- }
+ } else
+ tmp = reallocAligned(defaultMemPool, ptr, size, alignment);
- void* tmp = reallocAligned(ptr, size, alignment);
if (!tmp) errno = ENOMEM;
return tmp;
}
@@ -2011,36 +2339,35 @@ extern "C" void * safer_scalable_aligned_realloc(void *ptr, size_t size, size_t
errno = EINVAL;
return NULL;
}
+ void *tmp;
+
if (!ptr) {
- return allocateAligned(size, alignment);
- }
- if (isRecognized(ptr)) {
+ tmp = allocateAligned(defaultMemPool, size, alignment);
+ } else if (isRecognized(ptr)) {
if (!size) {
internalFree(ptr);
return NULL;
+ } else {
+ tmp = reallocAligned(defaultMemPool, ptr, size, alignment);
}
- void* tmp = reallocAligned(ptr, size, alignment);
- if (!tmp) errno = ENOMEM;
- return tmp;
}
#if USE_WINTHREAD
else {
orig_ptrs *original_ptrs = static_cast<orig_ptrs*>(orig_function);
if (size) {
+ // Without orig_msize, we can't do anything with this.
+ // Just keeping old pointer.
if ( original_ptrs->orig_msize ){
size_t oldSize = original_ptrs->orig_msize(ptr);
- void *newBuf = allocateAligned(size, alignment);
- if (newBuf) {
- memcpy(newBuf, ptr, size<oldSize? size : oldSize);
+ tmp = allocateAligned(defaultMemPool, size, alignment);
+ if (tmp) {
+ memcpy(tmp, ptr, size<oldSize? size : oldSize);
if ( original_ptrs->orig_free ){
original_ptrs->orig_free( ptr );
}
}
- return newBuf;
- }else{
- //We can't do anything with this. Just keeping old pointer
- return NULL;
- }
+ } else
+ tmp = NULL;
} else {
if ( original_ptrs->orig_free ){
original_ptrs->orig_free( ptr );
@@ -2049,7 +2376,8 @@ extern "C" void * safer_scalable_aligned_realloc(void *ptr, size_t size, size_t
}
}
#endif
- return NULL;
+ if (!tmp) errno = ENOMEM;
+ return tmp;
}
extern "C" void scalable_aligned_free(void *ptr)
diff --git a/src/tbbmalloc/large_objects.cpp b/src/tbbmalloc/large_objects.cpp
index c26511e..51cf1d2 100644
--- a/src/tbbmalloc/large_objects.cpp
+++ b/src/tbbmalloc/large_objects.cpp
@@ -36,70 +36,59 @@ namespace internal {
static struct LargeBlockCacheStat {
uintptr_t age;
- size_t cacheSize;
} loCacheStat;
- /*
- * The number of bins to cache large objects.
- */
-const uint32_t numLargeBlockBins = 1024; // for 1024 max cached size is near 8MB
-
-
-class CachedBlocksList {
- LargeMemoryBlock *first,
- *last;
- /* age of an oldest block in the list; equal to last->age, if last defined,
- used for quick cheching it without acquiring the lock. */
- uintptr_t oldest;
- /* currAge when something was excluded out of list because of the age,
- not because of cache hit */
- uintptr_t lastCleanedAge;
- /* Current threshold value for the blocks of a particular size.
- Set on cache miss. */
- intptr_t ageThreshold;
-
- MallocMutex lock;
- /* CachedBlocksList should be placed in zero-initialized memory,
- ctor not needed. */
- CachedBlocksList();
-public:
- inline void push(LargeMemoryBlock* ptr);
- inline LargeMemoryBlock* pop();
- void releaseLastIfOld(uintptr_t currAge, size_t size);
-};
-
-/*
- * Array of bins with lists of recently freed large objects cached for re-use.
- */
-static char globalCachedBlockBinsSpace[sizeof(CachedBlocksList)*numLargeBlockBins];
-static CachedBlocksList* globalCachedBlockBins = (CachedBlocksList*)globalCachedBlockBinsSpace;
-
-/*
- * Large Objects are the only objects in the system that begin
- * on a 16K byte boundary since the blocks used for smaller objects
- * have the Block structure at each 16K boundary.
- */
-static uintptr_t cleanupCacheIfNeed();
+static uintptr_t cleanupCacheIfNeed(ExtMemoryPool *extMemPool);
-void CachedBlocksList::push(LargeMemoryBlock *ptr)
+bool CachedLargeBlocksL::push(ExtMemoryPool *extMemPool, LargeMemoryBlock *ptr)
{
ptr->prev = NULL;
- ptr->age = cleanupCacheIfNeed ();
+ ptr->age = cleanupCacheIfNeed(extMemPool);
MallocMutex::scoped_lock scoped_cs(lock);
- 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;
+ 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;
+ }
+ return true;
+ } else {
+ // 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;
+ return false;
}
}
-LargeMemoryBlock *CachedBlocksList::pop()
+void LargeMemoryBlock::registerInPool(ExtMemoryPool *extMemPool)
+{
+ MallocMutex::scoped_lock scoped_cs(extMemPool->largeObjLock);
+ gPrev = NULL;
+ gNext = extMemPool->loHead;
+ if (gNext)
+ gNext->gPrev = this;
+ extMemPool->loHead = this;
+}
+
+void LargeMemoryBlock::unregisterFromPool(ExtMemoryPool *extMemPool)
+{
+ MallocMutex::scoped_lock scoped_cs(extMemPool->largeObjLock);
+ if (extMemPool->loHead == this)
+ extMemPool->loHead = gNext;
+ if (gNext)
+ gNext->gPrev = gPrev;
+ if (gPrev)
+ gPrev->gNext = gNext;
+}
+
+LargeMemoryBlock *CachedLargeBlocksL::pop(ExtMemoryPool *extMemPool)
{
- uintptr_t currAge = cleanupCacheIfNeed();
+ uintptr_t currAge = cleanupCacheIfNeed(extMemPool);
LargeMemoryBlock *result=NULL;
{
MallocMutex::scoped_lock scoped_cs(lock);
@@ -121,9 +110,11 @@ LargeMemoryBlock *CachedBlocksList::pop()
return result;
}
-void CachedBlocksList::releaseLastIfOld(uintptr_t currAge, size_t size)
+bool CachedLargeBlocksL::releaseLastIfOld(ExtMemoryPool *extMemPool,
+ uintptr_t currAge)
{
LargeMemoryBlock *toRelease = NULL;
+ bool released = false;
/* oldest may be more recent then age, that's why cast to signed type
was used. age overflow is also processed correctly. */
@@ -145,19 +136,71 @@ void CachedBlocksList::releaseLastIfOld(uintptr_t currAge, size_t size)
}
MALLOC_ASSERT( toRelease, ASSERT_TEXT );
lastCleanedAge = toRelease->age;
+ }
+ else
+ return false;
+ }
+ released = toRelease;
+
+ while ( toRelease ) {
+ LargeMemoryBlock *helper = toRelease->next;
+ removeBackRef(toRelease->backRefIdx);
+ if (extMemPool->userPool())
+ toRelease->unregisterFromPool(extMemPool);
+ extMemPool->backend.putLargeBlock(toRelease);
+ toRelease = helper;
+ }
+ return released;
+}
+
+bool CachedLargeBlocksL::releaseAll(ExtMemoryPool *extMemPool)
+{
+ LargeMemoryBlock *toRelease = NULL;
+ bool released = false;
+
+ if (last) {
+ MallocMutex::scoped_lock scoped_cs(lock);
+ // double check
+ if (last) {
+ toRelease = first;
+ last = NULL;
+ first = NULL;
+ oldest = 0;
}
else
- return;
+ return false;
}
+ released = toRelease;
+
while ( toRelease ) {
LargeMemoryBlock *helper = toRelease->next;
removeBackRef(toRelease->backRefIdx);
- freeRawMemory(toRelease, size, toRelease->fromMapMemory);
+ if (extMemPool->userPool())
+ toRelease->unregisterFromPool(extMemPool);
+ extMemPool->backend.putLargeBlock(toRelease);
toRelease = helper;
}
+ return released;
+}
+
+// release from cache blocks that are older than ageThreshold
+bool ExtMemoryPool::doLOCacheCleanup(uintptr_t currAge)
+{
+ bool res = false;
+
+ for (int i = numLargeBlockBins-1; i >= 0; i--)
+ res |= cachedLargeBlocks[i].releaseLastIfOld(this, currAge);
+
+ return res;
}
-static uintptr_t cleanupCacheIfNeed ()
+bool ExtMemoryPool::softCachesCleanup()
+{
+ // TODO: cleanup small objects as well
+ return doLOCacheCleanup(FencedLoad((intptr_t&)loCacheStat.age));
+}
+
+static uintptr_t cleanupCacheIfNeed(ExtMemoryPool *extMemPool)
{
/* loCacheStat.age overflow is OK, as we only want difference between
* its current value and some recent.
@@ -168,60 +211,53 @@ static uintptr_t cleanupCacheIfNeed ()
*/
uintptr_t currAge = (uintptr_t)AtomicIncrement((intptr_t&)loCacheStat.age);
- if ( 0 == currAge % cacheCleanupFreq ) {
- size_t objSize;
- int i;
-
- for (i = numLargeBlockBins-1,
- objSize = (numLargeBlockBins-1)*largeBlockCacheStep+blockSize;
- i >= 0;
- i--, objSize-=largeBlockCacheStep) {
- /* cached block size on iteration is
- * i*largeBlockCacheStep+blockSize, it seems iterative
- * computation of it improves performance.
- */
- // release from cache blocks that are older than ageThreshold
- globalCachedBlockBins[i].releaseLastIfOld(currAge, objSize);
- }
- }
+ if ( 0 == currAge % cacheCleanupFreq )
+ extMemPool->doLOCacheCleanup(currAge);
+
return currAge;
}
-static LargeMemoryBlock* getCachedLargeBlock (size_t size)
+static LargeMemoryBlock* getCachedLargeBlock(ExtMemoryPool *extMemPool, size_t size)
{
MALLOC_ASSERT( size%largeBlockCacheStep==0, ASSERT_TEXT );
LargeMemoryBlock *lmb = NULL;
// blockSize is the minimal alignment and thus the minimal size of a large object.
size_t idx = (size-minLargeObjectSize)/largeBlockCacheStep;
if (idx<numLargeBlockBins) {
- lmb = globalCachedBlockBins[idx].pop();
+ lmb = extMemPool->cachedLargeBlocks[idx].pop(extMemPool);
if (lmb) {
- MALLOC_ITT_SYNC_ACQUIRED(globalCachedBlockBins+idx);
+ MALLOC_ITT_SYNC_ACQUIRED(extMemPool->cachedLargeBlocks+idx);
STAT_increment(getThreadId(), ThreadCommonCounters, allocCachedLargeBlk);
}
}
return lmb;
}
-void* mallocLargeObject (size_t size, size_t alignment, bool startupAlloc)
+void* mallocLargeObject(ExtMemoryPool *extMemPool, size_t size, size_t alignment,
+ bool startupAlloc)
{
LargeMemoryBlock* lmb;
size_t headersSize = sizeof(LargeMemoryBlock)+sizeof(LargeObjectHdr);
+ // TODO: take into account that they are already largeObjectAlignment-alinged
size_t allocationSize = alignUp(size+headersSize+alignment, largeBlockCacheStep);
if (allocationSize < size) // allocationSize is wrapped around after alignUp
return NULL;
- if (startupAlloc || !(lmb = getCachedLargeBlock(allocationSize))) {
+ if (startupAlloc || !(lmb = getCachedLargeBlock(extMemPool, allocationSize))) {
BackRefIdx backRefIdx;
if ((backRefIdx = BackRefIdx::newBackRef(/*largeObj=*/true)).isInvalid())
return NULL;
- lmb = (LargeMemoryBlock*)getRawMemory(allocationSize, /*useMapMem=*/startupAlloc);
- if (!lmb) return NULL;
- lmb->fromMapMemory = startupAlloc;
+ // unalignedSize is set in result
+ lmb = extMemPool->backend.getLargeBlock(allocationSize, startupAlloc);
+ if (!lmb) {
+ removeBackRef(backRefIdx);
+ return NULL;
+ }
lmb->backRefIdx = backRefIdx;
- lmb->unalignedSize = allocationSize;
+ if (extMemPool->userPool())
+ lmb->registerInPool(extMemPool);
STAT_increment(getThreadId(), ThreadCommonCounters, allocNewLargeObj);
}
@@ -237,39 +273,39 @@ void* mallocLargeObject (size_t size, size_t alignment, bool startupAlloc)
return alignedArea;
}
-static bool freeLargeObjectToCache (LargeMemoryBlock* largeBlock)
+static bool freeLargeObjectToCache(ExtMemoryPool *extMemPool, LargeMemoryBlock* largeBlock)
{
size_t size = largeBlock->unalignedSize;
size_t idx = (size-minLargeObjectSize)/largeBlockCacheStep;
if (idx<numLargeBlockBins) {
MALLOC_ASSERT( size%largeBlockCacheStep==0, ASSERT_TEXT );
- MALLOC_ITT_SYNC_RELEASING(globalCachedBlockBins+idx);
- globalCachedBlockBins[idx].push(largeBlock);
-
- STAT_increment(getThreadId(), ThreadCommonCounters, cacheLargeBlk);
- return true;
+ MALLOC_ITT_SYNC_RELEASING(extMemPool->cachedLargeBlocks+idx);
+ if (extMemPool->cachedLargeBlocks[idx].push(extMemPool, largeBlock)) {
+ STAT_increment(getThreadId(), ThreadCommonCounters, cacheLargeBlk);
+ return true;
+ } else
+ return false;
}
return false;
}
-void freeLargeObject (void *object)
+void freeLargeObject(ExtMemoryPool *extMemPool, void *object)
{
LargeObjectHdr *header = (LargeObjectHdr*)object - 1;
// overwrite backRefIdx to simplify double free detection
header->backRefIdx = BackRefIdx();
- if (!freeLargeObjectToCache(header->memoryBlock)) {
+ if (!freeLargeObjectToCache(extMemPool, header->memoryBlock)) {
removeBackRef(header->memoryBlock->backRefIdx);
- freeRawMemory(header->memoryBlock, header->memoryBlock->unalignedSize,
- /*useMapMem=*/ header->memoryBlock->fromMapMemory);
+ if (extMemPool->userPool())
+ header->memoryBlock->unregisterFromPool(extMemPool);
+ extMemPool->backend.putLargeBlock(header->memoryBlock);
STAT_increment(getThreadId(), ThreadCommonCounters, freeLargeObj);
}
}
/*********** End allocation of large objects **********/
-
-
} // namespace internal
} // namespace rml
diff --git a/src/tbbmalloc/lin-tbbmalloc-export.def b/src/tbbmalloc/lin32-tbbmalloc-export.def
similarity index 88%
copy from src/tbbmalloc/lin-tbbmalloc-export.def
copy to src/tbbmalloc/lin32-tbbmalloc-export.def
index 0fd7a05..5bfc767 100644
--- a/src/tbbmalloc/lin-tbbmalloc-export.def
+++ b/src/tbbmalloc/lin32-tbbmalloc-export.def
@@ -43,11 +43,18 @@ __TBB_internal_malloc;
__TBB_internal_realloc;
__TBB_internal_posix_memalign;
scalable_msize;
+/* memory pool stuff */
+_ZN3rml10pool_resetEPNS_10MemoryPoolE;
+_ZN3rml11pool_createEiPKNS_13MemPoolPolicyE;
+_ZN3rml11pool_mallocEPNS_10MemoryPoolEj;
+_ZN3rml12pool_destroyEPNS_10MemoryPoolE;
+_ZN3rml9pool_freeEPNS_10MemoryPoolEPv;
+_ZN3rml12pool_reallocEPNS_10MemoryPoolEPvj;
local:
/* TBB symbols */
-*3rml8internal*;
+*3rml*;
*3tbb*;
*__TBB*;
__itt_*;
diff --git a/src/tbbmalloc/lin-tbbmalloc-export.def b/src/tbbmalloc/lin64-tbbmalloc-export.def
similarity index 88%
copy from src/tbbmalloc/lin-tbbmalloc-export.def
copy to src/tbbmalloc/lin64-tbbmalloc-export.def
index 0fd7a05..3501d70 100644
--- a/src/tbbmalloc/lin-tbbmalloc-export.def
+++ b/src/tbbmalloc/lin64-tbbmalloc-export.def
@@ -43,11 +43,18 @@ __TBB_internal_malloc;
__TBB_internal_realloc;
__TBB_internal_posix_memalign;
scalable_msize;
+/* memory pool stuff */
+_ZN3rml11pool_createElPKNS_13MemPoolPolicyE;
+_ZN3rml10pool_resetEPNS_10MemoryPoolE;
+_ZN3rml11pool_mallocEPNS_10MemoryPoolEm;
+_ZN3rml12pool_destroyEPNS_10MemoryPoolE;
+_ZN3rml9pool_freeEPNS_10MemoryPoolEPv;
+_ZN3rml12pool_reallocEPNS_10MemoryPoolEPvm;
local:
/* TBB symbols */
-*3rml8internal*;
+*3rml*;
*3tbb*;
*__TBB*;
__itt_*;
diff --git a/src/tbbmalloc/lin-tbbmalloc-export.def b/src/tbbmalloc/lin64ipf-tbbmalloc-export.def
similarity index 86%
rename from src/tbbmalloc/lin-tbbmalloc-export.def
rename to src/tbbmalloc/lin64ipf-tbbmalloc-export.def
index 0fd7a05..01a5b19 100644
--- a/src/tbbmalloc/lin-tbbmalloc-export.def
+++ b/src/tbbmalloc/lin64ipf-tbbmalloc-export.def
@@ -43,11 +43,19 @@ __TBB_internal_malloc;
__TBB_internal_realloc;
__TBB_internal_posix_memalign;
scalable_msize;
+/* memory pool stuff */
+_ZN3rml10pool_resetEPNS_10MemoryPoolE;
+_ZN3rml11pool_createEiPKNS_13MemPoolPolicyE;
+_ZN3rml11pool_createElPKNS_13MemPoolPolicyE;
+_ZN3rml11pool_mallocEPNS_10MemoryPoolEm;
+_ZN3rml12pool_destroyEPNS_10MemoryPoolE;
+_ZN3rml9pool_freeEPNS_10MemoryPoolEPv;
+_ZN3rml12pool_reallocEPNS_10MemoryPoolEPvm;
local:
/* TBB symbols */
-*3rml8internal*;
+*3rml*;
*3tbb*;
*__TBB*;
__itt_*;
diff --git a/src/tbbmalloc/mac32-tbbmalloc-export.def b/src/tbbmalloc/mac32-tbbmalloc-export.def
index 0e36795..eea06f7 100644
--- a/src/tbbmalloc/mac32-tbbmalloc-export.def
+++ b/src/tbbmalloc/mac32-tbbmalloc-export.def
@@ -18,7 +18,6 @@
writing.
*/
-// MemoryAllocator.cpp
_scalable_calloc
_scalable_free
_scalable_malloc
@@ -28,3 +27,10 @@ _scalable_aligned_malloc
_scalable_aligned_realloc
_scalable_aligned_free
_scalable_msize
+/* memory pool stuff */
+__ZN3rml11pool_createElPKNS_13MemPoolPolicyE
+__ZN3rml10pool_resetEPNS_10MemoryPoolE
+__ZN3rml12pool_destroyEPNS_10MemoryPoolE
+__ZN3rml11pool_mallocEPNS_10MemoryPoolEm
+__ZN3rml9pool_freeEPNS_10MemoryPoolEPv
+__ZN3rml12pool_reallocEPNS_10MemoryPoolEPvm
diff --git a/src/tbbmalloc/mac64-tbbmalloc-export.def b/src/tbbmalloc/mac64-tbbmalloc-export.def
index 0e36795..eea06f7 100644
--- a/src/tbbmalloc/mac64-tbbmalloc-export.def
+++ b/src/tbbmalloc/mac64-tbbmalloc-export.def
@@ -18,7 +18,6 @@
writing.
*/
-// MemoryAllocator.cpp
_scalable_calloc
_scalable_free
_scalable_malloc
@@ -28,3 +27,10 @@ _scalable_aligned_malloc
_scalable_aligned_realloc
_scalable_aligned_free
_scalable_msize
+/* memory pool stuff */
+__ZN3rml11pool_createElPKNS_13MemPoolPolicyE
+__ZN3rml10pool_resetEPNS_10MemoryPoolE
+__ZN3rml12pool_destroyEPNS_10MemoryPoolE
+__ZN3rml11pool_mallocEPNS_10MemoryPoolEm
+__ZN3rml9pool_freeEPNS_10MemoryPoolEPv
+__ZN3rml12pool_reallocEPNS_10MemoryPoolEPvm
diff --git a/src/tbbmalloc/tbb_function_replacement.cpp b/src/tbbmalloc/tbb_function_replacement.cpp
index 632987e..072b146 100644
--- a/src/tbbmalloc/tbb_function_replacement.cpp
+++ b/src/tbbmalloc/tbb_function_replacement.cpp
@@ -199,7 +199,7 @@ size_t compareStrings( const char *str1, const char *str2 )
// Check function prologue with know prologues from the dictionary
// opcodes - dictionary
// inpAddr - pointer to function prologue
-// Dictionary contains opcodes for several full asm instrutions
+// 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
// (matched_pattern/2-1)
diff --git a/src/tbbmalloc/tbbmalloc_internal.h b/src/tbbmalloc/tbbmalloc_internal.h
index c9c8956..c011c24 100644
--- a/src/tbbmalloc/tbbmalloc_internal.h
+++ b/src/tbbmalloc/tbbmalloc_internal.h
@@ -35,16 +35,23 @@
#if USE_PTHREAD
// Some pthreads documentation says that <pthreads.h> must be first header.
#include <pthread.h>
+ typedef pthread_key_t tls_key_t;
+#elif USE_WINTHREAD
+ #include "tbb/machine/windows_api.h"
+ typedef DWORD tls_key_t;
+#else
+ #error Must define USE_PTHREAD or USE_WINTHREAD
#endif
#include <stdio.h>
#include <stdlib.h>
+#include <limits.h> // for CHAR_BIT
#if MALLOC_CHECK_RECURSION
#include <new> /* for placement new */
#endif
#if __sun || __SUNPRO_CC
-#define __asm__ asm
+#define __asm__ asm
#endif
extern "C" {
@@ -70,6 +77,20 @@ extern "C" {
/********* End compile-time options **************/
namespace rml {
+
+#if !MEM_POLICY_DEFINED
+typedef void *(*rawAllocType)(intptr_t pool_id, size_t &bytes);
+typedef int (*rawFreeType)(intptr_t pool_id, void* raw_ptr, size_t raw_bytes);
+
+struct MemPoolPolicy {
+ rawAllocType pAlloc; // pAlloc and pFree must be thread-safe
+ rawFreeType pFree;
+ size_t granularity; // granularity of pAlloc allocations
+ void *pReserved; // reserved for future extensions
+ size_t szReserved; // size of pReserved data
+};
+#endif
+
namespace internal {
/********** Various numeric parameters controlling allocations ********/
@@ -91,8 +112,56 @@ const uint32_t largeBlockCacheStep = 8*1024;
*/
const unsigned cacheCleanupFreq = 256;
+ /*
+ * The number of bins to cache large objects.
+ */
+const uint32_t numLargeBlockBins = 1024; // for 1024 max cached size is near 8MB
+
/********** End of numeric parameters controlling allocations *********/
+class BlockI;
+struct LargeMemoryBlock;
+struct ExtMemoryPool;
+struct MemRegion;
+class FreeBlock;
+class TLSData;
+class Backend;
+class MemoryPool;
+
+class TLSKey {
+ tls_key_t TLS_pointer_key;
+public:
+ TLSKey();
+ ~TLSKey();
+ TLSData* getThreadMallocTLS() const;
+ void setThreadMallocTLS( TLSData * newvalue );
+ TLSData* createTLS(MemoryPool *memPool, Backend *backend);
+};
+
+class CachedLargeBlocksL {
+ LargeMemoryBlock *first,
+ *last;
+ /* age of an oldest block in the list; equal to last->age, if last defined,
+ used for quick cheching it without acquiring the lock. */
+ uintptr_t oldest;
+ /* currAge when something was excluded out of list because of the age,
+ not because of cache hit */
+ uintptr_t lastCleanedAge;
+ /* Current threshold value for the blocks of a particular size.
+ Set on cache miss. */
+ intptr_t ageThreshold;
+
+ MallocMutex lock;
+ /* CachedBlocksList should be placed in zero-initialized memory,
+ ctor not needed. */
+ CachedLargeBlocksL();
+public:
+ inline bool push(ExtMemoryPool *extMemPool, LargeMemoryBlock* ptr);
+ inline LargeMemoryBlock* pop(ExtMemoryPool *extMemPool);
+ bool releaseLastIfOld(ExtMemoryPool *extMemPool, uintptr_t currAge);
+ bool releaseAll(ExtMemoryPool *extMemPool);
+};
+
class BackRefIdx { // composite index to backreference array
private:
uint16_t master; // index in BackRefMaster
@@ -109,51 +178,322 @@ public:
static BackRefIdx newBackRef(bool largeObj);
};
-struct LargeMemoryBlock {
+// Block header is used during block coalescing
+// and must be preserved in used blocks.
+class BlockI {
+ intptr_t blockState[2];
+};
+
+struct LargeMemoryBlock : public BlockI {
LargeMemoryBlock *next, // ptrs in list of cached blocks
- *prev;
+ *prev,
+ // 2-linked list of pool's large objects
+ // Used to destroy backrefs on pool destroy/reset (backrefs are global).
+ *gPrev,
+ *gNext;
uintptr_t age; // age of block while in cache
size_t objectSize; // the size requested by a client
size_t unalignedSize; // the size requested from getMemory
- bool fromMapMemory;
+ // Is the block from getRawMem or from bin?
+ // It can't be detected reliable via size, because sometimes
+ // objects larger then Backend::maxBinedSize can be allocated from bins.
+ bool directRawMemCall;
BackRefIdx backRefIdx; // cached here, used copy is in LargeObjectHdr
+ void registerInPool(ExtMemoryPool *extMemPool);
+ void unregisterFromPool(ExtMemoryPool *extMemPool);
};
-struct LargeObjectHdr {
- LargeMemoryBlock *memoryBlock;
- /* Backreference points to LargeObjectHdr.
- Duplicated in LargeMemoryBlock to reuse in subsequent allocations. */
- BackRefIdx backRefIdx;
+// global state of blocks currently in processing
+class ProcBlocks {
+ // number of blocks currently removed from one bin and not returned
+ intptr_t blocksInProcessing; // to another
+ intptr_t binsModifications; // incremented on every bin modification
+public:
+ void consume() { AtomicIncrement(blocksInProcessing); }
+ void pureSignal() { AtomicIncrement(binsModifications); }
+ void signal() {
+ MALLOC_ITT_SYNC_RELEASING(&blocksInProcessing);
+ AtomicIncrement(binsModifications);
+ intptr_t prev = AtomicAdd(blocksInProcessing, -1);
+ MALLOC_ASSERT(prev > 0, ASSERT_TEXT);
+ }
+ 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();
+ }
+ MALLOC_ITT_SYNC_PREPARE(&blocksInProcessing);
+ for (;;) {
+ SpinWaitWhileEq(blocksInProcessing, myBlocksNum);
+ if (myBlocksNum > blocksInProcessing)
+ break;
+ myBlocksNum = FencedLoad(blocksInProcessing);
+ }
+ MALLOC_ITT_SYNC_ACQUIRED(&blocksInProcessing);
+ return true;
+ }
};
-struct FreeObject {
- FreeObject *next;
+class CoalRequestQ { // queue of free blocks that coalescing was delayed
+ FreeBlock *blocksToFree;
+public:
+ FreeBlock *getAll(); // return current list of blocks and make queue empty
+ void putBlock(FreeBlock *fBlock);
};
-// interface class for external access to Block
-class BlockI {
+template<unsigned NUM>
+class BitMask {
+ static const int SZ = NUM/( CHAR_BIT*sizeof(uintptr_t)) + (NUM % sizeof(uintptr_t) ? 1:0);
+ uintptr_t mask[SZ];
+public:
+ void set(size_t idx, bool val) {
+ MALLOC_ASSERT(idx<NUM, ASSERT_TEXT);
+
+ size_t i = idx / (CHAR_BIT*sizeof(uintptr_t));
+ int pos = idx % (CHAR_BIT*sizeof(uintptr_t));
+ if (val)
+ AtomicOr(&mask[i], 1ULL << pos);
+ else
+ AtomicAnd(&mask[i], ~(1ULL << pos));
+ }
+ int getMinTrue(unsigned startIdx) const {
+ size_t idx = startIdx / (CHAR_BIT*sizeof(uintptr_t));
+ int pos = startIdx % (CHAR_BIT*sizeof(uintptr_t));
+ // clear bits before startIdx
+ uintptr_t curr = mask[idx] & ~((1ULL<<pos) - 1);
+
+ for (int i=idx; i<SZ; i++, curr=mask[i]) {
+ if (-1 != (pos = BitScanRev(curr)))
+ return i*sizeof(uintptr_t)*CHAR_BIT + pos;
+ }
+ return -1;
+ }
+ void reset() { for (int i=0; i<SZ; i++) mask[i] = 0; }
+};
+
+class MemExtendingSema {
+ intptr_t active;
public:
- static BlockI *getRawBlock(bool startup);
- void initialize(void *bumpPtr);
+ bool wait() {
+ bool rescanBins = false;
+ // up to 3 threads can add more memory from OS simultaneously,
+ // rest of threads have to wait
+ for (;;) {
+ intptr_t prevCnt = FencedLoad(active);
+ if (prevCnt < 3) {
+ intptr_t n = AtomicCompareExchange(active, prevCnt+1, prevCnt);
+ if (n == prevCnt)
+ break;
+ } else {
+ SpinWaitWhileEq(active, prevCnt);
+ rescanBins = true;
+ break;
+ }
+ }
+ return rescanBins;
+ }
+ void signal() { AtomicAdd(active, -1); }
};
-class FreeBlocks {
- typedef void* (*RawAlloc) (size_t size, bool useMapMem);
- typedef void (*RawFree) (void *object, size_t size, bool useMapMem);
+class Backend {
+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;
+
+ // Bin keeps 2-linked list of free blocks. It must be 2-linked
+ // because during coalescing a block it's removed from a middle of the list.
+ struct Bin {
+ FreeBlock *head;
+ MallocMutex tLock;
+
+ void removeBlock(FreeBlock *fBlock);
+ void reset() { head = 0; }
+ size_t countFreeBlocks();
+ void verify();
+ bool empty() const { return !head; }
+ };
+
+ // array of bins accomplished bitmask for fast finding of non-empty bins
+ class IndexedBins {
+ BitMask<Backend::freeBinsNum> bitMask;
+ Bin freeBins[Backend::freeBinsNum];
+ public:
+ FreeBlock *getBlock(int binIdx, ProcBlocks *procBlocks, size_t size,
+ bool res16Kaligned, bool alignedBin, bool wait,
+ int *resLocked);
+ void lockRemoveBlock(int binIdx, FreeBlock *fBlock);
+ void addBlock(int binIdx, FreeBlock *fBlock, size_t blockSz);
+ bool tryAddBlock(int binIdx, FreeBlock *fBlock, size_t blockSz);
+ int getMinNonemptyBin(unsigned startBin) const {
+ int p = bitMask.getMinTrue(startBin);
+ return p == -1 ? Backend::freeBinsNum : p;
+ }
+ void reset();
+ };
- RawAlloc rawAlloc;
- RawFree rawFree;
- size_t memReqSize;
+private:
+ ExtMemoryPool *extMemPool;
+ // used for release every region on pool destroying
+ MemRegion *regionList;
+ MallocMutex regionListLock;
+
+ CoalRequestQ coalescQ; // queue of coalescing requests
+ ProcBlocks procBlocks;
+ // semaphore protecting adding more more memory from OS
+ MemExtendingSema memExtendingSema;
+
+ // Using of maximal observed requested size allows descrease
+ // memory consumption for small requests and descrease fragmentation
+ // for workloads when small and large allocation requests are mixed.
+ // TODO: decrease, not only increase it
+ size_t maxRequestedSize;
+ void correctMaxRequestSize(size_t requestSize);
+
+ size_t addNewRegion(size_t rawSize);
+ size_t initRegion(MemRegion *region, size_t rawSize);
+ void releaseRegion(MemRegion *region);
+
+ void *genericGetBlock(int num, size_t size, bool res16Kaligned, bool startup);
+ void genericPutBlock(FreeBlock *fBlock, size_t blockSz,
+ bool directRawMemCall);
+ 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 *doCoalesc(FreeBlock *fBlock, MemRegion **memRegion);
+ void coalescAndPutList(FreeBlock *head, bool forceCoalescQDrop, bool doStat);
+ bool scanCoalescQ(bool forceCoalescQDrop);
+ void coalescAndPut(FreeBlock *fBlock, size_t blockSz);
+
+ void removeBlockFromBin(FreeBlock *fBlock);
+
+ void *getRawMem(size_t &size, bool useMapMem) const;
+ void freeRawMem(void *object, size_t size, bool useMapMem) const;
- bool mallocBigBlock();
public:
- bool bootstrap(RawAlloc myAlloc, RawFree myFree, size_t myReqSize);
- BlockI *get(bool startup);
- void put(BlockI *block, bool startup);
- void putList(BlockI *head, BlockI *tail);
+ bool bootstrap(ExtMemoryPool *extMemoryPool) {
+ extMemPool = extMemoryPool;
+ return addNewRegion(2*1024*1024);
+ }
+ bool reset();
+ bool destroy();
+
+ BlockI *get16KBlock(int num, bool startup) {
+ BlockI *b = (BlockI*)
+ genericGetBlock(num, blockSize, /*res16Kaligned=*/true, startup);
+ MALLOC_ASSERT(isAligned(b, blockSize), ASSERT_TEXT);
+ return b;
+ }
+ void put16KBlock(BlockI *block, bool /*startup*/) {
+ genericPutBlock((FreeBlock *)block, blockSize,
+ /*directRawMemCall=*/false);
+ }
+
+ bool inUserPool() const;
+
+ LargeMemoryBlock *getLargeBlock(size_t size, bool startup);
+ void putLargeBlock(LargeMemoryBlock *lmb) {
+ genericPutBlock((FreeBlock *)lmb, lmb->unalignedSize,
+ lmb->directRawMemCall);
+ }
+
+ void reportStat();
+
+ enum {
+ NO_BIN = -1
+ };
+private:
+ static int sizeToBin(size_t size) {
+ if (size >= maxBinedSize)
+ return freeBinsNum-1;
+ else if (size < minBinedSize)
+ return NO_BIN;
+
+ int bin = (size - minBinedSize)/largeBlockCacheStep;
+
+ MALLOC_ASSERT(bin < freeBinsNum-1, "Invalid size.");
+ return bin;
+ }
+ static bool toAlignedBin(FreeBlock *block, size_t size) {
+ return isAligned((uintptr_t)block+size, blockSize) && size >= blockSize;
+ }
+
+ IndexedBins freeLargeBins,
+ freeAlignedBins;
+};
+
+struct ExtMemoryPool {
+ Backend backend;
+
+ intptr_t poolId;
+ // to find all large objects
+ MallocMutex largeObjLock;
+ LargeMemoryBlock *loHead;
+ // Callbacks to be used instead of MapMemory/UnmapMemory.
+ rawAllocType rawAlloc;
+ rawFreeType rawFree;
+ size_t granularity;
+ TLSKey tlsPointerKey; // per-pool TLS key
+
+ // bins with lists of recently freed large blocks cached for re-use
+ CachedLargeBlocksL cachedLargeBlocks[numLargeBlockBins];
+
+ bool doLOCacheCleanup(uintptr_t currAge);
+
+ // i.e., not system default pool for scalable_malloc/scalable_free
+ bool userPool() const { return rawAlloc; }
+
+ bool fixedSizePool() const { return userPool() && !rawFree; }
+
+ // true if something has beed released
+ bool softCachesCleanup();
+ bool release16KBCaches();
+ bool hardCachesCleanup() {
+ bool res = false;
+
+ for (int i = numLargeBlockBins-1; i >= 0; i--)
+ res |= cachedLargeBlocks[i].releaseAll(this);
+ // TODO: to release all thread's pools, not just current thread
+ res |= release16KBCaches();
+
+ return res;
+ }
+
+ void reset() {
+ // must reset LOC because all backrefs are cleaned,
+ // because backrefs in LOC are invalid already
+ hardCachesCleanup();
+ backend.reset();
+ tlsPointerKey.~TLSKey();
+ }
+ void destroy() {
+ if (rawFree)
+ backend.destroy();
+ tlsPointerKey.~TLSKey();
+ }
+};
+
+inline bool Backend::inUserPool() const { return extMemPool->userPool(); }
+
+struct LargeObjectHdr {
+ LargeMemoryBlock *memoryBlock;
+ /* Backreference points to LargeObjectHdr.
+ Duplicated in LargeMemoryBlock to reuse in subsequent allocations. */
+ BackRefIdx backRefIdx;
};
-extern FreeBlocks freeBlocks;
+struct FreeObject {
+ FreeObject *next;
+};
/******* A helper class to support overriding malloc with scalable_malloc *******/
#if MALLOC_CHECK_RECURSION
@@ -168,7 +508,7 @@ class RecursiveMallocCallProtector {
RecursiveMallocCallProtector can be before pthread initialized, pthread calls
can't be used in 1st instance of RecursiveMallocCallProtector.
RecursiveMallocCallProtector is used 1st time in checkInitialization(),
- so there is a guarantee that on 2nd usage pthread is initialized.
+ so there is a guarantee that on 2nd usage pthread is initialized.
No such situation observed with other supported OSes.
*/
#if __FreeBSD__
@@ -226,8 +566,8 @@ public:
static void detectNaiveOverload() {
if (!malloc_proxy) {
#if __FreeBSD__
-/* If !canUsePthread, we can't call pthread_self() before, but now pthread
- is already on, so can do it. False positives here lead to silent switching
+/* If !canUsePthread, we can't call pthread_self() before, but now pthread
+ is already on, so can do it. False positives here lead to silent switching
from malloc to mmap for all large allocations with bad performance impact. */
if (!canUsePthread) {
canUsePthread = true;
@@ -251,20 +591,19 @@ public:
bool isMallocInitializedExt();
-void* getRawMemory (size_t size, bool useMapMem);
-void freeRawMemory (void *object, size_t size, bool useMapMem);
-
extern const uint32_t minLargeObjectSize;
bool isLargeObject(void *object);
-void* mallocLargeObject (size_t size, size_t alignment, bool startupAlloc = false);
-void freeLargeObject (void *object);
+void* mallocLargeObject(ExtMemoryPool *extMemPool, size_t size, size_t alignment, bool startupAlloc = false);
+void freeLargeObject(ExtMemoryPool *extMemPool, void *object);
unsigned int getThreadId();
-bool initBackRefMaster();
+bool initBackRefMaster(Backend *backend);
void removeBackRef(BackRefIdx backRefIdx);
void setBackRef(BackRefIdx backRefIdx, void *newPtr);
void *getBackRef(BackRefIdx backRefIdx);
+void* getRawMemory(size_t size, bool useMapMem);
+bool freeRawMemory(void *object, size_t size, bool useMapMem);
} // namespace internal
} // namespace rml
diff --git a/src/tbbmalloc/win-gcc-tbbmalloc-export.def b/src/tbbmalloc/win32-gcc-tbbmalloc-export.def
similarity index 86%
copy from src/tbbmalloc/win-gcc-tbbmalloc-export.def
copy to src/tbbmalloc/win32-gcc-tbbmalloc-export.def
index c6090ee..0c8cd0b 100644
--- a/src/tbbmalloc/win-gcc-tbbmalloc-export.def
+++ b/src/tbbmalloc/win32-gcc-tbbmalloc-export.def
@@ -41,5 +41,13 @@ safer_scalable_realloc;
scalable_msize;
safer_scalable_msize;
safer_scalable_aligned_realloc;
+/* memory pool stuff */
+_ZN3rml10pool_resetEPNS_10MemoryPoolE;
+_ZN3rml11pool_createEiPKNS_13MemPoolPolicyE;
+_ZN3rml11pool_mallocEPNS_10MemoryPoolEj;
+_ZN3rml12pool_destroyEPNS_10MemoryPoolE;
+_ZN3rml9pool_freeEPNS_10MemoryPoolEPv;
+_ZN3rml12pool_reallocEPNS_10MemoryPoolEPvj;
+
local:*;
};
diff --git a/src/tbbmalloc/win32-tbbmalloc-export.def b/src/tbbmalloc/win32-tbbmalloc-export.def
index 835722b..7a44ecb 100644
--- a/src/tbbmalloc/win32-tbbmalloc-export.def
+++ b/src/tbbmalloc/win32-tbbmalloc-export.def
@@ -26,7 +26,7 @@
EXPORTS
-; MemoryAllocator.cpp
+; frontend.cpp
scalable_calloc
scalable_free
scalable_malloc
@@ -40,3 +40,10 @@ safer_scalable_realloc
scalable_msize
safer_scalable_msize
safer_scalable_aligned_realloc
+?pool_create at rml@@YAPAVMemoryPool at 1@HPBUMemPoolPolicy at 1@@Z
+?pool_destroy at rml@@YA_NPAVMemoryPool at 1@@Z
+?pool_malloc at rml@@YAPAXPAVMemoryPool at 1@I at Z
+?pool_free at rml@@YA_NPAVMemoryPool at 1@PAX at Z
+?pool_reset at rml@@YA_NPAVMemoryPool at 1@@Z
+?pool_realloc at rml@@YAPAXPAVMemoryPool at 1@PAXI at Z
+
diff --git a/src/tbbmalloc/win-gcc-tbbmalloc-export.def b/src/tbbmalloc/win64-gcc-tbbmalloc-export.def
similarity index 86%
rename from src/tbbmalloc/win-gcc-tbbmalloc-export.def
rename to src/tbbmalloc/win64-gcc-tbbmalloc-export.def
index c6090ee..c1455b6 100644
--- a/src/tbbmalloc/win-gcc-tbbmalloc-export.def
+++ b/src/tbbmalloc/win64-gcc-tbbmalloc-export.def
@@ -41,5 +41,13 @@ safer_scalable_realloc;
scalable_msize;
safer_scalable_msize;
safer_scalable_aligned_realloc;
+/* memory pool stuff */
+_ZN3rml10pool_resetEPNS_10MemoryPoolE;
+_ZN3rml11pool_createExPKNS_13MemPoolPolicyE;
+_ZN3rml11pool_mallocEPNS_10MemoryPoolEy;
+_ZN3rml12pool_destroyEPNS_10MemoryPoolE;
+_ZN3rml9pool_freeEPNS_10MemoryPoolEPv;
+_ZN3rml12pool_reallocEPNS_10MemoryPoolEPvy;
+
local:*;
};
diff --git a/src/tbbmalloc/win64-tbbmalloc-export.def b/src/tbbmalloc/win64-tbbmalloc-export.def
index 835722b..9a0566f 100644
--- a/src/tbbmalloc/win64-tbbmalloc-export.def
+++ b/src/tbbmalloc/win64-tbbmalloc-export.def
@@ -26,7 +26,7 @@
EXPORTS
-; MemoryAllocator.cpp
+; frontend.cpp
scalable_calloc
scalable_free
scalable_malloc
@@ -40,3 +40,10 @@ safer_scalable_realloc
scalable_msize
safer_scalable_msize
safer_scalable_aligned_realloc
+; memory pool stuff
+?pool_create at rml@@YAPEAVMemoryPool at 1@_JPEBUMemPoolPolicy at 1@@Z
+?pool_destroy at rml@@YA_NPEAVMemoryPool at 1@@Z
+?pool_malloc at rml@@YAPEAXPEAVMemoryPool at 1@_K at Z
+?pool_free at rml@@YA_NPEAVMemoryPool at 1@PEAX at Z
+?pool_reset at rml@@YA_NPEAVMemoryPool at 1@@Z
+?pool_realloc at rml@@YAPEAXPEAVMemoryPool at 1@PEAX_K at Z
diff --git a/src/tbbproxy/tbbproxy-windows.asm b/src/tbbproxy/tbbproxy-windows.asm
new file mode 100644
index 0000000..465d53c
--- /dev/null
+++ b/src/tbbproxy/tbbproxy-windows.asm
@@ -0,0 +1,121 @@
+; Copyright 2005-2011 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"
+
+// __TBB_STRING macro defined in "tbb_stddef.h". However, we cannot include "tbb_stddef.h"
+// because it contains a lot of C/C++ definitions. So, we have to define __TBB_STRING here:
+#define __TBB_STRING_AUX( x ) #x
+#define __TBB_STRING( x ) __TBB_STRING_AUX( x )
+
+// Eliminate difference between IA-32 and Intel 64: AWORD is a type of pointer, LANG is language
+// specification for extern directive.
+#ifdef ARCH_ia32
+ #define AWORD dword
+ #define LANG c
+#else
+ #define AWORD qword
+ #define LANG
+#endif
+
+#ifdef ARCH_ia32
+ // These directives are required for IA32 architecture only.
+ .686
+ .model flat, syscall
+#endif
+
+/*
+ Symbol names.
+*/
+
+// Note: masm for IA-32 does not like symbols defined as "name:" in data sections,
+// so we have to define symbols with "name label type" directive instead.
+
+fname macro sym:req
+ align sizeof AWORD
+ Ln_&sym& label byte
+ byte "&sym&", 0
+endm
+
+.const // Symbol names are constants.
+#define __TBB_SYMBOL( sym ) fname sym
+#include __TBB_STRING( __TBB_LST )
+
+/*
+ Symbol descriptors.
+*/
+
+extern LANG __tbb_internal_runtime_loader_stub : AWORD
+
+fsymbol macro sym:req
+ Ls_&sym& label AWORD
+ AWORD __tbb_internal_runtime_loader_stub
+ AWORD Ln_&sym&
+ dword sizeof AWORD
+ dword 1
+endm
+
+.data
+align sizeof AWORD
+public LANG __tbb_internal_runtime_loader_symbols
+__tbb_internal_runtime_loader_symbols label AWORD
+#define __TBB_SYMBOL( sym ) fsymbol sym
+#include __TBB_STRING( __TBB_LST )
+AWORD 0, 0 // Terminator of the __tbb_internal_runtime_loader_symbols array.
+dword 0, 0
+
+/*
+ Generate functions.
+*/
+
+// Helper assembler macro to handle different naming conventions on IA-32 and Intel 64:
+// IA-32: C++ names preserved, C names require leading underscore.
+// Intel 64: All names preserved.
+mangle macro name:req
+ #ifdef ARCH_ia32
+ if @instr( 1, name, <?> )
+ exitm @catstr( name )
+ else
+ exitm @catstr( <_>, name )
+ endif
+ #else
+ exitm @catstr( name )
+ #endif
+endm
+
+function macro sym:req
+ mangle( sym ) proc
+ jmp AWORD ptr Ls_&sym&
+ mangle( sym ) endp
+endm
+
+.code
+#define __TBB_SYMBOL( sym ) function sym
+#include __TBB_STRING( __TBB_LST )
+
+end
+
+// end of file //
diff --git a/src/tbbproxy/tbbproxy.cpp b/src/tbbproxy/tbbproxy.cpp
new file mode 100644
index 0000000..544e5fa
--- /dev/null
+++ b/src/tbbproxy/tbbproxy.cpp
@@ -0,0 +1,616 @@
+/*
+ Copyright 2005-2011 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_RUNTIME_LOADER 1
+#include "tbb/runtime_loader.h"
+#include "tbb/tbb_stddef.h"
+
+// C standard headers.
+#include <cctype> // isspace
+#include <cstdarg> // va_list, etc.
+#include <cstdio> // fprintf, stderr, etc.
+#include <cstdlib> // malloc, free, abort.
+#include <cstring> // strlen, etc.
+
+// C++ standard headers.
+#include <typeinfo>
+
+// OS-specific includes.
+#if _WIN32 || _WIN64
+ #include <windows.h>
+ #define snprintf _snprintf
+ #undef max
+#else
+ #include <dlfcn.h> // dlopen, dlsym, dlclose, dlerror.
+#endif
+
+#if TBB_USE_ASSERT
+ // We cannot use __TBB_ASSERT as it is because it calls a function from tbb library which may
+ // be not yet loaded. Redefine __TBB_ASSERT not to call tbb functions.
+ #undef __TBB_ASSERT
+ #define __TBB_ASSERT( cond, msg ) { \
+ if ( ! (cond) ) { \
+ say( "%s:%d: Assertion failed: %s.", __FILE__, __LINE__, (msg) ); \
+ } /* if */ \
+ /* TODO: abort? */ \
+ }
+#endif
+
+// Declare here, define at the bottom.
+extern "C" int __tbb_internal_runtime_loader_stub();
+
+namespace tbb {
+
+namespace interface6 {
+
+namespace internal {
+
+namespace runtime_loader {
+
+
+/*
+ ------------------------------------------------------------------------------------------------
+ User interaction utilities.
+ ------------------------------------------------------------------------------------------------
+*/
+
+
+// Print message to stderr. Do not call it directly, use say() or tell() instead.
+static void _say( char const * format, va_list args ) {
+ /*
+ On Linux Intel 64, vsnprintf() modifies args argument, so vsnprintf() crashes if it
+ is called for the second time with the same args. To prevent the crash, we have to
+ pass a fresh intact copy of args to vsnprintf() each time.
+
+ On Windows, unfortunately, standard va_copy() macro is not available. However, it
+ seems vsnprintf() does not modify args argument.
+ */
+ #if ! ( _WIN32 || _WIN64 )
+ va_list _args;
+ __va_copy( _args, args ); // Make copy of args.
+ #define args _args // Substitute args with its copy, _args.
+ #endif
+ int len = vsnprintf( NULL, 0, format, args );
+ #if ! ( _WIN32 || _WIN64 )
+ #undef args // Remove substitution.
+ va_end( _args );
+ #endif
+ char * buf = reinterpret_cast< char * >( malloc( len + 1 ) );
+ if ( buf == NULL ) {
+ abort();
+ } // if
+ vsnprintf( buf, len + 1, format, args );
+ fprintf( stderr, "TBB: %s\n", buf );
+ free( buf );
+} // _say
+
+
+// Debug/test/troubleshooting printing controlled by TBB_VERSION environment variable.
+// To enable printing, the variable must be set and not empty.
+// Do not call it directly, use tell() instead.
+static void _tell( char const * format, va_list args ) {
+ char const * var = getenv( "TBB_VERSION" );
+ if ( var != NULL && var[ 0 ] != 0 ) {
+ _say( format, args );
+ } // if
+} // _tell
+
+
+// Print message to stderr unconditinally.
+static void say( char const * format, ... ) {
+ va_list args;
+ va_start( args, format );
+ _say( format, args );
+ va_end( args );
+} // say
+
+
+// Debug/test/troubleshooting printing controlled by TBB_VERSION environment variable.
+// To enable printing, the variable must be set and not empty.
+static void tell( char const * format, ... ) {
+ va_list args;
+ va_start( args, format );
+ _tell( format, args );
+ va_end( args );
+} // tell
+
+
+// Error reporting utility. Behavior depends on mode.
+static tbb::runtime_loader::error_code error( tbb::runtime_loader::error_mode mode, tbb::runtime_loader::error_code err, char const * format, ... ) {
+ va_list args;
+ va_start( args, format );
+ if ( mode == tbb::runtime_loader::em_abort ) {
+ // In em_abort mode error message printed unconditionally.
+ _say( format, args );
+ } else {
+ // In other modes printing depends on TBB_VERSION environment variable.
+ _tell( format, args );
+ } // if
+ va_end( args );
+ switch ( mode ) {
+ case tbb::runtime_loader::em_abort : {
+ say( "Aborting..." );
+ #if TBB_USE_DEBUG && ( _WIN32 || _WIN64 )
+ DebugBreak();
+ #endif
+ abort();
+ } break;
+ case tbb::runtime_loader::em_throw : {
+ throw err;
+ } break;
+ case tbb::runtime_loader::em_status : {
+ // Do nothing.
+ } break;
+ } // switch
+ return err;
+} // error
+
+
+/*
+ ------------------------------------------------------------------------------------------------
+ General-purpose string manupulation utilities.
+ ------------------------------------------------------------------------------------------------
+*/
+
+
+// Delete character ch from string str in-place.
+static void strip( char * str, char ch ) {
+ int in = 0; // Input character index.
+ int out = 0; // Output character index.
+ for ( ; ; ) {
+ if ( str[ in ] != ch ) {
+ str[ out ] = str[ in ];
+ ++ out;
+ } // if
+ if ( str[ in ] == 0 ) {
+ break;
+ } // if
+ ++ in;
+ } // forever
+} // func strip
+
+
+// Strip trailing whitespaces in-place.
+static void trim( char * str ) {
+ size_t len = strlen( str );
+ while ( len > 0 && isspace( str[ len - 1 ] ) ) {
+ -- len;
+ } // while
+ str[ len ] = 0;
+} // func trim
+
+
+#if _WIN32 || _WIN64
+ // "When specifying a path, be sure to use backslashes (\), not forward slashes (/)."
+ // (see http://msdn.microsoft.com/en-us/library/ms886736.aspx).
+ const char proper_slash = '\\';
+ inline char char_or_slash( char c ) { return c=='/'? '\\': c; }
+#else
+ const char proper_slash = '/';
+ inline char char_or_slash( char c ) { return c; }
+#endif
+
+// Concatenate name of directory and name of file.
+void cat_file( char const * dir, char const * file, char * buffer, size_t len ) {
+ size_t i = 0;
+ // Copy directory name
+ for( ; i<len && *dir; ++i, ++dir ) {
+ buffer[i] = char_or_slash(*dir);
+ }
+ // Append trailing slash if missed.
+ if( i>0 && i<len && buffer[i-1]!=proper_slash ) {
+ buffer[i++] = proper_slash;
+ }
+ // Copy file name
+ __TBB_ASSERT( char_or_slash(*file)!=proper_slash, "File name starts with a slash" );
+ for( ; i<len && *file; ++i, ++file ) {
+ buffer[i] = *file;
+ }
+ // Append null terminator
+ buffer[ i<len? i: len-1 ] = '\0';
+} // cat_file
+
+
+/*
+ ------------------------------------------------------------------------------------------------
+ Windows implementation of dlopen, dlclose, dlsym, dlerror.
+ ------------------------------------------------------------------------------------------------
+*/
+
+
+#if _WIN32 || _WIN64
+
+ // Implement Unix-like interface (dlopen, dlclose, dlsym, dlerror) via Win32 API functions.
+
+ // Type of dlopen result.
+ typedef HMODULE handle_t;
+
+ enum rtld_flags_t {
+ RTLD_NOW,
+ RTLD_GLOBAL
+ }; // enum rtld_flags_t
+
+ // Unix-like dlopen().
+ static handle_t dlopen( char const * name, rtld_flags_t ) {
+ return LoadLibrary( name );
+ } // dlopen
+
+ // Unix-like dlsym().
+ static void * dlsym( handle_t lib, char const * sym ) {
+ return (void*)GetProcAddress( lib, sym );
+ } // dlsym
+
+ // Unix-like dlclose().
+ static int dlclose( handle_t lib ) {
+ return ! FreeLibrary( lib );
+ } // dlclose
+
+ // The function mimics Unix dlerror() function.
+ // Note: Not thread-safe due to statically allocated buffer.
+ static char * dlerror() {
+
+ static char buffer[ 2048 ]; // Note: statically allocated buffer.
+
+ DWORD err = GetLastError();
+ if ( err == ERROR_SUCCESS ) {
+ return NULL;
+ } // if
+
+ DWORD rc;
+ rc =
+ FormatMessage(
+ FORMAT_MESSAGE_FROM_SYSTEM,
+ NULL,
+ err,
+ MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT ), // Default language.
+ reinterpret_cast< LPTSTR >( & buffer ),
+ sizeof( buffer ),
+ NULL
+ );
+ if ( rc == 0 ) {
+ // FormatMessage() failed to format system error message. Buffer to short or another issue.
+ snprintf( buffer, sizeof( buffer ), "System error %u.", err );
+ } 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
+ 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.
+ */
+ strip( buffer, '\r' ); // Delete carriage returns if any.
+ trim( buffer ); // Delete trailing newlines and spaces.
+ } // if
+
+ return buffer;
+
+ } // dlerror
+
+#else
+
+ // Type of dlopen() result.
+ typedef void * handle_t;
+
+#endif
+
+
+/*
+ ------------------------------------------------------------------------------------------------
+ Runtime loader stuff.
+ ------------------------------------------------------------------------------------------------
+*/
+
+
+// Descriptor table declaration. It is defined in assembler file.
+enum symbol_type_t {
+ st_object = 0,
+ st_function = 1
+}; // enum symbol_type_t
+struct symbol_t {
+ void * addr;
+ char const * name;
+ int size;
+ symbol_type_t type;
+}; // symbol_t
+extern "C" symbol_t __tbb_internal_runtime_loader_symbols[];
+
+// Hooks for internal use (e. g. for testing).
+tbb::runtime_loader::error_mode stub_mode = tbb::runtime_loader::em_abort;
+
+static char const * tbb_dll_name = __TBB_STRING(__TBB_DLL_NAME); // Name of TBB library.
+static handle_t handle = NULL; // Handle of loaded TBB library or NULL.
+static int version = 0; // Version of the loaded library.
+static int counter = 0; // Number of runtime_loader objects using the loaded library.
+
+#define ANOTHER_RTL "probably multiple runtime_loader objects work in parallel"
+
+
+// One attempt to load library (dll_name can be a full path or just a file name).
+static tbb::runtime_loader::error_code _load( char const * dll_name, int min_ver, int max_ver ) {
+
+ tbb::runtime_loader::error_mode mode = tbb::runtime_loader::em_status;
+ tbb::runtime_loader::error_code code = tbb::runtime_loader::ec_ok;
+
+ /*
+ If these variables declared at the first usage, Intel compiler (on Windows IA-32) isues
+ warning(s):
+ transfer of control [goto error] bypasses initialization of: ...
+ Declaring variables at the beginning of the function eliminates warnings.
+ */
+ typedef int (*int_func_t)( void );
+ char const * get_ver_name = "TBB_runtime_interface_version"; // Name of function.
+ int_func_t get_ver_func = NULL; // Pointer to function.
+ handle_t _handle = NULL;
+ int _version = 0;
+ int total = 0;
+ int not_found = 0;
+
+ // This function should be called iff there is no loaded library.
+ __TBB_ASSERT( handle == NULL, "Handle is invalid; " ANOTHER_RTL );
+ __TBB_ASSERT( version == 0, "Version is invalid; " ANOTHER_RTL );
+ __TBB_ASSERT( counter == 0, "Counter is invalid; " ANOTHER_RTL );
+
+ tell( "Loading \"%s\"...", dll_name );
+
+ // First load the library.
+ _handle = dlopen( dll_name, RTLD_NOW );
+ if ( _handle == NULL ) {
+ char * msg = dlerror();
+ code = error( mode, tbb::runtime_loader::ec_no_lib, "Loading \"%s\" failed; system error: %s", dll_name, msg );
+ goto error;
+ } // if
+
+ // Then try to find out its version.
+ /*
+ g++ 3.4 issues error:
+ ISO C++ forbids casting between pointer-to-function and pointer-to-object
+ on reinterpret_cast<>. Thus, we have no choice but using C-style type cast.
+ */
+ get_ver_func = (int_func_t) dlsym( _handle, get_ver_name );
+ if ( get_ver_func == NULL ) {
+ code = error( mode, tbb::runtime_loader::ec_bad_lib, "Symbol \"%s\" not found; library rejected.", get_ver_name );
+ goto error;
+ } // if
+ _version = get_ver_func();
+ if ( ! ( min_ver <= _version && _version <= max_ver ) ) {
+ code = error( mode, tbb::runtime_loader::ec_bad_ver, "Version %d is out of requested range; library rejected.", _version );
+ goto error;
+ } // if
+
+ // Library is suitable. Mark it as loaded.
+ handle = _handle;
+ version = _version;
+ counter += 1;
+ __TBB_ASSERT( counter == 1, "Counter is invalid; " ANOTHER_RTL );
+
+ // Now search for all known symbols.
+ for ( int i = 0; __tbb_internal_runtime_loader_symbols[ i ].name != NULL; ++ i ) {
+ symbol_t & symbol = __tbb_internal_runtime_loader_symbols[ i ];
+ // Verify symbol descriptor.
+ __TBB_ASSERT( symbol.type == st_object || symbol.type == st_function, "Invalid symbol type" );
+ #if _WIN32 || _WIN64
+ __TBB_ASSERT( symbol.type == st_function, "Should not be symbols of object type on Windows" );
+ #endif
+ if ( symbol.type == st_object ) {
+ __TBB_ASSERT( symbol.addr != NULL, "Object address invalid" );
+ __TBB_ASSERT( symbol.size > 0, "Symbol size must be > 0" );
+ __TBB_ASSERT( symbol.size <= 0x1000, "Symbol size too big" );
+ } else { // Function
+ // __TBB_ASSERT( symbol.addr == reinterpret_cast< void * >( & stub ), "Invalid symbol address" );
+ __TBB_ASSERT( symbol.size == sizeof( void * ), "Invalid symbol size" );
+ } // if
+ void * addr = dlsym( _handle, symbol.name );
+ if ( addr != NULL ) {
+ if ( symbol.type == st_object ) {
+ if ( strncmp( symbol.name, "_ZTS", 4 ) == 0 ) {
+ // If object name begins with "_ZTS", it is a string, mangled type name.
+ // Its value must equal to name of symbol without "_ZTS" prefix.
+ char const * name = static_cast< char const * >( addr );
+ __TBB_ASSERT( strlen( name ) + 1 == size_t( symbol.size ), "Unexpected size of typeinfo name" );
+ __TBB_ASSERT( strcmp( symbol.name + 4, name ) == 0, "Unexpected content of typeinfo name" );
+ strncpy( reinterpret_cast< char * >( symbol.addr ), name, symbol.size );
+ reinterpret_cast< char * >( symbol.addr )[ symbol.size - 1 ] = 0;
+ } else {
+ #if TBB_USE_ASSERT
+ // If object name begins with "_ZTI", it is an object of std::type_info class.
+ // Its protected value must equal to name of symbol without "_ZTI" prefix.
+ if ( strncmp( symbol.name, "_ZTI", 4 ) == 0 ) {
+ std::type_info const * info = static_cast< std::type_info const * >( addr );
+ __TBB_ASSERT( size_t( symbol.size ) >= sizeof( std::type_info ), "typeinfo size is too small" );
+ // std::type_info::name is not a virtual method, it is safe to call it.
+ __TBB_ASSERT( strcmp( symbol.name + 4, info->name() ) == 0, "Unexpected content of typeinfo" );
+ } // if
+ #endif
+ // Copy object content from libtbb into runtime_loader.
+ memcpy( symbol.addr, addr, symbol.size );
+ }; // if
+ } else { // Function
+ symbol.addr = addr;
+ } // if
+ } else {
+ char const * msg = dlerror();
+ tell( "Symbol \"%s\" not found; system error: %s", symbol.name, msg );
+ ++ not_found;
+ } // if
+ ++ total;
+ } // for i
+
+ if ( not_found > 0 ) {
+ tell( "%d of %d symbols not found.", not_found, total );
+ } // if
+
+ tell( "The library successfully loaded." );
+ return code;
+
+ error:
+ if ( _handle != NULL ) {
+ int rc = dlclose( _handle );
+ if ( rc != 0 ) {
+ // Error occured.
+ __TBB_ASSERT( rc != 0, "Unexpected error: dlclose() failed" );
+ } // if
+ } // if
+ _handle = NULL;
+ return code;
+
+} // _load
+
+
+static tbb::runtime_loader::error_code load( tbb::runtime_loader::error_mode mode, char const * path[], int min_ver, int max_ver ) {
+ // Check arguments first.
+ if ( min_ver <= 0 ) {
+ return error( mode, tbb::runtime_loader::ec_bad_arg, "tbb::runtime_loader::load(): Invalid value of min_ver argument: %d.", min_ver );
+ } // if
+ if ( max_ver <= 0 ) {
+ return error( mode, tbb::runtime_loader::ec_bad_arg, "tbb::runtime_loader::load(): Invalid value of max_ver argument: %d.", max_ver );
+ } // if
+ if ( min_ver > max_ver ) {
+ return error( mode, tbb::runtime_loader::ec_bad_arg, "tbb::runtime_loader::load(): min_ver and max_ver specify empty range: [%d, %d].", min_ver, max_ver );
+ } // if
+ if ( min_ver == max_ver ) {
+ tell( "Searching for \"%s\" version %d...", tbb_dll_name, min_ver );
+ } else if ( max_ver == INT_MAX ) {
+ tell( "Searching for \"%s\" version %d+...", tbb_dll_name, min_ver );
+ } else {
+ tell( "Searching for \"%s\" version in range [%d, %d]...", tbb_dll_name, min_ver, max_ver );
+ } // if
+ // Then check whether a library already loaded.
+ if ( handle != NULL ) {
+ // Library already loaded. Check whether the version is compatible.
+ __TBB_ASSERT( version > 0, "Version is invalid; " ANOTHER_RTL );
+ __TBB_ASSERT( counter > 0, "Counter is invalid; " ANOTHER_RTL );
+ if ( min_ver <= version && version <= max_ver ) {
+ // Version is ok, let us use this library.
+ tell( "Library version %d is already loaded.", version );
+ counter += 1;
+ return tbb::runtime_loader::ec_ok;
+ } else {
+ // Version is not suitable.
+ return error( mode, tbb::runtime_loader::ec_bad_ver, "Library version %d is already loaded.", version );
+ } // if
+ } // if
+ // There is no loaded library, try to load it using provided directories.
+ __TBB_ASSERT( version == 0, "Version is invalid; " ANOTHER_RTL );
+ __TBB_ASSERT( counter == 0, "Counter is invalid; " ANOTHER_RTL );
+ size_t namelen = strlen(tbb_dll_name);
+ size_t buflen = 0;
+ char * buffer = NULL;
+ for ( int i = 0; path[i] != NULL; ++ i ) {
+ size_t len = strlen(path[i]) + namelen + 2; // 1 for slash and 1 for null terminator
+ if( buflen<len ) {
+ free( buffer );
+ buflen = len;
+ buffer = (char*)malloc( buflen );
+ }
+ cat_file( path[i], tbb_dll_name, buffer, buflen );
+ __TBB_ASSERT(strstr(buffer,tbb_dll_name), "Name concatenation error");
+ tbb::runtime_loader::error_code ec = _load( buffer, min_ver, max_ver );
+ if ( ec == tbb::runtime_loader::ec_ok ) {
+ return ec; // Success. Exiting...
+ } // if
+ } // for i
+ free( buffer );
+ return error( mode, tbb::runtime_loader::ec_no_lib, "No suitable library found." );
+} // load
+
+
+
+
+// Supress "defined but not used" compiler warnings.
+static void const * dummy[] = {
+ (void *) & strip,
+ (void *) & trim,
+ & dummy,
+ NULL
+};
+
+
+} // namespace runtime_loader
+
+} // namespace internal
+
+
+runtime_loader::runtime_loader( error_mode mode ) :
+ my_mode( mode ),
+ my_status( ec_ok ),
+ my_loaded( false )
+{
+} // ctor
+
+
+runtime_loader::runtime_loader( char const * path[], int min_ver, int max_ver, error_mode mode ) :
+ my_mode( mode ),
+ my_status( ec_ok ),
+ my_loaded( false )
+{
+ load( path, min_ver, max_ver );
+} // ctor
+
+
+runtime_loader::~runtime_loader() {
+} // dtor
+
+
+tbb::runtime_loader::error_code runtime_loader::load( char const * path[], int min_ver, int max_ver ) {
+ if ( my_loaded ) {
+ my_status = tbb::interface6::internal::runtime_loader::error( my_mode, ec_bad_call, "tbb::runtime_loader::load(): Library already loaded by this runtime_loader object." );
+ } else {
+ my_status = internal::runtime_loader::load( my_mode, path, min_ver, max_ver );
+ if ( my_status == ec_ok ) {
+ my_loaded = true;
+ } // if
+ } // if
+ return my_status;
+} // load
+
+
+
+
+tbb::runtime_loader::error_code runtime_loader::status() {
+ return my_status;
+} // status
+
+
+} // namespace interface6
+
+} // namespace tbb
+
+
+// Stub function replaces all TBB entry points when no library is loaded.
+int __tbb_internal_runtime_loader_stub() {
+ char const * msg = NULL;
+ if ( tbb::interface6::internal::runtime_loader::handle == NULL ) {
+ msg = "A function is called while TBB library is not loaded";
+ } else {
+ msg = "A function is called which is not present in loaded TBB library";
+ } // if
+ return tbb::interface6::internal::runtime_loader::error( tbb::interface6::internal::runtime_loader::stub_mode, tbb::runtime_loader::ec_no_lib, msg );
+} // stub
+
+
+// end of file //
diff --git a/src/test/harness.h b/src/test/harness.h
index c2c27cc..c4d318a 100644
--- a/src/test/harness.h
+++ b/src/test/harness.h
@@ -50,7 +50,7 @@ namespace Harness {
/** It MUST be defined by the test application.
If HARNESS_NO_PARSE_COMMAND_LINE macro was not explicitly set before including harness.h,
- then global variables Verbose, MinThread, and MaxThread will be available and
+ then global variables MinThread, and MaxThread will be available and
initialized when it is called.
Returns Harness::Done when the tests passed successfully. When the test fail, it must
@@ -214,19 +214,70 @@ static void ParseCommandLine( int argc, char* argv[] ) {
}
#endif /* HARNESS_NO_PARSE_COMMAND_LINE */
+#if HARNESS_USE_PROXY
+ #define TBB_PREVIEW_RUNTIME_LOADER 1
+ #include "tbb/runtime_loader.h"
+ static char const * _path[] = { ".", NULL };
+ static tbb::runtime_loader _runtime_loader( _path );
+#endif // HARNESS_USE_PROXY
+
#if !HARNESS_CUSTOM_MAIN
+#if __TBB_MPI_INTEROP
+#undef SEEK_SET
+#undef SEEK_CUR
+#undef SEEK_END
+#include "mpi.h"
+#endif
+
HARNESS_EXPORT
#if HARNESS_NO_PARSE_COMMAND_LINE
int main() {
+#if __TBB_MPI_INTEROP
+ MPI_Init(NULL,NULL);
+#endif
#else
int main(int argc, char* argv[]) {
ParseCommandLine( argc, argv );
+#if __TBB_MPI_INTEROP
+ MPI_Init(&argc,&argv);
+#endif
+#endif
+#if __TBB_MPI_INTEROP
+ // Simple TBB/MPI interoperability harness for most of tests
+ // Worker processes send blocking messages to the master process about their rank and group size
+ // Master process receives this info and print it in verbose mode
+ int rank, size, myrank;
+ MPI_Status status;
+ MPI_Comm_size(MPI_COMM_WORLD,&size);
+ MPI_Comm_rank(MPI_COMM_WORLD,&myrank);
+ if (myrank == 0) {
+#if !HARNESS_NO_PARSE_COMMAND_LINE
+ REMARK("Hello mpi world. I am %d of %d\n", myrank, size);
+#endif
+ for ( int i = 1; i < size; i++ ) {
+ MPI_Recv (&rank, 1, MPI_INT, i, 1, MPI_COMM_WORLD, &status);
+ MPI_Recv (&size, 1, MPI_INT, i, 1, MPI_COMM_WORLD, &status);
+#if !HARNESS_NO_PARSE_COMMAND_LINE
+ REMARK("Hello mpi world. I am %d of %d\n", rank, size);
+#endif
+ }
+ } else {
+ MPI_Send (&myrank, 1, MPI_INT, 0, 1, MPI_COMM_WORLD);
+ MPI_Send (&size, 1, MPI_INT, 0, 1, MPI_COMM_WORLD);
+ }
#endif
int res = TestMain ();
ASSERT( res==Harness::Done || res==Harness::Skipped, "Wrong return code by TestMain");
+#if __TBB_MPI_INTEROP
+ if (myrank == 0) {
+ REPORT( res==Harness::Done ? "done\n" : "skip\n" );
+ }
+ MPI_Finalize();
+#else
REPORT( res==Harness::Done ? "done\n" : "skip\n" );
+#endif
return 0;
}
@@ -308,6 +359,9 @@ public:
int status = pthread_join( thread_id, NULL );
ASSERT( !status, "pthread_join failed" );
#endif
+#if HARNESS_NO_ASSERT
+ (void)status;
+#endif
}
private:
diff --git a/src/test/harness_allocator.h b/src/test/harness_allocator.h
index b31f34b..531fad4 100644
--- a/src/test/harness_allocator.h
+++ b/src/test/harness_allocator.h
@@ -87,6 +87,9 @@ public:
static_counting_allocator() throw() { }
+ static_counting_allocator(const base_alloc_t& src) throw()
+ : base_alloc_t(src) { }
+
static_counting_allocator(const static_counting_allocator& src) throw()
: base_alloc_t(src) { }
@@ -94,9 +97,6 @@ public:
static_counting_allocator(const static_counting_allocator<U, C>& src) throw()
: base_alloc_t(src) { }
- bool operator==(const static_counting_allocator &a) const
- { return true; }
-
pointer allocate(const size_type n)
{
if(verbose) printf("\t+%d|", int(n));
diff --git a/src/test/harness_graph.h b/src/test/harness_graph.h
index 4fc2327..e56672e 100644
--- a/src/test/harness_graph.h
+++ b/src/test/harness_graph.h
@@ -34,10 +34,53 @@
#define harness_graph_H
#include "harness.h"
-#define TBB_PREVIEW_GRAPH 1
-#include "tbb/graph.h"
+#include "tbb/flow_graph.h"
#include "tbb/null_rw_mutex.h"
#include "tbb/atomic.h"
+#include "tbb/concurrent_unordered_map.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,
+// only in these tests.
+template<typename InputType, typename OutputType>
+struct convertor {
+ static OutputType convert_value(const InputType &i) {
+ return OutputType(i);
+ }
+};
+
+template<typename InputType>
+struct convertor<InputType,tbb::flow::continue_msg> {
+ static tbb::flow::continue_msg convert_value(const InputType &/*i*/) {
+ return tbb::flow::continue_msg();
+ }
+};
+
+template<typename OutputType>
+struct convertor<tbb::flow::continue_msg,OutputType> {
+ static OutputType convert_value(const tbb::flow::continue_msg &/*i*/) {
+ return OutputType();
+ }
+};
+
+// helper for multioutput_function_node tests.
+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) {
+ std::get<N-1>(p).put(convertor<InputType,typename std::tuple_element<N-1,ports_type>::type::output_type>::convert_value(i));
+ output_converted_value<N-1>(i, p);
+ }
+};
+
+template<>
+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
+ std::get<0>(p).put(convertor<InputType,typename std::tuple_element<0,ports_type>::type::output_type>::convert_value(i));
+ }
+};
template< typename InputType, typename OutputType >
struct harness_graph_default_functor {
@@ -47,25 +90,36 @@ struct harness_graph_default_functor {
};
template< typename OutputType >
-struct harness_graph_default_functor< tbb::continue_msg, OutputType > {
- static OutputType construct( tbb::continue_msg ) {
+struct harness_graph_default_functor< tbb::flow::continue_msg, OutputType > {
+ static OutputType construct( tbb::flow::continue_msg ) {
return OutputType();
}
};
template< typename InputType >
-struct harness_graph_default_functor< InputType, tbb::continue_msg > {
- static tbb::continue_msg construct( InputType ) {
- return tbb::continue_msg();
+struct harness_graph_default_functor< InputType, tbb::flow::continue_msg > {
+ static tbb::flow::continue_msg construct( InputType ) {
+ return tbb::flow::continue_msg();
}
};
template< >
-struct harness_graph_default_functor< tbb::continue_msg, tbb::continue_msg > {
- static tbb::continue_msg construct( tbb::continue_msg ) {
- return tbb::continue_msg();
+struct harness_graph_default_functor< tbb::flow::continue_msg, tbb::flow::continue_msg > {
+ static tbb::flow::continue_msg construct( tbb::flow::continue_msg ) {
+ return tbb::flow::continue_msg();
+ }
+};
+
+#if TBB_PREVIEW_GRAPH_NODES
+template<typename InputType, typename OutputSet>
+struct harness_graph_default_multioutput_functor {
+ static const int N = std::tuple_size<OutputSet>::value;
+ typedef typename tbb::flow::multioutput_function_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);
}
};
+#endif
static tbb::atomic<size_t> current_executors;
@@ -91,11 +145,15 @@ struct harness_graph_executor {
}
struct functor {
- OutputType operator()( InputType i ) const {
+ tbb::atomic<size_t> my_execute_count;
+ functor() { my_execute_count = 0; }
+ functor( const functor &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;
+ my_execute_count.fetch_and_increment();
OutputType v2 = (*harness_graph_executor::fptr)(i);
current_executors.fetch_and_decrement();
return v2;
@@ -104,6 +162,49 @@ struct harness_graph_executor {
};
+#if TBB_PREVIEW_GRAPH_NODES
+//! A multioutput executor that accepts InputType and has only one Output of OutputType.
+template< typename InputType, typename OutputTuple, typename M=tbb::null_rw_mutex >
+struct harness_graph_multioutput_executor {
+ typedef typename tbb::flow::multioutput_function_node<InputType,OutputTuple>::output_ports_type ports_type;
+ typedef typename std::tuple_element<0,OutputTuple>::type OutputType;
+
+ typedef void (*mfunction_ptr_type)( const InputType& v, ports_type &p );
+
+ static M mutex;
+ static mfunction_ptr_type fptr;
+ static tbb::atomic<size_t> execute_count;
+ 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();
+ ASSERT( max_executors == 0 || c <= max_executors, NULL );
+ ASSERT(std::tuple_size<OutputTuple>::value == 1, NULL);
+ ++execute_count;
+ (*fptr)(v,p);
+ current_executors.fetch_and_decrement();
+ }
+
+ struct functor {
+ tbb::atomic<size_t> my_execute_count;
+ functor() { my_execute_count = 0; }
+ functor( const functor &f ) { my_execute_count = f.my_execute_count; }
+ void operator()( const InputType &i, ports_type &p ) {
+ typename M::scoped_lock l( harness_graph_multioutput_executor::mutex );
+ size_t c = current_executors.fetch_and_increment();
+ ASSERT( harness_graph_multioutput_executor::max_executors == 0 || c <= harness_graph_multioutput_executor::max_executors, NULL );
+ ++execute_count;
+ my_execute_count.fetch_and_increment();
+ (*harness_graph_multioutput_executor::fptr)(i,p);
+ current_executors.fetch_and_decrement();
+ }
+ };
+
+};
+#endif // TBB_PREVIEW_GRAPH_NODES
+
template< typename InputType, typename OutputType, typename M >
M harness_graph_executor<InputType, OutputType, M>::mutex;
@@ -117,27 +218,112 @@ typename harness_graph_executor<InputType, OutputType, M>::function_ptr_type har
template< typename InputType, typename OutputType, typename M >
size_t harness_graph_executor<InputType, OutputType, M>::max_executors = 0;
+#if TBB_PREVIEW_GRAPH_NODES
+// static vars for multioutput_function_node tests
+template< typename InputType, typename OutputTuple, typename M >
+M harness_graph_multioutput_executor<InputType, OutputTuple, M>::mutex;
+
+template< typename InputType, typename OutputTuple, typename M >
+tbb::atomic<size_t> harness_graph_multioutput_executor<InputType, OutputTuple, M>::execute_count;
+
+template< typename InputType, typename OutputTuple, typename M >
+typename harness_graph_multioutput_executor<InputType, OutputTuple, M>::mfunction_ptr_type harness_graph_multioutput_executor<InputType, OutputTuple, M>::fptr
+ = harness_graph_default_multioutput_functor< InputType, OutputTuple >::construct;
+
+template< typename InputType, typename OutputTuple, typename M >
+size_t harness_graph_multioutput_executor<InputType, OutputTuple, M>::max_executors = 0;
+#endif
+
//! Counts the number of puts received
template< typename T >
-struct harness_counting_receiver : public tbb::receiver<T>, NoCopy {
+struct harness_counting_receiver : public tbb::flow::receiver<T>, NoCopy {
tbb::atomic< size_t > my_count;
+ T max_value;
+ size_t num_copies;
- harness_counting_receiver() {
+ harness_counting_receiver() : num_copies(1) {
my_count = 0;
}
- /* override */ bool try_put( T ) {
+ void initialize_map( const T& m, size_t c ) {
+ my_count = 0;
+ max_value = m;
+ num_copies = c;
+ }
+
+ /* override */ bool try_put( const T & ) {
++my_count;
return true;
}
+
+ void validate() {
+ size_t n = my_count;
+ ASSERT( n == num_copies*max_value, NULL );
+ }
+
+};
+
+//! Counts the number of puts received
+template< typename T >
+struct harness_mapped_receiver : public tbb::flow::receiver<T>, NoCopy {
+
+ tbb::atomic< size_t > my_count;
+ T max_value;
+ size_t num_copies;
+ typedef tbb::concurrent_unordered_map< T, tbb::atomic< size_t > > map_type;
+ map_type *my_map;
+
+ harness_mapped_receiver() : my_map(NULL) {
+ my_count = 0;
+ }
+
+ ~harness_mapped_receiver() {
+ if ( my_map ) delete my_map;
+ }
+
+ void initialize_map( const T& m, size_t c ) {
+ my_count = 0;
+ max_value = m;
+ num_copies = c;
+ if ( my_map ) delete my_map;
+ my_map = new map_type;
+ }
+
+ /* override */ bool try_put( const T &t ) {
+ if ( my_map ) {
+ tbb::atomic<size_t> a;
+ a = 1;
+ std::pair< typename map_type::iterator, bool > r = (*my_map).insert( typename map_type::value_type( t, a ) );
+ if ( r.second == false ) {
+ size_t v = r.first->second.fetch_and_increment();
+ ASSERT( v < num_copies, NULL );
+ }
+ } else {
+ ++my_count;
+ }
+ return true;
+ }
+
+ void validate() {
+ if ( my_map ) {
+ for ( size_t i = 0; i < (size_t)max_value; ++i ) {
+ size_t n = (*my_map)[(int)i];
+ ASSERT( n == num_copies, NULL );
+ }
+ } else {
+ size_t n = my_count;
+ ASSERT( n == num_copies*max_value, NULL );
+ }
+ }
+
};
//! Counts the number of puts received
template< typename T >
-struct harness_counting_sender : public tbb::sender<T>, NoCopy {
+struct harness_counting_sender : public tbb::flow::sender<T>, NoCopy {
- typedef tbb::receiver<T> successor_type;
+ typedef tbb::flow::receiver<T> successor_type;
tbb::atomic< successor_type * > my_receiver;
tbb::atomic< size_t > my_count;
tbb::atomic< size_t > my_received;
@@ -198,6 +384,16 @@ struct harness_counting_sender : public tbb::sender<T>, NoCopy {
}
}
+ void try_put_until_limit() {
+ successor_type *s = my_receiver;
+
+ for ( int i = 0; i < (int)my_limit; ++i ) {
+ ASSERT( s->try_put( T(i) ), NULL );
+ ++my_received;
+ }
+ ASSERT( my_received == my_limit, NULL );
+ }
+
};
#endif
diff --git a/src/test/harness_inject_scheduler.h b/src/test/harness_inject_scheduler.h
index 019a3d4..10f2b6e 100644
--- a/src/test/harness_inject_scheduler.h
+++ b/src/test/harness_inject_scheduler.h
@@ -59,6 +59,7 @@
#include "../tbb/spin_rw_mutex.cpp"
#include "../tbb/spin_mutex.cpp"
#include "../tbb/private_server.cpp"
+#include "../tbb/semaphore.cpp"
#include "../rml/client/rml_tbb.cpp"
#endif /* harness_inject_scheduler_H */
diff --git a/src/test/harness_iterator.h b/src/test/harness_iterator.h
index fbfd697..f553ecb 100644
--- a/src/test/harness_iterator.h
+++ b/src/test/harness_iterator.h
@@ -103,6 +103,31 @@ public:
RandomIterator operator+ (difference_type n) {return RandomIterator(my_ptr + n);}
};
+template <class T>
+class ConstRandomIterator {
+ const T * my_ptr;
+#if !HARNESS_EXTENDED_STD_COMPLIANCE
+ typedef typename std::allocator<T>::difference_type difference_type;
+#endif
+
+public:
+#if HARNESS_EXTENDED_STD_COMPLIANCE
+ typedef std::random_access_iterator_tag iterator_category;
+ typedef T value_type;
+ typedef typename std::allocator<T>::const_pointer pointer;
+ typedef typename std::allocator<T>::const_reference reference;
+ typedef typename std::allocator<T>::difference_type difference_type;
+#endif /* HARNESS_EXTENDED_STD_COMPLIANCE */
+
+ explicit ConstRandomIterator ( const T * ptr ) : my_ptr(ptr){}
+ ConstRandomIterator ( const ConstRandomIterator& r ) : my_ptr(r.my_ptr){}
+ const T& operator* () { return *my_ptr; }
+ ConstRandomIterator& operator++ () { ++my_ptr; return *this; }
+ bool operator== ( const ConstRandomIterator& r ) { return my_ptr == r.my_ptr; }
+ difference_type operator- (const ConstRandomIterator &r) {return my_ptr - r.my_ptr;}
+ ConstRandomIterator operator+ (difference_type n) {return ConstRandomIterator(my_ptr + n);}
+};
+
} // namespace Harness
#if !HARNESS_EXTENDED_STD_COMPLIANCE
@@ -111,18 +136,28 @@ namespace std {
struct iterator_traits< Harness::InputIterator<T> > {
typedef std::input_iterator_tag iterator_category;
typedef T value_type;
+ typedef value_type& reference;
};
template<typename T>
struct iterator_traits< Harness::ForwardIterator<T> > {
typedef std::forward_iterator_tag iterator_category;
typedef T value_type;
+ typedef value_type& reference;
};
template<typename T>
struct iterator_traits< Harness::RandomIterator<T> > {
typedef std::random_access_iterator_tag iterator_category;
typedef T value_type;
+ typedef value_type& reference;
+ };
+
+ template<typename T>
+ struct iterator_traits< Harness::ConstRandomIterator<T> > {
+ typedef std::random_access_iterator_tag iterator_category;
+ typedef T value_type;
+ typedef const value_type& reference;
};
} // namespace std
#endif /* !HARNESS_EXTENDED_STD_COMPLIANCE */
diff --git a/src/test/harness_m128.h b/src/test/harness_m128.h
index 931bafc..5a1a15a 100644
--- a/src/test/harness_m128.h
+++ b/src/test/harness_m128.h
@@ -26,56 +26,87 @@
the GNU General Public License.
*/
-// Header that sets HAVE_m128 if we have type __m128
+// Header that sets HAVE_m128/HAVE_m256 if vector types (__m128/__m256) are available
-#if (__SSE__||_M_IX86) && !defined(__sun)
-#include <xmmintrin.h>
-#define HAVE_m128 1
-
-//! Class for testing safety of using __m128
-/** Uses circuitous logic forces compiler to put __m128 objects on stack while
+//! Class for testing safety of using vector types.
+/** Uses circuitous logic forces compiler to put __m128/__m256 objects on stack while
executing various methods, and thus tempt it to use aligned loads and stores
on the stack. */
// 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.
-class ClassWithSSE {
+
+template<typename __Mvec>
+class ClassWithVectorType {
static const int n = 16;
- __m128 field[n];
+ static const int F = sizeof(__Mvec)/sizeof(float);
+ __Mvec field[n];
void init( int start );
public:
- ClassWithSSE() {init(-n);}
- ClassWithSSE( int i ) {init(i);}
- void operator=( const ClassWithSSE& src ) {
- __m128 stack[n];
+ ClassWithVectorType() {init(-n);}
+ ClassWithVectorType( int i ) {init(i);}
+ void operator=( const ClassWithVectorType& src ) {
+ __Mvec stack[n];
for( int i=0; i<n; ++i )
stack[i^5] = src.field[i];
for( int i=0; i<n; ++i )
field[i^5] = stack[i];
}
- ~ClassWithSSE() {init(-2*n);}
- friend bool operator==( const ClassWithSSE& x, const ClassWithSSE& y ) {
- for( int i=0; i<4*n; ++i )
+ ~ClassWithVectorType() {init(-2*n);}
+ friend bool operator==( const ClassWithVectorType& x, const ClassWithVectorType& y ) {
+ for( int i=0; i<F*n; ++i )
if( ((const float*)x.field)[i]!=((const float*)y.field)[i] )
return false;
return true;
}
- friend bool operator!=( const ClassWithSSE& x, const ClassWithSSE& y ) {
+ friend bool operator!=( const ClassWithVectorType& x, const ClassWithVectorType& y ) {
return !(x==y);
}
};
-void ClassWithSSE::init( int start ) {
- __m128 stack[n];
+template<typename __Mvec>
+void ClassWithVectorType<__Mvec>::init( int start ) {
+ __Mvec stack[n];
for( int i=0; i<n; ++i ) {
// Declaring value as a one-element array instead of a scalar quites
// gratuitous warnings about possible use of "value" before it was set.
- __m128 value[1];
- for( int j=0; j<4; ++j )
- ((float*)value)[j] = float(n*start+4*i+j);
+ __Mvec value[1];
+ for( int j=0; j<F; ++j )
+ ((float*)value)[j] = float(n*start+F*i+j);
stack[i^5] = value[0];
}
for( int i=0; i<n; ++i )
field[i^5] = stack[i];
}
-#endif /* __SSE__||_M_IX86 */
+#if (__AVX__ || (_MSC_VER>=1600 && _M_X64)) && !defined(__sun)
+#include <immintrin.h>
+#define HAVE_m256 1
+typedef ClassWithVectorType<__m256> ClassWithAVX;
+#if _MSC_VER
+#include <intrin.h> // for __cpuid
+#endif
+bool have_AVX() {
+ bool result = false;
+ const int avx_mask = 1<<28;
+#if _MSC_VER || __INTEL_COMPILER
+ int info[4] = {0,0,0,0};
+ const int ECX = 2;
+ __cpuid(info, 1);
+ result = (info[ECX] & avx_mask)!=0;
+#elif __GNUC__
+ int ECX;
+ __asm__( "cpuid"
+ : "=c"(ECX)
+ : "a" (1)
+ : "ebx", "edx" );
+ result = (ECX & avx_mask);
+#endif
+ return result;
+}
+#endif /* __AVX__ etc */
+
+#if (__SSE__ || _M_IX86_FP || _M_X64) && !defined(__sun)
+#include <xmmintrin.h>
+#define HAVE_m128 1
+typedef ClassWithVectorType<__m128> ClassWithSSE;
+#endif
diff --git a/examples/task_priority/fractal/fractal_video.h b/src/test/harness_task.h
similarity index 58%
copy from examples/task_priority/fractal/fractal_video.h
copy to src/test/harness_task.h
index 6608ba9..ea6bc41 100644
--- a/examples/task_priority/fractal/fractal_video.h
+++ b/src/test/harness_task.h
@@ -26,49 +26,38 @@
the GNU General Public License.
*/
-#ifndef FRACTAL_VIDEO_H_
-#define FRACTAL_VIDEO_H_
-
-#include "../../common/gui/video.h"
-#include "fractal.h"
-
-extern video *v;
-extern bool single;
-
-class fractal_video : public video
-{
- fractal_group *fg;
-
-private:
- void on_mouse( int x, int y, int key ) {
- if( key == 1 ) {
- if ( fg ) {
- fg->mouse_click( x, y );
+#include "tbb/task.h"
+#include "harness.h"
+
+//! Helper for verifying that old use cases of spawn syntax still work.
+tbb::task* GetTaskPtr( int& counter ) {
+ ++counter;
+ return NULL;
+}
+
+class TaskGenerator: public tbb::task {
+ int m_ChildCount;
+ int m_Depth;
+
+public:
+ TaskGenerator( int child_count, int _depth ) : m_ChildCount(child_count), m_Depth(_depth) {}
+ ~TaskGenerator( ) { m_ChildCount = m_Depth = -125; }
+
+ /*override*/ tbb::task* execute() {
+ ASSERT( m_ChildCount>=0 && m_Depth>=0, NULL );
+ if( m_Depth>0 ) {
+ recycle_as_safe_continuation();
+ set_ref_count( m_ChildCount+1 );
+ int k=0;
+ for( int j=0; j<m_ChildCount; ++j ) {
+ tbb::task& t = *new( allocate_child() ) TaskGenerator(m_ChildCount/2,m_Depth-1);
+ GetTaskPtr(k)->spawn(t);
}
+ ASSERT(k==m_ChildCount,NULL);
+ --m_Depth;
+ __TBB_Yield();
+ ASSERT( state()==recycle && ref_count()>0, NULL);
}
- }
-
- void on_key( int key ) {
- switch ( key&0xff ) {
- case 27: running = false;
- }
- }
-
- void on_process() {
- if ( fg ) {
- fg->run( !single );
- }
- }
-
-public:
- fractal_video() :fg(0) {
- title = "Fractal Example";
- v = this;
- }
-
- void set_fractal_group( fractal_group &_fg ) {
- fg = &_fg;
+ return NULL;
}
};
-
-#endif /* FRACTAL_VIDEO_H_ */
diff --git a/src/test/harness_tbb_independence.h b/src/test/harness_tbb_independence.h
index 2716d5e..0d69873 100644
--- a/src/test/harness_tbb_independence.h
+++ b/src/test/harness_tbb_independence.h
@@ -52,8 +52,29 @@ int32_t __TBB_machine_fetchadd4__TBB_full_fence (volatile void *ptr, int32_t val
return result;
}
+int64_t __TBB_machine_fetchadd8__TBB_full_fence (volatile void *ptr, int64_t value)
+{
+ pthread_mutex_lock(&counter_mutex);
+ int32_t result = *(int32_t*)ptr;
+ *(int32_t*)ptr = result + value;
+ pthread_mutex_unlock(&counter_mutex);
+ return result;
+}
+
void __TBB_machine_pause(int32_t /*delay*/) { __TBB_Yield(); }
+pthread_mutex_t cas_mutex = PTHREAD_MUTEX_INITIALIZER;
+
+extern "C" int64_t __TBB_machine_cmpswp8__TBB_full_fence(volatile void *ptr, int64_t value, int64_t comparand)
+{
+ pthread_mutex_lock(&cas_mutex);
+ int64_t result = *(int64_t*)ptr;
+ if (result == comparand)
+ *(int64_t*)ptr = value;
+ pthread_mutex_unlock(&cas_mutex);
+ return result;
+}
+
#elif _WIN64 && defined(_M_X64) && !__MINGW64__
#define __TBB_NO_IMPLICIT_LINKAGE 1
@@ -67,4 +88,6 @@ void __TBB_machine_pause(__int32 /*delay*/ ) { __TBB_Yield(); }
#endif /* _WIN64 */
+extern "C" void ITT_DoOneTimeInitialization() { }
+
#endif // harness_tbb_independence_H
diff --git a/src/test/test_ScalableAllocator.cpp b/src/test/test_ScalableAllocator.cpp
index a43f4aa..46bcad1 100644
--- a/src/test/test_ScalableAllocator.cpp
+++ b/src/test/test_ScalableAllocator.cpp
@@ -28,17 +28,59 @@
// Test whether scalable_allocator complies with the requirements in 20.1.5 of ISO C++ Standard (1998).
-#define HARNESS_NO_PARSE_COMMAND_LINE 1
+#define __TBB_EXTRA_DEBUG 1 // enables additional checks
+#define TBB_PREVIEW_MEMORY_POOL 1
+#include "harness_assert.h"
+#if __linux__ && __ia64__
+// Currently pools high-level interface has dependency to TBB library
+// to get atomics. For sake of testing add rudementary implementation of them.
+#include "harness_tbb_independence.h"
+#endif
+#include "tbb/memory_pool.h"
#include "tbb/scalable_allocator.h"
// the actual body of the test is there:
#include "test_allocator.h"
+#include "harness_allocator.h"
#if _MSC_VER
#include "tbb/machine/windows_api.h"
#endif /* _MSC_VER */
+typedef static_counting_allocator<tbb::memory_pool_allocator<char> > cnt_alloc_t;
+typedef local_counting_allocator<std::allocator<char> > cnt_provider_t;
+class MinimalAllocator : cnt_provider_t {
+public:
+ typedef char value_type;
+ MinimalAllocator() {
+ REMARK("%p::ctor\n", this);
+ }
+ MinimalAllocator(const MinimalAllocator&s) : cnt_provider_t(s) {
+ REMARK("%p::ctor(%p)\n", this, &s);
+ }
+ ~MinimalAllocator() {
+ REMARK("%p::dtor: alloc=%u/%u free=%u/%u\n", this,
+ unsigned(items_allocated),unsigned(allocations),
+ unsigned(items_freed), unsigned(frees) );
+ ASSERT(allocations==frees && items_allocated==items_freed,0);
+ if( allocations ) { // non-temporal copy
+ // TODO: describe consumption requirements
+ ASSERT(items_allocated>cnt_alloc_t::items_allocated, 0);
+ }
+ }
+ void *allocate(size_t sz) {
+ void *p = cnt_provider_t::allocate(sz);
+ REMARK("%p::allocate(%u) = %p\n", this, unsigned(sz), p);
+ return p;
+ }
+ void deallocate(void *p, size_t sz) {
+ ASSERT(allocations>frees,0);
+ REMARK("%p::deallocate(%p, %u)\n", this, p, unsigned(sz));
+ cnt_provider_t::deallocate(cnt_provider_t::pointer(p), sz);
+ }
+};
+
int TestMain () {
#if _MSC_VER && !__TBBMALLOC_NO_IMPLICIT_LINKAGE
#ifdef _DEBUG
@@ -50,6 +92,36 @@ int TestMain () {
#endif
#endif /* _MSC_VER && !__TBBMALLOC_NO_IMPLICIT_LINKAGE */
int result = TestMain<tbb::scalable_allocator<void> >();
+ {
+ tbb::memory_pool<tbb::scalable_allocator<int> > pool;
+ result += TestMain(tbb::memory_pool_allocator<void>(pool) );
+ }{
+ tbb::memory_pool<MinimalAllocator> pool;
+ cnt_alloc_t alloc(( tbb::memory_pool_allocator<char>(pool) )); // double parentheses to avoid function declaration
+ result += TestMain(alloc);
+ }{
+ static char buf[1024*1024*4];
+ tbb::fixed_pool pool(buf, sizeof(buf));
+ const char *text = "this is a test";// 15 bytes
+ char *p1 = (char*)pool.malloc( 16 );
+ ASSERT(p1, NULL);
+ strcpy(p1, text);
+ char *p2 = (char*)pool.realloc( p1, 15 );
+ ASSERT( p2 && !strcmp(p2, text), "realloc broke memory" );
+
+ result += TestMain(tbb::memory_pool_allocator<void>(pool) );
+
+ // try allocate almost entire buf keeping some reasonable space for internals
+ char *p3 = (char*)pool.realloc( p2, sizeof(buf)-128*1024 );
+ ASSERT( p3, "defragmentation failed" );
+ ASSERT( !strcmp(p3, text), "realloc broke memory" );
+ for( size_t sz = 10; sz < sizeof(buf); sz *= 2) {
+ ASSERT( pool.malloc( sz ), NULL);
+ pool.recycle();
+ }
+
+ result += TestMain(tbb::memory_pool_allocator<void>(pool) );
+ }
ASSERT( !result, NULL );
return Harness::Done;
}
diff --git a/src/test/test_ScalableAllocator_STL.cpp b/src/test/test_ScalableAllocator_STL.cpp
index 3d89a3e..051f48a 100644
--- a/src/test/test_ScalableAllocator_STL.cpp
+++ b/src/test/test_ScalableAllocator_STL.cpp
@@ -29,6 +29,16 @@
// Test whether scalable_allocator works with some of the host's STL containers.
#define HARNESS_NO_PARSE_COMMAND_LINE 1
+#define __TBB_EXTRA_DEBUG 1 // enables additional checks
+#define TBB_PREVIEW_MEMORY_POOL 1
+
+#include "harness_assert.h"
+#if __linux__ && __ia64__
+// Currently pools high-level interface has dependency to TBB library
+// to get atomics. For sake of testing add rudementary implementation of them.
+#include "harness_tbb_independence.h"
+#endif
+#include "tbb/memory_pool.h"
#include "tbb/scalable_allocator.h"
// The actual body of the test is there:
@@ -36,5 +46,10 @@
int TestMain () {
TestAllocatorWithSTL<tbb::scalable_allocator<void> >();
+ tbb::memory_pool<tbb::scalable_allocator<int> > mpool;
+ TestAllocatorWithSTL(tbb::memory_pool_allocator<void>(mpool) );
+ static char buf[1024*1024*4];
+ tbb::fixed_pool fpool(buf, sizeof(buf));
+ TestAllocatorWithSTL(tbb::memory_pool_allocator<void>(fpool) );
return Harness::Done;
}
diff --git a/src/test/test_aligned_space.cpp b/src/test/test_aligned_space.cpp
index 99d346d..85ace49 100644
--- a/src/test/test_aligned_space.cpp
+++ b/src/test/test_aligned_space.cpp
@@ -28,7 +28,7 @@
#include "tbb/tbb_config.h"
-#if __TBB_GCC_WARNING_SUPPRESSION_ENABLED
+#if __TBB_GCC_WARNING_SUPPRESSION_PRESENT
#pragma GCC diagnostic ignored "-Wstrict-aliasing"
#endif
@@ -109,7 +109,10 @@ int TestMain () {
TestAlignedSpace<size_t>();
#if HAVE_m128
TestAlignedSpace<__m128>();
-#endif /* HAVE_m128 */
+#endif
+#if HAVE_m256
+ if (have_AVX()) TestAlignedSpace<__m256>();
+#endif
return Harness::Done;
}
diff --git a/src/test/test_allocator.h b/src/test/test_allocator.h
index 7d04163..a694950 100644
--- a/src/test/test_allocator.h
+++ b/src/test/test_allocator.h
@@ -127,13 +127,6 @@ void TestBasic( A& a ) {
// number of bytes for such an allocation would overflow size_type.
ASSERT( a.max_size()*typename A::size_type(sizeof(T))>=a.max_size(), "max_size larger than reasonable" );
- // Test "a1==a2"
- A a1, a2;
- ASSERT( a1==a2, NULL );
-
- // Test "a1!=a2"
- ASSERT( !(a1!=a2), NULL );
-
// Test "a.construct(p,t)"
int n = NumberOfFoo;
typename A::pointer p = a.allocate(1);
@@ -164,8 +157,9 @@ struct Body: NoAssign {
ASSERT(array[i] == 0, NULL);
size_t size = i * (i&3);
array[i] = i&1 ? a.allocate(size, array[i>>3]) : a.allocate(size);
+ ASSERT(array[i] != 0, "allocator returned null");
char* s = reinterpret_cast<char*>(reinterpret_cast<void*>(array[i]));
- for( size_t j=0; j<size*sizeof(A); ++j ) {
+ for( size_t j=0; j<size*sizeof(typename A::value_type); ++j ) {
if(is_zero_filling<typename A::template rebind<void>::other>::value)
ASSERT( !s[j], NULL);
s[j] = PseudoRandomValue(i, t);
@@ -177,7 +171,7 @@ struct Body: NoAssign {
ASSERT(array[i] != 0, NULL);
size_t size = i * (i&3);
char* s = reinterpret_cast<char*>(reinterpret_cast<void*>(array[i]));
- for( size_t j=0; j<size*sizeof(A); ++j )
+ for( size_t j=0; j<size*sizeof(typename A::value_type); ++j )
ASSERT( s[j] == PseudoRandomValue(i, t), "Thread safety test failed" );
a.deallocate(array[i], size);
array[i] = 0;
@@ -200,27 +194,27 @@ struct Body: NoAssign {
};
// A is an allocator for some type, and U is another type
-template<typename A, typename U>
-void Test() {
- typename A::template rebind<U>::other b;
+template<typename U, typename A>
+void Test(A &a) {
+ typename A::template rebind<U>::other b(a);
TestBasic<U>(b);
-
- A a(b);
TestBasic<typename A::value_type>(a);
// thread safety
- int n = NumberOfFoo;
NativeParallelFor( 4, Body<A>(a) );
- ASSERT( NumberOfFoo==n, "Allocate/deallocate count mismatched" );
+ ASSERT( NumberOfFoo==0, "Allocate/deallocate count mismatched" );
ASSERT( a==b, NULL );
ASSERT( !(a!=b), NULL );
}
template<typename Allocator>
-int TestMain() {
- Test<typename Allocator::template rebind<Foo<char,1> >::other, Foo<int,17> >();
- Test<typename Allocator::template rebind<Foo<double,1> >::other, Foo<float,23> >();
+int TestMain(const Allocator &a = Allocator() ) {
+ NumberOfFoo = 0;
+ typename Allocator::template rebind<Foo<char,1> >::other a1(a);
+ typename Allocator::template rebind<Foo<double,1> >::other a2(a);
+ Test<Foo<int,17> >( a1 );
+ Test<Foo<float,23> >( a2 );
return 0;
}
diff --git a/src/test/test_allocator_STL.h b/src/test/test_allocator_STL.h
index b146298..e0a2644 100644
--- a/src/test/test_allocator_STL.h
+++ b/src/test/test_allocator_STL.h
@@ -31,8 +31,8 @@
#include "harness.h"
template<typename Container>
-void TestSequence() {
- Container c;
+void TestSequence(const typename Container::allocator_type &a) {
+ Container c(a);
for( int i=0; i<1000; ++i )
c.push_back(i*i);
typename Container::const_iterator p = c.begin();
@@ -43,8 +43,8 @@ void TestSequence() {
}
template<typename Set>
-void TestSet() {
- Set s;
+void TestSet(const typename Set::allocator_type &a) {
+ Set s(typename Set::key_compare(), a);
typedef typename Set::value_type value_type;
for( int i=0; i<100; ++i )
s.insert(value_type(3*i));
@@ -54,8 +54,8 @@ void TestSet() {
}
template<typename Map>
-void TestMap() {
- Map m;
+void TestMap(const typename Map::allocator_type &a) {
+ Map m(typename Map::key_compare(), a);
typedef typename Map::value_type value_type;
for( int i=0; i<100; ++i )
m.insert(value_type(i,i*i));
@@ -80,35 +80,35 @@ void TestMap() {
#endif
template<typename Allocator>
-void TestAllocatorWithSTL() {
+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;
typedef typename Allocator::template rebind<std::pair<int, int> >::other Aii;
// Sequenced containers
- TestSequence<std::deque <int,Ai> >();
- TestSequence<std::list <int,Ai> >();
- TestSequence<std::vector<int,Ai> >();
+ TestSequence<std::deque <int,Ai> >(a);
+ TestSequence<std::list <int,Ai> >(a);
+ TestSequence<std::vector<int,Ai> >(a);
// Associative containers
- TestSet<std::set <int, std::less<int>, Ai> >();
- TestSet<std::multiset<int, std::less<int>, Ai> >();
- TestMap<std::map <int, int, std::less<int>, Acii> >();
- TestMap<std::multimap<int, int, std::less<int>, Acii> >();
+ TestSet<std::set <int, std::less<int>, Ai> >(a);
+ TestSet<std::multiset<int, std::less<int>, Ai> >(a);
+ TestMap<std::map <int, int, std::less<int>, Acii> >(a);
+ TestMap<std::multimap<int, int, std::less<int>, Acii> >(a);
#if _MSC_VER
// Test compatibility with Microsoft's implementation of std::allocator for some cases that
// are undefined according to the ISO standard but permitted by Microsoft.
- TestSequence<std::deque <const int,Aci> >();
+ TestSequence<std::deque <const int,Aci> >(a);
#if _CPPLIB_VER>=500
- TestSequence<std::list <const int,Aci> >();
+ TestSequence<std::list <const int,Aci> >(a);
#endif
- TestSequence<std::vector<const int,Aci> >();
- TestSet<std::set<const int, std::less<int>, Aci> >();
- TestMap<std::map<int, int, std::less<int>, Aii> >();
- TestMap<std::map<const int, int, std::less<int>, Acii> >();
- TestMap<std::multimap<int, int, std::less<int>, Aii> >();
- TestMap<std::multimap<const int, int, std::less<int>, Acii> >();
+ TestSequence<std::vector<const int,Aci> >(a);
+ TestSet<std::set<const int, std::less<int>, Aci> >(a);
+ TestMap<std::map<int, int, std::less<int>, Aii> >(a);
+ TestMap<std::map<const int, int, std::less<int>, Acii> >(a);
+ TestMap<std::multimap<int, int, std::less<int>, Aii> >(a);
+ TestMap<std::multimap<const int, int, std::less<int>, Acii> >(a);
#endif /* _MSC_VER */
}
diff --git a/src/test/test_assembly.cpp b/src/test/test_assembly.cpp
index 43a88f7..e471466 100644
--- a/src/test/test_assembly.cpp
+++ b/src/test/test_assembly.cpp
@@ -89,9 +89,9 @@ static void TestAtomicCounter() {
static void TestTinyLock() {
REMARK("testing __TBB_LockByte\n");
- __TBB_Byte flags[16];
+ __TBB_atomic_flag flags[16];
for( unsigned int i=0; i<16; ++i )
- flags[i] = (__TBB_Byte)i;
+ flags[i] = (__TBB_Flag)i;
#if __TBB_GCC_OPTIMIZER_ORDERING_BROKEN
__TBB_store_with_release( flags[8], 0 );
#else
diff --git a/src/test/test_atomic.cpp b/src/test/test_atomic.cpp
index a2258c1..565cf0a 100644
--- a/src/test/test_atomic.cpp
+++ b/src/test/test_atomic.cpp
@@ -43,13 +43,24 @@ int TestMain() {
#include <string.h> // memcmp
#if _MSC_VER && !defined(__INTEL_COMPILER)
- // unary minus operator applied to unsigned type, result still unsigned
- #pragma warning( push )
- #pragma warning( disable: 4310 )
+ // Unary minus operator applied to unsigned type, result still unsigned
+ // Constant conditional expression
+ #pragma warning( disable: 4127 4310 )
#endif
+enum LoadStoreExpression {
+ UseOperators,
+ UseImplicitAcqRel,
+ UseExplicitFullyFenced,
+ UseExplicitAcqRel,
+ UseExplicitRelaxed,
+ UseGlobalHelperFullyFenced,
+ UseGlobalHelperAcqRel,
+ UseGlobalHelperRelaxed
+};
+
//! Structure that holds an atomic<T> and some guard bytes around it.
-template<typename T>
+template<typename T, LoadStoreExpression E = UseOperators>
struct TestStruct {
typedef unsigned char byte_type;
T prefix;
@@ -61,7 +72,12 @@ struct TestStruct {
reinterpret_cast<byte_type*>(&prefix)[j] = byte_type(0x11*(j+1));
reinterpret_cast<byte_type*>(&suffix)[sizeof(T)-j-1] = byte_type(0x11*(j+1));
}
- counter = i;
+ if ( E == UseOperators )
+ counter = i;
+ else if ( E == UseExplicitRelaxed )
+ counter.template store<tbb::relaxed>(i);
+ else
+ tbb::store<tbb::full_fence>( counter, i );
}
~TestStruct() {
// Check for writes outside the counter.
@@ -74,20 +90,11 @@ struct TestStruct {
};
// A global variable of type tbb::atomic<>
-template<typename T> tbb::atomic<T> TestStruct<T>::gCounter;
-
-#if _MSC_VER && !defined(__INTEL_COMPILER)
- #pragma warning( pop )
-#endif
-
-#if defined(__INTEL_COMPILER)
- // reference to EBX in a function requiring stack alignment
- #pragma warning( disable: 998 )
-#endif
+template<typename T, LoadStoreExpression E> tbb::atomic<T> TestStruct<T, E>::gCounter;
//! Test compare_and_swap template members of class atomic<T> for memory_semantics=M
template<typename T,tbb::memory_semantics M>
-void TestCompareAndSwapAcquireRelease( T i, T j, T k ) {
+void TestCompareAndSwapWithExplicitOrdering( T i, T j, T k ) {
ASSERT( i!=k, "values must be distinct" );
// Test compare_and_swap that should fail
TestStruct<T> x(i);
@@ -103,7 +110,7 @@ void TestCompareAndSwapAcquireRelease( T i, T j, T k ) {
//! i, j, k must be different values
template<typename T>
void TestCompareAndSwap( T i, T j, T k ) {
- ASSERT( i!=k, "values must be distinct" );
+ ASSERT( i!=k, "values must be distinct" );
// Test compare_and_swap that should fail
TestStruct<T> x(i);
T old = x.counter.compare_and_swap( j, k );
@@ -114,7 +121,7 @@ void TestCompareAndSwap( T i, T j, T k ) {
ASSERT( old==i, NULL );
if( x.counter==i ) {
ASSERT( x.counter==j, "value not updated?" );
- } else {
+ } else {
ASSERT( x.counter==j, "value trashed" );
}
// Check that atomic global variables work
@@ -122,14 +129,16 @@ void TestCompareAndSwap( T i, T j, T k ) {
old = TestStruct<T>::gCounter.compare_and_swap( j, i );
ASSERT( old==i, NULL );
ASSERT( TestStruct<T>::gCounter==j, "value not updated?" );
- TestCompareAndSwapAcquireRelease<T,tbb::acquire>(i,j,k);
- TestCompareAndSwapAcquireRelease<T,tbb::release>(i,j,k);
+ TestCompareAndSwapWithExplicitOrdering<T,tbb::full_fence>(i,j,k);
+ TestCompareAndSwapWithExplicitOrdering<T,tbb::acquire>(i,j,k);
+ TestCompareAndSwapWithExplicitOrdering<T,tbb::release>(i,j,k);
+ TestCompareAndSwapWithExplicitOrdering<T,tbb::relaxed>(i,j,k);
}
//! memory_semantics variation on TestFetchAndStore
template<typename T, tbb::memory_semantics M>
-void TestFetchAndStoreAcquireRelease( T i, T j ) {
- ASSERT( i!=j, "values must be distinct" );
+void TestFetchAndStoreWithExplicitOrdering( T i, T j ) {
+ ASSERT( i!=j, "values must be distinct" );
TestStruct<T> x(i);
T old = x.counter.template fetch_and_store<M>( j );
ASSERT( old==i, NULL );
@@ -139,7 +148,7 @@ void TestFetchAndStoreAcquireRelease( T i, T j ) {
//! i and j must be different values
template<typename T>
void TestFetchAndStore( T i, T j ) {
- ASSERT( i!=j, "values must be distinct" );
+ ASSERT( i!=j, "values must be distinct" );
TestStruct<T> x(i);
T old = x.counter.fetch_and_store( j );
ASSERT( old==i, NULL );
@@ -149,20 +158,21 @@ void TestFetchAndStore( T i, T j ) {
old = TestStruct<T>::gCounter.fetch_and_store( j );
ASSERT( old==i, NULL );
ASSERT( TestStruct<T>::gCounter==j, "value not updated?" );
- TestFetchAndStoreAcquireRelease<T,tbb::acquire>(i,j);
- TestFetchAndStoreAcquireRelease<T,tbb::release>(i,j);
+ TestFetchAndStoreWithExplicitOrdering<T,tbb::full_fence>(i,j);
+ TestFetchAndStoreWithExplicitOrdering<T,tbb::acquire>(i,j);
+ TestFetchAndStoreWithExplicitOrdering<T,tbb::release>(i,j);
+ TestFetchAndStoreWithExplicitOrdering<T,tbb::relaxed>(i,j);
}
#if _MSC_VER && !defined(__INTEL_COMPILER)
// conversion from <bigger integer> to <smaller integer>, possible loss of data
// the warning seems a complete nonsense when issued for e.g. short+=short
- #pragma warning( push )
#pragma warning( disable: 4244 )
#endif
//! Test fetch_and_add members of class atomic<T> for memory_semantics=M
template<typename T,tbb::memory_semantics M>
-void TestFetchAndAddAcquireRelease( T i ) {
+void TestFetchAndAddWithExplicitOrdering( T i ) {
TestStruct<T> x(i);
T actual;
T expected = i;
@@ -235,15 +245,12 @@ void TestFetchAndAdd( T i ) {
expected = i+42;
ASSERT( value==i, NULL );
ASSERT( TestStruct<T>::gCounter==expected, "value not updated?" );
-
- TestFetchAndAddAcquireRelease<T,tbb::acquire>(i);
- TestFetchAndAddAcquireRelease<T,tbb::release>(i);
+ TestFetchAndAddWithExplicitOrdering<T,tbb::full_fence>(i);
+ TestFetchAndAddWithExplicitOrdering<T,tbb::acquire>(i);
+ TestFetchAndAddWithExplicitOrdering<T,tbb::release>(i);
+ TestFetchAndAddWithExplicitOrdering<T,tbb::relaxed>(i);
}
-#if _MSC_VER && !defined(__INTEL_COMPILER)
- #pragma warning( pop )
-#endif // warning 4244 is back
-
//! A type with unknown size.
class IncompleteType;
@@ -259,11 +266,17 @@ void TestFetchAndAdd( bool ) {
}
template<typename T>
-void TestConst( T i ) {
- // Try const
+void TestConst( T i ) {
+ // Try const
const TestStruct<T> x(i);
- ASSERT( memcmp( &i, &x.counter, sizeof(T) )==0, "write to atomic<T> broken?" );;
+ ASSERT( memcmp( &i, &x.counter, sizeof(T) )==0, "write to atomic<T> broken?" );
ASSERT( x.counter==i, "read of atomic<T> broken?" );
+ const TestStruct<T, UseExplicitRelaxed> y(i);
+ ASSERT( memcmp( &i, &y.counter, sizeof(T) )==0, "relaxed write to atomic<T> broken?" );
+ ASSERT( tbb::load<tbb::relaxed>(y.counter) == i, "relaxed read of atomic<T> broken?" );
+ const TestStruct<T, UseGlobalHelperFullyFenced> z(i);
+ ASSERT( memcmp( &i, &z.counter, sizeof(T) )==0, "sequentially consistent write to atomic<T> broken?" );
+ ASSERT( z.counter.template load<tbb::full_fence>() == i, "sequentially consistent read of atomic<T> broken?" );
}
template<typename T>
@@ -288,7 +301,6 @@ struct AlignmentChecker {
#if _MSC_VER && !defined(__INTEL_COMPILER)
// unary minus operator applied to unsigned type, result still unsigned
- #pragma warning( push )
#pragma warning( disable: 4146 )
#endif
@@ -315,24 +327,18 @@ void TestAtomicInteger( const char* name ) {
TestParallel<T>( name );
}
-#if _MSC_VER && !defined(__INTEL_COMPILER)
- #pragma warning( pop )
-#endif
-
-
template<typename T>
struct Foo {
T x, y, z;
};
-
template<typename T>
void TestIndirection() {
Foo<T> item;
tbb::atomic<Foo<T>*> pointer;
pointer = &item;
for( int k=-10; k<=10; ++k ) {
- // Test various syntaxes for indirection to fields with non-zero offset.
+ // 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);
@@ -393,17 +399,11 @@ const int numMaskedOperations = 100000;
const int testSpaceSize = 8;
int prime[testSpaceSize] = {3,5,7,11,13,17,19,23};
-#if _MSC_VER && !defined(__INTEL_COMPILER)
- // "possible loss of data" warning suppressed again
- #pragma warning( push )
- #pragma warning( disable: 4244 )
-#endif
-
template<typename T>
class TestMaskedCAS_Body: NoAssign {
T* test_space_uncontended;
T* test_space_contended;
-public:
+public:
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;
@@ -471,10 +471,6 @@ intptr_t getCorrectContendedValue() {
return slot.result;
}
-#if _MSC_VER && !defined(__INTEL_COMPILER)
- #pragma warning( pop )
-#endif // warning 4244 is back again
-
template<typename T>
void TestMaskedCAS() {
REMARK("testing masked CAS<%d>\n",int(sizeof(T)));
@@ -497,6 +493,78 @@ void TestMaskedCAS() {
}
}
+template <typename T>
+class TestRelaxedLoadStorePlainBody {
+ static T s_turn,
+ s_ready;
+
+public:
+ static unsigned s_count1,
+ s_count2;
+
+ void operator() ( int id ) const {
+ using tbb::internal::__TBB_load_relaxed;
+ using tbb::internal::__TBB_store_relaxed;
+
+ if ( id == 0 ) {
+ while ( !__TBB_load_relaxed(s_turn) ) {
+ ++s_count1;
+ __TBB_store_relaxed(s_ready, 1);
+ }
+ }
+ else {
+ while ( !__TBB_load_relaxed(s_ready) ) {
+ ++s_count2;
+ continue;
+ }
+ __TBB_store_relaxed(s_turn, 1);
+ }
+ }
+}; // class TestRelaxedLoadStorePlainBody<T>
+
+template <typename T> T TestRelaxedLoadStorePlainBody<T>::s_turn = 0;
+template <typename T> T TestRelaxedLoadStorePlainBody<T>::s_ready = 0;
+template <typename T> unsigned TestRelaxedLoadStorePlainBody<T>::s_count1 = 0;
+template <typename T> unsigned TestRelaxedLoadStorePlainBody<T>::s_count2 = 0;
+
+template <typename T>
+class TestRelaxedLoadStoreAtomicBody {
+ static tbb::atomic<T> s_turn,
+ s_ready;
+
+public:
+ static unsigned s_count1,
+ s_count2;
+
+ void operator() ( int id ) const {
+ if ( id == 0 ) {
+ while ( s_turn.template load<tbb::relaxed>() == 0 ) {
+ ++s_count1;
+ s_ready.template store<tbb::relaxed>(1);
+ }
+ }
+ else {
+ while ( s_ready.template load<tbb::relaxed>() == 0 ) {
+ ++s_count2;
+ continue;
+ }
+ s_turn.template store<tbb::relaxed>(1);
+ }
+ }
+}; // class TestRelaxedLoadStoreAtomicBody<T>
+
+template <typename T> tbb::atomic<T> TestRelaxedLoadStoreAtomicBody<T>::s_turn;
+template <typename T> tbb::atomic<T> TestRelaxedLoadStoreAtomicBody<T>::s_ready;
+template <typename T> unsigned TestRelaxedLoadStoreAtomicBody<T>::s_count1 = 0;
+template <typename T> unsigned TestRelaxedLoadStoreAtomicBody<T>::s_count2 = 0;
+
+template <typename T>
+void TestRegisterPromotionSuppression () {
+ REMARK("testing register promotion suppression (size=%d)\n", (int)sizeof(T));
+ NativeParallelFor( 2, TestRelaxedLoadStorePlainBody<T>() );
+ NativeParallelFor( 2, TestRelaxedLoadStoreAtomicBody<T>() );
+}
+
template<unsigned N>
class ArrayElement {
char item[N];
@@ -508,7 +576,6 @@ int TestMain () {
TestAtomicInteger<long long>("long long");
#else
REPORT("64-bit atomics not supported\n");
- // TODO: advise about possibility to have 64-bit atomics on 64-bit PowerPC hardware even for 32-bit build?
ASSERT(sizeof(long long)==8, "type long long is not 64 bits");
#endif
TestAtomicInteger<unsigned long>("unsigned long");
@@ -544,6 +611,12 @@ int TestMain () {
ASSERT( !ParallelError, NULL );
TestMaskedCAS<unsigned char>();
TestMaskedCAS<unsigned short>();
+#if __TBB_64BIT_ATOMICS
+ TestRegisterPromotionSuppression<tbb::internal::int64_t>();
+#endif
+ TestRegisterPromotionSuppression<tbb::internal::int32_t>();
+ TestRegisterPromotionSuppression<tbb::internal::int16_t>();
+ TestRegisterPromotionSuppression<tbb::internal::int8_t>();
return Harness::Done;
}
@@ -554,7 +627,7 @@ struct FlagAndMessage {
/** 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;
+ T message;
};
// A special template function used for summation.
@@ -586,9 +659,65 @@ bool special_sum<bool>(intptr_t arg1, intptr_t arg2) {
}
volatile int One = 1;
-
-template<typename T>
+
+inline bool IsRelaxed ( LoadStoreExpression e ) {
+ return e == UseExplicitRelaxed || e == UseGlobalHelperRelaxed;
+}
+
+template <typename T, LoadStoreExpression E>
+struct LoadStoreTraits;
+
+template <typename T>
+struct LoadStoreTraits<T, UseOperators> {
+ static void load ( T& dst, const tbb::atomic<T>& src ) { dst = src; }
+ static void store ( tbb::atomic<T>& dst, const T& src ) { dst = src; }
+};
+
+template <typename T>
+struct LoadStoreTraits<T, UseImplicitAcqRel> {
+ static void load ( T& dst, const tbb::atomic<T>& src ) { dst = src.load(); }
+ static void store ( tbb::atomic<T>& dst, const T& src ) { dst.store(src); }
+};
+
+template <typename T>
+struct LoadStoreTraits<T, UseExplicitFullyFenced> {
+ static void load ( T& dst, const tbb::atomic<T>& src ) { dst = src.template load<tbb::full_fence>(); }
+ static void store ( tbb::atomic<T>& dst, const T& src ) { dst.template store<tbb::full_fence>(src); }
+};
+
+template <typename T>
+struct LoadStoreTraits<T, UseExplicitAcqRel> {
+ static void load ( T& dst, const tbb::atomic<T>& src ) { dst = src.template load<tbb::acquire>(); }
+ static void store ( tbb::atomic<T>& dst, const T& src ) { dst.template store<tbb::release>(src); }
+};
+
+template <typename T>
+struct LoadStoreTraits<T, UseExplicitRelaxed> {
+ static void load ( T& dst, const tbb::atomic<T>& src ) { dst = src.template load<tbb::relaxed>(); }
+ static void store ( tbb::atomic<T>& dst, const T& src ) { dst.template store<tbb::relaxed>(src); }
+};
+
+template <typename T>
+struct LoadStoreTraits<T, UseGlobalHelperFullyFenced> {
+ static void load ( T& dst, const tbb::atomic<T>& src ) { dst = tbb::load<tbb::full_fence>(src); }
+ static void store ( tbb::atomic<T>& dst, const T& src ) { tbb::store<tbb::full_fence>(dst, src); }
+};
+
+template <typename T>
+struct LoadStoreTraits<T, UseGlobalHelperAcqRel> {
+ static void load ( T& dst, const tbb::atomic<T>& src ) { dst = tbb::load<tbb::acquire>(src); }
+ static void store ( tbb::atomic<T>& dst, const T& src ) { tbb::store<tbb::release>(dst, src); }
+};
+
+template <typename T>
+struct LoadStoreTraits<T, UseGlobalHelperRelaxed> {
+ static void load ( T& dst, const tbb::atomic<T>& src ) { dst = tbb::load<tbb::relaxed>(src); }
+ static void store ( tbb::atomic<T>& dst, const T& src ) { tbb::store<tbb::relaxed>(dst, src); }
+};
+
+template<typename T, LoadStoreExpression E>
class HammerLoadAndStoreFence: NoAssign {
+ typedef LoadStoreTraits<T, E> trait;
FlagAndMessage<T>* fam;
const int n;
const int p;
@@ -602,22 +731,22 @@ public:
FlagAndMessage<T>* s = fam+k;
FlagAndMessage<T>* 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.
+ // 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.
for(unsigned short cnt=1; ; ++cnt) {
- if( !cnt ) // to help 1-core systems complete the test, yield every 2^16 iterations
+ if( !(cnt%1024) ) // to help 1-core or oversubscribed systems complete the test, yield every 2^10 iterations
__TBB_Yield();
// Compilers typically generate non-trivial sequence for division by a constant.
// The expression here is dependent on the loop index i, so it cannot be hoisted.
-#define COMPLICATED_ZERO (i*(one-1)/100)
+ #define COMPLICATED_ZERO (i*(one-1)/100)
// Read flag and then the message
T flag, message;
- if( trial&1 ) {
+ if( trial&1 ) {
// COMPLICATED_ZERO here tempts compiler to hoist load of message above reading of flag.
- flag = (s+COMPLICATED_ZERO)->flag;
+ trait::load( flag, (s+COMPLICATED_ZERO)->flag );
message = s->message;
} else {
- flag = s->flag;
+ trait::load( flag, s->flag );
message = s->message;
}
if( flag ) {
@@ -625,20 +754,29 @@ public:
REPORT("ERROR: flag!=(T)-1 k=%d i=%d trial=%x type=%s (atomicity problem?)\n", k, i, trial, name );
ParallelError = true;
}
- if( message!=(T)-1 ) {
- REPORT("ERROR: message!=(T)-1 k=%d i=%d trial=%x type=%s (memory fence problem?)\n", k, i, trial, name );
+ if( !IsRelaxed(E) && message!=(T)-1 ) {
+ REPORT("ERROR: message!=(T)-1 k=%d i=%d trial=%x type=%s mode=%d (memory fence problem?)\n", k, i, trial, name, E );
ParallelError = true;
}
- s->message = T(0);
- s->flag = T(0);
+ s->message = T(0);
+ trait::store( s->flag, T(0) );
+ // Prevent deadlock possible in relaxed mode because of store(0)
+ // to the first thread's flag being reordered after the last
+ // thread's store(-1) into it.
+ if ( IsRelaxed(E) ) {
+ while( s_next->flag.template load<tbb::relaxed>() != 0 )
+ __TBB_Yield();
+ }
+ else
+ ASSERT( s_next->flag == 0, NULL );
// Set message and then the flag
if( trial&2 ) {
// COMPLICATED_ZERO here tempts compiler to sink store below setting of flag
s_next->message = special_sum<T>(-1, COMPLICATED_ZERO);
- s_next->flag = (T)-1;
+ trait::store( s_next->flag, (T)-1 );
} else {
s_next->message = (T)-1;
- s_next->flag = (T)-1;
+ trait::store( s_next->flag, (T)-1 );
}
break;
} else {
@@ -651,22 +789,24 @@ 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,
+/** Test performs round-robin passing of message among p processors,
where p goes from MinThread to MaxThread. */
-template<typename T>
+template<typename T, LoadStoreExpression E>
void TestLoadAndStoreFences( const char* name ) {
for( int p=MinThread<2 ? 2 : MinThread; p<=MaxThread; ++p ) {
FlagAndMessage<T>* fam = new FlagAndMessage<T>[p];
- // Each of four trials excercise slightly different expresion pattern within the test.
- // See occurrences of COMPLICATED_ZERO for details.
+ // 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>( fam, 100, p, name, trial ) );
- for( int k=0; k<p; ++k ) {
- ASSERT( fam[k].message==(k==0 ? (T)-1 : 0), "incomplete round-robin?" );
- ASSERT( fam[k].flag==(k==0 ? (T)-1 : 0), "incomplete round-robin?" );
+ NativeParallelFor( p, HammerLoadAndStoreFence<T, E>( 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?" );
+ ASSERT( fam[k].flag==(k==0 ? (T)-1 : 0), "incomplete round-robin?" );
+ }
}
}
delete[] fam;
@@ -674,7 +814,7 @@ void TestLoadAndStoreFences( const char* name ) {
}
//! Sparse set of values of integral type T.
-/** Set is designed so that if a value is read or written non-atomically,
+/** Set is designed so that if a value is read or written non-atomically,
the resulting intermediate value is likely to not be a member of the set. */
template<typename T>
class SparseValueSet {
@@ -686,17 +826,17 @@ public:
// 2. The bytes are typically different.
// 3. When multiplied by any value <=127, the product does not overflow.
factor = T(0);
- for( unsigned i=0; i<sizeof(T)*8-7; i+=7 )
+ for( unsigned i=0; i<sizeof(T)*8-7; i+=7 )
factor = T(factor | T(1)<<i);
}
//! Get ith member of set
T get( int i ) const {
// Create multiple of factor. The & prevents overflow of the product.
return T((i&0x7F)*factor);
- }
+ }
//! True if set contains x
bool contains( T x ) const {
- // True if
+ // True if
return (x%factor)==0;
}
};
@@ -706,12 +846,12 @@ template<typename T>
class SparseValueSet<T*> {
SparseValueSet<ptrdiff_t> my_set;
public:
- T* get( int i ) const {return reinterpret_cast<T*>(my_set.get(i));}
+ T* get( int i ) const {return reinterpret_cast<T*>(my_set.get(i));}
bool contains( T* x ) const {return my_set.contains(reinterpret_cast<ptrdiff_t>(x));}
};
-//! Specialization for bool.
-/** Checking bool for atomic read/write is pointless in practice, because
+//! Specialization for bool.
+/** Checking bool for atomic read/write is pointless in practice, because
there is no way to *not* atomically read or write a bool value. */
template<>
class SparseValueSet<bool> {
@@ -746,8 +886,8 @@ public:
int j = int(1/x+T(0.5));
if( 0<j && j<=128 ) {
T error = x*T(j)-T(1);
- // In the calculation above, if x was indeed generated by method get, the error should be
- // at most epsilon, because x is off by at most 1/2 ulp from its infinitely precise value,
+ // In the calculation above, if x was indeed generated by method get, the error should be
+ // at most epsilon, because x is off by at most 1/2 ulp from its infinitely precise value,
// j is exact, and the multiplication incurs at most another 1/2 ulp of round-off error.
if( -epsilon<=error && error<=epsilon ) {
return true;
@@ -760,10 +900,10 @@ public:
};
};
-template<>
+template<>
class SparseValueSet<float>: public SparseFloatSet<float> {};
-template<>
+template<>
class SparseValueSet<double>: public SparseFloatSet<double> {};
template<typename T>
@@ -771,7 +911,7 @@ class HammerAssignment: NoAssign {
tbb::atomic<T>& x;
const char* name;
SparseValueSet<T> set;
-public:
+public:
HammerAssignment( tbb::atomic<T>& x_, const char* name_ ) : x(x_), name(name_) {}
void operator()( int k ) const {
const int n = 1000000;
@@ -790,7 +930,7 @@ public:
} else {
tbb::atomic<T> y;
for( int i=0; i<n; ++i ) {
- // Get pseudo-random value.
+ // Get pseudo-random value.
y = set.get(i);
// Write y atomically into x.
x = y;
@@ -804,9 +944,7 @@ public:
template<typename T> void TestAssignmentSignature( T& (T::*)(const T&) ) {}
#if _MSC_VER && !defined(__INTEL_COMPILER)
- // Suppress "conditional expression is constant" warning.
- #pragma warning( push )
- #pragma warning( disable: 4127 )
+ #pragma warning( disable: 4355 4800 )
#endif
template<typename T>
@@ -817,17 +955,17 @@ void TestAssignment( const char* name ) {
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
+ // 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
+ // 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);
+ 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".
@@ -839,14 +977,104 @@ void TestAssignment( const char* name ) {
#endif /* __TBB_x86_32 && (__linux__ || __FreeBSD__ || _WIN32) */
}
-#if _MSC_VER && !defined(__INTEL_COMPILER)
- #pragma warning( pop )
-#endif
+static const unsigned Primes[] = {
+ 0x9e3779b1, 0xffe6cc59, 0x2109f6dd, 0x43977ab5, 0xba5703f5, 0xb495a877, 0xe1626741, 0x79695e6b,
+ 0xbc98c09f, 0xd5bee2b3, 0x287488f9, 0x3af18231, 0x9677cd4d, 0xbe3a6929, 0xadc6a877, 0xdcf0674b,
+ 0xbe4d6fe9, 0x5f15e201, 0x99afc3fd, 0xf3f16801, 0xe222cfff, 0x24ba5fdb, 0x0620452d, 0x79f149e3,
+ 0xc8b93f49, 0x972702cd, 0xb07dd827, 0x6c97d5ed, 0x085a3d61, 0x46eb5ea7, 0x3d9910ed, 0x2e687b5b,
+ 0x29609227, 0x6eb081f1, 0x0954c4e1, 0x9d114db9, 0x542acfa9, 0xb3e6bd7b, 0x0742d917, 0xe9f3ffa7,
+ 0x54581edb, 0xf2480f45, 0x0bb9288f, 0xef1affc7, 0x85fa0ca7, 0x3ccc14db, 0xe6baf34b, 0x343377f7,
+ 0x5ca19031, 0xe6d9293b, 0xf0a9f391, 0x5d2e980b, 0xfc411073, 0xc3749363, 0xb892d829, 0x3549366b,
+ 0x629750ad, 0xb98294e5, 0x892d9483, 0xc235baf3, 0x3d2402a3, 0x6bdef3c9, 0xbec333cd, 0x40c9520f
+};
+
+class FastRandom {
+ unsigned x, a;
+public:
+ unsigned short get() {
+ unsigned short r = (unsigned short)(x>>16);
+ x = x*a+1;
+ return r;
+ }
+ FastRandom( unsigned seed ) {
+ x = seed;
+ a = Primes[seed % (sizeof(Primes)/sizeof(Primes[0]))];
+ }
+};
+
+template <typename T, LoadStoreExpression E>
+class ArbitrationBody : 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;
+
+public:
+ void operator() ( int id ) const {
+ const int me = id;
+ const T other = (T)(uintptr_t)(1 - id),
+ cleared = T(0),
+ signaled = T(1);
+ for ( int i = 0; i < 100000; ++i ) {
+ 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(t, s_turn);
+ if ( r != signaled || t != other )
+ break;
+ __TBB_Pause(1);
+ if ( j == 2<<12 ) {
+ j = 0;
+ __TBB_Yield();
+ }
+ }
+ // Entered critical section
+ ASSERT( !s_inside, "Peterson lock is broken - some fences are missing" );
+ s_inside = true;
+ unsigned short spin = my_rand.get() % c_rand_ceil;
+ for ( volatile int j = 0; j < spin; ++j )
+ continue;
+ s_inside = false;
+ ASSERT( !s_inside, "Peterson lock is broken - some fences are missing" );
+ // leaving critical section
+ 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) {}
+};
+
+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>
+void TestDekkerArbitration () {
+ NativeParallelFor( 2, ArbitrationBody<T, E>() );
+}
template<typename T>
void TestParallel( const char* name ) {
- TestLoadAndStoreFences<T>(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>();
}
#endif // __TBB_TEST_PIC && !__PIC__
diff --git a/src/test/test_broadcast_node.cpp b/src/test/test_broadcast_node.cpp
index 7556b61..47e5eb3 100644
--- a/src/test/test_broadcast_node.cpp
+++ b/src/test/test_broadcast_node.cpp
@@ -27,8 +27,7 @@
*/
#include "harness.h"
-#define TBB_PREVIEW_GRAPH 1
-#include "tbb/graph.h"
+#include "tbb/flow_graph.h"
#include "tbb/atomic.h"
@@ -42,13 +41,13 @@ class int_convertable_type : private NoAssign {
public:
int_convertable_type( int v ) : my_value(v) {}
- operator int() { return my_value; }
+ operator int() const { return my_value; }
};
template< typename T >
-class counting_array_receiver : public tbb::receiver<T> {
+class counting_array_receiver : public tbb::flow::receiver<T> {
tbb::atomic<size_t> my_counters[N];
@@ -64,7 +63,7 @@ public:
return v;
}
- /* override */ bool try_put( T v ) {
+ /* override */ bool try_put( const T &v ) {
++my_counters[(int)v];
return true;
}
@@ -74,13 +73,13 @@ public:
template< typename T >
void test_serial_broadcasts() {
- tbb::broadcast_node<T> b;
+ tbb::flow::broadcast_node<T> b;
for ( int num_receivers = 1; num_receivers < R; ++num_receivers ) {
counting_array_receiver<T> *receivers = new counting_array_receiver<T>[num_receivers];
for ( int r = 0; r < num_receivers; ++r ) {
- ASSERT( b.register_successor( receivers[r] ), NULL );
+ tbb::flow::make_edge( b, receivers[r] );
}
for (int n = 0; n < N; ++n ) {
@@ -91,7 +90,7 @@ void test_serial_broadcasts() {
for (int n = 0; n < N; ++n ) {
ASSERT( receivers[r][n] == 1, NULL );
}
- ASSERT( b.remove_successor( receivers[r] ), NULL );
+ tbb::flow::remove_edge( b, receivers[r] );
}
ASSERT( b.try_put( (T)0 ), NULL );
for ( int r = 0; r < num_receivers; ++r )
@@ -106,11 +105,11 @@ void test_serial_broadcasts() {
template< typename T >
class native_body : private NoAssign {
- tbb::broadcast_node<T> &my_b;
+ tbb::flow::broadcast_node<T> &my_b;
public:
- native_body( tbb::broadcast_node<T> &b ) : my_b(b) {}
+ native_body( tbb::flow::broadcast_node<T> &b ) : my_b(b) {}
void operator()(int) const {
for (int n = 0; n < N; ++n ) {
@@ -121,15 +120,12 @@ public:
};
template< typename T >
-void test_parallel_broadcasts(int p) {
-
- tbb::broadcast_node<T> b;
-
+void run_parallel_broadcasts(int p, tbb::flow::broadcast_node<T>& b) {
for ( int num_receivers = 1; num_receivers < R; ++num_receivers ) {
counting_array_receiver<T> *receivers = new counting_array_receiver<T>[num_receivers];
for ( int r = 0; r < num_receivers; ++r ) {
- ASSERT( b.register_successor( receivers[r] ), NULL );
+ tbb::flow::make_edge( b, receivers[r] );
}
NativeParallelFor( p, native_body<T>( b ) );
@@ -138,16 +134,26 @@ void test_parallel_broadcasts(int p) {
for (int n = 0; n < N; ++n ) {
ASSERT( (int)receivers[r][n] == p, NULL );
}
- ASSERT( b.remove_successor( receivers[r] ), NULL );
+ tbb::flow::remove_edge( b, receivers[r] );
}
ASSERT( b.try_put( (T)0 ), NULL );
for ( int r = 0; r < num_receivers; ++r )
- ASSERT( (int)receivers[0][0] == p, NULL ) ;
+ ASSERT( (int)receivers[r][0] == p, NULL ) ;
delete [] receivers;
}
+}
+
+template< typename T >
+void test_parallel_broadcasts(int p) {
+ tbb::flow::broadcast_node<T> b;
+ run_parallel_broadcasts(p, b);
+
+ // test copy constructor
+ tbb::flow::broadcast_node<T> b_copy(b);
+ run_parallel_broadcasts(p, b_copy);
}
int TestMain() {
@@ -166,6 +172,4 @@ int TestMain() {
test_parallel_broadcasts<int_convertable_type>(p);
}
return Harness::Done;
-
}
-
diff --git a/src/test/test_buffer_node.cpp b/src/test/test_buffer_node.cpp
index 81a9e2f..29b4f99 100644
--- a/src/test/test_buffer_node.cpp
+++ b/src/test/test_buffer_node.cpp
@@ -27,8 +27,7 @@
*/
#include "harness.h"
-#define TBB_PREVIEW_GRAPH 1
-#include "tbb/graph.h"
+#include "tbb/flow_graph.h"
#include "tbb/task_scheduler_init.h"
#include "tbb/tick_count.h"
@@ -38,7 +37,7 @@
#define C 10
template< typename T >
-void spin_try_get( tbb::buffer_node<T> &b, T &value ) {
+void spin_try_get( tbb::flow::buffer_node<T> &b, T &value ) {
while ( b.try_get(value) != true ) {}
}
@@ -50,9 +49,9 @@ void check_item( T* count_value, T &value ) {
template< typename T >
struct parallel_puts : NoAssign {
- tbb::buffer_node<T> &my_b;
+ tbb::flow::buffer_node<T> &my_b;
- parallel_puts( tbb::buffer_node<T> &b ) : my_b(b) {}
+ parallel_puts( tbb::flow::buffer_node<T> &b ) : my_b(b) {}
void operator()(int i) const {
for (int j = 0; j < N; ++j) {
@@ -103,10 +102,10 @@ struct touches {
template< typename T >
struct parallel_gets : NoAssign {
- tbb::buffer_node<T> &my_b;
+ tbb::flow::buffer_node<T> &my_b;
touches<T> &my_touches;
- parallel_gets( tbb::buffer_node<T> &b, touches<T> &t) : my_b(b), my_touches(t) {}
+ parallel_gets( tbb::flow::buffer_node<T> &b, touches<T> &t) : my_b(b), my_touches(t) {}
void operator()(int) const {
for (int j = 0; j < N; ++j) {
@@ -121,10 +120,10 @@ struct parallel_gets : NoAssign {
template< typename T >
struct parallel_put_get : NoAssign {
- tbb::buffer_node<T> &my_b;
+ tbb::flow::buffer_node<T> &my_b;
touches<T> &my_touches;
- parallel_put_get( tbb::buffer_node<T> &b, touches<T> &t ) : my_b(b), my_touches(t) {}
+ parallel_put_get( tbb::flow::buffer_node<T> &b, touches<T> &t ) : my_b(b), my_touches(t) {}
void operator()(int tid) const {
@@ -152,11 +151,11 @@ struct parallel_put_get : NoAssign {
//
template< typename T >
int test_reservation(int num_threads) {
- tbb::graph g;
+ tbb::flow::graph g;
T bogus_value(-1);
// Simple tests
- tbb::buffer_node<T> b(g);
+ tbb::flow::buffer_node<T> b(g);
b.try_put(T(1));
b.try_put(T(2));
@@ -202,10 +201,10 @@ int test_reservation(int num_threads) {
//
template< typename T >
int test_parallel(int num_threads) {
- tbb::graph g;
- tbb::buffer_node<T> b(g);
- tbb::buffer_node<T> b2(g);
- tbb::buffer_node<T> b3(g);
+ tbb::flow::graph g;
+ tbb::flow::buffer_node<T> b(g);
+ tbb::flow::buffer_node<T> b2(g);
+ tbb::flow::buffer_node<T> b3(g);
T bogus_value(-1);
T j = bogus_value;
@@ -251,8 +250,8 @@ int test_parallel(int num_threads) {
ASSERT( b.try_get( j ) == false, NULL );
ASSERT( j == bogus_value, NULL );
- ASSERT( b.register_successor( b2 ) == true, NULL );
- ASSERT( b2.register_successor( b3 ) == true, NULL );
+ tbb::flow::make_edge( b, b2 );
+ tbb::flow::make_edge( b2, b3 );
NativeParallelFor( num_threads, parallel_puts<T>(b) );
{
@@ -270,6 +269,35 @@ int test_parallel(int num_threads) {
ASSERT( b3.try_get( j ) == false, NULL );
ASSERT( j == bogus_value, NULL );
+ // test copy constructor
+ ASSERT( b.remove_successor( b2 ), NULL );
+ // fill up b:
+ NativeParallelFor( num_threads, parallel_puts<T>(b) );
+ // copy b:
+ tbb::flow::buffer_node<T> b_copy(b);
+
+ // b_copy should be empty
+ j = bogus_value;
+ g.wait_for_all();
+ ASSERT( b_copy.try_get( j ) == false, NULL );
+
+ // hook them together:
+ ASSERT( b.register_successor(b_copy) == true, NULL );
+ // try to get content from b_copy
+ {
+ touches< T > t( num_threads );
+ NativeParallelFor( num_threads, parallel_gets<T>(b_copy, t) );
+ g.wait_for_all();
+ ASSERT( t.validate_touches(), NULL );
+ }
+ // now both should be empty
+ j = bogus_value;
+ g.wait_for_all();
+ ASSERT( b.try_get( j ) == false, NULL );
+ g.wait_for_all();
+ ASSERT( b_copy.try_get( j ) == false, NULL );
+ ASSERT( j == bogus_value, NULL );
+
return 0;
}
@@ -284,11 +312,11 @@ int test_parallel(int num_threads) {
template< typename T >
int test_serial() {
- tbb::graph g;
+ tbb::flow::graph g;
T bogus_value(-1);
- tbb::buffer_node<T> b(g);
- tbb::buffer_node<T> b2(g);
+ tbb::flow::buffer_node<T> b(g);
+ tbb::flow::buffer_node<T> b2(g);
T j = bogus_value;
//
@@ -321,7 +349,7 @@ int test_serial() {
ASSERT( b.try_get( j ) == false, NULL );
ASSERT( j == bogus_value, NULL );
- ASSERT( b.register_successor( b2 ) == true, NULL );
+ tbb::flow::make_edge(b, b2);
vsum = T(0);
for (int i = 0; i < N; ++i) {
@@ -342,7 +370,7 @@ int test_serial() {
ASSERT( b2.try_get( j ) == false, NULL );
ASSERT( j == bogus_value, NULL );
- ASSERT( b.remove_successor( b2 ) == true, NULL );
+ tbb::flow::remove_edge(b, b2);
ASSERT( b.try_put( 1 ) == true, NULL );
g.wait_for_all();
ASSERT( b2.try_get( j ) == false, NULL );
@@ -351,9 +379,9 @@ int test_serial() {
ASSERT( b.try_get( j ) == true, NULL );
ASSERT( j == 1, NULL );
- tbb::buffer_node<T> b3(g);
- ASSERT( b.register_successor( b2 ) == true, NULL );
- ASSERT( b2.register_successor( b3 ) == true, NULL );
+ tbb::flow::buffer_node<T> b3(g);
+ tbb::flow::make_edge( b, b2 );
+ tbb::flow::make_edge( b2, b3 );
vsum = T(0);
for (int i = 0; i < N; ++i) {
@@ -376,7 +404,7 @@ int test_serial() {
ASSERT( b3.try_get( j ) == false, NULL );
ASSERT( j == bogus_value, NULL );
- ASSERT( b.remove_successor( b2 ) == true, NULL );
+ tbb::flow::remove_edge(b, b2);
ASSERT( b.try_put( 1 ) == true, NULL );
g.wait_for_all();
ASSERT( b2.try_get( j ) == false, NULL );
diff --git a/src/test/test_cilk_dynamic_load.cpp b/src/test/test_cilk_dynamic_load.cpp
index 2b91bac..a11554b 100644
--- a/src/test/test_cilk_dynamic_load.cpp
+++ b/src/test/test_cilk_dynamic_load.cpp
@@ -28,14 +28,16 @@
#include "tbb/tbb_config.h"
-// Skip the test if no TBB-Cilk interoperability
+// Skip the test if no interoperability with cilkrts
#define __TBB_CILK_INTEROP (__TBB_SURVIVE_THREAD_SWITCH && __INTEL_COMPILER>=1200)
-// Skip the test until Cilk will have dlopen()/dlclose() start up feature
+// Skip the test when cilkrts did not have dlopen()/dlclose() start up feature
#define CILK_SYMBOLS_VISIBLE (_WIN32||_WIN64)
// The compiler does not add "-lcilkrts" linker option on some linux systems
-#define CILK_LINKAGE_BROKEN (__linux__ && __GNUC__<4 && __INTEL_COMPILER_BUILD_DATE <= 20101116)
+#define CILK_LINKAGE_BROKEN (__linux__ && __GNUC__<4 && __INTEL_COMPILER_BUILD_DATE <= 20110427)
+// In U4, cilkrts incorrectly sends the interop notifications to TBB
+#define CILK_NOTIFICATIONS_BROKEN ( __INTEL_COMPILER_BUILD_DATE == 20110427 )
-#if __TBB_CILK_INTEROP && CILK_SYMBOLS_VISIBLE && !CILK_LINKAGE_BROKEN
+#if __TBB_CILK_INTEROP && CILK_SYMBOLS_VISIBLE && !CILK_LINKAGE_BROKEN && !CILK_NOTIFICATIONS_BROKEN
#if _WIN32 || _WIN64
#include "tbb/machine/windows_api.h"
@@ -63,7 +65,7 @@ static const int P_nested = 2;
#define CILK_TEST_EXPORT extern "C"
#endif /* _WIN32 || _WIN64 */
-bool g_sandwich = true; // have to be declare before #include "test_cilk_sandwich.h"
+bool g_sandwich = true; // have to be declare before #include "test_cilk_common.h"
#include "test_cilk_common.h"
CILK_TEST_EXPORT int CilkFib( int n )
@@ -175,7 +177,7 @@ int TestMain () {
#endif /* _USRDLL */
-#else /* No Cilk interop */
+#else /* !__TBB_CILK_INTEROP */
#include "harness.h"
@@ -183,4 +185,4 @@ int TestMain () {
return Harness::Skipped;
}
-#endif /* No Cilk interop */
+#endif /* !__TBB_CILK_INTEROP */
diff --git a/src/test/test_cilk_interop.cpp b/src/test/test_cilk_interop.cpp
index ba9fb1e..46861c8 100644
--- a/src/test/test_cilk_interop.cpp
+++ b/src/test/test_cilk_interop.cpp
@@ -29,12 +29,14 @@
#include "tbb/tbb_config.h"
#include "harness.h"
-// Skip the test if no TBB-Cilk interoperability
+// Skip the test if no interoperability with cilkrts
#define __TBB_CILK_INTEROP (__TBB_SURVIVE_THREAD_SWITCH && __INTEL_COMPILER>=1200)
// The compiler does not add "-lcilkrts" linker option on some linux systems
-#define CILK_LINKAGE_BROKEN (__linux__ && __GNUC__<4 && __INTEL_COMPILER_BUILD_DATE <= 20101116)
+#define CILK_LINKAGE_BROKEN (__linux__ && __GNUC__<4 && __INTEL_COMPILER_BUILD_DATE <= 20110427)
+// In U4, cilkrts incorrectly sends the interop notifications to TBB
+#define CILK_NOTIFICATIONS_BROKEN ( __INTEL_COMPILER_BUILD_DATE == 20110427 )
-#if __TBB_CILK_INTEROP && !CILK_LINKAGE_BROKEN
+#if __TBB_CILK_INTEROP && !CILK_LINKAGE_BROKEN && !CILK_NOTIFICATIONS_BROKEN
static const int N = 14;
static const int P_outer = 4;
@@ -57,7 +59,7 @@ enum tbb_sched_injection_mode_t {
tbb_sched_injection_mode_t g_sim = tbbsched_none;
-bool g_sandwich = false; // have to be declare before #include "test_cilk_sandwich.h"
+bool g_sandwich = false; // have to be declare before #include "test_cilk_common.h"
#include "test_cilk_common.h"
// A time delay routine
@@ -151,10 +153,10 @@ int TestMain () {
return Harness::Done;
}
-#else /* No Cilk interop */
+#else /* !__TBB_CILK_INTEROP */
int TestMain () {
return Harness::Skipped;
}
-#endif /* No Cilk interop */
+#endif /* !__TBB_CILK_INTEROP */
diff --git a/src/test/test_combinable.cpp b/src/test/test_combinable.cpp
index b7ff86b..5dbd83a 100644
--- a/src/test/test_combinable.cpp
+++ b/src/test/test_combinable.cpp
@@ -52,7 +52,7 @@
#include "harness_assert.h"
#include "harness.h"
-#if __TBB_GCC_WARNING_SUPPRESSION_ENABLED
+#if __TBB_GCC_WARNING_SUPPRESSION_PRESENT
#pragma GCC diagnostic ignored "-Wuninitialized"
#endif
diff --git a/src/test/test_concurrent_hash_map.cpp b/src/test/test_concurrent_hash_map.cpp
index 26af309..e9b02f3 100644
--- a/src/test/test_concurrent_hash_map.cpp
+++ b/src/test/test_concurrent_hash_map.cpp
@@ -77,6 +77,13 @@ namespace tbb {
};
}
+#if HARNESS_USE_PROXY
+ #define TBB_PREVIEW_RUNTIME_LOADER 1
+ #include "tbb/runtime_loader.h"
+ static char const * test_path[] = { ".", NULL };
+ static tbb::runtime_loader test_runtime_loader( test_path );
+#endif // HARNESS_USE_PROXY
+
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):
diff --git a/src/test/test_concurrent_monitor.cpp b/src/test/test_concurrent_monitor.cpp
index 0390adc..3e6ec13 100644
--- a/src/test/test_concurrent_monitor.cpp
+++ b/src/test/test_concurrent_monitor.cpp
@@ -28,11 +28,23 @@
#include "tbb/concurrent_monitor.h"
#include "tbb/atomic.h"
+#include "tbb/task_scheduler_init.h"
#include "tbb/parallel_for.h"
#include "tbb/blocked_range.h"
#include "harness.h"
+#if _WIN32||_WIN64
+#include "tbb/dynamic_link.cpp"
+#endif
+
+#include "tbb/semaphore.cpp"
#include "tbb/concurrent_monitor.cpp"
+#if _MSC_VER && !defined(__INTEL_COMPILER)
+ // Workaround for overzealous compiler warnings
+ // Suppress compiler warning about constant conditional expression
+ #pragma warning (disable: 4127)
+#endif
+
using namespace tbb;
//! Queuing lock with concurrent_monitor; to test concurrent_monitor::notify( Predicate p )
@@ -85,7 +97,10 @@ void QueuingMutex::ScopedLock::Acquire( QueuingMutex& m )
// "sending" the fields initialized above to other processors.
ScopedLock* pred = m.q_tail.fetch_and_store<tbb::release>(this);
if( pred ) {
+#if TBB_USE_ASSERT
+ __TBB_control_consistency_helper(); // on "m.q_tail"
ASSERT( !pred->next, "the predecessor has another successor!");
+#endif
pred->next = this;
for( int i=0; i<16; ++i ) {
if( going!=0ul ) break;
@@ -94,9 +109,8 @@ void QueuingMutex::ScopedLock::Acquire( QueuingMutex& m )
SleepPerhaps();
}
- // Force acquire so that user's critical section receives correct values
- // from processor that was previously in the user's critical section.
- __TBB_load_with_acquire(going);
+ // Acquire critical section indirectly from previous owner or directly from predecessor.
+ __TBB_control_consistency_helper(); // on either "m.q_tail" or "going"
}
//! A method to release QueuingMutex lock
@@ -199,15 +213,16 @@ void SpinMutex::ScopedLock::SleepPerhaps()
mq.cancel_wait( thr_ctx );
}
+//! A value protected by a mutex.
template<typename M>
struct Counter {
typedef M mutex_type;
M mutex;
- volatile long value;
+ long value;
};
//! Function object for use with parallel_for.h.
-template<typename C>
+template<typename C, int D>
struct AddOne: NoAssign {
C& counter;
/** Increments counter once for each iteration in the iteration space. */
@@ -215,30 +230,34 @@ struct AddOne: NoAssign {
for( size_t i=range.begin(); i!=range.end(); ++i ) {
typename C::mutex_type::ScopedLock lock(counter.mutex);
counter.value = counter.value+1;
+ if( D>0 )
+ for( int j=0; j<D; ++j ) __TBB_Yield();
}
}
AddOne( C& counter_ ) : counter(counter_) {}
};
-//! Generic test of a TBB mutex type M.
-/** Does not test features specific to reader-writer locks. */
-template<typename M>
-void Test() {
+//! Generic test with TBB mutex type M, max range R, and delay D.
+template<typename M,int R, int D>
+void Test( int p ) {
Counter<M> counter;
counter.value = 0;
- const int n = 100000;
- tbb::parallel_for(tbb::blocked_range<size_t>(0,n,n/10),AddOne<Counter<M> >(counter));
+ const int n = R;
+ tbb::task_scheduler_init init(p);
+ tbb::parallel_for(tbb::blocked_range<size_t>(0,n,n/10),AddOne<Counter<M>,D>(counter));
if( counter.value!=n )
- REPORT("ERROR : counter.value=%ld\n",counter.value);
+ REPORT("ERROR : counter.value=%ld (instead of %ld)\n",counter.value,n);
}
int TestMain () {
for( int p=MinThread; p<=MaxThread; ++p ) {
REMARK( "testing with %d workers\n", static_cast<int>(p) );
// test the predicated notify
- Test<QueuingMutex>();
+ Test<QueuingMutex,100000,0>( p );
+ Test<QueuingMutex,1000,10000>( p );
// test the notify_all method
- Test<SpinMutex>();
+ Test<SpinMutex,100000,0>( p );
+ Test<SpinMutex,1000,10000>( p );
REMARK( "calling destructor for task_scheduler_init\n" );
}
return Harness::Done;
diff --git a/src/test/test_concurrent_priority_queue.cpp b/src/test/test_concurrent_priority_queue.cpp
index 2d757c7..b932b08 100644
--- a/src/test/test_concurrent_priority_queue.cpp
+++ b/src/test/test_concurrent_priority_queue.cpp
@@ -26,17 +26,6 @@
the GNU General Public License.
*/
-#ifndef TBB_PREVIEW_CONCURRENT_PRIORITY_QUEUE
- #define TBB_PREVIEW_CONCURRENT_PRIORITY_QUEUE 1
-#endif
-
-#if __INTEL_COMPILER && _WIN64 && TBB_USE_ASSERT
-// The Intel Compiler has an issue that causes the Microsoft Iterator
-// Debugging code to crash in vector::pop_back when it is called after a
-// vector::push_back throws an exception.
-#define _HAS_ITERATOR_DEBUGGING 0
-#endif
-
#include "tbb/concurrent_priority_queue.h"
#include "tbb/atomic.h"
#include "harness.h"
@@ -53,6 +42,15 @@
#pragma warning( pop )
#endif
+#if __INTEL_COMPILER && (_WIN32 || _WIN64) && TBB_USE_DEBUG && _CPPLIB_VER<520
+// The Intel Compiler has an issue that causes the Microsoft Iterator
+// Debugging code to crash in vector::pop_back when it is called after a
+// vector::push_back throws an exception.
+// #define _HAS_ITERATOR_DEBUGGING 0 // Setting this to 0 doesn't solve the problem
+ // and also provokes a redefinition warning
+#define __TBB_ITERATOR_DEBUGGING_EXCEPTIONS_BROKEN
+#endif
+
using namespace tbb;
const size_t MAX_ITER = 10000;
@@ -139,23 +137,6 @@ public:
}
};
-template<typename T, typename C>
-struct ReserveBody : NoAssign {
- int nThread;
- concurrent_priority_queue<T, C> *q;
-public:
- ReserveBody(int nThread_, concurrent_priority_queue<T, C> *q_) : nThread(nThread_), q(q_) {}
- void operator()(const int threadID) const {
- T in_elem(threadID), out_elem;
- q->reserve(q->capacity()+1);
- for (size_t i=0; i<MAX_ITER; ++i) {
- q->push(in_elem);
- if (i%2) in_elem = in_elem + nThread;
- ASSERT(q->try_pop(out_elem), "FAILED simultaneous enqueue/dequeue test in ReserveBody.");
- }
- }
-};
-
template <typename T, typename C>
class FloggerBody : NoAssign {
int nThread;
@@ -183,7 +164,6 @@ void TestConstructorsDestructorsAccessors() {
q = new concurrent_priority_queue<int, std::less<int> >();
REMARK("Default constructor complete.\n");
ASSERT(q->size()==0, "FAILED size test.");
- ASSERT(q->capacity()==0, "FAILED capacity test.");
ASSERT(q->empty(), "FAILED empty test.");
REMARK("Testing destructor.\n");
delete q;
@@ -193,7 +173,6 @@ void TestConstructorsDestructorsAccessors() {
q = new concurrent_priority_queue<int, std::less<int> >(42);
REMARK("Capacity constructor complete.\n");
ASSERT(q->size()==0, "FAILED size test.");
- ASSERT(q->capacity()==42, "FAILED capacity test.");
ASSERT(q->empty(), "FAILED empty test.");
REMARK("Testing destructor.\n");
delete q;
@@ -203,7 +182,6 @@ void TestConstructorsDestructorsAccessors() {
qi = new concurrent_priority_queue<int, std::less<int>, std::allocator<int> >(a);
REMARK("Allocator constructor complete.\n");
ASSERT(qi->size()==0, "FAILED size test.");
- ASSERT(qi->capacity()==0, "FAILED allocator test.");
ASSERT(qi->empty(), "FAILED empty test.");
REMARK("Testing destructor.\n");
delete qi;
@@ -213,7 +191,6 @@ void TestConstructorsDestructorsAccessors() {
qi = new concurrent_priority_queue<int, std::less<int>, std::allocator<int> >(42, a);
REMARK("Capacity+allocator constructor complete.\n");
ASSERT(qi->size()==0, "FAILED size test.");
- ASSERT(qi->capacity()==42, "FAILED capacity+allocator test.");
ASSERT(qi->empty(), "FAILED empty test.");
REMARK("Testing destructor.\n");
delete qi;
@@ -225,14 +202,12 @@ void TestConstructorsDestructorsAccessors() {
q = new concurrent_priority_queue<int, std::less<int> >(v.begin(), v.end());
REMARK("Iterator filler constructor complete.\n");
ASSERT(q->size()==42, "FAILED vector/size test.");
- ASSERT(q->capacity()==42, "FAILED vector/capacity test.");
ASSERT(!q->empty(), "FAILED vector/empty test.");
REMARK("Testing copy constructor.\n");
qo = new concurrent_priority_queue<int, std::less<int> >(*q);
REMARK("Copy constructor complete.\n");
ASSERT(qo->size()==42, "FAILED vector/size test.");
- ASSERT(qo->capacity()==42, "FAILED vector/capacity test.");
ASSERT(!qo->empty(), "FAILED vector/empty test.");
REMARK("Testing destructor.\n");
delete q;
@@ -240,7 +215,7 @@ void TestConstructorsDestructorsAccessors() {
REMARK("Destruction complete.\n");
}
-void TestAssignmentClearShrinkSwap() {
+void TestAssignmentClearSwap() {
std::vector<int> v;
concurrent_priority_queue<int, std::less<int> > *q, *qo;
int e;
@@ -254,14 +229,12 @@ void TestAssignmentClearShrinkSwap() {
*qo = *q;
REMARK("Assignment complete.\n");
ASSERT(qo->size()==42, "FAILED assignment/size test.");
- ASSERT(qo->capacity()==42, "FAILED assignment/capacity test.");
ASSERT(!qo->empty(), "FAILED assignment/empty test.");
REMARK("Testing clear.\n");
q->clear();
REMARK("Clear complete.\n");
ASSERT(q->size()==0, "FAILED clear/size test.");
- ASSERT(q->capacity()==42, "FAILED clear/capacity test.");
ASSERT(q->empty(), "FAILED clear/empty test.");
for (size_t i=0; i<5; ++i)
@@ -271,27 +244,17 @@ void TestAssignmentClearShrinkSwap() {
*q = *qo;
REMARK("Assignment complete.\n");
ASSERT(q->size()==37, "FAILED assignment/size test.");
- ASSERT(q->capacity()==37, "FAILED assignment/capacity test.");
ASSERT(!q->empty(), "FAILED assignment/empty test.");
for (size_t i=0; i<5; ++i)
(void) qo->try_pop(e);
- REMARK("Testing shrink_to_fit.\n");
- qo->shrink_to_fit();
- REMARK("Shrink_to_fit complete.\n");
- ASSERT(qo->size()==32, "FAILED shrink_to_fit/size test.");
- ASSERT(qo->capacity()==32, "FAILED shrink_to_fit/capacity test.");
- ASSERT(!qo->empty(), "FAILED shrink_to_fit/empty test.");
-
REMARK("Testing swap.\n");
q->swap(*qo);
REMARK("Swap complete.\n");
ASSERT(q->size()==32, "FAILED swap/size test.");
- ASSERT(q->capacity()==32, "FAILED swap/capacity test.");
ASSERT(!q->empty(), "FAILED swap/empty test.");
ASSERT(qo->size()==37, "FAILED swap_operand/size test.");
- ASSERT(qo->capacity()==37, "FAILED swap_operand/capacity test.");
ASSERT(!qo->empty(), "FAILED swap_operand/empty test.");
delete q;
delete qo;
@@ -310,7 +273,6 @@ void TestSerialPushPop() {
}
REMARK("Pushing complete.\n");
ASSERT(q->size()==MAX_ITER, "FAILED push/size test.");
- ASSERT(q->capacity()==MAX_ITER, "FAILED push/capacity test.");
ASSERT(!q->empty(), "FAILED push/empty test.");
REMARK("Testing serial pop.\n");
@@ -320,7 +282,6 @@ void TestSerialPushPop() {
prev = e;
++count;
ASSERT(q->size()==MAX_ITER-count, "FAILED swap/size test.");
- ASSERT(q->capacity()==MAX_ITER, "FAILED swap/capacity test.");
ASSERT(!q->empty() || count==MAX_ITER, "FAILED swap/empty test.");
}
REMARK("Popping complete.\n");
@@ -340,7 +301,6 @@ void TestParallelPushPop(int nThreads, T t_max, T t_min, C /*compare*/) {
REMARK("Pushing complete.\n");
qsize = q->size();
ASSERT(q->size()==nThreads*MAX_ITER, "FAILED push/size test.");
- ASSERT(q->capacity()>=qsize, "FAILED push/capacity test.");
ASSERT(!q->empty(), "FAILED push/empty test.");
REMARK("Testing parallel pop.\n");
@@ -350,23 +310,9 @@ void TestParallelPushPop(int nThreads, T t_max, T t_min, C /*compare*/) {
ASSERT(q->size()==0, "FAILED pop/empty test.");
q->clear();
- q->shrink_to_fit();
delete(q);
}
-void TestPushPopReserve(int nThreads) {
- concurrent_priority_queue<int, std::less<int> > *q = new concurrent_priority_queue<int, std::less<int> >(0);
- counter = 0;
- REMARK("Testing reserve.\n");
- NativeParallelFor(nThreads, ReserveBody<int, std::less<int> >(nThreads, q));
- REMARK("Reserve complete.\n");
- ASSERT(q->size()==0, "FAILED reserve/size test.");
- ASSERT(q->empty(), "FAILED reserve/empty test.");
- q->clear();
- q->shrink_to_fit();
- delete q;
-}
-
void TestExceptions() {
const size_t TOO_LARGE_SZ = 1000000000;
my_throwing_type elem;
@@ -377,14 +323,14 @@ void TestExceptions() {
my_throwing_type::throw_flag = 1;
cpq_ex_test_type q;
} catch(...) {
- REMARK("FAILED: allocating empty queue should not throw exception.\n");
+ ASSERT(false, "FAILED: allocating empty queue should not throw exception.\n");
}
// Allocate small queue should not throw for reasonably sized type
try {
my_throwing_type::throw_flag = 1;
cpq_ex_test_type q(42);
} catch(...) {
- REMARK("FAILED: allocating small queue should not throw exception.\n");
+ ASSERT(false, "FAILED: allocating small queue should not throw exception.\n");
}
// Allocate a queue with too large initial size
try {
@@ -434,21 +380,9 @@ void TestExceptions() {
REMARK("FAILED: Assign did not throw exception.\n");
} catch(...) {
ASSERT(assign_q.empty(), "FAILED: assign_q should be empty.\n");
- ASSERT(assign_q.capacity()==24, "FAILED: assign_q should have no newly allocated memory.\n");
}
REMARK("Assignment exceptions testing complete.\n");
- REMARK("Testing reserve exceptions.\n");
- try {
- my_throwing_type::throw_flag = 1;
- src_q.reserve(50);
- REMARK("FAILED: Reserve did not throw exception.\n");
- } catch(...) {
- ASSERT(!src_q.empty(), "FAILED: src_q should not be empty.\n");
- ASSERT(src_q.capacity()==42, "FAILED: src_q should be have no new allocated memory.\n");
- ASSERT(src_q.size()==42, "FAILED: src_q should have same size.\n");
- ASSERT(src_q.try_pop(elem), "FAILED: src_q is not functional.\n");
- }
- REMARK("Reserve exceptions testing complete.\n");
+#ifndef __TBB_ITERATOR_DEBUGGING_EXCEPTIONS_BROKEN
REMARK("Testing push exceptions.\n");
my_throwing_type::throw_flag = 0;
pq = new cpq_ex_test_type(3);
@@ -457,30 +391,39 @@ void TestExceptions() {
pq->push(elem);
pq->push(elem);
} catch(...) {
- REMARK("FAILED: Push should not throw exception... yet.\n");
+ ASSERT(false, "FAILED: Push should not throw exception... yet.\n");
}
- try { // should crash on reserve copy
+ try { // should crash on copy during expansion of vector
my_throwing_type::throw_flag = 1;
pq->push(elem);
REMARK("FAILED: Push did not throw exception.\n");
} catch(...) {
ASSERT(!pq->empty(), "FAILED: pq should not be empty.\n");
- ASSERT(pq->capacity()==3, "FAILED: pq should be have no new allocated memory.\n");
ASSERT(pq->size()==3, "FAILED: pq should be only three elements.\n");
ASSERT(pq->try_pop(elem), "FAILED: pq is not functional.\n");
}
- try { // should crash on push copy of element, reserve not needed
+ delete pq;
+
+ my_throwing_type::throw_flag = 0;
+ pq = new cpq_ex_test_type(3);
+ try {
+ pq->push(elem);
+ pq->push(elem);
+ } catch(...) {
+ ASSERT(false, "FAILED: Push should not throw exception... yet.\n");
+ }
+ try { // should crash on push copy of element
my_throwing_type::throw_flag = 1;
pq->push(elem);
REMARK("FAILED: Push did not throw exception.\n");
} catch(...) {
ASSERT(!pq->empty(), "FAILED: pq should not be empty.\n");
- ASSERT(pq->capacity()==3, "FAILED: pq should be have no new allocated memory.\n");
ASSERT(pq->size()==2, "FAILED: pq should be only two elements.\n");
ASSERT(pq->try_pop(elem), "FAILED: pq is not functional.\n");
}
delete pq;
REMARK("Push exceptions testing complete.\n");
+#endif
}
template <typename T, typename C>
@@ -499,7 +442,7 @@ void TestCpqOnNThreads(int nThreads) {
my_less data_compare;
TestConstructorsDestructorsAccessors();
- TestAssignmentClearShrinkSwap();
+ TestAssignmentClearSwap();
TestSerialPushPop();
TestParallelPushPop(nThreads, INT_MAX, INT_MIN, int_compare);
@@ -510,7 +453,6 @@ void TestCpqOnNThreads(int nThreads) {
TestFlogger(nThreads, (unsigned char)CHAR_MAX, int_compare);
TestFlogger(nThreads, DATA_MAX, data_compare);
- TestPushPopReserve(nThreads);
#if TBB_USE_EXCEPTIONS && !__TBB_THROW_ACROSS_MODULE_BOUNDARY_BROKEN
TestExceptions();
#else
diff --git a/src/test/test_concurrent_queue.cpp b/src/test/test_concurrent_queue.cpp
index 1e7f8db..b4a96f5 100644
--- a/src/test/test_concurrent_queue.cpp
+++ b/src/test/test_concurrent_queue.cpp
@@ -397,12 +397,20 @@ bool operator==(const BarEx& bar1, const BarEx& bar2) {
#endif /* TBB_USE_EXCEPTIONS */
#if TBB_DEPRECATED
+
+#if __INTEL_COMPILER==1200 && _MSC_VER==1600
+// A workaround due to ICL 12.0 with /Qvc10 generating buggy code in TestIterator
+#define CALL_BEGIN(q,i) q.begin()
+#define CALL_END(q,i) q.end()
+#else
#define CALL_BEGIN(q,i) (((i)&0x1)?q.begin():q.unsafe_begin())
#define CALL_END(q,i) (((i)&0x1)?q.end():q.unsafe_end())
+#endif
+
#else
#define CALL_BEGIN(q,i) q.unsafe_begin()
#define CALL_END(q,i) q.unsafe_end()
-#endif
+#endif /* TBB_DEPRECATED */
void TestConstructors ()
{
@@ -897,34 +905,39 @@ void TestPrimitiveTypes( int nthread, T exemplar )
#include "harness_m128.h"
-#if HAVE_m128
+#if HAVE_m128 || HAVE_m256
-//! Test concurrent queue with SSE type
-/** Type Queue should be a queue of ClassWithSSE. */
-template<typename Queue>
-void TestSSE() {
+//! Test concurrent queue with vector types
+/** Type Queue should be a queue of ClassWithSSE/ClassWithAVX. */
+template<typename ClassWithVectorType, typename Queue>
+void TestVectorTypes() {
Queue q1;
- for( int i=0; i<100; ++i )
- q1.push(ClassWithSSE(i));
+ for( int i=0; i<100; ++i ) {
+ // VC8 does not properly align a temporary value; to work around, use explicit variable
+ ClassWithVectorType bar(i);
+ q1.push(bar);
+ }
// Copy the queue
Queue q2 = q1;
// Check that elements of the copy are correct
typename Queue::const_iterator ci = q2.unsafe_begin();
for( int i=0; i<100; ++i ) {
- ClassWithSSE foo = *ci;
- ASSERT( *ci==ClassWithSSE(i), NULL );
+ ClassWithVectorType foo = *ci;
+ ClassWithVectorType bar(i);
+ ASSERT( *ci==bar, NULL );
++ci;
}
for( int i=0; i<101; ++i ) {
- ClassWithSSE tmp;
+ ClassWithVectorType tmp;
bool b = q1.try_pop( tmp );
ASSERT( b==(i<100), NULL );
- ASSERT( !b || tmp==ClassWithSSE(i), NULL );
+ ClassWithVectorType bar(i);
+ ASSERT( !b || tmp==bar, NULL );
}
}
-#endif /* HAVE_m128 */
+#endif /* HAVE_m128 || HAVE_m256 */
int TestMain () {
TestEmptyQueue<char>();
@@ -942,9 +955,15 @@ int TestMain () {
TestPrimitiveTypes( MaxThread, (float)-1.2f );
TestPrimitiveTypes( MaxThread, (double)-4.3 );
#if HAVE_m128
- TestSSE<tbb::concurrent_queue<ClassWithSSE> >();
- TestSSE<tbb::concurrent_bounded_queue<ClassWithSSE> >();
-#endif /* HAVE_m128 */
+ TestVectorTypes<ClassWithSSE, tbb::concurrent_queue<ClassWithSSE> >();
+ TestVectorTypes<ClassWithSSE, tbb::concurrent_bounded_queue<ClassWithSSE> >();
+#endif
+#if HAVE_m256
+ if( have_AVX() ) {
+ TestVectorTypes<ClassWithAVX, tbb::concurrent_queue<ClassWithAVX> >();
+ TestVectorTypes<ClassWithAVX, tbb::concurrent_bounded_queue<ClassWithAVX> >();
+ }
+#endif
// Test concurrent operations
for( int nthread=MinThread; nthread<=MaxThread; ++nthread ) {
diff --git a/src/test/test_concurrent_unordered.cpp b/src/test/test_concurrent_unordered.cpp
index b9e857f..c6be930 100644
--- a/src/test/test_concurrent_unordered.cpp
+++ b/src/test/test_concurrent_unordered.cpp
@@ -30,6 +30,7 @@
#define __TBB_EXTRA_DEBUG 1
#include "tbb/concurrent_unordered_map.h"
+#include "tbb/concurrent_unordered_set.h"
#include "tbb/parallel_for.h"
#include "tbb/tick_count.h"
#include <stdio.h>
@@ -39,9 +40,8 @@
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> Mycumap;
-//typedef tbb::concurrent_unordered_map<int, int> Mycumap;
-//typedef concurrent_unordered_multimap<int, int> Mycummap;
+typedef tbb::concurrent_unordered_map<int, int, tbb::tbb_hash<int>, std::equal_to<int>, MyAllocator> MyMap;
+typedef tbb::concurrent_unordered_set<int, tbb::tbb_hash<int>, std::equal_to<int>, MyAllocator> MySet;
#define CheckAllocatorE(t,a,f) CheckAllocator(t,a,f,true,__LINE__)
#define CheckAllocatorA(t,a,f) CheckAllocator(t,a,f,false,__LINE__)
@@ -59,15 +59,19 @@ inline void CheckAllocator(MyTable &table, size_t expected_allocs, size_t expect
}
}
+// value generator for cumap
template <typename K, typename V = std::pair<const K, K> >
struct ValueFactory {
static V make(const K &value) { return V(value, value); }
+ static K key(const V &value) { return value.first; }
static K get(const V& value) { return value.second; }
};
+// generator for cuset
template <typename T>
struct ValueFactory<T, T> {
static T make(const T &value) { return value; }
+ static T key(const T &value) { return value; }
static T get(const T &value) { return value; }
};
@@ -79,16 +83,16 @@ struct Value : ValueFactory<typename T::key_type, typename T::value_type> {};
#pragma warning(disable: 4127) // warning 4127 -- while (true) has a constant expression in it
#endif
-template<typename Iterator, typename RangeType>
+template<typename ContainerType, typename Iterator, typename RangeType>
std::pair<int,int> CheckRecursiveRange(RangeType range) {
std::pair<int,int> sum(0, 0); // count, sum
for( Iterator i = range.begin(), e = range.end(); i != e; ++i ) {
- ++sum.first; sum.second += i->second;
+ ++sum.first; sum.second += Value<ContainerType>::get(*i);
}
if( range.is_divisible() ) {
RangeType range2( range, tbb::split() );
- std::pair<int,int> sum1 = CheckRecursiveRange<Iterator, RangeType>( range );
- std::pair<int,int> sum2 = CheckRecursiveRange<Iterator, RangeType>( range2 );
+ std::pair<int,int> sum1 = CheckRecursiveRange<ContainerType,Iterator, RangeType>( range );
+ std::pair<int,int> sum2 = CheckRecursiveRange<ContainerType,Iterator, RangeType>( range2 );
sum1.first += sum2.first; sum1.second += sum2.second;
ASSERT( sum == sum1, "Mismatched ranges after division");
}
@@ -97,16 +101,16 @@ std::pair<int,int> CheckRecursiveRange(RangeType range) {
template <typename T>
struct SpecialTests {
- static void Test() {}
+ static void Test(const char *str) {REMARK("skipped -- specialized %s tests\n", str);}
};
template <>
-struct SpecialTests <Mycumap>
+struct SpecialTests <MyMap>
{
- static void Test()
+ static void Test(const char *str)
{
- Mycumap cont(0);
- const Mycumap &ccont(cont);
+ MyMap cont(0);
+ const MyMap &ccont(cont);
// mapped_type& operator[](const key_type& k);
cont[1] = 2;
@@ -125,10 +129,10 @@ struct SpecialTests <Mycumap>
ASSERT(ccont.at(1) == 2, "Concurrent container size incorrect");
// iterator find(const key_type& k);
- Mycumap::const_iterator it = cont.find(1);
- ASSERT(it != cont.end() && Value<Mycumap>::get(*(it)) == 2, "Element with key 1 not properly found");
+ MyMap::const_iterator it = cont.find(1);
+ ASSERT(it != cont.end() && Value<MyMap>::get(*(it)) == 2, "Element with key 1 not properly found");
- REMARK("passed -- specialized concurrent unordered map tests\n");
+ REMARK("passed -- specialized %s tests\n", str);
}
};
@@ -273,8 +277,8 @@ void test_basic(const char * str)
ASSERT(ins3.second == true && Value<T>::get(*(ins3.first)) == i, "Element 1 not properly inserted");
}
ASSERT(cont.size() == 256, "Wrong number of elements inserted");
- ASSERT(256 == CheckRecursiveRange<typename T::iterator>(cont.range()).first, NULL);
- ASSERT(256 == CheckRecursiveRange<typename T::const_iterator>(ccont.range()).first, NULL);
+ ASSERT((256 == CheckRecursiveRange<T,typename T::iterator>(cont.range()).first), NULL);
+ ASSERT((256 == CheckRecursiveRange<T,typename T::const_iterator>(ccont.range()).first), NULL);
// size_type unsafe_bucket_count() const;
ASSERT(ccont.unsafe_bucket_count() == 16, "Wrong number of buckets");
@@ -327,7 +331,7 @@ void test_basic(const char * str)
REMARK("\n");
#endif
- SpecialTests<T>::Test();
+ SpecialTests<T>::Test(str);
}
void test_machine() {
@@ -383,7 +387,7 @@ public:
typedef tbb::atomic<unsigned char> AtomicByte;
-template<typename RangeType>
+template<typename ContainerType, typename RangeType>
struct ParallelTraverseBody: NoAssign {
const int n;
AtomicByte* const array;
@@ -392,8 +396,8 @@ struct ParallelTraverseBody: NoAssign {
{}
void operator()( const RangeType& range ) const {
for( typename RangeType::iterator i = range.begin(); i!=range.end(); ++i ) {
- int k = i->first;
- ASSERT( k == i->second, NULL );
+ int k = Value<ContainerType>::key(*i);
+ ASSERT( k == Value<ContainerType>::get(*i), NULL );
ASSERT( 0<=k && k<n, NULL );
array[k]++;
}
@@ -430,6 +434,16 @@ public:
}
};
+template<>
+class AssignBody<MySet>: NoAssign {
+ MySet &table;
+public:
+ AssignBody(MySet &t) : NoAssign(), table(t) {}
+ void operator()(int i) const {
+ table.insert(i);
+ }
+};
+
template<typename T>
void test_concurrent(const char *tablename) {
#if TBB_USE_ASSERT
@@ -452,15 +466,15 @@ void test_concurrent(const char *tablename) {
memset( array, 0, items*sizeof(AtomicByte) );
typename T::range_type r = table.range();
- ASSERT(items == CheckRecursiveRange<typename T::iterator>(r).first, NULL);
- tbb::parallel_for( r, ParallelTraverseBody<typename T::const_range_type>( array, items ));
+ 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<typename T::const_iterator>(cr).first, NULL);
- tbb::parallel_for( cr, ParallelTraverseBody<typename T::const_range_type>( array, items ));
+ 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;
@@ -477,7 +491,9 @@ void test_concurrent(const char *tablename) {
int TestMain () {
test_machine();
- test_basic<Mycumap>("concurrent unordered map");
- test_concurrent<Mycumap>("concurrent unordered map");
+ test_basic<MyMap>("concurrent unordered map");
+ test_concurrent<MyMap>("concurrent unordered map");
+ test_basic<MySet>("concurrent unordered set");
+ test_concurrent<MySet>("concurrent unordered set");
return Harness::Done;
}
diff --git a/src/test/test_concurrent_vector.cpp b/src/test/test_concurrent_vector.cpp
index e33190d..37cec5a 100644
--- a/src/test/test_concurrent_vector.cpp
+++ b/src/test/test_concurrent_vector.cpp
@@ -959,21 +959,26 @@ void TestExceptions() {
#endif /* TBB_USE_EXCEPTIONS */
//------------------------------------------------------------------------
-// Test SSE
+// Test SSE / AVX
//------------------------------------------------------------------------
#include "harness_m128.h"
-#if HAVE_m128
+#if HAVE_m128 | HAVE_m256
-void TestSSE() {
- tbb::concurrent_vector<ClassWithSSE> v;
+template<typename ClassWithVectorType>
+void TestVectorTypes() {
+ tbb::concurrent_vector<ClassWithVectorType> v;
for( int i=0; i<100; ++i ) {
- v.push_back(ClassWithSSE(i));
- for( int j=0; i<i; ++j )
- ASSERT( v[j]==ClassWithSSE(j), NULL );
+ // VC8 does not properly align a temporary value; to work around, use explicit variable
+ ClassWithVectorType foo(i);
+ v.push_back(foo);
+ for( int j=0; i<i; ++j ) {
+ ClassWithVectorType bar(j);
+ ASSERT( v[j]==bar, NULL );
+ }
}
}
-#endif /* HAVE_m128 */
+#endif /* HAVE_m128 | HAVE_m256 */
//------------------------------------------------------------------------
@@ -988,9 +993,12 @@ int TestMain () {
TestResizeAndCopy();
TestAssign();
#if HAVE_m128
- TestSSE();
-#endif /* HAVE_m128 */
+ TestVectorTypes<ClassWithSSE>();
#endif
+#if HAVE_m256
+ if (have_AVX()) TestVectorTypes<ClassWithAVX>();
+#endif
+#endif /* !TBB_DEPRECATED */
TestCapacity();
ASSERT( !FooCount, NULL );
for( int nthread=MinThread; nthread<=MaxThread; ++nthread ) {
diff --git a/src/test/test_condition_variable.h b/src/test/test_condition_variable.h
index c685f3f..f403a02 100644
--- a/src/test/test_condition_variable.h
+++ b/src/test/test_condition_variable.h
@@ -189,11 +189,13 @@ void TestLocks( const char* name, int nthread ) {
Counter<M> counter;
counter.value = 0;
Order = 0;
- const long test_size = 100000;
- NativeParallelFor( nthread, WorkForLocks<Counter<M>, test_size>(counter) );
+ // use the macro because of a seeming gcc 4.6 bug
+#define TEST_SIZE 100000
+ NativeParallelFor( nthread, WorkForLocks<Counter<M>, TEST_SIZE>(counter) );
- if( counter.value!=2*test_size )
- REPORT("ERROR for %s in TestLocks: counter.value=%ld != 2 * %ld=test_size\n",name,counter.value,test_size);
+ if( counter.value!=2*TEST_SIZE )
+ REPORT("ERROR for %s in TestLocks: counter.value=%ld != 2 * %ld=test_size\n",name,counter.value,TEST_SIZE);
+#undef TEST_SIZE
}
static tbb::atomic<int> barrier;
diff --git a/src/test/test_continue_node.cpp b/src/test/test_continue_node.cpp
index 86f757b..1e381df 100644
--- a/src/test/test_continue_node.cpp
+++ b/src/test/test_continue_node.cpp
@@ -26,108 +26,165 @@
the GNU General Public License.
*/
-#include "harness.h"
-#define TBB_PREVIEW_GRAPH 1
-#include "tbb/graph.h"
+#include "harness_graph.h"
-#define N 100
-#define T 10
+#include "tbb/task_scheduler_init.h"
+#include "tbb/spin_mutex.h"
-struct counting_receiver : public tbb::receiver<tbb::continue_msg> {
+tbb::spin_mutex global_mutex;
- typedef tbb::continue_msg input_type;
- typedef tbb::sender<tbb::continue_msg> predecessor_type;
+#define N 1000
+#define MAX_NODES 4
+#define C 8
- tbb::atomic< int > my_count;
+struct empty_no_assign : private NoAssign {
+ empty_no_assign() {}
+ empty_no_assign( int ) {}
+ operator int() { return 0; }
+};
+
+template< typename InputType >
+struct parallel_puts : private NoAssign {
+
+ tbb::flow::receiver< InputType > * const my_exe_node;
- counting_receiver() { my_count = 0; }
+ parallel_puts( tbb::flow::receiver< InputType > &exe_node ) : my_exe_node(&exe_node) {}
- bool try_put( input_type ) {
- ++my_count;
- return true;
+ void operator()( int ) const {
+ for ( int i = 0; i < N; ++i ) {
+ // the nodes will accept all puts
+ ASSERT( my_exe_node->try_put( InputType() ) == true, NULL );
+ }
}
};
-#if !__TBB_LAMBDAS_PRESENT
-class native_body : tbb::internal::no_assign {
- tbb::continue_node &my_node;
+template< typename OutputType >
+void run_continue_nodes( int p, tbb::flow::graph& g, tbb::flow::continue_node< OutputType >& n ) {
+ for (size_t i = 0; i < N; ++i) {
+ n.register_predecessor( *reinterpret_cast< tbb::flow::sender< tbb::flow::continue_msg > * >(&n) );
+ }
+
+ for (size_t num_receivers = 1; num_receivers <= MAX_NODES; ++num_receivers ) {
+ harness_counting_receiver<OutputType> *receivers = new harness_counting_receiver<OutputType>[num_receivers];
+ harness_graph_executor<tbb::flow::continue_msg, OutputType>::execute_count = 0;
+
+ for (size_t r = 0; r < num_receivers; ++r ) {
+ tbb::flow::make_edge( n, receivers[r] );
+ }
+
+ NativeParallelFor( p, parallel_puts<tbb::flow::continue_msg>(n) );
+ g.wait_for_all();
+
+ // 2) the nodes will receive puts from multiple predecessors simultaneously,
+ size_t ec = harness_graph_executor<tbb::flow::continue_msg, OutputType>::execute_count;
+ ASSERT( (int)ec == p, NULL );
+ for (size_t r = 0; r < num_receivers; ++r ) {
+ size_t c = receivers[r].my_count;
+ // 3) the nodes will send to multiple successors.
+ ASSERT( (int)c == p, NULL );
+ }
+ }
+}
+
+template< typename OutputType, typename Body >
+void continue_nodes( Body body ) {
+ for (int p = 1; p < 2*MaxThread; ++p) {
+ tbb::flow::graph g;
+ tbb::flow::continue_node< OutputType > exe_node( g, body );
+ run_continue_nodes( p, g, exe_node);
+ tbb::flow::continue_node< OutputType > exe_node_copy( exe_node );
+ run_continue_nodes( p, g, exe_node_copy);
+ }
+}
+
+const size_t Offset = 123;
+tbb::atomic<size_t> global_execute_count;
+
+template< typename OutputType >
+struct inc_functor {
-public:
+ tbb::atomic<size_t> local_execute_count;
+ inc_functor( ) { local_execute_count = 0; }
+ inc_functor( const inc_functor &f ) { local_execute_count = f.local_execute_count; }
+
+ OutputType operator()( tbb::flow::continue_msg ) {
+ ++global_execute_count;
+ ++local_execute_count;
+ return OutputType();
+ }
- native_body( tbb::continue_node &n ) : my_node(n) {}
- void operator()( int ) const {
- my_node.try_put( tbb::continue_msg() );
- }
};
-#endif
-
-// Tests
-//
-// Test that the node fires after receiving N messages from multiple senders
-// Test that the node resets and can be reused
-// Test that a successor added after triggering is NOT immediately signalled
-//
-int test_parallel_puts() {
- tbb::graph g;
- tbb::continue_node n(g);
- counting_receiver r;
- counting_receiver r2;
-
- n.register_successor(r);
-
- for (int i = 0; i < N; ++i)
- n.register_predecessor( n ); // this is a trick since the predecessor doesn't matter
-
- for (int t = 0; t < T; ++t)
-#if __TBB_LAMBDAS_PRESENT
- NativeParallelFor( N, [&](int) { n.try_put( tbb::continue_msg() ); } );
-#else
- NativeParallelFor( N, native_body(n) );
-#endif
-
- g.wait_for_all();
- ASSERT( r.my_count == T, NULL );
-
-
- n.register_successor(r2);
- ASSERT( r2.my_count == 0, NULL );
- return 0;
+
+template< typename OutputType >
+void continue_nodes_with_copy( ) {
+
+ for (int p = 1; p < 2*MaxThread; ++p) {
+ tbb::flow::graph g;
+ inc_functor<OutputType> cf;
+ cf.local_execute_count = Offset;
+ global_execute_count = Offset;
+
+ tbb::flow::continue_node< OutputType > exe_node( g, cf );
+ for (size_t i = 0; i < N; ++i) {
+ exe_node.register_predecessor( *reinterpret_cast< tbb::flow::sender< tbb::flow::continue_msg > * >(&exe_node) );
+ }
+
+ for (size_t num_receivers = 1; num_receivers <= MAX_NODES; ++num_receivers ) {
+ harness_counting_receiver<OutputType> *receivers = new harness_counting_receiver<OutputType>[num_receivers];
+
+ for (size_t r = 0; r < num_receivers; ++r ) {
+ tbb::flow::make_edge( exe_node, receivers[r] );
+ }
+
+ NativeParallelFor( p, parallel_puts<tbb::flow::continue_msg>(exe_node) );
+ g.wait_for_all();
+
+ // 2) the nodes will receive puts from multiple predecessors simultaneously,
+ for (size_t r = 0; r < num_receivers; ++r ) {
+ size_t c = receivers[r].my_count;
+ // 3) the nodes will send to multiple successors.
+ ASSERT( (int)c == p, NULL );
+ }
+ }
+
+ // validate that the local body matches the global execute_count and both are correct
+ inc_functor<OutputType> body_copy = tbb::flow::copy_body< inc_functor<OutputType> >( exe_node );
+ const size_t expected_count = p*MAX_NODES + Offset;
+ size_t global_count = global_execute_count;
+ size_t inc_count = body_copy.local_execute_count;
+ ASSERT( global_count == expected_count && global_count == inc_count, NULL );
+
+ }
}
-//
-// Tests
-//
-// Test that the node fires after receiving N messages from a single sender
-// Test that the node resets and can be reused
-// Test that a successor added after triggering is NOT immediately signalled
-//
-int test_serial_puts() {
- tbb::graph g;
- tbb::continue_node n(g);
- counting_receiver r;
- counting_receiver r2;
-
- n.register_successor(r);
-
- for (int i = 0; i < N; ++i)
- n.register_predecessor( n ); // this is a trick since the predecessor doesn't matter
-
- for (int t = 0; t < T; ++t)
- for (int i = 0; i < N; ++i)
- n.try_put( tbb::continue_msg() );
-
- g.wait_for_all();
- ASSERT( r.my_count == T, NULL );
-
- n.register_successor(r2);
- ASSERT( r2.my_count == 0, NULL );
- return 0;
+template< typename OutputType >
+void run_continue_nodes() {
+ harness_graph_executor< tbb::flow::continue_msg, OutputType>::max_executors = 0;
+ #if __TBB_LAMBDAS_PRESENT
+ continue_nodes<OutputType>( []( tbb::flow::continue_msg i ) -> OutputType { return harness_graph_executor<tbb::flow::continue_msg, OutputType>::func(i); } );
+ #endif
+ continue_nodes<OutputType>( &harness_graph_executor<tbb::flow::continue_msg, OutputType>::func );
+ continue_nodes<OutputType>( typename harness_graph_executor<tbb::flow::continue_msg, OutputType>::functor() );
+ continue_nodes_with_copy<OutputType>();
+}
+
+//! Tests limited concurrency cases for nodes that accept data messages
+void test_concurrency(int num_threads) {
+ tbb::task_scheduler_init init(num_threads);
+ run_continue_nodes<tbb::flow::continue_msg>();
+ run_continue_nodes<int>();
+ run_continue_nodes<empty_no_assign>();
}
int TestMain() {
- test_serial_puts();
- test_parallel_puts();
+ if( MinThread<1 ) {
+ REPORT("number of threads must be positive\n");
+ exit(1);
+ }
+ for( int p=MinThread; p<=MaxThread; ++p ) {
+ test_concurrency(p);
+ }
return Harness::Done;
}
diff --git a/src/test/test_eh_algorithms.cpp b/src/test/test_eh_algorithms.cpp
index cd204dc..adc2ffa 100644
--- a/src/test/test_eh_algorithms.cpp
+++ b/src/test/test_eh_algorithms.cpp
@@ -89,10 +89,10 @@ intptr_t TestNumSubrangesCalculation ( intptr_t length, intptr_t grain, intptr_t
class NoThrowParForBody {
public:
void operator()( const range_type& r ) const {
- volatile long x;
+ volatile count_type x = 0;
count_type end = r.end();
for( count_type i=r.begin(); i<end; ++i )
- x = 0;
+ x += i;
}
};
diff --git a/src/test/test_enumerable_thread_specific.cpp b/src/test/test_enumerable_thread_specific.cpp
index c0744fd..0d24e24 100644
--- a/src/test/test_enumerable_thread_specific.cpp
+++ b/src/test/test_enumerable_thread_specific.cpp
@@ -56,7 +56,7 @@
#include "harness_assert.h"
#include "harness.h"
-#if __TBB_GCC_WARNING_SUPPRESSION_ENABLED
+#if __TBB_GCC_WARNING_SUPPRESSION_PRESENT
#pragma GCC diagnostic ignored "-Wuninitialized"
#endif
@@ -888,6 +888,7 @@ flog_segmented_iterator_map() {
REMARK( "ii=%d, (*my_csi).first=%d, second=%d\n",ii, int((*my_csi).first), int((*my_csi).second));
}
}
+ if(found_error) REPORT("segmented_iterator_map failed\n");
}
void
diff --git a/src/test/test_executable_node.cpp b/src/test/test_executable_node.cpp
deleted file mode 100644
index 74c968c..0000000
--- a/src/test/test_executable_node.cpp
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- Copyright 2005-2011 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_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
-#define C 8
-
-struct empty_no_assign : private NoAssign {
- empty_no_assign() {}
- empty_no_assign( int ) {}
- operator int() { return 0; }
-};
-
-template< typename InputType >
-struct parallel_puts : private NoAssign {
-
- tbb::receiver< InputType > * const my_exe_node;
-
- parallel_puts( tbb::receiver< InputType > &exe_node ) : my_exe_node(&exe_node) {}
-
- void operator()( int ) const {
- for ( int i = 0; i < N; ++i ) {
- // the nodes will accept all puts
- ASSERT( my_exe_node->try_put( InputType() ) == true, NULL );
- }
- }
-
-};
-
-template< typename OutputType, typename Body >
-void continue_nodes( Body body ) {
-
- for (int p = 1; p < 2*MaxThread; ++p) {
- tbb::graph g;
- tbb::executable_node< OutputType > exe_node( g, body );
- for (size_t i = 0; i < N; ++i) {
- exe_node.register_predecessor( *reinterpret_cast< tbb::sender< tbb::continue_msg > * >(&exe_node) );
- }
-
- for (size_t num_receivers = 1; num_receivers <= MAX_NODES; ++num_receivers ) {
- harness_counting_receiver<OutputType> *receivers = new harness_counting_receiver<OutputType>[num_receivers];
- harness_graph_executor<tbb::continue_msg, OutputType>::execute_count = 0;
-
- for (size_t r = 0; r < num_receivers; ++r ) {
- ASSERT( exe_node.register_successor( receivers[r] ), NULL );
- }
-
- NativeParallelFor( p, parallel_puts<tbb::continue_msg>(exe_node) );
- g.wait_for_all();
-
- // 2) the nodes will receive puts from multiple predecessors simultaneously,
- size_t ec = harness_graph_executor<tbb::continue_msg, OutputType>::execute_count;
- ASSERT( (int)ec == p, NULL );
- for (size_t r = 0; r < num_receivers; ++r ) {
- size_t c = receivers[r].my_count;
- // 3) the nodes will send to multiple successors.
- ASSERT( (int)c == p, NULL );
- }
- }
- }
-}
-
-template< typename OutputType >
-void run_continue_nodes() {
- harness_graph_executor< tbb::continue_msg, OutputType>::max_executors = 0;
- #if __TBB_LAMBDAS_PRESENT
- continue_nodes<OutputType>( []( tbb::continue_msg i ) -> OutputType { return harness_graph_executor<tbb::continue_msg, OutputType>::func(i); } );
- #endif
- continue_nodes<OutputType>( &harness_graph_executor<tbb::continue_msg, OutputType>::func );
- continue_nodes<OutputType>( typename harness_graph_executor<tbb::continue_msg, OutputType>::functor() );
-}
-
-//! Tests limited concurrency cases for nodes that accept data messages
-void test_concurrency(int num_threads) {
- tbb::task_scheduler_init init(num_threads);
- run_continue_nodes<tbb::continue_msg>();
- run_continue_nodes<int>();
- run_continue_nodes<empty_no_assign>();
-}
-
-int TestMain() {
- if( MinThread<1 ) {
- REPORT("number of threads must be positive\n");
- exit(1);
- }
- for( int p=MinThread; p<=MaxThread; ++p ) {
- test_concurrency(p);
- }
- return Harness::Done;
-}
-
diff --git a/src/test/test_faf_task.cpp b/src/test/test_faf_task.cpp
deleted file mode 100644
index ca2e702..0000000
--- a/src/test/test_faf_task.cpp
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- Copyright 2005-2011 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.h"
-#include "tbb/task.h"
-#include "tbb/task_scheduler_init.h"
-
-const int NumRepeats = 200;
-const int MaxNumThreads = 16;
-static volatile bool Finished[MaxNumThreads] = {};
-
-static volatile bool CanStart;
-
-//! Custom user task interface
-class ITask {
-public:
- virtual ~ITask() {}
- virtual void Execute() = 0;
- virtual void Release() { delete this; }
-};
-
-class TestTask : public ITask {
- volatile bool *m_pDone;
-public:
- TestTask ( volatile bool *pDone ) : m_pDone(pDone) {}
-
- /* override */ void Execute() {
- *m_pDone = true;
- }
-};
-
-class CarrierTask : public tbb::task {
- ITask* m_pTask;
-public:
- CarrierTask(ITask* pTask) : m_pTask(pTask) {}
-
- /*override*/ task* execute() {
- m_pTask->Execute();
- m_pTask->Release();
- return NULL;
- }
-};
-
-class SpawnerTask : public ITask {
- ITask* m_taskToSpawn;
-public:
- SpawnerTask(ITask* job) : m_taskToSpawn(job) {}
-
- void Execute() {
- while ( !CanStart )
- __TBB_Yield();
- tbb::task::enqueue( *new( tbb::task::allocate_root() ) CarrierTask(m_taskToSpawn) );
- }
-};
-
-class EnqueuerBody {
-public:
- void operator() ( int id ) const {
- tbb::task_scheduler_init init(tbb::task_scheduler_init::default_num_threads() + 1);
-
- SpawnerTask* pTask = new SpawnerTask( new TestTask(Finished + id) );
- tbb::task::enqueue( *new( tbb::task::allocate_root() ) CarrierTask(pTask) );
- }
-};
-
-//! Regression test for a bug that caused premature arena destruction
-void TestCascadedEnqueue () {
- tbb::task_scheduler_init init(tbb::task_scheduler_init::default_num_threads() + 1);
-
- int minNumThreads = min(tbb::task_scheduler_init::default_num_threads(), MaxNumThreads) / 2;
- int maxNumThreads = min(tbb::task_scheduler_init::default_num_threads() * 2, MaxNumThreads);
-
- for ( int numThreads = minNumThreads; numThreads <= maxNumThreads; ++numThreads ) {
- for ( int i = 0; i < NumRepeats; ++i ) {
- CanStart = false;
- __TBB_Yield();
- NativeParallelFor( numThreads, EnqueuerBody() );
- CanStart = true;
- int j = 0;
- while ( j < numThreads ) {
- if ( Finished[j] )
- ++j;
- else
- __TBB_Yield();
- }
- for ( j = 0; j < numThreads; ++j )
- Finished[j] = false;
- REMARK("%02d threads; Iteration %03d\r", numThreads, i);
- }
- }
- REMARK( " \r" );
-}
-
-class DummyTask : public tbb::task {
-public:
- task *execute() {
- Harness::Sleep(1);
- return NULL;
- }
-};
-
-class SharedRootBody {
- tbb::task *my_root;
-public:
- SharedRootBody ( tbb::task *root ) : my_root(root) {}
-
- void operator() ( int ) const {
- tbb::task::enqueue( *new( tbb::task::allocate_additional_child_of(*my_root) ) DummyTask );
- }
-};
-
-//! Test for enqueuing children of the same root from different master threads
-void TestSharedRoot () {
- for ( int p = MinThread; p <= MaxThread; ++p ) {
- tbb::task_scheduler_init init(p);
- tbb::task *root = new ( tbb::task::allocate_root() ) tbb::empty_task;
- root->set_ref_count(1);
- for( int n = MinThread; n <= MaxThread; ++n )
- NativeParallelFor( n, SharedRootBody(root) );
- root->wait_for_all();
- tbb::task::destroy(*root);
- }
-}
-
-
-int TestMain () {
- TestCascadedEnqueue();
- TestSharedRoot();
- return Harness::Done;
-}
diff --git a/src/test/test_fast_random.cpp b/src/test/test_fast_random.cpp
index ba620c5..6d53c7f 100644
--- a/src/test/test_fast_random.cpp
+++ b/src/test/test_fast_random.cpp
@@ -33,6 +33,21 @@
by no more than AcceptableDeviation percent.
**/
+#if HARNESS_USE_PROXY
+
+// The test includes injects scheduler directly, so skip it when proxy tested.
+
+#undef HARNESS_USE_PROXY
+#include "harness.h"
+#undef __TBB_DYNAMIC_LOAD_ENABLED
+#include "harness_tbb_independence.h"
+
+int TestMain () {
+ return Harness::Skipped;
+}
+
+#else // HARNESS_USE_PROXY
+
#include "harness_inject_scheduler.h"
#define HARNESS_DEFAULT_MIN_THREADS 2
@@ -132,6 +147,42 @@ struct CheckDistributionBody {
}
};
+struct rng {
+ tbb::internal::FastRandom my_fast_random;
+ rng (unsigned seed):my_fast_random(seed) {}
+ unsigned short operator()(){return my_fast_random.get();}
+};
+
+#include <algorithm>
+
+template <std::size_t seriesLen >
+struct SingleCheck{
+ bool operator()(unsigned seed)const{
+ std::size_t series1[seriesLen]={0};
+ std::size_t series2[seriesLen]={0};
+ std::generate(series1,series1+seriesLen,rng(seed));
+ std::generate(series2,series2+seriesLen,rng(seed));
+ return std::equal(series1,series1+seriesLen,series2);
+ }
+};
+
+template <std::size_t seriesLen ,size_t seedsNum>
+struct CheckReproducibilityBody:NoAssign{
+ unsigned short seeds[seedsNum];
+ const std::size_t grainSize;
+ CheckReproducibilityBody(std::size_t GrainSize): grainSize(GrainSize){
+ //first generate seeds to check on, and make sure that sequence is reproducible
+ ASSERT(SingleCheck<seedsNum>()(0),"Series generated by FastRandom must be reproducible");
+ std::generate(seeds,seeds+seedsNum,rng(0));
+ }
+
+ void operator()(int id)const{
+ for (size_t i=id*grainSize; (i<seedsNum)&&(i< ((id+1)*grainSize));++i ){
+ ASSERT(SingleCheck<seriesLen>()(i),"Series generated by FastRandom must be reproducible");
+ }
+ }
+
+};
#include "tbb/tbb_thread.h"
int TestMain () {
@@ -146,8 +197,13 @@ int TestMain () {
// Ideally tbb::parallel_for could be used to parallelize the outermost loop
// in CheckDistributionBody, but it is not used to avoid unit test contamination.
int P = tbb::tbb_thread::hardware_concurrency();
+ enum {reproducibilitySeedsToTest=1000};
+ enum {reproducibilitySeriesLen=100};
+ CheckReproducibilityBody<reproducibilitySeriesLen,reproducibilitySeedsToTest> CheckReproducibility(reproducibilitySeedsToTest/MaxThread);
while ( MinThread <= MaxThread ) {
- NativeParallelFor( min(P, MaxThread - MinThread + 1), CheckDistributionBody() );
+ int ThreadsToRun = min(P, MaxThread - MinThread + 1);
+ NativeParallelFor( ThreadsToRun, CheckDistributionBody() );
+ NativeParallelFor(ThreadsToRun, CheckReproducibility);
MinThread += P;
}
double observedProbabilityOfOutliers = (NumLowOutliers + NumHighOutliers) / NumChecks;
@@ -160,3 +216,4 @@ int TestMain () {
}
return Harness::Done;
}
+#endif // HARNESS_USE_PROXY
diff --git a/src/test/test_flow_graph.cpp b/src/test/test_flow_graph.cpp
new file mode 100644
index 0000000..882b5db
--- /dev/null
+++ b/src/test/test_flow_graph.cpp
@@ -0,0 +1,141 @@
+/*
+ Copyright 2005-2011 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_graph.h"
+#include "tbb/task_scheduler_init.h"
+
+const int T = 4;
+const int W = 4;
+
+struct decrement_wait : NoAssign {
+
+ tbb::flow::graph * const my_graph;
+ bool * const my_done_flag;
+
+ decrement_wait( tbb::flow::graph &h, bool *done_flag ) : my_graph(&h), my_done_flag(done_flag) {}
+
+ void operator()(int i) const {
+ Harness::Sleep(10*i);
+ my_done_flag[i] = true;
+ my_graph->decrement_wait_count();
+ }
+};
+
+static void test_wait_count() {
+ tbb::flow::graph h;
+ for (int i = 0; i < T; ++i ) {
+ bool done_flag[W];
+ for (int j = 0; j < W; ++j ) {
+ for ( int w = 0; w < W; ++w ) done_flag[w] = false;
+ for ( int w = 0; w < j; ++w ) h.increment_wait_count();
+
+ NativeParallelFor( j, decrement_wait(h, done_flag) );
+ h.wait_for_all();
+ for ( int w = 0; w < W; ++w ) {
+ if ( w < j ) ASSERT( done_flag[w] == true, NULL );
+ else ASSERT( done_flag[w] == false, NULL );
+ }
+ }
+ }
+}
+
+const int F = 100;
+
+#if __TBB_LAMBDAS_PRESENT
+bool lambda_flag[F];
+#endif
+bool functor_flag[F];
+
+struct set_functor {
+ int my_i;
+ set_functor( int i ) : my_i(i) {}
+ void operator()() { functor_flag[my_i] = true; }
+};
+
+struct return_functor {
+ int my_i;
+ return_functor( int i ) : my_i(i) {}
+ int operator()() { return my_i; }
+};
+
+static void test_run() {
+ tbb::flow::graph h;
+ for (int i = 0; i < T; ++i ) {
+
+ // Create receivers and flag arrays
+ #if __TBB_LAMBDAS_PRESENT
+ harness_mapped_receiver<int> lambda_r;
+ lambda_r.initialize_map( F, 1 );
+ #endif
+ harness_mapped_receiver<int> functor_r;
+ functor_r.initialize_map( F, 1 );
+
+ // Initialize flag arrays
+ for (int j = 0; j < F; ++j ) {
+ #if __TBB_LAMBDAS_PRESENT
+ lambda_flag[j] = false;
+ #endif
+ functor_flag[j] = false;
+ }
+
+ for ( int j = 0; j < F; ++j ) {
+ #if __TBB_LAMBDAS_PRESENT
+ h.run( [=]() { lambda_flag[j] = true; } );
+ h.run( lambda_r, [=]() { return j; } );
+ #endif
+ h.run( set_functor(j) );
+ h.run( functor_r, return_functor(j) );
+ }
+ h.wait_for_all();
+ for ( int j = 0; j < F; ++j ) {
+ #if __TBB_LAMBDAS_PRESENT
+ ASSERT( lambda_flag[i] == true, NULL );
+ #endif
+ ASSERT( functor_flag[i] == true, NULL );
+ }
+ #if __TBB_LAMBDAS_PRESENT
+ lambda_r.validate();
+ #endif
+ functor_r.validate();
+ }
+}
+
+int TestMain() {
+ current_executors = 0;
+ if( MinThread<1 ) {
+ REPORT("number of threads must be positive\n");
+ exit(1);
+ }
+ for( int p=MinThread; p<=MaxThread; ++p ) {
+ tbb::task_scheduler_init init(p);
+ test_wait_count();
+ test_run();
+ }
+ return Harness::Done;
+}
+
diff --git a/src/test/test_function_node.cpp b/src/test/test_function_node.cpp
index eba9782..aa9483a 100644
--- a/src/test/test_function_node.cpp
+++ b/src/test/test_function_node.cpp
@@ -33,9 +33,197 @@
tbb::spin_mutex global_mutex;
-#define N 1000
+#define N 100
#define MAX_NODES 4
-#define C 8
+
+//! 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
+ 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
+*/
+
+template< typename InputType >
+struct parallel_put_until_limit : private NoAssign {
+
+ harness_counting_sender<InputType> *my_senders;
+
+ parallel_put_until_limit( harness_counting_sender<InputType> *senders ) : my_senders(senders) {}
+
+ void operator()( int i ) const {
+ if ( my_senders ) {
+ my_senders[i].try_put_until_limit();
+ }
+ }
+
+};
+
+template< typename InputType, typename OutputType, typename Body >
+void buffered_levels( size_t concurrency, Body body ) {
+
+ // 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_executor<InputType, OutputType>::execute_count = 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
+ tbb::flow::function_node< InputType, OutputType > exe_node( g, lc, body );
+
+ //Create a vector of identical exe_nodes
+ std::vector< tbb::flow::function_node< InputType, OutputType > > exe_vec(2, exe_node);
+
+ 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 ) {
+ // Create num_receivers counting receivers and connect the exe_vec[node_idx] to them.
+ harness_mapped_receiver<OutputType> *receivers = new harness_mapped_receiver<OutputType>[num_receivers];
+ for (size_t r = 0; r < num_receivers; ++r ) {
+ tbb::flow::make_edge( exe_vec[node_idx], receivers[r] );
+ }
+
+ // 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]
+ 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] );
+ }
+
+ // Initialize the receivers so they know how many senders and messages to check for
+ for (size_t r = 0; r < num_receivers; ++r ) {
+ receivers[r].initialize_map( N, num_senders );
+ }
+
+ // Do the test
+ NativeParallelFor( (int)num_senders, parallel_put_until_limit<InputType>(senders) );
+ g.wait_for_all();
+
+ // cofirm 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 );
+ }
+ // validate the receivers
+ for (size_t r = 0; r < num_receivers; ++r ) {
+ receivers[r].validate();
+ }
+ delete [] senders;
+ }
+ for (size_t r = 0; r < num_receivers; ++r ) {
+ tbb::flow::remove_edge( exe_vec[node_idx], receivers[r] );
+ }
+ ASSERT( exe_vec[node_idx].try_put( InputType() ) == true, NULL );
+ g.wait_for_all();
+ for (size_t r = 0; r < num_receivers; ++r ) {
+ // since it's detached, nothing should have changed
+ receivers[r].validate();
+ }
+ delete [] receivers;
+ }
+ }
+ }
+}
+
+const size_t Offset = 123;
+tbb::atomic<size_t> global_execute_count;
+
+struct inc_functor {
+
+ tbb::atomic<size_t> local_execute_count;
+ inc_functor( ) { local_execute_count = 0; }
+ inc_functor( const inc_functor &f ) { local_execute_count = f.local_execute_count; }
+
+ int operator()( int i ) {
+ ++global_execute_count;
+ ++local_execute_count;
+ return i;
+ }
+
+};
+
+template< typename InputType, typename OutputType >
+void buffered_levels_with_copy( size_t concurrency ) {
+
+ // Do for lc = 1 to concurrency level
+ for ( size_t lc = 1; lc <= concurrency; ++lc ) {
+ tbb::flow::graph g;
+
+ inc_functor cf;
+ cf.local_execute_count = Offset;
+ global_execute_count = Offset;
+
+ tbb::flow::function_node< InputType, OutputType > exe_node( g, lc, cf );
+
+ for (size_t num_receivers = 1; num_receivers <= MAX_NODES; ++num_receivers ) {
+ harness_mapped_receiver<OutputType> *receivers = new harness_mapped_receiver<OutputType>[num_receivers];
+ for (size_t r = 0; r < num_receivers; ++r ) {
+ tbb::flow::make_edge( exe_node, receivers[r] );
+ }
+
+ 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];
+ for (size_t s = 0; s < num_senders; ++s ) {
+ senders[s].my_limit = N;
+ tbb::flow::make_edge( senders[s], exe_node );
+ }
+
+ for (size_t r = 0; r < num_receivers; ++r ) {
+ receivers[r].initialize_map( N, num_senders );
+ }
+
+ NativeParallelFor( (int)num_senders, parallel_put_until_limit<InputType>(senders) );
+ g.wait_for_all();
+
+ 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 );
+ }
+ for (size_t r = 0; r < num_receivers; ++r ) {
+ receivers[r].validate();
+ }
+ delete [] senders;
+ }
+ for (size_t r = 0; r < num_receivers; ++r ) {
+ tbb::flow::remove_edge( exe_node, receivers[r] );
+ }
+ ASSERT( exe_node.try_put( InputType() ) == true, NULL );
+ g.wait_for_all();
+ for (size_t r = 0; r < num_receivers; ++r ) {
+ receivers[r].validate();
+ }
+ delete [] receivers;
+ }
+
+ // validate that the local body matches the global execute_count and both are correct
+ inc_functor body_copy = tbb::flow::copy_body<inc_functor>( exe_node );
+ const size_t expected_count = N/2 * MAX_NODES * MAX_NODES * ( MAX_NODES + 1 ) + MAX_NODES + Offset;
+ size_t global_count = global_execute_count;
+ size_t inc_count = body_copy.local_execute_count;
+ ASSERT( global_count == expected_count && global_count == inc_count, NULL );
+ }
+}
+
+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); } );
+ #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_with_copy<InputType,OutputType>( c );
+}
+
//! Performs test on executable nodes with limited concurrency
/** Theses tests check:
@@ -50,17 +238,17 @@ template< typename InputType, typename OutputType, typename Body >
void concurrency_levels( size_t concurrency, Body body ) {
for ( size_t lc = 1; lc <= concurrency; ++lc ) {
- tbb::graph g;
+ tbb::flow::graph g;
harness_graph_executor<InputType, OutputType, tbb::spin_mutex>::execute_count = 0;
- tbb::function_node< InputType, OutputType > exe_node( g, lc, body );
+ tbb::flow::function_node< InputType, OutputType, tbb::flow::rejecting > exe_node( g, lc, body );
for (size_t num_receivers = 1; num_receivers <= MAX_NODES; ++num_receivers ) {
harness_counting_receiver<OutputType> *receivers = new harness_counting_receiver<OutputType>[num_receivers];
for (size_t r = 0; r < num_receivers; ++r ) {
- ASSERT( exe_node.register_successor( receivers[r] ), NULL );
+ tbb::flow::make_edge( exe_node, receivers[r] );
}
harness_counting_sender<InputType> *senders = NULL;
@@ -103,7 +291,7 @@ void concurrency_levels( size_t concurrency, Body body ) {
delete [] senders;
}
for (size_t r = 0; r < num_receivers; ++r ) {
- ASSERT( exe_node.remove_successor( receivers[r] ) == true, NULL );
+ tbb::flow::remove_edge( exe_node, receivers[r] );
}
ASSERT( exe_node.try_put( InputType() ) == true, NULL );
g.wait_for_all();
@@ -127,7 +315,7 @@ void run_concurrency_levels( int c ) {
}
-struct empty_no_assign : private NoAssign {
+struct empty_no_assign {
empty_no_assign() {}
empty_no_assign( int ) {}
operator int() { return 0; }
@@ -136,9 +324,9 @@ struct empty_no_assign : private NoAssign {
template< typename InputType >
struct parallel_puts : private NoAssign {
- tbb::receiver< InputType > * const my_exe_node;
+ tbb::flow::receiver< InputType > * const my_exe_node;
- parallel_puts( tbb::receiver< InputType > &exe_node ) : my_exe_node(&exe_node) {}
+ parallel_puts( tbb::flow::receiver< InputType > &exe_node ) : my_exe_node(&exe_node) {}
void operator()( int ) const {
for ( int i = 0; i < N; ++i ) {
@@ -161,8 +349,8 @@ template< typename InputType, typename OutputType, typename Body >
void unlimited_concurrency( Body body ) {
for (int p = 1; p < 2*MaxThread; ++p) {
- tbb::graph g;
- tbb::function_node< InputType, OutputType > exe_node( g, tbb::graph::unlimited, body );
+ tbb::flow::graph g;
+ tbb::flow::function_node< InputType, OutputType, tbb::flow::rejecting > exe_node( g, tbb::flow::unlimited, body );
for (size_t num_receivers = 1; num_receivers <= MAX_NODES; ++num_receivers ) {
@@ -170,7 +358,7 @@ void unlimited_concurrency( Body body ) {
harness_graph_executor<InputType, OutputType>::execute_count = 0;
for (size_t r = 0; r < num_receivers; ++r ) {
- ASSERT( exe_node.register_successor( receivers[r] ), NULL );
+ tbb::flow::make_edge( exe_node, receivers[r] );
}
NativeParallelFor( p, parallel_puts<InputType>(exe_node) );
@@ -198,17 +386,41 @@ void run_unlimited_concurrency() {
unlimited_concurrency<InputType,OutputType>( typename harness_graph_executor<InputType, OutputType>::functor() );
}
+struct continue_msg_to_int : private NoAssign {
+ int my_int;
+ continue_msg_to_int(int x) : my_int(x) {}
+ int operator()(tbb::flow::continue_msg) { return my_int; }
+};
+
+void test_function_node_with_continue_msg_as_input() {
+ // If this function terminates, then this test is successful
+ tbb::flow::graph g;
+
+ tbb::flow::broadcast_node<tbb::flow::continue_msg> Start;
+
+ tbb::flow::function_node<tbb::flow::continue_msg, int, tbb::flow::rejecting> FN1( g, tbb::flow::serial, continue_msg_to_int(42));
+ tbb::flow::function_node<tbb::flow::continue_msg, int, tbb::flow::rejecting> FN2( g, tbb::flow::serial, continue_msg_to_int(43));
+
+ tbb::flow::make_edge( Start, FN1 );
+ tbb::flow::make_edge( Start, FN2 );
+
+ Start.try_put( tbb::flow::continue_msg() );
+ g.wait_for_all();
+}
+
//! 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,int>(num_threads);
- run_concurrency_levels<int,tbb::continue_msg>(num_threads);
+ run_concurrency_levels<int,tbb::flow::continue_msg>(num_threads);
+ run_buffered_levels<int, int>(num_threads);
run_unlimited_concurrency<int,int>();
run_unlimited_concurrency<int,empty_no_assign>();
run_unlimited_concurrency<empty_no_assign,int>();
run_unlimited_concurrency<empty_no_assign,empty_no_assign>();
- run_unlimited_concurrency<int,tbb::continue_msg>();
- run_unlimited_concurrency<empty_no_assign,tbb::continue_msg>();
+ run_unlimited_concurrency<int,tbb::flow::continue_msg>();
+ run_unlimited_concurrency<empty_no_assign,tbb::flow::continue_msg>();
+ test_function_node_with_continue_msg_as_input();
}
int TestMain() {
diff --git a/src/test/test_intrusive_list.cpp b/src/test/test_intrusive_list.cpp
index a1fe490..cc3c8b9 100644
--- a/src/test/test_intrusive_list.cpp
+++ b/src/test/test_intrusive_list.cpp
@@ -31,8 +31,6 @@
#include "../tbb/intrusive_list.h"
-#if __TBB_ARENA_PER_MASTER
-
using tbb::internal::intrusive_list_node;
// Machine word filled with repeated pattern of FC bits
@@ -139,10 +137,8 @@ void TestListAssertions () {
tbb::set_assertion_handler( NULL );
#endif /* TRY_BAD_EXPR_ENABLED */
}
-#endif /* __TBB_ARENA_PER_MASTER */
int TestMain () {
-#if __TBB_ARENA_PER_MASTER
TestListOperations<IntrusiveList1, DataItemWithInheritedNode>();
TestListOperations<IntrusiveList2, DataItemWithMemberNodes>();
TestListOperations<IntrusiveList3, DataItemWithMemberNodes>();
@@ -150,7 +146,4 @@ int TestMain () {
TestListAssertions<IntrusiveList2, DataItemWithMemberNodes>();
TestListAssertions<IntrusiveList3, DataItemWithMemberNodes>();
return Harness::Done;
-#else
- return Harness::Skipped;
-#endif /* __TBB_ARENA_PER_MASTER */
}
diff --git a/src/test/test_join_node.cpp b/src/test/test_join_node.cpp
index 35199c8..5255a6c 100644
--- a/src/test/test_join_node.cpp
+++ b/src/test/test_join_node.cpp
@@ -27,22 +27,22 @@
*/
#include "harness.h"
+#include "tbb/flow_graph.h"
+#include "tbb/task_scheduler_init.h"
#if !__SUNPRO_CC
-#define TBB_PREVIEW_GRAPH 1
-#include "tbb/graph.h"
-#include "tbb/task_scheduler_init.h"
-
//
// Tests
//
-const int Count = 300;
+const int Count = 150;
const int MaxPorts = 10;
const int MaxNSources = 5; // max # of source_nodes to register for each join_node input in parallel test
bool outputCheck[MaxPorts][Count]; // for checking output
+using tbb::flow::NO_TAG;
+
void
check_outputCheck( int nUsed, int maxCnt) {
for(int i=0; i < nUsed; ++i) {
@@ -92,8 +92,8 @@ public:
static const char* name() { return "short"; }
};
-// T must be arithmetic, and shouldn't wrap around for reasonable sizes of Count (which is now 1000, and maxPorts is 10,
-// so the max number generated right now is 11000.) Source will generate a series of TT with value
+// T must be arithmetic, and shouldn't wrap around for reasonable sizes of Count (which is now 150, and maxPorts is 10,
+// so the max number generated right now is 1500 or so.) Source will generate a series of TT with value
// (init_val + (i-1)*addend) * my_mult, where i is the i-th invocation of the body. We are attaching addend
// source nodes to a join_port, and each will generate part of the numerical series the port is expecting
// to receive. If there is only one source node, the series order will be maintained; if more than one,
@@ -114,6 +114,249 @@ public:
}
};
+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;
+ }
+};
+
+// allocator for join_node. This is specialized for tag_matching joins because they require a variable number
+// of tag_value methods passed to the constructor
+
+template<int N, typename JType, tbb::flow::graph_buffer_policy JP>
+class makeJoin {
+public:
+ static JType *create(tbb::flow::graph& g) {
+ JType *temp = new JType(g);
+ return temp;
+ }
+ static void destroy(JType *p) { delete p; }
+};
+
+
+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;
+public:
+ static JType *create(tbb::flow::graph& g) {
+ JType *temp = new JType(g,
+ tag_func<T0>(T0(2)),
+ tag_func<T1>(T1(3))
+ );
+ return temp;
+ }
+ static void destroy(JType *p) { delete p; }
+};
+
+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;
+public:
+ static JType *create(tbb::flow::graph& g) {
+ JType *temp = new JType(g,
+ tag_func<T0>(T0(2)),
+ tag_func<T1>(T1(3)),
+ tag_func<T2>(T2(4))
+ );
+ return temp;
+ }
+ static void destroy(JType *p) { delete p; }
+};
+
+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;
+public:
+ static JType *create(tbb::flow::graph& g) {
+ JType *temp = new JType(g,
+ tag_func<T0>(T0(2)),
+ tag_func<T1>(T1(3)),
+ tag_func<T2>(T2(4)),
+ tag_func<T3>(T3(5))
+ );
+ return temp;
+ }
+ static void destroy(JType *p) { delete p; }
+};
+
+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;
+public:
+ static JType *create(tbb::flow::graph& g) {
+ JType *temp = new JType(g,
+ tag_func<T0>(T0(2)),
+ tag_func<T1>(T1(3)),
+ tag_func<T2>(T2(4)),
+ tag_func<T3>(T3(5)),
+ tag_func<T4>(T4(6))
+ );
+ return temp;
+ }
+ static void destroy(JType *p) { delete p; }
+};
+
+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;
+public:
+ static JType *create(tbb::flow::graph& g) {
+ JType *temp = new JType(g,
+ tag_func<T0>(T0(2)),
+ tag_func<T1>(T1(3)),
+ tag_func<T2>(T2(4)),
+ tag_func<T3>(T3(5)),
+ tag_func<T4>(T4(6)),
+ tag_func<T5>(T5(7))
+ );
+ return temp;
+ }
+ static void destroy(JType *p) { delete p; }
+};
+
+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;
+public:
+ static JType *create(tbb::flow::graph& g) {
+ JType *temp = new JType(g,
+ tag_func<T0>(T0(2)),
+ tag_func<T1>(T1(3)),
+ tag_func<T2>(T2(4)),
+ tag_func<T3>(T3(5)),
+ tag_func<T4>(T4(6)),
+ tag_func<T5>(T5(7)),
+ tag_func<T6>(T6(8))
+ );
+ return temp;
+ }
+ static void destroy(JType *p) { delete p; }
+};
+
+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;
+public:
+ static JType *create(tbb::flow::graph& g) {
+ JType *temp = new JType(g,
+ tag_func<T0>(T0(2)),
+ tag_func<T1>(T1(3)),
+ tag_func<T2>(T2(4)),
+ tag_func<T3>(T3(5)),
+ tag_func<T4>(T4(6)),
+ tag_func<T5>(T5(7)),
+ tag_func<T6>(T6(8)),
+ tag_func<T7>(T7(9))
+ );
+ return temp;
+ }
+ static void destroy(JType *p) { delete p; }
+};
+
+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;
+public:
+ static JType *create(tbb::flow::graph& g) {
+ JType *temp = new JType(g,
+ tag_func<T0>(T0(2)),
+ tag_func<T1>(T1(3)),
+ tag_func<T2>(T2(4)),
+ tag_func<T3>(T3(5)),
+ tag_func<T4>(T4(6)),
+ tag_func<T5>(T5(7)),
+ tag_func<T6>(T6(8)),
+ tag_func<T7>(T7(9)),
+ tag_func<T8>(T8(10))
+ );
+ return temp;
+ }
+ static void destroy(JType *p) { delete p; }
+};
+
+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;
+public:
+ static JType *create(tbb::flow::graph& g) {
+ JType *temp = new JType(g,
+ tag_func<T0>(T0(2)),
+ tag_func<T1>(T1(3)),
+ tag_func<T2>(T2(4)),
+ tag_func<T3>(T3(5)),
+ tag_func<T4>(T4(6)),
+ tag_func<T5>(T5(7)),
+ tag_func<T6>(T6(8)),
+ tag_func<T7>(T7(9)),
+ tag_func<T8>(T8(10)),
+ tag_func<T9>(T9(11))
+ );
+ return temp;
+ }
+ static void destroy(JType *p) { delete p; }
+};
+
// holder for source_node pointers for eventual deletion
static void* all_source_nodes[MaxPorts][MaxNSources];
@@ -124,15 +367,15 @@ public:
typedef JNT join_node_type;
typedef typename join_node_type::output_type TT;
typedef typename std::tuple_element<ELEM-1,TT>::type IT;
- typedef typename tbb::source_node<IT> my_source_node_type;
+ typedef typename tbb::flow::source_node<IT> my_source_node_type;
static void print_remark() {
source_node_helper<ELEM-1,JNT>::print_remark();
REMARK(", %s", name_of<IT>::name());
}
- static void add_source_nodes(join_node_type &my_join, tbb::graph &g, int nInputs) {
+ static void add_source_nodes(join_node_type &my_join, tbb::flow::graph &g, int nInputs) {
for(int i=0; i < nInputs; ++i) {
my_source_node_type *new_node = new my_source_node_type(g, source_body<IT>((IT)(ELEM+1), i, nInputs));
- ASSERT(new_node->register_successor(std::get<ELEM-1>(my_join.inputs() )), NULL);
+ tbb::flow::make_edge( *new_node, tbb::flow::input_port<ELEM-1>(my_join) );
all_source_nodes[ELEM-1][i] = (void *)new_node;
}
// add the next source_node
@@ -152,7 +395,7 @@ public:
static void remove_source_nodes(join_node_type& my_join, int nInputs) {
for(int i=0; i< nInputs; ++i) {
my_source_node_type *dp = reinterpret_cast<my_source_node_type *>(all_source_nodes[ELEM-1][i]);
- dp->remove_successor(std::get<ELEM-1>(my_join.inputs()));
+ tbb::flow::remove_edge( *dp, tbb::flow::input_port<ELEM-1>(my_join) );
delete dp;
}
source_node_helper<ELEM-1, JNT>::remove_source_nodes(my_join, nInputs);
@@ -164,15 +407,15 @@ class source_node_helper<1, JNT> {
typedef JNT join_node_type;
typedef typename join_node_type::output_type TT;
typedef typename std::tuple_element<0,TT>::type IT;
- typedef typename tbb::source_node<IT> my_source_node_type;
+ typedef typename tbb::flow::source_node<IT> my_source_node_type;
public:
static void print_remark() {
REMARK("Parallel test of join_node< %s", name_of<IT>::name());
}
- static void add_source_nodes(join_node_type &my_join, tbb::graph &g, int nInputs) {
+ static void add_source_nodes(join_node_type &my_join, tbb::flow::graph &g, int nInputs) {
for(int i=0; i < nInputs; ++i) {
my_source_node_type *new_node = new my_source_node_type(g, source_body<IT>((IT)2, i, nInputs));
- ASSERT(new_node->register_successor(std::get<0>(my_join.inputs() )), NULL);
+ tbb::flow::make_edge( *new_node, tbb::flow::input_port<0>(my_join) );
all_source_nodes[0][i] = (void *)new_node;
}
}
@@ -187,17 +430,18 @@ public:
static void remove_source_nodes(join_node_type& my_join, int nInputs) {
for(int i=0; i < nInputs; ++i) {
my_source_node_type *dp = reinterpret_cast<my_source_node_type *>(all_source_nodes[0][i]);
- dp->remove_successor(std::get<0>(my_join.inputs()));
+ tbb::flow::remove_edge( *dp, tbb::flow::input_port<0>(my_join) );
delete dp;
}
}
};
-template<typename JType>
+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 tbb::flow::graph_buffer_policy jp = JP;
static void test() {
TType v;
source_node_helper<SIZE,JType>::print_remark();
@@ -208,22 +452,24 @@ public:
}
}
for(int nInputs = 1; nInputs <= MaxNSources; ++nInputs) {
- tbb::graph g;
- JType my_join(g);
- tbb::queue_node<TType> outq1(g);
- tbb::queue_node<TType> outq2(g);
+ 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);
+ tbb::flow::queue_node<TType> outq1(g);
+ tbb::flow::queue_node<TType> outq2(g);
- ASSERT(my_join.register_successor(outq1), NULL); // register outputs first, so they both get all
- ASSERT(my_join.register_successor(outq2), NULL); // the results
+ 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<SIZE, JType>::add_source_nodes((*my_join), g, nInputs);
g.wait_for_all();
reset_outputCheck(SIZE, Count);
for(int i=0; i < Count; ++i) {
ASSERT(outq1.try_get(v), NULL);
- source_node_helper<SIZE, JType>::check_value(i, v, nInputs == 1);
+ source_node_helper<SIZE, JType>::check_value(i, v, not_out_of_order);
}
check_outputCheck(SIZE, Count);
@@ -231,16 +477,17 @@ public:
for(int i=0; i < Count; i++) {
ASSERT(outq2.try_get(v), NULL);;
- source_node_helper<SIZE, JType>::check_value(i, v, nInputs == 1);
+ source_node_helper<SIZE, JType>::check_value(i, v, not_out_of_order);
}
check_outputCheck(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);
- my_join.remove_successor(outq1);
- my_join.remove_successor(outq2);
+ source_node_helper<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);
}
}
};
@@ -251,15 +498,15 @@ class serial_queue_helper {
public:
typedef typename JType::output_type TT;
typedef typename std::tuple_element<ELEM-1,TT>::type IT;
- typedef typename tbb::queue_node<IT> my_queue_node_type;
+ typedef typename tbb::flow::queue_node<IT> my_queue_node_type;
static void print_remark() {
serial_queue_helper<ELEM-1,JType>::print_remark();
REMARK(", %s", name_of<IT>::name());
}
- static void add_queue_nodes(tbb::graph &g, JType &my_join) {
+ 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);
- ASSERT(new_node->register_successor(std::get<ELEM-1>(my_join.inputs())), NULL);
+ tbb::flow::make_edge( *new_node, std::get<ELEM-1>(my_join.inputs()) );
all_source_nodes[ELEM-1][0] = (void *)new_node;
}
static void fill_one_queue(int maxVal) {
@@ -282,7 +529,7 @@ public:
}
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]);
- vptr->remove_successor(my_join);
+ tbb::flow::remove_edge( *vptr, std::get<ELEM-1>(my_join.inputs()) );
serial_queue_helper<ELEM-1, JType>::remove_queue_nodes(my_join);
delete vptr;
}
@@ -293,13 +540,13 @@ 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::queue_node<IT> my_queue_node_type;
+ 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());
}
- static void add_queue_nodes(tbb::graph &g, JType &my_join) {
+ static void add_queue_nodes(tbb::flow::graph &g, JType &my_join) {
my_queue_node_type *new_node = new my_queue_node_type(g);
- ASSERT(new_node->register_successor(std::get<0>(my_join.inputs() )), NULL);
+ tbb::flow::make_edge( *new_node, tbb::flow::input_port<0>(my_join) );
all_source_nodes[0][0] = (void *)new_node;
}
static void fill_one_queue(int maxVal) {
@@ -317,7 +564,7 @@ public:
}
static void remove_queue_nodes(JType &my_join) {
my_queue_node_type *vptr = reinterpret_cast<my_queue_node_type *>(all_source_nodes[0][0]);
- vptr->remove_successor(my_join);
+ tbb::flow::remove_edge( *vptr, std::get<0>(my_join.inputs()) );
delete vptr;
}
};
@@ -327,34 +574,46 @@ public:
// * put to buffer before port0, then put to buffer before port1, ...
// * fill buffer before port0 then fill buffer before port1, ...
-template<typename JType>
-class serial_test {
+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;
-public:
-static void test() {
- tbb::graph g;
- JType my_join(g);
-
+ std::vector<bool> flags;
serial_queue_helper<SIZE, JType>::add_queue_nodes(g,my_join);
typedef TType q3_input_type;
- tbb::queue_node< q3_input_type > q3(g);
-
- serial_queue_helper<SIZE, JType>::print_remark(); REMARK(" >\n");
+ tbb::flow::queue_node< q3_input_type > q3(g);
- ASSERT(my_join.register_successor( q3 ), NULL);
+ tbb::flow::make_edge( my_join, q3 );
// 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);
+ flags.push_back(false);
}
g.wait_for_all();
+ tbb::flow::graph_buffer_policy jp = JP;
for (int i = 0; i < Count; ++i ) {
q3_input_type v;
g.wait_for_all();
ASSERT(q3.try_get( v ), "Error in try_get()");
- serial_queue_helper<SIZE,JType>::check_queue_value(i, v);
+ 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);
+ flags[j] = true;
+ }
+ else {
+ serial_queue_helper<SIZE,JType>::check_queue_value(i, v);
+ }
+ }
+
+ if(jp == tbb::flow::tag_matching) {
+ for(int i = 0; i < Count; ++i) {
+ ASSERT(flags[i], NULL);
+ flags[i] = false;
+ }
}
// fill each queue completely before filling the next.
@@ -365,55 +624,409 @@ static void test() {
q3_input_type v;
g.wait_for_all();
ASSERT(q3.try_get( v ), "Error in try_get()");
- serial_queue_helper<SIZE,JType>::check_queue_value(i, v);
+ if(jp == tbb::flow::tag_matching) {
+ int j = int(std::get<0>(v)) / 2;
+ serial_queue_helper<SIZE,JType>::check_queue_value(j, v);
+ flags[i] = true;
+ }
+ else {
+ serial_queue_helper<SIZE,JType>::check_queue_value(i, v);
+ }
+ }
+
+ if(jp == tbb::flow::tag_matching) {
+ for(int i = 0; i < Count; ++i) {
+ ASSERT(flags[i], NULL);
+ }
+ }
+
+ serial_queue_helper<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 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");
+
+ 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);
+
+
+ for(int e = 0; e < ELEMS; ++e) { // exercise each of the vector elements
+ test_one_serial<JType,JP>( join_vector[e], g);
}
}
}; // serial_test
-template<template<typename> class TestType, typename OutputTupleType, tbb::join_policy J>
+template<
+ template<typename, tbb::flow::graph_buffer_policy> class TestType, // serial_test or parallel_test
+ typename OutputTupleType, // type of the output of the join
+ tbb::flow::graph_buffer_policy J> // graph_buffer_policy (reserving, queueing or tag_matching)
class generate_test {
public:
- typedef tbb::join_node<OutputTupleType,J> join_node_type;
+ typedef tbb::flow::join_node<OutputTupleType,J> join_node_type;
static void do_test() {
- TestType<join_node_type>::test();
+ TestType<join_node_type,J>::test();
}
};
+template<tbb::flow::graph_buffer_policy JP>
+void test_input_port_policies();
+
+// join_node (reserving) does not consume inputs until an item is available at
+// every input. It tries to reserve each input, and if any fails it releases the
+// reservation. When it builds a tuple it broadcasts to all its successors and
+// consumes all the inputs.
+//
+// So our test will put an item at one input port, then attach another node to the
+// same node (a queue node in this case). The second successor should receive the
+// item in the queue, emptying it.
+//
+// We then place an item in the second input queue, and check the output queues; they
+// should still be empty. Then we place an item in the first queue; the output queues
+// should then receive a tuple.
+//
+// we then attach another function node to the second input. It should not receive
+// an item, verifying that the item in the queue is consumed.
+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
+ // create join_node<type0,type1> jn
+ JType jn(g);
+ // create output_queue oq0, oq1
+ typedef JType::output_type OQType;
+ tbb::flow::queue_node<OQType> oq0(g);
+ tbb::flow::queue_node<OQType> oq1(g);
+ // create iq0, iq1
+ typedef tbb::flow::queue_node<int> IQType;
+ IQType iq0(g);
+ IQType iq1(g);
+ // create qnp, qnq
+ IQType qnp(g);
+ IQType qnq(g);
+ REMARK("Testing policies of join_node<reserving> input ports\n");
+ // attach jn to oq0, oq1
+ 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.inputs()) );
+ tbb::flow::make_edge( iq1, std::get<1>(jn.inputs()) );
+ for(int loop = 0; loop < 3; ++loop) {
+ // place one item in iq0
+ ASSERT(iq0.try_put(1), "Error putting to iq1");
+ // attach iq0 to qnp
+ tbb::flow::make_edge( iq0, qnp );
+ // qnp should have an item in it.
+ g.wait_for_all();
+ {
+ int i;
+ ASSERT(qnp.try_get(i) && i == 1, "Error in item fetched by qnp");
+ }
+ // place item in iq1
+ ASSERT(iq1.try_put(2), "Error putting to iq1");
+ // oq0, oq1 should be empty
+ g.wait_for_all();
+ {
+ OQType t1;
+ ASSERT(!oq0.try_get(t1) && !oq1.try_get(t1), "oq0 and oq1 not empty");
+ }
+ // detach qnp from iq0
+ tbb::flow::remove_edge( iq0, qnp); // if we don't remove qnp it will gobble any values we put in iq0
+ // place item in iq0
+ ASSERT(iq0.try_put(3), "Error on second put to iq0");
+ // oq0, oq1 should have items in them
+ g.wait_for_all();
+ {
+ 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");
+ }
+ // attach qnp to iq0, qnq to iq1
+ // qnp and qnq should be empty
+ tbb::flow::make_edge( iq0, qnp );
+ tbb::flow::make_edge( iq1, qnq );
+ g.wait_for_all();
+ {
+ int i;
+ ASSERT(!qnp.try_get(i), "iq0 still had value in it");
+ ASSERT(!qnq.try_get(i), "iq1 still had value in it");
+ }
+ tbb::flow::remove_edge( iq0, qnp );
+ tbb::flow::remove_edge( iq1, qnq );
+ } // for ( int loop ...
+}
+
+// join_node (queueing) consumes inputs as soon as they are available at
+// any input. When it builds a tuple it broadcasts to all its successors and
+// discards the broadcast values.
+//
+// So our test will put an item at one input port, then attach another node to the
+// same node (a queue node in this case). The second successor should not receive
+// an item (because the join consumed it).
+//
+// We then place an item in the second input queue, and check the output queues; they
+// should each have a tuple.
+//
+// we then attach another function node to the second input. It should not receive
+// an item, verifying that the item in the queue is consumed.
+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;
+ // create join_node<type0,type1> jn
+ JType jn(g);
+ // create output_queue oq0, oq1
+ typedef JType::output_type OQType;
+ tbb::flow::queue_node<OQType> oq0(g);
+ tbb::flow::queue_node<OQType> oq1(g);
+ // create iq0, iq1
+ typedef tbb::flow::queue_node<int> IQType;
+ IQType iq0(g);
+ IQType iq1(g);
+ // create qnp, qnq
+ IQType qnp(g);
+ IQType qnq(g);
+ REMARK("Testing policies of join_node<queueing> input ports\n");
+ // attach jn to oq0, oq1
+ 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.inputs()) );
+ tbb::flow::make_edge( iq1, std::get<1>(jn.inputs()) );
+ for(int loop = 0; loop < 3; ++loop) {
+ // place one item in iq0
+ ASSERT(iq0.try_put(1), "Error putting to iq1");
+ // attach iq0 to qnp
+ tbb::flow::make_edge( iq0, qnp );
+ // qnp should have an item in it.
+ g.wait_for_all();
+ {
+ int i;
+ ASSERT(!qnp.try_get(i), "Item was received by qnp");
+ }
+ // place item in iq1
+ ASSERT(iq1.try_put(2), "Error putting to iq1");
+ // oq0, oq1 should have items
+ g.wait_for_all();
+ {
+ 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");
+ }
+ // attach qnq to iq1
+ // qnp and qnq should be empty
+ tbb::flow::make_edge( iq1, qnq );
+ g.wait_for_all();
+ {
+ int i;
+ ASSERT(!qnp.try_get(i), "iq0 still had value in it");
+ ASSERT(!qnq.try_get(i), "iq1 still had value in it");
+ }
+ tbb::flow::remove_edge( iq0, qnp );
+ tbb::flow::remove_edge( iq1, qnq );
+ } // for ( int loop ...
+}
+
+tbb::flow::tag_value myTagValue(int i) { return tbb::flow::tag_value(i); }
+
+// join_node (tag_matching) consumes inputs as soon as they are available at
+// any input. When it builds a tuple it broadcasts to all its successors and
+// discards the broadcast values.
+//
+// It chooses the tuple it broadcasts by matching the tag values returned by the
+// methods given the constructor of the join, in this case the method just casts
+// the value in each port to tag_value.
+//
+// So our test will put an item at one input port, then attach another node to the
+// same node (a queue node in this case). The second successor should not receive
+// an item (because the join consumed it).
+//
+// We then place an item in the second input queue, and check the output queues; they
+// should each have a tuple.
+//
+// we then attach another queue node to the second input. It should not receive
+// an item, verifying that the item in the queue is consumed.
+//
+// We will then exercise the join with a bunch of values, and the output order should
+// be determined by the order we insert items into the second queue. (Each tuple set
+// corresponding to a tag will be complete when the second item is inserted.)
+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;
+ JType jn(g, myTagValue, myTagValue);
+ // create output_queue oq0, oq1
+ typedef JType::output_type OQType;
+ tbb::flow::queue_node<OQType> oq0(g);
+ tbb::flow::queue_node<OQType> oq1(g);
+ // create iq0, iq1
+ typedef tbb::flow::queue_node<int> IQType;
+ IQType iq0(g);
+ IQType iq1(g);
+ // create qnp, qnq
+ IQType qnp(g);
+ IQType qnq(g);
+
+ REMARK("Testing policies of join_node<tag_matching> input ports\n");
+ // attach jn to oq0, oq1
+ tbb::flow::make_edge( jn, oq0 );
+ tbb::flow::make_edge( jn, oq1 );
+ // attach iq0, iq1 to jn
+ tbb::flow::make_edge( iq0, tbb::flow::input_port<0>(jn) );
+ tbb::flow::make_edge( iq1, tbb::flow::input_port<1>(jn) );
+ // we'll put four discrete values in the inputs to the join_node. Each
+ // set of inputs should result in one output. (NO_TAG is currently defined
+ // to be tag_value(-1), so zero is an allowed tag_value.)
+ for(int loop = 0; loop < 4; ++loop) {
+ // place one item in iq0
+ ASSERT(iq0.try_put(loop), "Error putting to iq1");
+ // attach iq0 to qnp
+ tbb::flow::make_edge( iq0, qnp );
+ // qnp should not have an item in it. (the join consumed it.)
+ g.wait_for_all();
+ {
+ int i;
+ ASSERT(!qnp.try_get(i), "Item was received by qnp");
+ }
+ // place item in iq1
+ ASSERT(iq1.try_put(loop), "Error putting to iq1");
+ // oq0, oq1 should have items
+ g.wait_for_all();
+ {
+ 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), "extra object in output queue oq0");
+ ASSERT(!oq1.try_get(t0), "extra object in output queue oq1");
+ }
+ // attach qnq to iq1
+ // qnp and qnq should be empty
+ tbb::flow::make_edge( iq1, qnq );
+ g.wait_for_all();
+ {
+ int i;
+ ASSERT(!qnp.try_get(i), "iq0 still had value in it");
+ ASSERT(!qnq.try_get(i), "iq1 still had value in it");
+ }
+ tbb::flow::remove_edge( iq0, qnp );
+ tbb::flow::remove_edge( iq1, qnq );
+ } // for ( int loop ...
+
+ // Now we'll put [4 .. nValues - 1] in iq0, and then put [4 .. nValues - 1] in iq1 in
+ // a different order. We should see tuples in the output queues in the order we inserted
+ // the integers into iq1.
+
+ const int nValues = 100;
+ const int nIncr = 31; // relatively prime to nValues
+
+ for(int loop = 4; loop < 4+nValues; ++loop) {
+ // place one item in iq0
+ ASSERT(iq0.try_put(loop), "Error putting to iq1");
+ g.wait_for_all();
+ {
+ OQType t3;
+ ASSERT(!oq0.try_get(t3), "Object in output queue");
+ ASSERT(!oq1.try_get(t3), "Object in output queue");
+ }
+ } // for ( int loop ...
+
+ for(int loop = 1; loop <= nValues; ++loop) {
+ int lp1 = 4 + (loop * nIncr)%nValues;
+ // place item in iq1
+ ASSERT(iq1.try_put(lp1), "Error putting to iq1");
+ // oq0, oq1 should have items
+ g.wait_for_all();
+ {
+ 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), "extra object in output queue oq0");
+ ASSERT(!oq1.try_get(t0), "extra object in output queue oq1");
+ }
+ } // for ( int loop ...
+}
+
int TestMain() {
#if __TBB_USE_TBB_TUPLE
- REMARK(" Using TBB tuple");
+ REMARK(" Using TBB tuple\n");
#else
- REMARK(" Using platform tuple");
+ REMARK(" Using platform tuple\n");
#endif
-#if __TBB_USE_VARIADIC_TEMPLATE
- REMARK(" with variadic template\n");
-#else
- REMARK(" with explicit template\n");
-#endif
- for (int p = 0; p < 2; ++p) {
-
- REMARK("two_phase\n");
- generate_test<serial_test, std::tuple<float, double>, tbb::two_phase >::do_test();
- generate_test<serial_test, std::tuple<float, double, int, long>, tbb::two_phase >::do_test();
- generate_test<serial_test, std::tuple<double, double, int, long, int, short>, tbb::two_phase >::do_test();
- generate_test<serial_test, std::tuple<float, double, double, double, float, int, float, long>, tbb::two_phase >::do_test();
- generate_test<serial_test, std::tuple<float, double, int, double, double, float, long, int, float, long>, tbb::two_phase >::do_test();
- generate_test<parallel_test, std::tuple<float, double>, tbb::two_phase >::do_test();
- generate_test<parallel_test, std::tuple<float, int, long>, tbb::two_phase >::do_test();
- generate_test<parallel_test, std::tuple<double, double, int, int, short>, tbb::two_phase >::do_test();
- generate_test<parallel_test, std::tuple<float, int, double, float, long, float, long>, tbb::two_phase >::do_test();
- generate_test<parallel_test, std::tuple<float, double, int, double, double, long, int, float, long>, tbb::two_phase >::do_test();
+ test_input_port_policies<tbb::flow::reserving>();
+ test_input_port_policies<tbb::flow::queueing>();
+ test_input_port_policies<tbb::flow::tag_matching>();
+ 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();
+ generate_test<serial_test, std::tuple<double, double, int, long, int, short>, tbb::flow::reserving >::do_test();
+#if COMPREHENSIVE_TEST
+ generate_test<serial_test, std::tuple<float, double, double, double, float, int, float, long>, tbb::flow::reserving >::do_test();
+ generate_test<serial_test, std::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
+ generate_test<parallel_test, std::tuple<float, int, double, float, long, float, long>, tbb::flow::reserving >::do_test();
+ generate_test<parallel_test, std::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();
+ generate_test<serial_test, std::tuple<double, double, int, long, int, short>, tbb::flow::queueing >::do_test();
+#if COMPREHENSIVE_TEST
+ generate_test<serial_test, std::tuple<float, double, double, double, float, int, float, long>, tbb::flow::queueing >::do_test();
+ generate_test<serial_test, std::tuple<float, double, int, double, double, float, long, int, float, 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
+ generate_test<parallel_test, std::tuple<float, int, double, float, long, float, long>, tbb::flow::queueing >::do_test();
+ generate_test<parallel_test, std::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();
+ generate_test<serial_test, std::tuple<double, double, int, long, int, short>, tbb::flow::tag_matching >::do_test();
+#if COMPREHENSIVE_TEST
+ generate_test<serial_test, std::tuple<float, double, double, double, float, int, float, long>, tbb::flow::tag_matching >::do_test();
+ generate_test<serial_test, std::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
+ generate_test<parallel_test, std::tuple<float, int, double, float, long, float, long>, tbb::flow::tag_matching >::do_test();
+ generate_test<parallel_test, std::tuple<float, double, int, double, double, long, int, float, long>, tbb::flow::tag_matching >::do_test();
+#endif
}
return Harness::Done;
}
+#else // __SUNPRO_CC
-#else /* __SUNPRO_CC */
-
-int TestMain() {
- REPORT("Known issue: test skipped because of the compiler (CC %X) bug.\n", __SUNPRO_CC);
+int TestMain() {
return Harness::Skipped;
}
-#endif /* __SUNPRO_CC */
+#endif // SUNPRO_CC
diff --git a/src/test/test_lambda.cpp b/src/test/test_lambda.cpp
index 99037b2..0a7fb8c 100644
--- a/src/test/test_lambda.cpp
+++ b/src/test/test_lambda.cpp
@@ -56,6 +56,7 @@ void f(int val, int *arr, int start, int stop) {
#include "harness.h"
+#if __TBB_TASK_GROUP_CONTEXT
int Fib(int n) {
if( n<2 ) {
return n;
@@ -70,6 +71,7 @@ int Fib(int n) {
return x+y;
}
}
+#endif /* !__TBB_TASK_GROUP_CONTEXT */
#include "harness_report.h"
#include "harness_assert.h"
@@ -159,12 +161,14 @@ int TestMain () {
}, 42, 64);
myThread.join();
+#if __TBB_TASK_GROUP_CONTEXT
// test task_group
REMARK("Testing task_group... ");
int result;
result = Fib(32);
ASSERT(result==2178309, "task_group w/lambda failed.\n");
REMARK("passed.\n");
+#endif /* __TBB_TASK_GROUP_CONTEXT */
// Reset array a to index values
parallel_for(blocked_range<int>(0,N,Grainsize),
diff --git a/src/test/test_limiter_node.cpp b/src/test/test_limiter_node.cpp
index e560249..513deb7 100644
--- a/src/test/test_limiter_node.cpp
+++ b/src/test/test_limiter_node.cpp
@@ -27,8 +27,7 @@
*/
#include "harness.h"
-#define TBB_PREVIEW_GRAPH 1
-#include "tbb/graph.h"
+#include "tbb/flow_graph.h"
#include "tbb/atomic.h"
#include "tbb/task_scheduler_init.h"
@@ -36,44 +35,44 @@ const int L = 10;
const int N = 1000;
template< typename T >
-struct serial_receiver : public tbb::receiver<T> {
+struct serial_receiver : public tbb::flow::receiver<T> {
T next_value;
serial_receiver() : next_value(T(0)) {}
- /* override */ bool try_put( T v ) {
+ /* override */ bool try_put( const T &v ) {
ASSERT( next_value++ == v, NULL );
return true;
}
};
template< typename T >
-struct parallel_receiver : public tbb::receiver<T> {
+struct parallel_receiver : public tbb::flow::receiver<T> {
tbb::atomic<int> my_count;
parallel_receiver() { my_count = 0; }
- /* override */ bool try_put( T ) {
+ /* override */ bool try_put( const T & ) {
++my_count;
return true;
}
};
template< typename T >
-struct empty_sender : public tbb::sender<T> {
- /* override */ bool register_successor( tbb::receiver<T> & ) { return false; }
- /* override */ bool remove_successor( tbb::receiver<T> & ) { return false; }
+struct empty_sender : public tbb::flow::sender<T> {
+ /* override */ bool register_successor( tbb::flow::receiver<T> & ) { return false; }
+ /* override */ bool remove_successor( tbb::flow::receiver<T> & ) { return false; }
};
template< typename T >
struct put_body : NoAssign {
- tbb::limiter_node<T> &my_lim;
+ tbb::flow::limiter_node<T> &my_lim;
tbb::atomic<int> &my_accept_count;
- put_body( tbb::limiter_node<T> &lim, tbb::atomic<int> &accept_count ) :
+ put_body( tbb::flow::limiter_node<T> &lim, tbb::atomic<int> &accept_count ) :
my_lim(lim), my_accept_count(accept_count) {}
void operator()( int ) const {
@@ -88,10 +87,10 @@ struct put_body : NoAssign {
template< typename T >
struct put_dec_body : NoAssign {
- tbb::limiter_node<T> &my_lim;
+ tbb::flow::limiter_node<T> &my_lim;
tbb::atomic<int> &my_accept_count;
- put_dec_body( tbb::limiter_node<T> &lim, tbb::atomic<int> &accept_count ) :
+ put_dec_body( tbb::flow::limiter_node<T> &lim, tbb::atomic<int> &accept_count ) :
my_lim(lim), my_accept_count(accept_count) {}
void operator()( int ) const {
@@ -101,13 +100,28 @@ struct put_dec_body : NoAssign {
if ( msg == true ) {
++local_accept_count;
++my_accept_count;
- my_lim.decrement.try_put( tbb::continue_msg() );
+ my_lim.decrement.try_put( tbb::flow::continue_msg() );
}
}
}
};
+template< typename T >
+void test_puts_with_decrements( int num_threads, tbb::flow::limiter_node< T >& lim ) {
+ parallel_receiver<T> r;
+ empty_sender< tbb::flow::continue_msg > s;
+ tbb::atomic<int> accept_count;
+ accept_count = 0;
+ tbb::flow::make_edge( lim, r );
+ lim.decrement.register_predecessor( s );
+ // test puts with decrements
+ NativeParallelFor( num_threads, put_dec_body<T>(lim, accept_count) );
+ int c = accept_count;
+ ASSERT( c == N*num_threads, NULL );
+ ASSERT( r.my_count == N*num_threads, NULL );
+}
+
//
// Tests
//
@@ -120,12 +134,12 @@ int test_parallel(int num_threads) {
// test puts with no decrements
for ( int i = 0; i < L; ++i ) {
- tbb::graph g;
- tbb::limiter_node< T > lim(g, i);
+ tbb::flow::graph g;
+ tbb::flow::limiter_node< T > lim(g, i);
parallel_receiver<T> r;
tbb::atomic<int> accept_count;
accept_count = 0;
- lim.register_successor( r );
+ tbb::flow::make_edge( lim, r );
// test puts with no decrements
NativeParallelFor( num_threads, put_body<T>(lim, accept_count) );
g.wait_for_all();
@@ -135,19 +149,11 @@ int test_parallel(int num_threads) {
// test puts with decrements
for ( int i = 1; i < L; ++i ) {
- tbb::graph g;
- tbb::limiter_node< T > lim(g, i);
- parallel_receiver<T> r;
- empty_sender< tbb::continue_msg > s;
- tbb::atomic<int> accept_count;
- accept_count = 0;
- lim.register_successor( r );
- lim.decrement.register_predecessor( s );
- // test puts with no decrements
- NativeParallelFor( num_threads, put_dec_body<T>(lim, accept_count) );
- int c = accept_count;
- ASSERT( c == N*num_threads, NULL );
- ASSERT( r.my_count == N*num_threads, NULL );
+ tbb::flow::graph g;
+ tbb::flow::limiter_node< T > lim(g, i);
+ test_puts_with_decrements(num_threads, lim);
+ tbb::flow::limiter_node< T > lim_copy( lim );
+ test_puts_with_decrements(num_threads, lim_copy);
}
return 0;
@@ -164,10 +170,10 @@ int test_serial() {
// test puts with no decrements
for ( int i = 0; i < L; ++i ) {
- tbb::graph g;
- tbb::limiter_node< T > lim(g, i);
+ tbb::flow::graph g;
+ tbb::flow::limiter_node< T > lim(g, i);
serial_receiver<T> r;
- lim.register_successor( r );
+ tbb::flow::make_edge( lim, r );
for ( int j = 0; j < L; ++j ) {
bool msg = lim.try_put( T(j) );
ASSERT( ( j < i && msg == true ) || ( j >= i && msg == false ), NULL );
@@ -177,17 +183,17 @@ int test_serial() {
// test puts with decrements
for ( int i = 1; i < L; ++i ) {
- tbb::graph g;
- tbb::limiter_node< T > lim(g, i);
+ tbb::flow::graph g;
+ tbb::flow::limiter_node< T > lim(g, i);
serial_receiver<T> r;
- empty_sender< tbb::continue_msg > s;
- lim.register_successor( r );
+ empty_sender< tbb::flow::continue_msg > s;
+ tbb::flow::make_edge( lim, r );
lim.decrement.register_predecessor( s );
for ( int j = 0; j < N; ++j ) {
bool msg = lim.try_put( T(j) );
ASSERT( ( j < i && msg == true ) || ( j >= i && msg == false ), NULL );
if ( msg == false ) {
- lim.decrement.try_put( tbb::continue_msg() );
+ lim.decrement.try_put( tbb::flow::continue_msg() );
msg = lim.try_put( T(j) );
ASSERT( msg == true, NULL );
}
diff --git a/src/test/test_malloc_compliance.cpp b/src/test/test_malloc_compliance.cpp
index 5db0db0..2e74ebf 100644
--- a/src/test/test_malloc_compliance.cpp
+++ b/src/test/test_malloc_compliance.cpp
@@ -26,7 +26,7 @@
the GNU General Public License.
*/
-const int MByte = 1048576; //1MB
+const unsigned MByte = 1048576; //1MB
bool __tbb_test_errno = false;
/* _WIN32_WINNT should be defined at the very beginning,
@@ -44,13 +44,13 @@ bool __tbb_test_errno = false;
#pragma comment(lib, "version.lib") // to use GetFileVersionInfo*
#endif
-void limitMem( int limit )
+void limitMem( size_t limit )
{
static HANDLE hJob = NULL;
JOBOBJECT_EXTENDED_LIMIT_INFORMATION jobInfo;
jobInfo.BasicLimitInformation.LimitFlags = JOB_OBJECT_LIMIT_PROCESS_MEMORY;
- jobInfo.ProcessMemoryLimit = limit? limit*MByte : 2*1024LL*MByte;
+ jobInfo.ProcessMemoryLimit = limit? limit*MByte : 2*MByte*1024;
if (NULL == hJob) {
if (NULL == (hJob = CreateJobObject(NULL, NULL))) {
REPORT("Can't assign create job object: %ld\n", GetLastError());
@@ -76,7 +76,7 @@ void limitMem( int limit )
#include <sys/types.h> // uint64_t on FreeBSD, needed for rlim_t
#include "harness_report.h"
-void limitMem( int limit )
+void limitMem( size_t limit )
{
rlimit rlim;
rlim.rlim_cur = limit? limit*MByte : (rlim_t)RLIM_INFINITY;
@@ -212,9 +212,9 @@ public:
};
class Limit {
- int limit;
+ size_t limit;
public:
- Limit(int limit) : limit(limit) {}
+ Limit(size_t limit) : limit(limit) {}
void operator() () const {
limitMem(limit);
}
@@ -371,6 +371,27 @@ int main(int argc, char* argv[]) {
return 0;
}
+// if non-zero byte found, returns bad value address plus 1
+size_t NonZero(void *ptr, size_t size)
+{
+ size_t words = size / sizeof(intptr_t);
+ size_t tailSz = size % sizeof(intptr_t);
+ intptr_t *buf =(intptr_t*)ptr;
+ char *bufTail =(char*)(buf+words);
+
+ for (size_t i=0; i<words; i++)
+ if (buf[i]) {
+ for (unsigned b=0; b<sizeof(intptr_t); b++)
+ if (((char*)(buf+i))[b])
+ return sizeof(intptr_t)*i + b + 1;
+ }
+ for (size_t i=0; i<tailSz; i++)
+ if (bufTail[i]) {
+ return words*sizeof(intptr_t)+i+1;
+ }
+ return 0;
+}
+
struct TestStruct
{
DWORD field1:2;
@@ -378,22 +399,8 @@ struct TestStruct
double field3;
UCHAR field4[100];
TestStruct* field5;
-// std::string field6;
std::vector<int> field7;
double field8;
- bool IsZero() {
- int wordSz = sizeof(TestStruct) / sizeof(intptr_t);
- int tailSz = sizeof(TestStruct) % sizeof(intptr_t);
-
- intptr_t *buf =(intptr_t*)this;
- char *bufTail =(char*) (buf+wordSz);
-
- for (int i=0; i<wordSz; i++)
- if (buf[i]) return false;
- for (int i=0; i<tailSz; i++)
- if (bufTail[i]) return false;
- return true;
- }
};
int Tposix_memalign(void **memptr, size_t alignment, size_t size)
@@ -567,7 +574,7 @@ void CMemTest::Zerofilling()
continue;
for (size_t j=0; j<CountElement; j++)
{
- if (!(TSMas+j)->IsZero())
+ if (NonZero(TSMas+j, sizeof(TestStruct)))
{
CountErrors++;
if (ShouldReportError()) REPORT("detect nonzero element at TestStruct\n");
@@ -581,6 +588,22 @@ void CMemTest::Zerofilling()
}
#if !__APPLE__
+
+void myMemset(void *ptr, int c, size_t n)
+{
+#if __linux__ && __i386__
+// memset in Fedora 13 is not always correclty set memory to
+// required values.
+ char *p = (char*)ptr;
+ for (size_t i=0; i<n; i++)
+ p[i] = c;
+#else
+ memset(ptr, c, n);
+#endif
+}
+
+// This test requires 200 MB per thread, i.e. for standart 1:4 run
+// more then 800 MB of RAM is required.
void CMemTest::NULLReturn(UINT MinSize, UINT MaxSize, int total_threads)
{
// find size to guarantee getting NULL for 1024 B allocations
@@ -596,13 +619,14 @@ void CMemTest::NULLReturn(UINT MinSize, UINT MaxSize, int total_threads)
void **buf_1024 = (void**)Tmalloc(MAXNUM_1024*sizeof(void*));
ASSERT(buf_1024, NULL);
- /* We must have space for pointers when memory limit is hit.
- Reserve enough for the worst case.
+ /* We must have space for pointers when memory limit is hit.
+ Reserve enough for the worst case, taking into account race for
+ limited space between threads.
*/
- PointerList.reserve(200*MByte/MinSize);
+ PointerList.reserve(200*total_threads*MByte/MinSize);
- /* There is a bug in the specific verion of GLIBC (2.5-12) shipped
- with RHEL5 that leads to erroneous working of the test
+ /* There is a bug in the specific verion of GLIBC (2.5-12) shipped
+ with RHEL5 that leads to erroneous working of the test
on Intel64 and IPF systems when setrlimit-related part is enabled.
Switching to GLIBC 2.5-18 from RHEL5.1 resolved the issue.
*/
@@ -611,8 +635,8 @@ void CMemTest::NULLReturn(UINT MinSize, UINT MaxSize, int total_threads)
else
limitMem(200);
- /* regression test against the bug in allocator when it dereference NULL
- while lack of memory
+ /* regression test against the bug in allocator when it dereference NULL
+ while lack of memory
*/
for (num_1024=0; num_1024<MAXNUM_1024; num_1024++) {
buf_1024[num_1024] = Tcalloc(1024, 1);
@@ -630,7 +654,7 @@ void CMemTest::NULLReturn(UINT MinSize, UINT MaxSize, int total_threads)
tmp=Tmalloc(Size);
if (tmp != NULL)
{
- memset(tmp, 0, Size);
+ myMemset(tmp, 0, Size);
PointerList.push_back(MemStruct(tmp, Size));
}
} while(tmp != NULL);
@@ -667,7 +691,7 @@ void CMemTest::NULLReturn(UINT MinSize, UINT MaxSize, int total_threads)
CountErrors++;
if (ShouldReportError()) REPORT("error: errno changed to %d though valid pointer was returned\n", errno);
}
- memset(tmp, 0, Size);
+ myMemset(tmp, 0, Size);
PointerList.push_back(MemStruct(tmp, Size));
}
}
@@ -745,7 +769,7 @@ void CMemTest::NULLReturn(UINT MinSize, UINT MaxSize, int total_threads)
if (ShouldReportError()) REPORT("valid pointer returned, error: errno not kept\n");
}
// newly allocated area have to be zeroed
- memset((char*)tmp + PointerList[i].Size, 0, PointerList[i].Size);
+ myMemset((char*)tmp + PointerList[i].Size, 0, PointerList[i].Size);
PointerList[i].Pointer = tmp;
PointerList[i].Size *= 2;
}
@@ -758,13 +782,10 @@ void CMemTest::NULLReturn(UINT MinSize, UINT MaxSize, int total_threads)
if (ShouldReportError()) REPORT("NULL returned, error: errno(%d) != ENOMEM\n", errno);
}
// check data integrity
- BYTE *zer=(BYTE*)PointerList[i].Pointer;
- for (UINT k=0; k<PointerList[i].Size; k++)
- if (zer[k] != 0)
- {
- CountErrors++;
- if (ShouldReportError()) REPORT("NULL returned, error: data changed\n");
- }
+ if (NonZero(PointerList[i].Pointer, PointerList[i].Size)) {
+ CountErrors++;
+ if (ShouldReportError()) REPORT("NULL returned, error: data changed\n");
+ }
}
}
if (FullLog) REPORT("realloc end\n");
@@ -799,21 +820,17 @@ void CMemTest::UniquePointer()
MasPointer[i]=(int*)Tmalloc(MasCountElem[i]*sizeof(int));
if (NULL == MasPointer[i])
MasCountElem[i]=0;
- for (UINT j=0; j<MasCountElem[i]; j++)
- *(MasPointer[i]+j)=0;
+ memset(MasPointer[i], 0, sizeof(int)*MasCountElem[i]);
}
if (FullLog) REPORT("malloc....");
for (UINT i=0; i<COUNT_ELEM-1; i++)
{
- for (UINT j=0; j<MasCountElem[i]; j++)
- {
- if (*(*(MasPointer+i)+j)!=0)
- {
- CountErrors++;
- if (ShouldReportError()) REPORT("error, detect 1 with 0x%p\n",(*(MasPointer+i)+j));
- }
- *(*(MasPointer+i)+j)+=1;
+ if (size_t badOff = NonZero(MasPointer[i], sizeof(int)*MasCountElem[i])) {
+ CountErrors++;
+ if (ShouldReportError())
+ REPORT("error, detect non-zero at %p\n", (char*)MasPointer[i]+badOff-1);
}
+ memset(MasPointer[i], 1, sizeof(int)*MasCountElem[i]);
}
if (CountErrors) REPORT("%s\n",strError);
else if (FullLog) REPORT("%s\n",strOk);
@@ -832,15 +849,12 @@ void CMemTest::UniquePointer()
if (FullLog) REPORT("calloc....");
for (int i=0; i<COUNT_ELEM-1; i++)
{
- for (UINT j=0; j<*(MasCountElem+i); j++)
- {
- if (*(*(MasPointer+i)+j)!=0)
- {
- CountErrors++;
- if (ShouldReportError()) REPORT("error, detect 1 with 0x%p\n",(*(MasPointer+i)+j));
- }
- *(*(MasPointer+i)+j)+=1;
+ if (size_t badOff = NonZero(MasPointer[i], sizeof(int)*MasCountElem[i])) {
+ CountErrors++;
+ if (ShouldReportError())
+ REPORT("error, detect non-zero at %p\n", (char*)MasPointer[i]+badOff-1);
}
+ memset(MasPointer[i], 1, sizeof(int)*MasCountElem[i]);
}
if (CountErrors) REPORT("%s\n",strError);
else if (FullLog) REPORT("%s\n",strOk);
@@ -855,20 +869,14 @@ void CMemTest::UniquePointer()
(int*)Trealloc(*(MasPointer+i),MasCountElem[i]*sizeof(int));
if (NULL == MasPointer[i])
MasCountElem[i]=0;
- for (UINT j=0; j<MasCountElem[i]; j++)
- *(*(MasPointer+i)+j)=0;
+ memset(MasPointer[i], 0, sizeof(int)*MasCountElem[i]);
}
if (FullLog) REPORT("realloc....");
for (int i=0; i<COUNT_ELEM-1; i++)
{
- for (UINT j=0; j<*(MasCountElem+i); j++)
- {
- if (*(*(MasPointer+i)+j)!=0)
- {
- CountErrors++;
- }
- *(*(MasPointer+i)+j)+=1;
- }
+ if (NonZero(MasPointer[i], sizeof(int)*MasCountElem[i]))
+ CountErrors++;
+ memset(MasPointer[i], 1, sizeof(int)*MasCountElem[i]);
}
if (CountErrors) REPORT("%s\n",strError);
else if (FullLog) REPORT("%s\n",strOk);
diff --git a/src/test/test_malloc_overload.cpp b/src/test/test_malloc_overload.cpp
index 2c6f75d..684d27c 100644
--- a/src/test/test_malloc_overload.cpp
+++ b/src/test/test_malloc_overload.cpp
@@ -115,14 +115,24 @@ public:
static BackRefIdx newBackRef(bool largeObj);
};
-struct LargeMemoryBlock {
+class ExtMemoryPool;
+
+class BlockI {
+ intptr_t blockState[2];
+};
+
+struct LargeMemoryBlock : public BlockI {
LargeMemoryBlock *next, // ptrs in list of cached blocks
- *prev;
+ *prev,
+ *gPrev, // in pool's global list
+ *gNext;
uintptr_t age; // age of block while in cache
size_t objectSize; // the size requested by a client
size_t unalignedSize; // the size requested from getMemory
bool fromMapMemory;
BackRefIdx backRefIdx; // cached here, used copy is in LargeObjectHdr
+ void registerInPool(ExtMemoryPool *extMemPool);
+ void unregisterFromPool(ExtMemoryPool *extMemPool);
};
struct LargeObjectHdr {
diff --git a/src/test/test_malloc_pools.cpp b/src/test/test_malloc_pools.cpp
new file mode 100644
index 0000000..bd2be42
--- /dev/null
+++ b/src/test/test_malloc_pools.cpp
@@ -0,0 +1,397 @@
+/*
+ Copyright 2005-2011 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/scalable_allocator.h"
+#include "tbb/atomic.h"
+#include "harness.h"
+#include "harness_barrier.h"
+#include "harness_tbb_independence.h"
+
+template<typename T>
+static inline T alignUp (T arg, uintptr_t alignment) {
+ return T(((uintptr_t)arg+(alignment-1)) & ~(alignment-1));
+}
+
+struct PoolSpace {
+ size_t pos;
+ int regions;
+ size_t bufSize;
+ char *space;
+
+ static const size_t BUF_SIZE = 8*1024*1024;
+
+ PoolSpace(size_t bufSize = BUF_SIZE) :
+ pos(0), regions(0),
+ bufSize(bufSize), space(new char[bufSize]) {
+ memset(space, 0, bufSize);
+ }
+ ~PoolSpace() {
+ delete []space;
+ }
+};
+
+static PoolSpace *poolSpace;
+
+struct MallocPoolHeader {
+ void *rawPtr;
+ size_t userSize;
+};
+
+static tbb::atomic<int> liveRegions;
+
+static void *getMallocMem(intptr_t /*pool_id*/, size_t &bytes)
+{
+ void *rawPtr = malloc(bytes+sizeof(MallocPoolHeader));
+ if (!rawPtr)
+ return NULL;
+ void *ret = (void *)((uintptr_t)rawPtr+sizeof(MallocPoolHeader));
+
+ MallocPoolHeader *hdr = (MallocPoolHeader*)ret-1;
+ hdr->rawPtr = rawPtr;
+ hdr->userSize = bytes;
+
+ liveRegions++;
+
+ return ret;
+}
+
+static int putMallocMem(intptr_t /*pool_id*/, void *ptr, size_t bytes)
+{
+ MallocPoolHeader *hdr = (MallocPoolHeader*)ptr-1;
+ ASSERT(bytes == hdr->userSize, "Invalid size in pool callback.");
+ free(hdr->rawPtr);
+
+ liveRegions--;
+
+ return 0;
+}
+
+void TestPoolReset()
+{
+ rml::MemPoolPolicy pol;
+ pol.pAlloc = getMallocMem;
+ pol.pFree = putMallocMem;
+ pol.granularity = 8;
+
+ rml::MemoryPool *pool = pool_create(0, &pol);
+ for (int i=0; i<100; i++) {
+ ASSERT(pool_malloc(pool, 8), NULL);
+ ASSERT(pool_malloc(pool, 50*1024), NULL);
+ }
+ int regionsBeforeReset = liveRegions;
+ pool_reset(pool);
+ for (int i=0; i<100; i++) {
+ ASSERT(pool_malloc(pool, 8), NULL);
+ ASSERT(pool_malloc(pool, 50*1024), NULL);
+ }
+ ASSERT(regionsBeforeReset == liveRegions,
+ "Expected no new regions allocation.");
+ pool_destroy(pool);
+ ASSERT(!liveRegions, "Expected all regions were released.");
+}
+
+class SharedPoolRun: NoAssign {
+ static long threadNum;
+ static Harness::SpinBarrier startB,
+ mallocDone;
+ static rml::MemoryPool *pool;
+ static void **crossThread,
+ **afterTerm;
+public:
+ static const int OBJ_CNT = 100;
+
+ static void init(int num, rml::MemoryPool *pl, void **crThread, void **aTerm) {
+ threadNum = num;
+ pool = pl;
+ crossThread = crThread;
+ afterTerm = aTerm;
+ startB.initialize(threadNum);
+ mallocDone.initialize(threadNum);
+ }
+
+ void operator()( int id ) const {
+ const int ITERS = 1000;
+ void *local[ITERS];
+
+ startB.wait();
+ for (int i=id*OBJ_CNT; i<(id+1)*OBJ_CNT; i++) {
+ afterTerm[i] = pool_malloc(pool, i%2? 8*1024 : 9*1024);
+ memset(afterTerm[i], i, i%2? 8*1024 : 9*1024);
+ crossThread[i] = pool_malloc(pool, i%2? 9*1024 : 8*1024);
+ memset(crossThread[i], i, i%2? 9*1024 : 8*1024);
+ }
+
+ for (int i=1; i<ITERS; i+=2) {
+ local[i-1] = pool_malloc(pool, 6*1024);
+ memset(local[i-1], i, 6*1024);
+ local[i] = pool_malloc(pool, 16*1024);
+ memset(local[i], i, 16*1024);
+ }
+ mallocDone.wait();
+ int myVictim = threadNum-id-1;
+ for (int i=myVictim*OBJ_CNT; i<(myVictim+1)*OBJ_CNT; i++)
+ pool_free(pool, crossThread[i]);
+ for (int i=0; i<ITERS; i++)
+ pool_free(pool, local[i]);
+ }
+};
+
+long SharedPoolRun::threadNum;
+Harness::SpinBarrier SharedPoolRun::startB,
+ SharedPoolRun::mallocDone;
+rml::MemoryPool *SharedPoolRun::pool;
+void **SharedPoolRun::crossThread,
+ **SharedPoolRun::afterTerm;
+
+// single pool shared by different threads
+void TestSharedPool()
+{
+ rml::MemPoolPolicy pol;
+ pol.pAlloc = getMallocMem;
+ pol.pFree = putMallocMem;
+ pol.granularity = 8;
+
+ rml::MemoryPool *pool = pool_create(0, &pol);
+
+ void **crossThread = new void*[MaxThread * SharedPoolRun::OBJ_CNT];
+ void **afterTerm = new void*[MaxThread * SharedPoolRun::OBJ_CNT];
+
+ for (int p=MinThread; p<=MaxThread; p++) {
+ SharedPoolRun::init(p, pool, crossThread, afterTerm);
+ SharedPoolRun thr;
+
+ void *hugeObj = pool_malloc(pool, 10*1024*1024);
+ ASSERT(hugeObj, NULL);
+
+ NativeParallelFor( p, thr );
+
+ pool_free(pool, hugeObj);
+ for (int i=0; i<p*SharedPoolRun::OBJ_CNT; i++)
+ pool_free(pool, afterTerm[i]);
+ }
+ delete []afterTerm;
+ delete []crossThread;
+
+ pool_destroy(pool);
+ ASSERT(!liveRegions, "Expected all regions were released.");
+}
+
+void *CrossThreadGetMem(intptr_t pool_id, size_t &bytes)
+{
+ if (poolSpace[pool_id].pos + bytes > poolSpace[pool_id].bufSize)
+ return NULL;
+
+ void *ret = poolSpace[pool_id].space + poolSpace[pool_id].pos;
+ poolSpace[pool_id].pos += bytes;
+ poolSpace[pool_id].regions++;
+
+ return ret;
+}
+
+int CrossThreadPutMem(intptr_t pool_id, void* /*raw_ptr*/, size_t /*raw_bytes*/)
+{
+ poolSpace[pool_id].regions--;
+ return 0;
+}
+
+class CrossThreadRun: NoAssign {
+ static long number_of_threads;
+ static Harness::SpinBarrier barrier;
+ static rml::MemoryPool **pool;
+ static char **obj;
+public:
+ static void initBarrier(unsigned thrds) { barrier.initialize(thrds); }
+ static void init(long num) {
+ number_of_threads = num;
+ pool = new rml::MemoryPool*[number_of_threads];
+ poolSpace = new PoolSpace[number_of_threads];
+ obj = new char*[number_of_threads];
+ }
+ static void destroy() {
+ for (long i=0; i<number_of_threads; i++)
+ ASSERT(!poolSpace[i].regions, "Memory leak detected");
+ delete []pool;
+ delete []poolSpace;
+ delete []obj;
+ }
+ CrossThreadRun() {}
+ void operator()( int id ) const {
+ rml::MemPoolPolicy pol;
+
+ pol.pAlloc = CrossThreadGetMem;
+ pol.pFree = CrossThreadPutMem;
+ pol.granularity = 8;
+ pool[id] = pool_create(id, &pol);
+ const int objLen = 10*id;
+
+ obj[id] = (char*)pool_malloc(pool[id], objLen);
+ ASSERT(obj[id], NULL);
+ memset(obj[id], id, objLen);
+
+ {
+ const size_t lrgSz = 2*16*1024;
+ void *ptrLarge = pool_malloc(pool[id], lrgSz);
+ ASSERT(ptrLarge, NULL);
+ memset(ptrLarge, 1, lrgSz);
+
+ // consume all small objects
+ while (pool_malloc(pool[id], 5*1024))
+ ;
+ // releasing of large object can give a chance to allocate more
+ pool_free(pool[id], ptrLarge);
+
+ ASSERT(pool_malloc(pool[id], 5*1024), NULL);
+ }
+
+ barrier.wait();
+ int myPool = number_of_threads-id-1;
+ for (int i=0; i<10*myPool; i++)
+ ASSERT(myPool==obj[myPool][i], NULL);
+ pool_free(pool[myPool], obj[myPool]);
+ pool_destroy(pool[myPool]);
+ }
+};
+
+long CrossThreadRun::number_of_threads;
+Harness::SpinBarrier CrossThreadRun::barrier;
+rml::MemoryPool **CrossThreadRun::pool;
+char **CrossThreadRun::obj;
+
+// pools created, used and destored by different threads
+void TestCrossThreadPools()
+{
+ for (int p=MinThread; p<=MaxThread; p++) {
+ CrossThreadRun::initBarrier(p);
+ CrossThreadRun::init(p);
+ NativeParallelFor( p, CrossThreadRun() );
+ for (int i=0; i<p; i++)
+ ASSERT(!poolSpace[i].regions, "Region leak detected");
+ CrossThreadRun::destroy();
+ }
+}
+
+// buffer is too small to pool be created, but must not leak resourses
+void TestTooSmallBuffer()
+{
+ poolSpace = new PoolSpace(8*1024);
+
+ rml::MemPoolPolicy pol;
+ pol.pAlloc = CrossThreadGetMem;
+ pol.pFree = CrossThreadPutMem;
+ pol.granularity = 8;
+ pool_destroy( pool_create(0, &pol) );
+ ASSERT(!poolSpace[0].regions, "No leaks.");
+
+ delete poolSpace;
+}
+
+static void *fixedBufGetMem(intptr_t /*pool_id*/, size_t &bytes)
+{
+ static const size_t BUF_SZ = 8*1024*1024;
+ static char buf[BUF_SZ];
+ static bool used;
+
+ if (used)
+ return NULL;
+ used = true;
+ bytes = BUF_SZ;
+ return buf;
+}
+
+void TestFixedBufferPool()
+{
+ void *ptrs[7];
+ rml::MemPoolPolicy pol;
+
+ pol.pAlloc = fixedBufGetMem;
+ pol.pFree = NULL;
+ pol.granularity = 8;
+ rml::MemoryPool *pool = pool_create(0, &pol);
+
+ void *largeObj = pool_malloc(pool, 7*1024*1024);
+ ASSERT(largeObj, NULL);
+ pool_free(pool, largeObj);
+
+ for (int i=0; i<7; i++) {
+ ptrs[i] = pool_malloc(pool, 1024*1024);
+ ASSERT(ptrs[i], NULL);
+ }
+ for (int i=0; i<7; i++)
+ pool_free(pool, ptrs[i]);
+
+ largeObj = pool_malloc(pool, 7*1024*1024);
+ ASSERT(largeObj, NULL);
+ pool_free(pool, largeObj);
+
+ pool_destroy(pool);
+}
+
+static size_t currGranularity;
+
+static void *getGranMem(intptr_t /*pool_id*/, size_t &bytes)
+{
+ ASSERT(!(bytes%currGranularity), "Region size mismatch granularity.");
+ return malloc(bytes);
+}
+
+static int putGranMem(intptr_t /*pool_id*/, void *ptr, size_t bytes)
+{
+ ASSERT(!(bytes%currGranularity), "Region size mismatch granularity.");
+ free(ptr);
+ return 0;
+}
+
+static void TestPoolGranularity()
+{
+ rml::MemPoolPolicy pol;
+ const size_t grans[] = {4*1024, 2*1024*1024, 6*1024*1024, 10*1024*1024};
+
+ pol.pAlloc = getGranMem;
+ pol.pFree = putGranMem;
+ for (unsigned i=0; i<sizeof(grans)/sizeof(grans[0]); i++) {
+ pol.granularity = currGranularity = grans[i];
+ rml::MemoryPool *pool = pool_create(0, &pol);
+ for (int sz=500*1024; sz<16*1024*1024; sz+=101*1024) {
+ void *p = pool_malloc(pool, sz);
+ ASSERT(p, "Can't allocate memory in pool.");
+ pool_free(pool, p);
+ }
+ pool_destroy(pool);
+ }
+}
+
+int TestMain () {
+ TestTooSmallBuffer();
+ TestPoolReset();
+ TestSharedPool();
+ TestCrossThreadPools();
+ TestFixedBufferPool();
+ TestPoolGranularity();
+
+ return Harness::Done;
+}
diff --git a/src/test/test_malloc_regression.cpp b/src/test/test_malloc_regression.cpp
index 8223639..72d4d8f 100644
--- a/src/test/test_malloc_regression.cpp
+++ b/src/test/test_malloc_regression.cpp
@@ -50,14 +50,14 @@ void RunThread(const Body& body, const Arg& arg) {
}
/*--------------------------------------------------------------------*/
-// The regression test against bug #1518 where thread boot strap allocations "leaked"
+// The regression test against bug #1518 where thread bootstrap allocations "leaked"
#include "harness_memory.h"
bool TestBootstrapLeak() {
/* In the bug 1518, each thread leaked ~384 bytes.
Initially, scalable allocator maps 1MB. Thus it is necessary to take out most of this space.
- 1MB is chunked into 16K blocks; of those, one block is for thread boot strap, and one more
+ 1MB is chunked into 16K blocks; of those, one block is for thread bootstrap, and one more
should be reserved for the test body. 62 blocks left, each can serve 15 objects of 1024 bytes.
*/
const int alloc_size = 1024;
@@ -79,7 +79,7 @@ bool TestBootstrapLeak() {
}
ptrdiff_t memory_leak = 0;
- // Note that 16K boot strap memory block is enough to serve 42 threads.
+ // Note that 16K bootstrap memory block is enough to serve 42 threads.
const int num_thread_runs = 200;
for (int run=0; run<3; run++) {
memory_in_use = GetMemoryUsage();
@@ -114,7 +114,7 @@ bool TestReallocMsize(size_t startSz) {
buf[realSz-1] = 0;
char *buf1 = (char*)scalable_realloc(buf, 2*realSz);
ASSERT(buf1, "");
- ASSERT(scalable_msize(buf1)>=2*realSz,
+ ASSERT(scalable_msize(buf1)>=2*realSz,
"scalable_msize must be not less then allocated size");
buf1[2*realSz-1] = 0;
if ( strspn(buf1, "a") < realSz-1 ) {
@@ -144,7 +144,7 @@ int TestMain () {
}
for (size_t a=2; a<=64*1024; a*=2)
passed &= TestReallocMsize(a);
-
+
ASSERT( passed, "Test failed" );
return Harness::Done;
}
diff --git a/src/test/test_malloc_whitebox.cpp b/src/test/test_malloc_whitebox.cpp
index 072da57..5f807ac 100644
--- a/src/test/test_malloc_whitebox.cpp
+++ b/src/test/test_malloc_whitebox.cpp
@@ -221,6 +221,11 @@ static size_t allocatedBackRefCount()
return cnt;
}
+static void cleanObjectCache()
+{
+ defaultMemPool->extMemPool.hardCachesCleanup();
+}
+
void TestBackRef() {
size_t beforeNumBackRef, afterNumBackRef;
@@ -245,11 +250,127 @@ void TestBackRef() {
ASSERT(beforeNumBackRef==afterNumBackRef, "backreference leak detected");
}
+void *getMem(intptr_t /*pool_id*/, size_t &bytes)
+{
+ const size_t BUF_SIZE = 8*1024*1024;
+ static char space[BUF_SIZE];
+ static size_t pos;
+
+ if (pos + bytes > BUF_SIZE)
+ return NULL;
+
+ void *ret = space + pos;
+ pos += bytes;
+
+ return ret;
+}
+
+int putMem(intptr_t /*pool_id*/, void* /*raw_ptr*/, size_t /*raw_bytes*/)
+{
+ return 0;
+}
+
+struct MallocPoolHeader {
+ void *rawPtr;
+ size_t userSize;
+};
+
+void *getMallocMem(intptr_t /*pool_id*/, size_t &bytes)
+{
+ void *rawPtr = malloc(bytes+sizeof(MallocPoolHeader));
+ void *ret = (void *)((uintptr_t)rawPtr+sizeof(MallocPoolHeader));
+
+ MallocPoolHeader *hdr = (MallocPoolHeader*)ret-1;
+ hdr->rawPtr = rawPtr;
+ hdr->userSize = bytes;
+
+ return ret;
+}
+
+int putMallocMem(intptr_t /*pool_id*/, void *ptr, size_t bytes)
+{
+ MallocPoolHeader *hdr = (MallocPoolHeader*)ptr-1;
+ ASSERT(bytes == hdr->userSize, "Invalid size in pool callback.");
+ free(hdr->rawPtr);
+
+ return 0;
+}
+
+void TestPools() {
+ rml::MemPoolPolicy pol;
+ size_t beforeNumBackRef, afterNumBackRef;
+
+ pol.pAlloc = getMem;
+ pol.pFree = putMem;
+ pol.granularity = 8;
+ rml::MemoryPool *pool1 = pool_create(0, &pol);
+ rml::MemoryPool *pool2 = pool_create(0, &pol);
+ pool_destroy(pool1);
+ pool_destroy(pool2);
+
+ cleanObjectCache();
+ beforeNumBackRef = allocatedBackRefCount();
+ rml::MemoryPool *fixedPool = pool_create(0, &pol);
+
+ pol.pAlloc = getMallocMem;
+ pol.pFree = putMallocMem;
+ pol.granularity = 8;
+ rml::MemoryPool *mallocPool = pool_create(0, &pol);
+
+/* check that large object cache (LOC) returns correct size for cached objects
+ passBackendSz Byte objects are cached in LOC, but bypassed the backend, so
+ memory requested directly from allocation callback.
+ nextPassBackendSz Byte objects must fit to another LOC bin,
+ so that their allocation/realeasing leads to cache cleanup.
+ All this is expecting to lead to releasing of passBackendSz Byte object
+ from LOC during LOC cleanup, and putMallocMem checks that returned size
+ is correct.
+*/
+ const size_t passBackendSz = Backend::maxBinedSize+1,
+ anotherLOCBinSz = minLargeObjectSize+1;
+ for (int i=0; i<10; i++) { // run long enough to be cached
+ void *p = pool_malloc(mallocPool, passBackendSz);
+ ASSERT(p, "Memory was not allocated");
+ pool_free(mallocPool, p);
+ }
+ // run long enough to passBackendSz allocation was cleaned from cache
+ // and returned back to putMallocMem for size checking
+ for (int i=0; i<1000; i++) {
+ void *p = pool_malloc(mallocPool, anotherLOCBinSz);
+ ASSERT(p, "Memory was not allocated");
+ pool_free(mallocPool, p);
+ }
+
+ void *smallObj = pool_malloc(fixedPool, 10);
+ memset(smallObj, 1, 10);
+ void *ptr = pool_malloc(fixedPool, 1024);
+ memset(ptr, 1, 1024);
+ void *largeObj = pool_malloc(fixedPool, minLargeObjectSize);
+ memset(largeObj, 1, minLargeObjectSize);
+ ptr = pool_malloc(fixedPool, minLargeObjectSize);
+ memset(ptr, minLargeObjectSize, minLargeObjectSize);
+ pool_malloc(fixedPool, 10*minLargeObjectSize); // no leak for unsuccesful allocations
+ pool_free(fixedPool, smallObj);
+ 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) {
+ ptr = pool_malloc(mallocPool, sz);
+ memset(ptr, sz, sz);
+ pool_free(mallocPool, ptr);
+ }
+ pool_destroy(mallocPool);
+ pool_destroy(fixedPool);
+
+ cleanObjectCache();
+ afterNumBackRef = allocatedBackRefCount();
+ ASSERT(beforeNumBackRef==afterNumBackRef, "backreference leak detected");
+}
+
void TestObjectRecognition() {
size_t headersSize = sizeof(LargeMemoryBlock)+sizeof(LargeObjectHdr);
unsigned falseObjectSize = 113; // unsigned is the type expected by getObjectSize
size_t obtainedSize;
- Block *auxBackRef;
ASSERT(sizeof(BackRefIdx)==4, "Unexpected size of BackRefIdx");
ASSERT(getObjectSize(falseObjectSize)!=falseObjectSize, "Error in test: bad choice for false object size");
@@ -316,12 +437,61 @@ void TestObjectRecognition() {
scalable_free(bufferLOH);
}
+class TestBackendWork: NoAssign {
+ struct TestBlock {
+ intptr_t data;
+ BackRefIdx idx;
+ };
+ static const int ITERS = 100;
+
+ Harness::SpinBarrier *barrier;
+ rml::internal::Backend *backend;
+public:
+ TestBackendWork(rml::internal::Backend *backend, Harness::SpinBarrier *barrier) :
+ backend(backend), barrier(barrier) {}
+ void operator()(int) const {
+ barrier->wait();
+
+ for (int i=0; i<ITERS; i++) {
+ BlockI *block16K = backend->get16KBlock(1, /*startup=*/false);
+ LargeMemoryBlock *lmb = backend->getLargeBlock(16*1024, /*startup=*/false);
+ backend->put16KBlock(block16K, /*startup=*/false);
+ backend->putLargeBlock(lmb);
+ }
+ }
+};
+
+void TestBackend()
+{
+ rml::MemPoolPolicy pol;
+ Harness::SpinBarrier barrier;
+
+ pol.pAlloc = getMallocMem;
+ pol.pFree = putMallocMem;
+ pol.granularity = 8;
+ rml::MemoryPool *mPool = pool_create(0, &pol);
+ rml::internal::ExtMemoryPool *ePool =
+ &((rml::internal::MemoryPool*)mPool)->extMemPool;
+ rml::internal::Backend *backend = &ePool->backend;
+
+ for( int p=MaxThread; p>=MinThread; --p ) {
+ barrier.initialize(p);
+ NativeParallelFor( p, TestBackendWork(backend, &barrier) );
+ }
+
+ BlockI *block = backend->get16KBlock(1, /*startup=*/false);
+ backend->put16KBlock(block, /*startup=*/false);
+
+ pool_destroy(mPool);
+}
int TestMain () {
// backreference requires that initialization was done
if(!isMallocInitialized()) doInitialization();
- // to succeed, leak detection must be the 1st memory-intensive test
+ // to succeed, leak detection must be the 1st memory-intensive test
TestBackRef();
+ TestPools();
+ TestBackend();
#if MALLOC_CHECK_RECURSION
for( int p=MaxThread; p>=MinThread; --p ) {
diff --git a/src/test/test_multioutput_function_node.cpp b/src/test/test_multioutput_function_node.cpp
new file mode 100644
index 0000000..569cb83
--- /dev/null
+++ b/src/test/test_multioutput_function_node.cpp
@@ -0,0 +1,471 @@
+/*
+ Copyright 2005-2011 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_GRAPH_NODES 1
+#include "harness_graph.h"
+
+#include "tbb/task_scheduler_init.h"
+#include "tbb/spin_mutex.h"
+
+#if !__SUNPRO_CC
+
+tbb::spin_mutex global_mutex;
+
+#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
+ 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
+*/
+
+template< typename InputType >
+struct parallel_put_until_limit : private NoAssign {
+
+ harness_counting_sender<InputType> *my_senders;
+
+ parallel_put_until_limit( harness_counting_sender<InputType> *senders ) : my_senders(senders) {}
+
+ void operator()( int i ) const {
+ if ( my_senders ) {
+ my_senders[i].try_put_until_limit();
+ }
+ }
+
+};
+
+//! exercise buffered multioutput_function_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;
+ // 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_multioutput_executor<InputType, OutputTuple,tbb::spin_mutex>::execute_count = 0;
+ // Set the max allowed executors to lc. There is a check in the functor to make sure this is never exceeded.
+ harness_graph_multioutput_executor<InputType, OutputTuple,tbb::spin_mutex>::max_executors = lc;
+
+ // Create the function_node with the appropriate concurreny level, and use default buffering
+ tbb::flow::multioutput_function_node< InputType, OutputTuple > exe_node( g, lc, body );
+
+ //Create a vector of identical exe_nodes
+ std::vector< tbb::flow::multioutput_function_node< InputType, OutputTuple > > exe_vec(2, exe_node);
+
+ // exercise each of the copied nodes
+ for (size_t node_idx=0; node_idx<exe_vec.size(); ++node_idx) {
+ for (size_t num_receivers = 1; num_receivers <= MAX_NODES; ++num_receivers ) {
+ // Create num_receivers counting receivers and connect the exe_vec[node_idx] to them.
+ harness_mapped_receiver<OutputType> *receivers = new harness_mapped_receiver<OutputType>[num_receivers];
+ for (size_t r = 0; r < num_receivers; ++r ) {
+ tbb::flow::make_edge( tbb::flow::output_port<0>(exe_vec[node_idx]), receivers[r] );
+ }
+
+ // 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]
+ 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] );
+ }
+
+ // Initialize the receivers so they know how many senders and messages to check for
+ for (size_t r = 0; r < num_receivers; ++r ) {
+ receivers[r].initialize_map( N, num_senders );
+ }
+
+ // Do the test
+ NativeParallelFor( (int)num_senders, parallel_put_until_limit<InputType>(senders) );
+ g.wait_for_all();
+
+ // cofirm 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 );
+ }
+ // validate the receivers
+ for (size_t r = 0; r < num_receivers; ++r ) {
+ receivers[r].validate();
+ }
+ delete [] senders;
+ }
+ for (size_t r = 0; r < num_receivers; ++r ) {
+ tbb::flow::remove_edge( tbb::flow::output_port<0>(exe_vec[node_idx]), receivers[r] );
+ }
+ ASSERT( exe_vec[node_idx].try_put( InputType() ) == true, NULL );
+ g.wait_for_all();
+ for (size_t r = 0; r < num_receivers; ++r ) {
+ // since it's detached, nothing should have changed
+ receivers[r].validate();
+ }
+ delete [] receivers;
+ }
+ }
+ }
+}
+
+const size_t Offset = 123;
+tbb::atomic<size_t> global_execute_count;
+
+struct inc_functor {
+
+ tbb::atomic<size_t> local_execute_count;
+ inc_functor( ) { local_execute_count = 0; }
+ inc_functor( const inc_functor &f ) { local_execute_count = f.local_execute_count; }
+
+ template<typename ports_type>
+ void operator()( int i, ports_type &p ) {
+ ++global_execute_count;
+ ++local_execute_count;
+ std::get<0>(p).put(i);
+ }
+
+};
+
+template< typename InputType, typename OutputTuple >
+void buffered_levels_with_copy( size_t concurrency ) {
+ typedef typename std::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;
+
+ inc_functor cf;
+ cf.local_execute_count = Offset;
+ global_execute_count = Offset;
+
+ tbb::flow::multioutput_function_node< InputType, OutputTuple > exe_node( g, lc, cf );
+
+ for (size_t num_receivers = 1; num_receivers <= MAX_NODES; ++num_receivers ) {
+ harness_mapped_receiver<OutputType> *receivers = new harness_mapped_receiver<OutputType>[num_receivers];
+ for (size_t r = 0; r < num_receivers; ++r ) {
+ tbb::flow::make_edge( tbb::flow::output_port<0>(exe_node), receivers[r] );
+ }
+
+ 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];
+ for (size_t s = 0; s < num_senders; ++s ) {
+ senders[s].my_limit = N;
+ tbb::flow::make_edge( senders[s], exe_node );
+ }
+
+ for (size_t r = 0; r < num_receivers; ++r ) {
+ receivers[r].initialize_map( N, num_senders );
+ }
+
+ NativeParallelFor( (int)num_senders, parallel_put_until_limit<InputType>(senders) );
+ g.wait_for_all();
+
+ 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 );
+ }
+ for (size_t r = 0; r < num_receivers; ++r ) {
+ receivers[r].validate();
+ }
+ delete [] senders;
+ }
+ for (size_t r = 0; r < num_receivers; ++r ) {
+ tbb::flow::remove_edge( tbb::flow::output_port<0>(exe_node), receivers[r] );
+ }
+ ASSERT( exe_node.try_put( InputType() ) == true, NULL );
+ g.wait_for_all();
+ for (size_t r = 0; r < num_receivers; ++r ) {
+ receivers[r].validate();
+ }
+ delete [] receivers;
+ }
+
+ // validate that the local body matches the global execute_count and both are correct
+ inc_functor body_copy = tbb::flow::copy_body<inc_functor>( exe_node );
+ const size_t expected_count = N/2 * MAX_NODES * MAX_NODES * ( MAX_NODES + 1 ) + MAX_NODES + Offset;
+ size_t global_count = global_execute_count;
+ size_t inc_count = body_copy.local_execute_count;
+ ASSERT( global_count == expected_count && global_count == inc_count, NULL );
+ }
+}
+
+template< typename InputType, typename OutputTuple >
+void run_buffered_levels( int c ) {
+ typedef typename tbb::flow::multioutput_function_node<InputType,OutputTuple>::ports_type ports_type;
+ harness_graph_multioutput_executor<InputType, OutputTuple, tbb::spin_mutex>::max_executors = c;
+ #if __TBB_LAMBDAS_PRESENT
+ buffered_levels<InputType,OutputTuple>( c, []( InputType i, ports_type &p ) { harness_graph_multioutput_executor<InputType, OutputTuple, tbb::spin_mutex>::func(i,p); } );
+ #endif
+ buffered_levels<InputType,OutputTuple>( c, &harness_graph_multioutput_executor<InputType, OutputTuple, tbb::spin_mutex>::func );
+ buffered_levels<InputType,OutputTuple>( c, typename harness_graph_multioutput_executor<InputType, OutputTuple, tbb::spin_mutex>::functor() );
+ buffered_levels_with_copy<InputType,OutputTuple>( c );
+}
+
+
+//! Performs test on executable nodes with limited concurrency
+/** Theses tests check:
+ 1) that the nodes will accepts puts up to the concurrency limit,
+ 2) the nodes do not exceed the concurrency limit even when run with more threads (this is checked in the harness_graph_executor),
+ 3) the nodes will receive puts from multiple successors simultaneously,
+ and 4) the nodes will send to multiple predecessors.
+ There is no checking of the contents of the messages for corruption.
+*/
+
+template< typename InputType, typename OutputTuple, typename Body >
+void concurrency_levels( size_t concurrency, Body body ) {
+ typedef typename std::tuple_element<0,OutputTuple>::type OutputType;
+ for ( size_t lc = 1; lc <= concurrency; ++lc ) {
+ tbb::flow::graph g;
+ harness_graph_multioutput_executor<InputType, OutputTuple, tbb::spin_mutex>::execute_count = 0;
+
+ tbb::flow::multioutput_function_node< InputType, OutputTuple, tbb::flow::rejecting > exe_node( g, lc, body );
+
+ for (size_t num_receivers = 1; num_receivers <= MAX_NODES; ++num_receivers ) {
+
+ harness_counting_receiver<OutputType> *receivers = new harness_counting_receiver<OutputType>[num_receivers];
+
+ for (size_t r = 0; r < num_receivers; ++r ) {
+ tbb::flow::make_edge( tbb::flow::output_port<0>(exe_node), receivers[r] );
+ }
+
+ harness_counting_sender<InputType> *senders = NULL;
+
+ 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_multioutput_executor< InputType, OutputTuple, tbb::spin_mutex >::mutex );
+
+ // put to lc level, it will accept and then block at m
+ for ( size_t c = 0 ; c < lc ; ++c ) {
+ ASSERT( exe_node.try_put( InputType() ) == true, NULL );
+ }
+ // 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;
+ exe_node.register_predecessor( senders[s] );
+ }
+
+ } // release lock at end of scope, setting the exe node free to continue
+ // wait for graph to settle down
+ g.wait_for_all();
+
+ // 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 );
+ }
+ // 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 );
+ receivers[r].my_count = 0;
+ }
+ delete [] senders;
+ }
+ for (size_t r = 0; r < num_receivers; ++r ) {
+ tbb::flow::remove_edge( tbb::flow::output_port<0>(exe_node), receivers[r] );
+ }
+ ASSERT( exe_node.try_put( InputType() ) == true, NULL );
+ g.wait_for_all();
+ for (size_t r = 0; r < num_receivers; ++r ) {
+ ASSERT( int(receivers[r].my_count) == 0, NULL );
+ }
+ delete [] receivers;
+ }
+ }
+}
+
+template< typename InputType, typename OutputTuple >
+void run_concurrency_levels( int c ) {
+ harness_graph_multioutput_executor<InputType, OutputTuple, tbb::spin_mutex>::max_executors = c;
+ typedef typename tbb::flow::multioutput_function_node<InputType,OutputTuple>::ports_type ports_type;
+ #if __TBB_LAMBDAS_PRESENT
+ concurrency_levels<InputType,OutputTuple>( c, []( InputType i, ports_type &p ) { harness_graph_multioutput_executor<InputType, OutputTuple, tbb::spin_mutex>::func(i,p); } );
+ #endif
+ concurrency_levels<InputType,OutputTuple>( c, &harness_graph_multioutput_executor<InputType, OutputTuple, tbb::spin_mutex>::func );
+ concurrency_levels<InputType,OutputTuple>( c, typename harness_graph_multioutput_executor<InputType, OutputTuple, tbb::spin_mutex>::functor() );
+}
+
+
+struct empty_no_assign {
+ empty_no_assign() {}
+ empty_no_assign( int ) {}
+ operator int() { return 0; }
+ operator int() const { return 0; }
+};
+
+template< typename InputType >
+struct parallel_puts : private NoAssign {
+
+ tbb::flow::receiver< InputType > * const my_exe_node;
+
+ parallel_puts( tbb::flow::receiver< InputType > &exe_node ) : my_exe_node(&exe_node) {}
+
+ void operator()( int ) const {
+ for ( int i = 0; i < N; ++i ) {
+ // the nodes will accept all puts
+ ASSERT( my_exe_node->try_put( InputType() ) == true, NULL );
+ }
+ }
+
+};
+
+//! Performs test on executable nodes with unlimited concurrency
+/** These tests check:
+ 1) that the nodes will accept all puts
+ 2) the nodes will receive puts from multiple predecessors simultaneously,
+ and 3) the nodes will send to multiple successors.
+ There is no checking of the contents of the messages for corruption.
+*/
+
+template< typename InputType, typename OutputTuple, typename Body >
+void unlimited_concurrency( Body body ) {
+ typedef typename std::tuple_element<0,OutputTuple>::type OutputType;
+
+ for (int p = 1; p < 2*MaxThread; ++p) {
+ tbb::flow::graph g;
+ tbb::flow::multioutput_function_node< InputType, OutputTuple, tbb::flow::rejecting > exe_node( g, tbb::flow::unlimited, body );
+
+ for (size_t num_receivers = 1; num_receivers <= MAX_NODES; ++num_receivers ) {
+ harness_counting_receiver<OutputType> *receivers = new harness_counting_receiver<OutputType>[num_receivers];
+ harness_graph_multioutput_executor<InputType, OutputTuple>::execute_count = 0;
+
+ for (size_t r = 0; r < num_receivers; ++r ) {
+ tbb::flow::make_edge( tbb::flow::output_port<0>(exe_node), receivers[r] );
+ }
+
+ NativeParallelFor( p, parallel_puts<InputType>(exe_node) );
+ g.wait_for_all();
+
+ // 2) the nodes will receive puts from multiple predecessors simultaneously,
+ size_t ec = harness_graph_multioutput_executor<InputType, OutputTuple>::execute_count;
+ ASSERT( (int)ec == p*N, NULL );
+ for (size_t r = 0; r < num_receivers; ++r ) {
+ size_t c = receivers[r].my_count;
+ // 3) the nodes will send to multiple successors.
+ ASSERT( (int)c == p*N, NULL );
+ }
+ }
+ }
+}
+
+template< typename InputType, typename OutputTuple >
+void run_unlimited_concurrency() {
+ typedef typename tbb::flow::multioutput_function_node<InputType,OutputTuple>::ports_type ports_type;
+ harness_graph_multioutput_executor<InputType, OutputTuple>::max_executors = 0;
+ #if __TBB_LAMBDAS_PRESENT
+ unlimited_concurrency<InputType,OutputTuple>( []( InputType i, ports_type &p ) { harness_graph_multioutput_executor<InputType, OutputTuple>::func(i,p); } );
+ #endif
+ unlimited_concurrency<InputType,OutputTuple>( &harness_graph_multioutput_executor<InputType, OutputTuple>::func );
+ unlimited_concurrency<InputType,OutputTuple>( typename harness_graph_multioutput_executor<InputType, OutputTuple>::functor() );
+}
+
+template<typename InputType, typename OutputTuple>
+struct oddEvenBody {
+ typedef typename tbb::flow::multioutput_function_node<InputType,OutputTuple>::ports_type ports_type;
+ typedef typename std::tuple_element<0,OutputTuple>::type EvenType;
+ typedef typename std::tuple_element<1,OutputTuple>::type OddType;
+ void operator() (const InputType &i, ports_type &p) {
+ if((int)i % 2) {
+ std::get<1>(p).put(OddType(i));
+ }
+ else {
+ std::get<0>(p).put(EvenType(i));
+ }
+ }
+};
+
+template<typename InputType, typename OutputTuple >
+void run_multiport_test(int num_threads) {
+ typedef typename tbb::flow::multioutput_function_node<InputType, OutputTuple> mo_node_type;
+ typedef typename std::tuple_element<0,OutputTuple>::type EvenType;
+ typedef typename std::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>() );
+
+ tbb::flow::queue_node<EvenType> q0(g);
+ tbb::flow::queue_node<OddType> q1(g);
+
+ tbb::flow::make_edge(tbb::flow::output_port<0>(mo_node), q0);
+ tbb::flow::make_edge(tbb::flow::output_port<1>(mo_node), q1);
+
+ for(InputType i = 0; i < N; ++i) {
+ mo_node.try_put(i);
+ }
+
+ g.wait_for_all();
+ for(int i = 0; i < N/2; ++i) {
+ EvenType e;
+ OddType o;
+ ASSERT(q0.try_get(e) && (int)e % 2 == 0, NULL);
+ ASSERT(q1.try_get(o) && (int)o % 2 == 1, NULL);
+ }
+}
+
+//! 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);
+}
+
+int TestMain() {
+ current_executors = 0;
+ if( MinThread<1 ) {
+ REPORT("number of threads must be positive\n");
+ exit(1);
+ }
+ for( int p=MinThread; p<=MaxThread; ++p ) {
+ test_concurrency(p);
+ }
+ return Harness::Done;
+}
+#else // __SUNPRO_CC
+int TestMain() {
+ return Harness::Skipped;
+}
+#endif // __SUNPRO_CC
diff --git a/src/test/test_mutex_native_threads.cpp b/src/test/test_mutex_native_threads.cpp
index 4e6fa2f..3aff41f 100644
--- a/src/test/test_mutex_native_threads.cpp
+++ b/src/test/test_mutex_native_threads.cpp
@@ -182,14 +182,16 @@ void Test( const char * name, int nthread ) {
Counter<M> counter;
counter.value = 0;
Order = 0;
- const long test_size = 100000;
+ // use the macro because of a seeming gcc 4.6 bug
+#define TEST_SIZE 100000
tbb::tick_count t0 = tbb::tick_count::now();
- NativeParallelFor( nthread, Work<Counter<M>, test_size>(counter) );
+ NativeParallelFor( nthread, Work<Counter<M>, TEST_SIZE>(counter) );
tbb::tick_count t1 = tbb::tick_count::now();
REMARK("%s time = %g usec\n",name, (t1-t0).seconds() );
- if( counter.value!=test_size )
- REPORT("ERROR for %s: counter.value=%ld != %ld=test_size\n",name,counter.value,test_size);
+ if( counter.value!=TEST_SIZE )
+ REPORT("ERROR for %s: counter.value=%ld != %ld=test_size\n",name,counter.value,TEST_SIZE);
+#undef TEST_SIZE
}
@@ -199,15 +201,17 @@ void TestReaderWriter( const char * mutex_name, int nthread ) {
REMARK("testing %s\n",mutex_name);
Invariant<M,8> invariant(mutex_name);
Order = 0;
- static const long test_size = 1000000;
+ // use the macro because of a seeming gcc 4.6 bug
+#define TEST_SIZE 1000000
tbb::tick_count t0 = tbb::tick_count::now();
- NativeParallelFor( nthread, Work<Invariant<M,8>, test_size>(invariant) );
+ NativeParallelFor( nthread, Work<Invariant<M,8>, TEST_SIZE>(invariant) );
tbb::tick_count t1 = tbb::tick_count::now();
// There is either a writer or a reader upgraded to a writer for each 4th iteration
- long expected_value = test_size/4;
+ long expected_value = TEST_SIZE/4;
if( !invariant.value_is(expected_value) )
REPORT("ERROR for %s: final invariant value is wrong\n",mutex_name);
REMARK("%s readers & writers time = %g usec\n",mutex_name,(t1-t0).seconds());
+#undef TEST_SIZE
}
int TestMain () {
diff --git a/src/test/test_or_node.cpp b/src/test/test_or_node.cpp
new file mode 100644
index 0000000..c53313f
--- /dev/null
+++ b/src/test/test_or_node.cpp
@@ -0,0 +1,458 @@
+/*
+ Copyright 2005-2011 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.h"
+#define TBB_PREVIEW_GRAPH_NODES 1
+#include "tbb/flow_graph.h"
+
+#if !__SUNPRO_CC
+//
+// Tests
+//
+
+const int Count = 150;
+const int MaxPorts = 10;
+const int MaxNSources = 5; // max # of source_nodes to register for each or_node input in parallel test
+bool outputCheck[MaxPorts][Count]; // for checking output
+
+void
+check_outputCheck( int nUsed, int maxCnt) {
+ for(int i=0; i < nUsed; ++i) {
+ for( int j = 0; j < maxCnt; ++j) {
+ ASSERT(outputCheck[i][j], NULL);
+ }
+ }
+}
+
+void
+reset_outputCheck( int nUsed, int maxCnt) {
+ for(int i=0; i < nUsed; ++i) {
+ for( int j = 0; j < maxCnt; ++j) {
+ outputCheck[i][j] = false;
+ }
+ }
+}
+
+class test_class {
+ public:
+ test_class() { my_val = 0; }
+ test_class(int i) { my_val = i; }
+ operator int() { return my_val; }
+ private:
+ int my_val;
+};
+
+template<typename T>
+class name_of {
+public:
+ static const char* name() { return "Unknown"; }
+};
+template<>
+class name_of<int> {
+public:
+ static const char* name() { return "int"; }
+};
+template<>
+class name_of<float> {
+public:
+ static const char* name() { return "float"; }
+};
+template<>
+class name_of<double> {
+public:
+ static const char* name() { return "double"; }
+};
+template<>
+class name_of<long> {
+public:
+ static const char* name() { return "long"; }
+};
+template<>
+class name_of<short> {
+public:
+ static const char* name() { return "short"; }
+};
+template<>
+class name_of<test_class> {
+public:
+ static const char* name() { return "test_class"; }
+};
+
+// TT must be arithmetic, and shouldn't wrap around for reasonable sizes of Count (which is now 150, and maxPorts is 10,
+// so the max number generated right now is 1500 or so.) Source will generate a series of TT with value
+// (init_val + (i-1)*addend) * my_mult, where i is the i-th invocation of the body. We are attaching addend
+// source nodes to a or_port, and each will generate part of the numerical series the port is expecting
+// to receive. If there is only one source node, the series order will be maintained; if more than one,
+// this is not guaranteed.
+template<typename TT>
+class source_body {
+ const TT my_mult;
+ int my_count;
+ const int addend;
+ source_body& operator=( const source_body& other);
+public:
+ source_body(TT multiplier, int init_val, int addto) : my_mult(multiplier), my_count(init_val), addend(addto) { }
+ bool operator()( TT &v) {
+ int lc = my_count;
+ v = my_mult * (TT)my_count;
+ my_count += addend;
+ return lc < Count;
+ }
+};
+
+// allocator for or_node.
+
+template<typename OType>
+class makeOr {
+public:
+ static OType *create() {
+ OType *temp = new OType();
+ return temp;
+ }
+ static void destroy(OType *p) { delete p; }
+};
+
+template<int ELEM, typename ONT>
+struct getval_helper {
+
+ typedef typename ONT::output_type OT;
+ static int get_integer_val(OT &o) {
+ return int(std::get<ELEM-1>(o.result));
+ }
+};
+
+// holder for source_node pointers for eventual deletion
+
+static void* all_source_nodes[MaxPorts][MaxNSources];
+
+template<int ELEM, typename ONT>
+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::source_node<IT> my_source_node_type;
+ static void print_remark() {
+ source_node_helper<ELEM-1,ONT>::print_remark();
+ REMARK(", %s", name_of<IT>::name());
+ }
+ static void add_source_nodes(or_node_type &my_or, tbb::flow::graph &g, int nInputs) {
+ for(int i=0; i < nInputs; ++i) {
+ my_source_node_type *new_node = new my_source_node_type(g, source_body<IT>((IT)(ELEM+1), i, nInputs));
+ ASSERT(new_node->register_successor(tbb::flow::input_port<ELEM-1>(my_or)), NULL);
+ all_source_nodes[ELEM-1][i] = (void *)new_node;
+ }
+ // add the next source_node
+ source_node_helper<ELEM-1, ONT>::add_source_nodes(my_or, g, nInputs);
+ }
+ static void check_value(TT &v) {
+ if(v.indx == ELEM-1) {
+ int ival = getval_helper<ELEM,ONT>::get_integer_val(v);
+ ASSERT(!(ival%(ELEM+1)), NULL);
+ ival /= (ELEM+1);
+ ASSERT(!outputCheck[ELEM-1][ival], NULL);
+ outputCheck[ELEM-1][ival] = true;
+ }
+ else {
+ source_node_helper<ELEM-1,ONT>::check_value(v);
+ }
+ }
+
+ static void remove_source_nodes(or_node_type& my_or, int nInputs) {
+ for(int i=0; i< nInputs; ++i) {
+ my_source_node_type *dp = reinterpret_cast<my_source_node_type *>(all_source_nodes[ELEM-1][i]);
+ dp->remove_successor(tbb::flow::input_port<ELEM-1>(my_or));
+ delete dp;
+ }
+ source_node_helper<ELEM-1, ONT>::remove_source_nodes(my_or, nInputs);
+ }
+};
+
+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::source_node<IT> my_source_node_type;
+public:
+ static void print_remark() {
+ REMARK("Parallel test of or_node< %s", name_of<IT>::name());
+ }
+ static void add_source_nodes(or_node_type &my_or, tbb::flow::graph &g, int nInputs) {
+ for(int i=0; i < nInputs; ++i) {
+ my_source_node_type *new_node = new my_source_node_type(g, source_body<IT>((IT)2, i, nInputs));
+ ASSERT(new_node->register_successor(tbb::flow::input_port<0>(my_or)), NULL);
+ all_source_nodes[0][i] = (void *)new_node;
+ }
+ }
+ static void check_value(TT &v) {
+ int ival = getval_helper<1,ONT>::get_integer_val(v);
+ ASSERT(!(ival%2), NULL);
+ ival /= 2;
+ ASSERT(!outputCheck[0][ival], NULL);
+ outputCheck[0][ival] = true;
+ }
+ static void remove_source_nodes(or_node_type& my_or, int nInputs) {
+ for(int i=0; i < nInputs; ++i) {
+ my_source_node_type *dp = reinterpret_cast<my_source_node_type *>(all_source_nodes[0][i]);
+ dp->remove_successor(tbb::flow::input_port<0>(my_or));
+ delete dp;
+ }
+ }
+};
+
+template<typename OType>
+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 void test() {
+ TType v;
+ source_node_helper<SIZE,OType>::print_remark();
+ REMARK(" >\n");
+ for(int i=0; i < MaxPorts; ++i) {
+ for(int j=0; j < MaxNSources; ++j) {
+ all_source_nodes[i][j] = NULL;
+ }
+ }
+ for(int nInputs = 1; nInputs <= MaxNSources; ++nInputs) {
+ tbb::flow::graph g;
+ OType* my_or = makeOr<OType>::create();
+ tbb::flow::queue_node<TType> outq1(g);
+ tbb::flow::queue_node<TType> outq2(g);
+
+ ASSERT((*my_or).register_successor(outq1), NULL); // register outputs first, so they both get all
+ ASSERT((*my_or).register_successor(outq2), NULL); // the results
+
+ source_node_helper<SIZE, OType>::add_source_nodes((*my_or), g, nInputs);
+
+ g.wait_for_all();
+
+ reset_outputCheck(SIZE, Count);
+ for(int i=0; i < Count*SIZE; ++i) {
+ ASSERT(outq1.try_get(v), NULL);
+ source_node_helper<SIZE, OType>::check_value(v);
+ }
+
+ check_outputCheck(SIZE, Count);
+ reset_outputCheck(SIZE, Count);
+
+ for(int i=0; i < Count*SIZE; i++) {
+ ASSERT(outq2.try_get(v), NULL);;
+ source_node_helper<SIZE, OType>::check_value(v);
+ }
+ check_outputCheck(SIZE, Count);
+
+ ASSERT(!outq1.try_get(v), NULL);
+ ASSERT(!outq2.try_get(v), NULL);
+
+ source_node_helper<SIZE, OType>::remove_source_nodes((*my_or), nInputs);
+ (*my_or).remove_successor(outq1);
+ (*my_or).remove_successor(outq2);
+ makeOr<OType>::destroy(my_or);
+ }
+ }
+};
+
+std::vector<int> last_index_seen;
+
+template<int ELEM, typename OType>
+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;
+ static void print_remark() {
+ serial_queue_helper<ELEM-1,OType>::print_remark();
+ REMARK(", %s", name_of<IT>::name());
+ }
+ static void fill_one_queue(int maxVal, OType &my_or) {
+ // fill queue to "left" of me
+ serial_queue_helper<ELEM-1,OType>::fill_one_queue(maxVal,my_or);
+ for(int i = 0; i < maxVal; ++i) {
+ ASSERT(tbb::flow::input_port<ELEM-1>(my_or).try_put((IT)(i*(ELEM+1))), NULL);
+ }
+ }
+ static void put_one_queue_val(int myVal, OType &my_or) {
+ // put this val to my "left".
+ serial_queue_helper<ELEM-1,OType>::put_one_queue_val(myVal, my_or);
+ ASSERT(tbb::flow::input_port<ELEM-1>(my_or).try_put((IT)(myVal*(ELEM+1))), NULL);
+ }
+ static void check_queue_value(OT &v) {
+ if(ELEM - 1 == v.indx) {
+ // this assumes each or node input is queueing.
+ int rval = getval_helper<ELEM,OType>::get_integer_val(v);
+ ASSERT( rval == (last_index_seen[ELEM-1]+1)*(ELEM+1), NULL);
+ last_index_seen[ELEM-1] = rval / (ELEM+1);
+ }
+ else {
+ serial_queue_helper<ELEM-1,OType>::check_queue_value(v);
+ }
+ }
+};
+
+template<typename OType>
+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;
+ static void print_remark() {
+ REMARK("Serial test of or_node< %s", name_of<IT>::name());
+ }
+ static void fill_one_queue(int maxVal, OType &my_or) {
+ for(int i = 0; i < maxVal; ++i) {
+ ASSERT(tbb::flow::input_port<0>(my_or).try_put((IT)(i*2)), NULL);
+ }
+ }
+ static void put_one_queue_val(int myVal, OType &my_or) {
+ ASSERT(tbb::flow::input_port<0>(my_or).try_put((IT)(myVal*2)), NULL);
+ }
+ static void check_queue_value(OT &v) {
+ ASSERT(v.indx == 0, NULL); // won't get here unless true
+ int rval = getval_helper<1,OType>::get_integer_val(v);
+ ASSERT( rval == (last_index_seen[0]+1)*2, NULL);
+ last_index_seen[0] = rval / 2;
+ }
+};
+
+template<typename OType, typename TType, int SIZE>
+void test_one_serial( OType &my_or, tbb::flow::graph &g) {
+ last_index_seen.clear();
+ for(int ii=0; ii < SIZE; ++ii) last_index_seen.push_back(-1);
+
+ typedef TType q3_input_type;
+ tbb::flow::queue_node< q3_input_type > q3(g);
+ q3_input_type v;
+
+ ASSERT((my_or).register_successor( q3 ), NULL);
+
+ // fill each queue with its value one-at-a-time
+ for (int i = 0; i < Count; ++i ) {
+ serial_queue_helper<SIZE,OType>::put_one_queue_val(i,my_or);
+ }
+
+ g.wait_for_all();
+ for (int i = 0; i < Count * SIZE; ++i ) {
+ g.wait_for_all();
+ ASSERT(q3.try_get( v ), "Error in try_get()");
+ {
+ serial_queue_helper<SIZE,OType>::check_queue_value(v);
+ }
+ }
+ ASSERT(!q3.try_get( v ), "extra values in output queue");
+ for(int ii=0; ii < SIZE; ++ii) last_index_seen[ii] = -1;
+
+ // fill each queue completely before filling the next.
+ serial_queue_helper<SIZE, OType>::fill_one_queue(Count,my_or);
+
+ g.wait_for_all();
+ for (int i = 0; i < Count*SIZE; ++i ) {
+ g.wait_for_all();
+ ASSERT(q3.try_get( v ), "Error in try_get()");
+ {
+ serial_queue_helper<SIZE,OType>::check_queue_value(v);
+ }
+ }
+ ASSERT(!q3.try_get( v ), "extra values in output queue");
+}
+
+//
+// Single predecessor at each port, single accepting successor
+// * put to buffer before port0, then put to buffer before port1, ...
+// * fill buffer before port0 then fill buffer before port1, ...
+
+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;
+public:
+static void test() {
+ tbb::flow::graph g;
+ static const int ELEMS = 3;
+ OType* my_or = makeOr<OType>::create();
+
+ serial_queue_helper<SIZE, OType>::print_remark(); REMARK(" >\n");
+
+ test_one_serial<OType,TType,SIZE>(*my_or, g);
+
+ std::vector<OType> or_vector(ELEMS, *my_or);
+
+ makeOr<OType>::destroy(my_or);
+
+ for(int e = 0; e < ELEMS; ++e) {
+ test_one_serial<OType,TType,SIZE>(or_vector[e], g);
+ }
+}
+
+}; // serial_test
+
+template<
+ template<typename> class TestType, // serial_test or parallel_test
+ typename InputTupleType> // type of the inputs to the or_node
+class generate_test {
+public:
+ typedef tbb::flow::or_node<InputTupleType> or_node_type;
+ static void do_test() {
+ TestType<or_node_type>::test();
+ }
+};
+
+int TestMain() {
+ REMARK("Testing or_node, ");
+#if __TBB_USE_TBB_TUPLE
+ REMARK("using TBB tuple\n");
+#else
+ REMARK("using platform tuple\n");
+#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();
+#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();
+#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 8d0cdfc..ee38062 100644
--- a/src/test/test_overwrite_node.cpp
+++ b/src/test/test_overwrite_node.cpp
@@ -27,8 +27,6 @@
*/
#include "harness_graph.h"
-#define TBB_PREVIEW_GRAPH 1
-#include "tbb/graph.h"
#include "tbb/task_scheduler_init.h"
@@ -38,7 +36,7 @@
template< typename R >
void simple_read_write_tests() {
- tbb::overwrite_node<R> n;
+ tbb::flow::overwrite_node<R> n;
for ( int t = 0; t < T; ++t ) {
R v0(N+1);
@@ -54,7 +52,7 @@ void simple_read_write_tests() {
}
for (int i = 0; i < M; ++i) {
- ASSERT( n.register_successor(r[i]), NULL );
+ tbb::flow::make_edge( n, r[i] );
}
for (int i = 0; i < N; ++i ) {
@@ -72,7 +70,7 @@ void simple_read_write_tests() {
ASSERT( int(c) == N+t%2, NULL );
}
for (int i = 0; i < M; ++i) {
- ASSERT( n.remove_successor(r[i]), NULL );
+ tbb::flow::remove_edge( n, r[i] );
}
ASSERT( n.try_put( R(0) ), NULL );
for (int i = 0; i < M; ++i) {
@@ -87,11 +85,11 @@ void simple_read_write_tests() {
template< typename R >
class native_body : NoAssign {
- tbb::overwrite_node<R> &my_node;
+ tbb::flow::overwrite_node<R> &my_node;
public:
- native_body( tbb::overwrite_node<R> &n ) : my_node(n) {}
+ native_body( tbb::flow::overwrite_node<R> &n ) : my_node(n) {}
void operator()( int i ) const {
R v1(static_cast<R>(i));
@@ -102,35 +100,39 @@ public:
template< typename R >
void parallel_read_write_tests() {
- tbb::overwrite_node<R> n;
+ tbb::flow::overwrite_node<R> n;
+ //Create a vector of identical nodes
+ std::vector< tbb::flow::overwrite_node<R> > ow_vec(2, n);
+ for (size_t node_idx=0; node_idx<ow_vec.size(); ++node_idx) {
for ( int t = 0; t < T; ++t ) {
harness_counting_receiver<R> r[M];
for (int i = 0; i < M; ++i) {
- ASSERT( n.register_successor(r[i]), NULL );
+ tbb::flow::make_edge( ow_vec[node_idx], r[i] );
}
R v0;
- ASSERT( n.is_valid() == false, NULL );
- ASSERT( n.try_get( v0 ) == false, NULL );
+ ASSERT( ow_vec[node_idx].is_valid() == false, NULL );
+ ASSERT( ow_vec[node_idx].try_get( v0 ) == false, NULL );
- NativeParallelFor( N, native_body<R>( n ) );
+ NativeParallelFor( N, native_body<R>( ow_vec[node_idx] ) );
for (int i = 0; i < M; ++i) {
size_t c = r[i].my_count;
ASSERT( int(c) == N, NULL );
}
for (int i = 0; i < M; ++i) {
- ASSERT( n.remove_successor(r[i]), NULL );
+ tbb::flow::remove_edge( ow_vec[node_idx], r[i] );
}
- ASSERT( n.try_put( R(0) ), NULL );
+ ASSERT( ow_vec[node_idx].try_put( R(0) ), NULL );
for (int i = 0; i < M; ++i) {
size_t c = r[i].my_count;
ASSERT( int(c) == N, NULL );
}
- n.clear();
- ASSERT( n.is_valid() == false, NULL );
- ASSERT( n.try_get( v0 ) == false, NULL );
+ ow_vec[node_idx].clear();
+ ASSERT( ow_vec[node_idx].is_valid() == false, NULL );
+ ASSERT( ow_vec[node_idx].try_get( v0 ) == false, NULL );
+ }
}
}
diff --git a/src/test/test_parallel_do.cpp b/src/test/test_parallel_do.cpp
index 10f2ff8..195a828 100644
--- a/src/test/test_parallel_do.cpp
+++ b/src/test/test_parallel_do.cpp
@@ -214,6 +214,8 @@ void Run( int nthread ) {
TestIterator<Harness::InputIterator<value_t> >(nthread, depth);
// Test for forward iterators
TestIterator<Harness::ForwardIterator<value_t> >(nthread, depth);
+ // Test for const random access iterators
+ TestIterator_RvalueOnly<Harness::ConstRandomIterator<value_t> >(nthread, depth);
}
}
diff --git a/src/test/test_parallel_for.cpp b/src/test/test_parallel_for.cpp
index 17a7dbd..e39e4c1 100644
--- a/src/test/test_parallel_for.cpp
+++ b/src/test/test_parallel_for.cpp
@@ -28,6 +28,9 @@
// Test for function template parallel_for.h
+// Enable testing of serial subset.
+#define TBB_PREVIEW_SERIAL_SUBSET 1
+
#if _MSC_VER
#pragma warning (push)
#if !defined(__INTEL_COMPILER)
@@ -38,7 +41,9 @@
// Workaround for overzealous compiler warnings in /Wp64 mode
#pragma warning (disable: 4267)
#endif
-#endif //#if _MSC_VER
+
+#define _SCL_SECURE_NO_WARNINGS
+#endif //#if _MSC_VER
#include "tbb/parallel_for.h"
#include "tbb/atomic.h"
@@ -47,7 +52,7 @@
static tbb::atomic<int> FooBodyCount;
-//! An range object whose only public members are those required by the Range concept.
+//! A range object whose only public members are those required by the Range concept.
template<size_t Pad>
class FooRange {
//! Start of range
@@ -59,7 +64,7 @@ class FooRange {
zero_fill<char>(pad, Pad);
pad[Pad-1] = 'x';
}
- template<size_t Pad_> friend void Flog( int nthread );
+ template<typename Flavor_, size_t Pad_> friend void Flog( int nthread );
template<size_t Pad_> friend class FooBody;
void operator&();
@@ -75,14 +80,14 @@ public:
}
};
-//! An range object whose only public members are those required by the parallel_for.h body concept.
+//! A range object whose only public members are those required by the parallel_for.h body concept.
template<size_t Pad>
class FooBody {
static const int LIVE = 0x1234;
tbb::atomic<int>* array;
int state;
friend class FooRange<Pad>;
- template<size_t Pad_> friend void Flog( int nthread );
+ template<typename Flavor_, size_t Pad_> friend void Flog( int nthread );
FooBody( tbb::atomic<int>* array_ ) : array(array_), state(LIVE) {}
public:
~FooBody() {
@@ -90,58 +95,117 @@ public:
for( size_t i=0; i<sizeof(*this); ++i )
reinterpret_cast<char*>(this)[i] = -1;
}
- //! Copy constructor
+ //! Copy constructor
FooBody( const FooBody& other ) : array(other.array), state(other.state) {
++FooBodyCount;
ASSERT( state==LIVE, NULL );
}
void operator()( FooRange<Pad>& r ) const {
- for( int k=0; k<r.size; ++k )
- array[r.start+k]++;
+ for( int k=0; k<r.size; ++k ) {
+ const int i = array[r.start+k]++;
+ ASSERT( i==0, NULL );
+ }
}
};
#include "tbb/tick_count.h"
-static const int N = 1000;
+static const int N = 500;
static tbb::atomic<int> Array[N];
-template<size_t Pad>
+struct serial_tag {};
+struct parallel_tag {};
+
+template <typename Flavor, 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 );
+ }
+ void operator()( const Range& r, const Body& body, tbb::affinity_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 );
+ }
+ void operator()( const Range& r, const Body& body, tbb::affinity_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>
+struct InvokerStep;
+
+template <typename T, typename Body>
+struct InvokerStep<serial_tag, T, Body> {
+ void operator()( const T& first, const T& last, const Body& f ) {
+ tbb::serial:: parallel_for( first, last, f );
+ }
+ void operator()( const T& first, const T& last, const T& step, const Body& f ) {
+ tbb::serial:: parallel_for( first, last, step, f );
+ }
+};
+
+template <typename T, typename Body>
+struct InvokerStep<parallel_tag, T, Body> {
+ void operator()( const T& first, const T& last, const Body& f ) {
+ tbb:: parallel_for( first, last, f );
+ }
+ void operator()( const T& first, const T& last, const T& step, const Body& f ) {
+ tbb:: parallel_for( first, last, step, f );
+ }
+};
+
+template<typename Flavor, size_t Pad>
void Flog( int nthread ) {
tbb::tick_count T0 = tbb::tick_count::now();
for( int i=0; i<N; ++i ) {
- for ( int mode = 0; mode < 4; ++mode)
- {
+ for ( int mode = 0; mode < 4; ++mode) {
FooRange<Pad> r( 0, i );
const FooRange<Pad> rc = r;
FooBody<Pad> f( Array );
const FooBody<Pad> fc = f;
memset( Array, 0, sizeof(Array) );
FooBodyCount = 1;
+ Invoker< Flavor, FooRange<Pad>, FooBody<Pad> > invoke_for;
switch (mode) {
case 0:
- tbb::parallel_for( rc, fc );
+ invoke_for( rc, fc );
break;
case 1:
- tbb::parallel_for( rc, fc, tbb::simple_partitioner() );
+ invoke_for( rc, fc, tbb::simple_partitioner() );
break;
case 2:
- tbb::parallel_for( rc, fc, tbb::auto_partitioner() );
+ invoke_for( rc, fc, tbb::auto_partitioner() );
break;
case 3: {
static tbb::affinity_partitioner affinity;
- tbb::parallel_for( rc, fc, affinity );
+ invoke_for( rc, fc, affinity );
}
break;
}
- for( int j=0; j<i; ++j )
+ for( int j=0; j<i; ++j )
ASSERT( Array[j]==1, NULL );
- for( int j=i; j<N; ++j )
+ for( int j=i; j<N; ++j )
ASSERT( Array[j]==0, NULL );
- // Destruction of bodies might take a while, but there should be at most one body per thread
- // at this point.
- while( FooBodyCount>1 && FooBodyCount<=nthread )
- __TBB_Yield();
ASSERT( FooBodyCount==1, NULL );
}
}
@@ -151,8 +215,8 @@ void Flog( int nthread ) {
// Testing parallel_for with step support
const size_t PFOR_BUFFER_TEST_SIZE = 1024;
-// test_buffer has some extra items beyound right bound
-const size_t PFOR_BUFFER_ACTUAL_SIZE = PFOR_BUFFER_TEST_SIZE + 1024;
+// test_buffer has some extra items beyond its right bound
+const size_t PFOR_BUFFER_ACTUAL_SIZE = PFOR_BUFFER_TEST_SIZE + 1024;
size_t pfor_buffer[PFOR_BUFFER_ACTUAL_SIZE];
template<typename T>
@@ -175,20 +239,21 @@ public:
#pragma warning (pop)
#endif
-template <typename T>
+template <typename Flavor, typename T>
void TestParallelForWithStepSupport()
{
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;
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){
- tbb::parallel_for(begin, pfor_buffer_test_size, TestFunctor<T>());
+ invoke_for(begin, pfor_buffer_test_size, TestFunctor<T>());
} else {
- tbb::parallel_for(begin, pfor_buffer_test_size, step, TestFunctor<T>());
+ invoke_for(begin, pfor_buffer_test_size, step, TestFunctor<T>());
}
// Verifying that parallel_for processed all items it should
for (T i = begin; i < pfor_buffer_test_size; i = i + step) {
@@ -216,6 +281,7 @@ void TestParallelForWithStepSupport()
#endif /* TBB_USE_EXCEPTIONS && !__TBB_THROW_ACROSS_MODULE_BOUNDARY_BROKEN */
}
+#if __TBB_TASK_GROUP_CONTEXT
// Exception support test
#define HARNESS_EH_SIMPLE_MODE 1
#include "tbb/tbb_exception.h"
@@ -283,31 +349,65 @@ void TestCancellation()
ResetEhGlobals();
RunCancellationTest<my_worker_pfor_step_task, CancellatorTask>();
}
+#endif /* __TBB_TASK_GROUP_CONTEXT */
#include "harness_m128.h"
-#if HAVE_m128 && !__TBB_SSE_STACK_ALIGNMENT_BROKEN
+#if (HAVE_m128 || HAVE_m256) && !__TBB_SSE_STACK_ALIGNMENT_BROKEN
+template<typename ClassWithVectorType>
struct SSE_Functor {
- ClassWithSSE* Src, * Dst;
- SSE_Functor( ClassWithSSE* src, ClassWithSSE* dst ) : Src(src), Dst(dst) {}
+ ClassWithVectorType* Src, * Dst;
+ SSE_Functor( ClassWithVectorType* src, ClassWithVectorType* dst ) : Src(src), Dst(dst) {}
void operator()( tbb::blocked_range<int>& r ) const {
for( int i=r.begin(); i!=r.end(); ++i )
Dst[i] = Src[i];
- }
+ }
};
//! Test that parallel_for works with stack-allocated __m128
-void TestSSE() {
- ClassWithSSE Array1[N], Array2[N];
- for( int i=0; i<N; ++i )
- Array1[i] = ClassWithSSE(i);
- tbb::parallel_for( tbb::blocked_range<int>(0,N), SSE_Functor(Array1, Array2) );
- for( int i=0; i<N; ++i )
- ASSERT( Array2[i]==ClassWithSSE(i), NULL ) ;
+template<typename ClassWithVectorType>
+void TestVectorTypes() {
+ ClassWithVectorType Array1[N], Array2[N];
+ for( int i=0; i<N; ++i ) {
+ // VC8 does not properly align a temporary value; to work around, use explicit variable
+ ClassWithVectorType foo(i);
+ Array1[i] = foo;
+ }
+ tbb::parallel_for( tbb::blocked_range<int>(0,N), SSE_Functor<ClassWithVectorType>(Array1, Array2) );
+ for( int i=0; i<N; ++i ) {
+ ClassWithVectorType foo(i);
+ ASSERT( Array2[i]==foo, NULL ) ;
+ }
+}
+#endif /* HAVE_m128 || HAVE_m256 */
+
+#include <vector>
+#include <tbb/blocked_range.h>
+#include <sstream>
+struct TestSimplePartitionerStabilityFunctor:NoAssign{
+ std::vector<int> & ranges;
+ TestSimplePartitionerStabilityFunctor(std::vector<int> & theRanges):ranges(theRanges){}
+ void operator()(tbb::blocked_range<size_t>& r)const{
+ ranges.at(r.begin())=true;
+ }
+};
+void TestSimplePartitionerStability(){
+ const std::size_t repeat_count= 10;
+ const std::size_t rangeToSplitSize=1000000;
+ const std::size_t grainsizeStep=rangeToSplitSize/repeat_count;
+ typedef TestSimplePartitionerStabilityFunctor FunctorType;
+
+ for (std::size_t i=0 , grainsize=grainsizeStep; i<repeat_count;i++, grainsize+=grainsizeStep){
+ std::vector<int> firstSeries(rangeToSplitSize,0);
+ std::vector<int> secondSeries(rangeToSplitSize,0);
+
+ tbb::parallel_for(tbb::blocked_range<size_t>(0,rangeToSplitSize,grainsize),FunctorType(firstSeries),tbb::simple_partitioner());
+ tbb::parallel_for(tbb::blocked_range<size_t>(0,rangeToSplitSize,grainsize),FunctorType(secondSeries),tbb::simple_partitioner());
+ std::stringstream str; str<<i;
+ ASSERT(firstSeries==secondSeries,("splitting range with tbb::simple_partitioner must be reproducible; i=" +str.str()).c_str() );
+ }
}
-#endif /* HAVE_m128 */
-
#include <cstdio>
#include "tbb/task_scheduler_init.h"
#include "harness_cpu.h"
@@ -320,39 +420,64 @@ int TestMain () {
for( int p=MinThread; p<=MaxThread; ++p ) {
if( p>0 ) {
tbb::task_scheduler_init init( p );
- Flog<1>(p);
- Flog<10>(p);
- Flog<100>(p);
- Flog<1000>(p);
- Flog<10000>(p);
+ Flog<parallel_tag,1>(p);
+ Flog<parallel_tag,10>(p);
+ Flog<parallel_tag,100>(p);
+ Flog<parallel_tag,1000>(p);
+ Flog<parallel_tag,10000>(p);
// Testing with different integer types
- TestParallelForWithStepSupport<short>();
- TestParallelForWithStepSupport<unsigned short>();
- TestParallelForWithStepSupport<int>();
- TestParallelForWithStepSupport<unsigned int>();
- TestParallelForWithStepSupport<long>();
- TestParallelForWithStepSupport<unsigned long>();
- TestParallelForWithStepSupport<long long>();
- TestParallelForWithStepSupport<unsigned long long>();
- TestParallelForWithStepSupport<size_t>();
+ TestParallelForWithStepSupport<parallel_tag,short>();
+ TestParallelForWithStepSupport<parallel_tag,unsigned short>();
+ TestParallelForWithStepSupport<parallel_tag,int>();
+ TestParallelForWithStepSupport<parallel_tag,unsigned int>();
+ TestParallelForWithStepSupport<parallel_tag,long>();
+ TestParallelForWithStepSupport<parallel_tag,unsigned long>();
+ TestParallelForWithStepSupport<parallel_tag,long long>();
+ TestParallelForWithStepSupport<parallel_tag,unsigned long long>();
+ TestParallelForWithStepSupport<parallel_tag,size_t>();
+
+ // This is for testing serial implementation.
+ if( p == MaxThread ) {
+ Flog<serial_tag,1>(p);
+ Flog<serial_tag,10>(p);
+ Flog<serial_tag,100>(p);
+ TestParallelForWithStepSupport<serial_tag,short>();
+ TestParallelForWithStepSupport<serial_tag,unsigned short>();
+ TestParallelForWithStepSupport<serial_tag,int>();
+ TestParallelForWithStepSupport<serial_tag,unsigned int>();
+ TestParallelForWithStepSupport<serial_tag,long>();
+ TestParallelForWithStepSupport<serial_tag,unsigned long>();
+ TestParallelForWithStepSupport<serial_tag,long long>();
+ TestParallelForWithStepSupport<serial_tag,unsigned long long>();
+ TestParallelForWithStepSupport<serial_tag,size_t>();
+ }
+
#if TBB_USE_EXCEPTIONS && !__TBB_THROW_ACROSS_MODULE_BOUNDARY_BROKEN
TestExceptionsSupport();
#endif /* TBB_USE_EXCEPTIONS && !__TBB_THROW_ACROSS_MODULE_BOUNDARY_BROKEN */
- if (p>1) TestCancellation();
-#if HAVE_m128 && !__TBB_SSE_STACK_ALIGNMENT_BROKEN
- TestSSE();
-#endif /* HAVE_m128 */
-
+#if __TBB_TASK_GROUP_CONTEXT
+ if ( p > 1 )
+ TestCancellation();
+#endif /* __TBB_TASK_GROUP_CONTEXT */
+#if !__TBB_SSE_STACK_ALIGNMENT_BROKEN
+ #if HAVE_m128
+ TestVectorTypes<ClassWithSSE>();
+ #endif
+ #if HAVE_m256
+ if (have_AVX()) TestVectorTypes<ClassWithAVX>();
+ #endif
+#endif /*!__TBB_SSE_STACK_ALIGNMENT_BROKEN*/
// Test that all workers sleep when no work
TestCPUUserTime(p);
+ TestSimplePartitionerStability();
}
}
#if __TBB_THROW_ACROSS_MODULE_BOUNDARY_BROKEN
REPORT("Known issue: exception handling tests are skipped.\n");
#endif
-#if HAVE_m128 && __TBB_SSE_STACK_ALIGNMENT_BROKEN
- REPORT("Known issue: stack alignment for SSE not tested.\n");
+#if (HAVE_m128 || HAVE_m256) && __TBB_SSE_STACK_ALIGNMENT_BROKEN
+ REPORT("Known issue: stack alignment for SSE/AVX not tested.\n");
#endif
return Harness::Done;
}
diff --git a/src/test/test_parallel_for_each.cpp b/src/test/test_parallel_for_each.cpp
index 4d8038f..00742de 100644
--- a/src/test/test_parallel_for_each.cpp
+++ b/src/test/test_parallel_for_each.cpp
@@ -93,6 +93,7 @@ void RunMutablePForEachTests() {
ASSERT( test_vector[i]==1, "parallel_for_each did not process each element exactly once" );
}
+#if __TBB_TASK_GROUP_CONTEXT
#define HARNESS_EH_SIMPLE_MODE 1
#include "tbb/tbb_exception.h"
#include "harness_eh.h"
@@ -155,6 +156,7 @@ void TestCancellation()
ResetEhGlobals();
RunCancellationTest<my_worker_pforeach_task<Iterator>, CancellatorTask>();
}
+#endif /* __TBB_TASK_GROUP_CONTEXT */
#include "harness_cpu.h"
@@ -165,9 +167,12 @@ int TestMain () {
}
for( int p=MinThread; p<=MaxThread; ++p ) {
tbb::task_scheduler_init init( p );
+
RunPForEachTests<Harness::RandomIterator<size_t> >();
+ RunPForEachTests<Harness::ConstRandomIterator<size_t> >();
RunPForEachTests<Harness::InputIterator<size_t> >();
RunPForEachTests<Harness::ForwardIterator<size_t> >();
+
RunMutablePForEachTests<Harness::RandomIterator<size_t> >();
RunMutablePForEachTests<Harness::ForwardIterator<size_t> >();
@@ -176,11 +181,15 @@ int TestMain () {
TestExceptionsSupport<Harness::InputIterator<size_t> >();
TestExceptionsSupport<Harness::ForwardIterator<size_t> >();
#endif /* TBB_USE_EXCEPTIONS && !__TBB_THROW_ACROSS_MODULE_BOUNDARY_BROKEN */
+
+#if __TBB_TASK_GROUP_CONTEXT
if (p > 1) {
TestCancellation<Harness::RandomIterator<size_t> >();
TestCancellation<Harness::InputIterator<size_t> >();
TestCancellation<Harness::ForwardIterator<size_t> >();
}
+#endif /* __TBB_TASK_GROUP_CONTEXT */
+
// Test that all workers sleep when no work
TestCPUUserTime(p);
}
diff --git a/src/test/test_parallel_invoke.cpp b/src/test/test_parallel_invoke.cpp
index 55d15bf..8f24c2e 100644
--- a/src/test/test_parallel_invoke.cpp
+++ b/src/test/test_parallel_invoke.cpp
@@ -36,11 +36,9 @@
#include "tbb/tbb_exception.h"
#include "harness.h"
-#if !defined(__INTEL_COMPILER)
-#if defined(_MSC_VER) && _MSC_VER <= 1400 || __GNUC__==3 && __GNUC_MINOR__<=3 || __SUNPRO_CC
+#if !__INTEL_COMPILER && (_MSC_VER && _MSC_VER <= 1400 || __GNUC__==3 && __GNUC_MINOR__<=3 || __SUNPRO_CC)
#define __TBB_FUNCTION_BY_CONSTREF_IN_TEMPLATE_BROKEN 1
#endif
-#endif
static const size_t MAX_NUMBER_OF_PINVOKE_ARGS = 10;
tbb::atomic<size_t> function_counter;
@@ -211,6 +209,7 @@ void test_parallel_invoke()
// Exception handling support test
+#if __TBB_TASK_GROUP_CONTEXT
#define HARNESS_EH_SIMPLE_MODE 1
#include "harness_eh.h"
@@ -297,6 +296,7 @@ void TestCancellation ()
}
}
}
+#endif /* __TBB_TASK_GROUP_CONTEXT */
//------------------------------------------------------------------------
// Entry point
@@ -316,7 +316,9 @@ int TestMain () {
#elif TBB_USE_EXCEPTIONS
TestExceptionHandling();
#endif /* TBB_USE_EXCEPTIONS */
+#if __TBB_TASK_GROUP_CONTEXT
TestCancellation();
+#endif /* __TBB_TASK_GROUP_CONTEXT */
}
TestCPUUserTime(p);
}
diff --git a/src/test/test_parallel_reduce.cpp b/src/test/test_parallel_reduce.cpp
index e246413..5ec3ba0 100644
--- a/src/test/test_parallel_reduce.cpp
+++ b/src/test/test_parallel_reduce.cpp
@@ -26,6 +26,7 @@
the GNU General Public License.
*/
+#define TBB_PREVIEW_DETERMINISTIC_REDUCE 1
#include "tbb/parallel_reduce.h"
#include "tbb/atomic.h"
#include "harness_assert.h"
@@ -147,7 +148,7 @@ void Flog( int nthread, bool interference=false ) {
}
tbb::tick_count T1 = tbb::tick_count::now();
REMARK("time=%g join_count=%ld ForkCount=%ld nthread=%d%s\n",
- (T1-T0).seconds(),join_count,long(ForkCount), nthread, interference ? " with interference)":"");
+ (T1-T0).seconds(),join_count,long(ForkCount), nthread, interference ? " with interference":"");
}
}
@@ -165,7 +166,7 @@ public:
};
//! Test for problem in TBB 2.1 parallel_reduce where middle of a range is stolen.
-/** Warning: this test is a somewhat abusive use of TBB somewhat because
+/** Warning: this test is a somewhat abusive use of TBB because
it requires two or more threads to avoid deadlock. */
void FlogWithInterference( int nthread ) {
ASSERT( nthread>=2, "requires too or more threads" );
@@ -250,6 +251,74 @@ void ParallelSum () {
delete array;
}
+const int N = 1000;
+
+#include "harness_concurrency_tracker.h"
+
+template <class Op>
+struct ReduceBody {
+ typename Op::Type my_value;
+
+ ReduceBody() : my_value() {}
+ ReduceBody( ReduceBody &, tbb::split ) : my_value() {}
+
+ void operator() ( const tbb::blocked_range<int>& r ) {
+ Harness::ConcurrencyTracker ct;
+ for ( int i = r.begin(); i != r.end(); ++i ) {
+ Op op;
+ my_value = op(my_value, i);
+ }
+ }
+
+ void join( const ReduceBody& y ) {
+ Op op;
+ my_value = op.join(my_value, y.my_value);
+ }
+};
+
+template <class Op>
+void TestDeterministicReduction () {
+ typedef typename Op::Type Type;
+ const tbb::blocked_range<int> range(0, N);
+ ReduceBody<Op> body;
+ tbb::parallel_deterministic_reduce( range,body );
+ Type R = body.my_value;
+ for ( int i=0; i<100; ++i ) {
+ ReduceBody<Op> body2;
+ tbb::parallel_deterministic_reduce( range,body2 );
+ ASSERT( body2.my_value == R, NULL );
+#if __TBB_LAMBDAS_PRESENT
+ Type r = tbb::parallel_deterministic_reduce( range, Type(),
+ [](const tbb::blocked_range<int>& r, Type value) -> Type {
+ Harness::ConcurrencyTracker ct;
+ for ( int i = r.begin(); i != r.end(); ++i ) {
+ Op op;
+ value = op(value, i);
+ }
+ return value;
+ },
+ [](const Type& v1, const Type& v2) -> Type {
+ Op op;
+ return op.join(v1,v2);
+ }
+ );
+ ASSERT( r == R, NULL );
+#endif /* LAMBDAS */
+ }
+ ASSERT_WARNING((Harness::ConcurrencyTracker::PeakParallelism() > 1), "no parallel execution\n");
+}
+
+class RotOp {
+public:
+ typedef int Type;
+ int operator() ( int x, int i ) const {
+ return ( x<<1 ) ^ i;
+ }
+ int join( int x, int y ) const {
+ return operator()( x, y );
+ }
+};
+
#include "tbb/task_scheduler_init.h"
#include "harness_cpu.h"
@@ -264,6 +333,8 @@ int TestMain () {
if( p>=2 )
FlogWithInterference(p);
ParallelSum();
+ if ( p>=2 )
+ TestDeterministicReduction<RotOp>();
// Test that all workers sleep when no work
TestCPUUserTime(p);
}
diff --git a/src/test/test_parallel_sort.cpp b/src/test/test_parallel_sort.cpp
index daf8812..886d8ac 100644
--- a/src/test/test_parallel_sort.cpp
+++ b/src/test/test_parallel_sort.cpp
@@ -311,11 +311,13 @@ bool init_iter(std::string *iter, std::string *sorted_list, size_t n, const std:
test_type = "sin";
for (size_t i = 0; i < n; i++) {
char buffer[20];
-#if __STDC_SECURE_LIB__>=200411
+// Getting rid of secure warning issued by C++ 14.00 and newer
+// sprintf_s is not defined in msvcrt.dll in windows XP and windows 2003 (used by MinGW gcc 4.5.2 with default spec)
+#if __STDC_SECURE_LIB__>=200411 && !__MINGW64__
sprintf_s(buffer, sizeof(buffer), "%f", float(sin(float(i))));
#else
sprintf(buffer, "%f", float(sin(float(i))));
-#endif /* _MSC_VER>=1400 */
+#endif /* __STDC_SECURE_LIB__>=200411 || && !__MINGW64__ */
sorted_list[i] = iter[i] = std::string(buffer);
}
break;
diff --git a/src/test/test_priority_queue_node.cpp b/src/test/test_priority_queue_node.cpp
index c30a656..60f1833 100644
--- a/src/test/test_priority_queue_node.cpp
+++ b/src/test/test_priority_queue_node.cpp
@@ -28,8 +28,7 @@
// TO DO: Add overlapping put / receive tests
-#define TBB_PREVIEW_GRAPH 1
-#include "tbb/graph.h"
+#include "tbb/flow_graph.h"
#include "tbb/task_scheduler_init.h"
#include "tbb/tick_count.h"
#include "harness.h"
@@ -40,7 +39,7 @@
#define C 10
template< typename T >
-void spin_try_get( tbb::priority_queue_node<T> &q, T &value ) {
+void spin_try_get( tbb::flow::priority_queue_node<T> &q, T &value ) {
while ( q.try_get(value) != true ) ;
}
@@ -54,8 +53,8 @@ void check_item( T* next_value, T &value ) {
template< typename T >
struct parallel_puts : NoAssign {
- tbb::priority_queue_node<T> &my_q;
- parallel_puts( tbb::priority_queue_node<T> &q ) : my_q(q) {}
+ tbb::flow::priority_queue_node<T> &my_q;
+ parallel_puts( tbb::flow::priority_queue_node<T> &q ) : my_q(q) {}
void operator()(int i) const {
for (int j = 0; j < N; ++j) {
bool msg = my_q.try_put( T(N*i + j) );
@@ -66,8 +65,8 @@ struct parallel_puts : NoAssign {
template< typename T >
struct parallel_gets : NoAssign {
- tbb::priority_queue_node<T> &my_q;
- parallel_gets( tbb::priority_queue_node<T> &q) : my_q(q) {}
+ tbb::flow::priority_queue_node<T> &my_q;
+ parallel_gets( tbb::flow::priority_queue_node<T> &q) : my_q(q) {}
void operator()(int) const {
T prev;
spin_try_get( my_q, prev );
@@ -81,8 +80,8 @@ struct parallel_gets : NoAssign {
template< typename T >
struct parallel_put_get : NoAssign {
- tbb::priority_queue_node<T> &my_q;
- parallel_put_get( tbb::priority_queue_node<T> &q ) : my_q(q) {}
+ tbb::flow::priority_queue_node<T> &my_q;
+ parallel_put_get( tbb::flow::priority_queue_node<T> &q ) : my_q(q) {}
void operator()(int tid) const {
for ( int i = 0; i < N; i+=C ) {
int j_end = ( N < i + C ) ? N : i + C;
@@ -106,11 +105,11 @@ struct parallel_put_get : NoAssign {
//
template< typename T >
int test_reservation(int) {
- tbb::graph g;
+ tbb::flow::graph g;
T bogus_value(-1);
// Simple tests
- tbb::priority_queue_node<T> q(g);
+ tbb::flow::priority_queue_node<T> q(g);
q.try_put(T(1));
q.try_put(T(2));
@@ -162,10 +161,10 @@ int test_reservation(int) {
//
template< typename T >
int test_parallel(int num_threads) {
- tbb::graph g;
- tbb::priority_queue_node<T> q(g);
- tbb::priority_queue_node<T> q2(g);
- tbb::priority_queue_node<T> q3(g);
+ tbb::flow::graph g;
+ tbb::flow::priority_queue_node<T> q(g);
+ tbb::flow::priority_queue_node<T> q2(g);
+ tbb::flow::priority_queue_node<T> q3(g);
T bogus_value(-1);
T j = bogus_value;
@@ -193,9 +192,8 @@ int test_parallel(int num_threads) {
ASSERT( q.try_get( j ) == false, NULL );
ASSERT( j == bogus_value, NULL );
-
- ASSERT( q.register_successor( q2 ) == true, NULL );
- ASSERT( q2.register_successor( q3 ) == true, NULL );
+ tbb::flow::make_edge( q, q2 );
+ tbb::flow::make_edge( q2, q3 );
NativeParallelFor( num_threads, parallel_puts<T>(q) );
g.wait_for_all();
NativeParallelFor( num_threads, parallel_gets<T>(q3) );
@@ -208,6 +206,25 @@ int test_parallel(int num_threads) {
ASSERT( q3.try_get( j ) == false, NULL );
ASSERT( j == bogus_value, NULL );
+ // test copy constructor
+ ASSERT( q.remove_successor( q2 ) == true, NULL );
+ NativeParallelFor( num_threads, parallel_puts<T>(q) );
+ tbb::flow::priority_queue_node<T> q_copy(q);
+ g.wait_for_all();
+ j = bogus_value;
+ ASSERT( q_copy.try_get( j ) == false, NULL );
+ ASSERT( q.register_successor( q_copy ) == true, NULL );
+ for (int i = num_threads*N -1; i>=0; --i) {
+ spin_try_get( q_copy, j );
+ ASSERT(j == i, NULL);
+ j = bogus_value;
+ }
+ g.wait_for_all();
+ ASSERT( q.try_get( j ) == false, NULL );
+ ASSERT( j == bogus_value, NULL );
+ ASSERT( q_copy.try_get( j ) == false, NULL );
+ ASSERT( j == bogus_value, NULL );
+
return 0;
}
@@ -222,11 +239,11 @@ int test_parallel(int num_threads) {
template< typename T >
int test_serial() {
- tbb::graph g;
+ tbb::flow::graph g;
T bogus_value(-1);
- tbb::priority_queue_node<T> q(g);
- tbb::priority_queue_node<T> q2(g);
+ tbb::flow::priority_queue_node<T> q(g);
+ tbb::flow::priority_queue_node<T> q2(g);
T j = bogus_value;
//
@@ -254,7 +271,7 @@ int test_serial() {
ASSERT( q.try_get( j ) == false, NULL );
ASSERT( j == bogus_value, NULL );
- ASSERT( q.register_successor( q2 ) == true, NULL );
+ tbb::flow::make_edge( q, q2 );
for (int i = 0; i < N; ++i)
ASSERT( q.try_put( T(i) ), NULL );
@@ -271,7 +288,7 @@ int test_serial() {
ASSERT( q2.try_get( j ) == false, NULL );
ASSERT( j == bogus_value, NULL );
- ASSERT( q.remove_successor( q2 ) == true, NULL );
+ tbb::flow::remove_edge( q, q2 );
ASSERT( q.try_put( 1 ) == true, NULL );
g.wait_for_all();
ASSERT( q2.try_get( j ) == false, NULL );
@@ -280,9 +297,9 @@ int test_serial() {
ASSERT( q.try_get( j ) == true, NULL );
ASSERT( j == 1, NULL );
- tbb::priority_queue_node<T> q3(g);
- ASSERT( q.register_successor( q2 ) == true, NULL );
- ASSERT( q2.register_successor( q3 ) == true, NULL );
+ tbb::flow::priority_queue_node<T> q3(g);
+ tbb::flow::make_edge( q, q2 );
+ tbb::flow::make_edge( q2, q3 );
for (int i = 0; i < N; ++i)
ASSERT( q.try_put( T(i) ), NULL );
@@ -301,7 +318,7 @@ int test_serial() {
ASSERT( q3.try_get( j ) == false, NULL );
ASSERT( j == bogus_value, NULL );
- ASSERT( q.remove_successor( q2 ) == true, NULL );
+ tbb::flow::remove_edge( q, q2 );
ASSERT( q.try_put( 1 ) == true, NULL );
g.wait_for_all();
ASSERT( q2.try_get( j ) == false, NULL );
diff --git a/src/test/test_queue_node.cpp b/src/test/test_queue_node.cpp
index ecc617a..350bfb5 100644
--- a/src/test/test_queue_node.cpp
+++ b/src/test/test_queue_node.cpp
@@ -28,8 +28,7 @@
// TO DO: Add overlapping put / receive tests
-#define TBB_PREVIEW_GRAPH 1
-#include "tbb/graph.h"
+#include "tbb/flow_graph.h"
#include "tbb/task_scheduler_init.h"
#include "tbb/tick_count.h"
#include "harness.h"
@@ -40,7 +39,7 @@
#define C 10
template< typename T >
-void spin_try_get( tbb::queue_node<T> &q, T &value ) {
+void spin_try_get( tbb::flow::queue_node<T> &q, T &value ) {
while ( q.try_get(value) != true ) ;
}
@@ -55,9 +54,9 @@ void check_item( T* next_value, T &value ) {
template< typename T >
struct parallel_puts : NoAssign {
- tbb::queue_node<T> &my_q;
+ tbb::flow::queue_node<T> &my_q;
- parallel_puts( tbb::queue_node<T> &q ) : my_q(q) {}
+ parallel_puts( tbb::flow::queue_node<T> &q ) : my_q(q) {}
void operator()(int i) const {
for (int j = 0; j < N; ++j) {
@@ -142,10 +141,10 @@ struct touches {
template< typename T >
struct parallel_gets : NoAssign {
- tbb::queue_node<T> &my_q;
+ tbb::flow::queue_node<T> &my_q;
touches<T> &my_touches;
- parallel_gets( tbb::queue_node<T> &q, touches<T> &t) : my_q(q), my_touches(t) {}
+ parallel_gets( tbb::flow::queue_node<T> &q, touches<T> &t) : my_q(q), my_touches(t) {}
void operator()(int tid) const {
for (int j = 0; j < N; ++j) {
@@ -160,10 +159,10 @@ struct parallel_gets : NoAssign {
template< typename T >
struct parallel_put_get : NoAssign {
- tbb::queue_node<T> &my_q;
+ tbb::flow::queue_node<T> &my_q;
touches<T> &my_touches;
- parallel_put_get( tbb::queue_node<T> &q, touches<T> &t ) : my_q(q), my_touches(t) {}
+ parallel_put_get( tbb::flow::queue_node<T> &q, touches<T> &t ) : my_q(q), my_touches(t) {}
void operator()(int tid) const {
@@ -191,11 +190,11 @@ struct parallel_put_get : NoAssign {
//
template< typename T >
int test_reservation(int num_threads) {
- tbb::graph g;
+ tbb::flow::graph g;
T bogus_value(-1);
// Simple tests
- tbb::queue_node<T> q(g);
+ tbb::flow::queue_node<T> q(g);
q.try_put(T(1));
q.try_put(T(2));
@@ -242,10 +241,10 @@ int test_reservation(int num_threads) {
//
template< typename T >
int test_parallel(int num_threads) {
- tbb::graph g;
- tbb::queue_node<T> q(g);
- tbb::queue_node<T> q2(g);
- tbb::queue_node<T> q3(g);
+ tbb::flow::graph g;
+ tbb::flow::queue_node<T> q(g);
+ tbb::flow::queue_node<T> q2(g);
+ tbb::flow::queue_node<T> q3(g);
T bogus_value(-1);
T j = bogus_value;
@@ -291,8 +290,8 @@ int test_parallel(int num_threads) {
ASSERT( q.try_get( j ) == false, NULL );
ASSERT( j == bogus_value, NULL );
- ASSERT( q.register_successor( q2 ) == true, NULL );
- ASSERT( q2.register_successor( q3 ) == true, NULL );
+ tbb::flow::make_edge( q, q2 );
+ tbb::flow::make_edge( q2, q3 );
NativeParallelFor( num_threads, parallel_puts<T>(q) );
{
@@ -310,6 +309,26 @@ int test_parallel(int num_threads) {
ASSERT( q3.try_get( j ) == false, NULL );
ASSERT( j == bogus_value, NULL );
+ // test copy constructor
+ ASSERT( q.remove_successor( q2 ), NULL );
+ NativeParallelFor( num_threads, parallel_puts<T>(q) );
+ tbb::flow::queue_node<T> q_copy(q);
+ j = bogus_value;
+ g.wait_for_all();
+ ASSERT( q_copy.try_get( j ) == false, NULL );
+ ASSERT( q.register_successor( q_copy ) == true, NULL );
+ {
+ touches< T > t( num_threads );
+ NativeParallelFor( num_threads, parallel_gets<T>(q_copy, t) );
+ g.wait_for_all();
+ ASSERT( t.validate_touches(), NULL );
+ }
+ j = bogus_value;
+ ASSERT( q.try_get( j ) == false, NULL );
+ ASSERT( j == bogus_value, NULL );
+ ASSERT( q_copy.try_get( j ) == false, NULL );
+ ASSERT( j == bogus_value, NULL );
+
return 0;
}
@@ -324,11 +343,11 @@ int test_parallel(int num_threads) {
template< typename T >
int test_serial() {
- tbb::graph g;
+ tbb::flow::graph g;
T bogus_value(-1);
- tbb::queue_node<T> q(g);
- tbb::queue_node<T> q2(g);
+ tbb::flow::queue_node<T> q(g);
+ tbb::flow::queue_node<T> q2(g);
T j = bogus_value;
//
@@ -360,7 +379,7 @@ int test_serial() {
ASSERT( q.try_get( j ) == false, NULL );
ASSERT( j == bogus_value, NULL );
- ASSERT( q.register_successor( q2 ) == true, NULL );
+ tbb::flow::make_edge( q, q2 );
for (int i = 0; i < N; ++i) {
bool msg = q.try_put( T(i) );
@@ -380,7 +399,7 @@ int test_serial() {
ASSERT( q2.try_get( j ) == false, NULL );
ASSERT( j == bogus_value, NULL );
- ASSERT( q.remove_successor( q2 ) == true, NULL );
+ tbb::flow::remove_edge( q, q2 );
ASSERT( q.try_put( 1 ) == true, NULL );
g.wait_for_all();
ASSERT( q2.try_get( j ) == false, NULL );
@@ -389,9 +408,9 @@ int test_serial() {
ASSERT( q.try_get( j ) == true, NULL );
ASSERT( j == 1, NULL );
- tbb::queue_node<T> q3(g);
- ASSERT( q.register_successor( q2 ) == true, NULL );
- ASSERT( q2.register_successor( q3 ) == true, NULL );
+ tbb::flow::queue_node<T> q3(g);
+ tbb::flow::make_edge( q, q2 );
+ tbb::flow::make_edge( q2, q3 );
for (int i = 0; i < N; ++i) {
bool msg = q.try_put( T(i) );
@@ -412,7 +431,7 @@ int test_serial() {
ASSERT( q3.try_get( j ) == false, NULL );
ASSERT( j == bogus_value, NULL );
- ASSERT( q.remove_successor( q2 ) == true, NULL );
+ tbb::flow::remove_edge( q, q2 );
ASSERT( q.try_put( 1 ) == true, NULL );
g.wait_for_all();
ASSERT( q2.try_get( j ) == false, NULL );
diff --git a/src/test/test_runtime_loader.cpp b/src/test/test_runtime_loader.cpp
new file mode 100644
index 0000000..1c2b06b
--- /dev/null
+++ b/src/test/test_runtime_loader.cpp
@@ -0,0 +1,300 @@
+/*
+ Copyright 2005-2011 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 !(_WIN32||_WIN64)
+
+#include "harness.h"
+
+int TestMain () {
+ return Harness::Skipped;
+}
+
+#else // !(_WIN32||_WIN64)
+
+#define TBB_PREVIEW_RUNTIME_LOADER 1
+#include "tbb/runtime_loader.h"
+#include "tbb/tbb_stddef.h"
+#include "tbb/task_scheduler_init.h"
+#include "tbb/tbb_exception.h"
+
+#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
+
+#ifdef HARNESS_USE_RUNTIME_LOADER
+ #undef HARNESS_USE_RUNTIME_LOADER // We do not want harness to preload tbb.
+#endif
+#include "harness.h"
+
+static int errors = 0;
+
+#define CHECK( cond ) { \
+ if ( ! (cond) ) { \
+ ++ errors; \
+ REPORT( "%s:%d: --- TEST FAILED ---\n", __FILE__, __LINE__ ); \
+ }; \
+}
+
+#define SAY( msg ) \
+ REMARK( "%s:%d: %s\n", __FILE__, __LINE__, msg )
+
+typedef int (*int_func_t)();
+
+namespace tbb {
+namespace interface6 {
+namespace internal {
+namespace runtime_loader {
+ extern tbb::runtime_loader::error_mode stub_mode;
+} } } } // namespaces runtime_loader, internal, interface6, tbb
+
+using tbb::interface6::internal::runtime_loader::stub_mode;
+
+#define _CHECK_TBB( code ) { \
+ stub_mode = tbb::runtime_loader::em_status; \
+ int ver = tbb::TBB_runtime_interface_version(); \
+ stub_mode = tbb::runtime_loader::em_abort; \
+ CHECK( ver == code ); \
+}
+
+#define CHECK_TBB_IS_LOADED() \
+ _CHECK_TBB( TBB_INTERFACE_VERSION )
+
+#define CHECK_TBB_IS_NOT_LOADED() \
+ _CHECK_TBB( tbb::runtime_loader::ec_no_lib )
+
+int TestMain() {
+
+
+ __TBB_TRY {
+
+ {
+ SAY( "Call a function when library is not yet loaded, stub should return a error." );
+ CHECK_TBB_IS_NOT_LOADED();
+ }
+
+ {
+ SAY( "Create a runtime_loader object, do not load library but make some bad calls." );
+ tbb::runtime_loader rtl( tbb::runtime_loader::em_status );
+ SAY( "After creating status should be ok." );
+ CHECK( rtl.status() == tbb::runtime_loader::ec_ok );
+ SAY( "Call a function, stub should return a error." );
+ CHECK_TBB_IS_NOT_LOADED();
+ }
+
+ {
+ SAY( "Create a runtime_loader object and call load() with bad arguments." );
+ char const * path[] = { ".", NULL };
+ tbb::runtime_loader rtl( tbb::runtime_loader::em_status );
+ SAY( "Min version is bad." );
+ rtl.load( path, -1 );
+ CHECK( rtl.status() == tbb::runtime_loader::ec_bad_arg );
+ SAY( "Max version is bad." );
+ rtl.load( path, TBB_INTERFACE_VERSION, -1 );
+ CHECK( rtl.status() == tbb::runtime_loader::ec_bad_arg );
+ SAY( "Both versions are bad." );
+ rtl.load( path, -1, -1 );
+ CHECK( rtl.status() == tbb::runtime_loader::ec_bad_arg );
+ SAY( "Min is bigger than max." );
+ rtl.load( path, TBB_INTERFACE_VERSION + 1, TBB_INTERFACE_VERSION - 1 );
+ CHECK( rtl.status() == tbb::runtime_loader::ec_bad_arg );
+ }
+
+ {
+ SAY( "Create a proxy object and call load() with good arguments but not availabe version." );
+ char const * path[] = { ".", NULL };
+ tbb::runtime_loader rtl( tbb::runtime_loader::em_status );
+ SAY( "Min version too big." );
+ rtl.load( path, TBB_INTERFACE_VERSION + 1, TBB_INTERFACE_VERSION + 1 );
+ CHECK( rtl.status() == tbb::runtime_loader::ec_no_lib );
+ SAY( "Max version is too small." );
+ rtl.load( path, TBB_INTERFACE_VERSION - 1, TBB_INTERFACE_VERSION - 1 );
+ CHECK( rtl.status() == tbb::runtime_loader::ec_no_lib );
+ }
+
+ {
+ SAY( "Test em_throw mode." );
+ char const * path[] = { ".", NULL };
+ tbb::runtime_loader rtl( tbb::runtime_loader::em_throw );
+ tbb::runtime_loader::error_code code = tbb::runtime_loader::ec_ok;
+ __TBB_TRY {
+ rtl.load( path, -1 );
+ } __TBB_CATCH ( tbb::runtime_loader::error_code c ) {
+ code = c;
+ }; // __TBB_TRY
+ CHECK( code == tbb::runtime_loader::ec_bad_arg );
+ __TBB_TRY {
+ rtl.load( path, TBB_INTERFACE_VERSION + 1 );
+ } __TBB_CATCH ( tbb::runtime_loader::error_code c ) {
+ code = c;
+ }; // __TBB_TRY
+ CHECK( code == tbb::runtime_loader::ec_no_lib );
+ }
+
+ {
+ SAY( "Load current version, but specify wrong directories." );
+ tbb::runtime_loader rtl( tbb::runtime_loader::em_status );
+ SAY( "Specify no directories." );
+ char const * path0[] = { NULL };
+ rtl.load( path0 );
+ CHECK( rtl.status() == tbb::runtime_loader::ec_no_lib );
+ SAY( "Specify directories without library." );
+ char const * path1[] = { "..", "/", NULL };
+ rtl.load( path1 );
+ CHECK( rtl.status() == tbb::runtime_loader::ec_no_lib );
+ }
+
+ {
+ SAY( "Now really load library and do various tests." );
+ char const * path[] = { ".", NULL };
+ tbb::runtime_loader rtl( tbb::runtime_loader::em_status );
+ SAY( "Load current version." );
+ rtl.load( path, TBB_INTERFACE_VERSION, TBB_INTERFACE_VERSION );
+ CHECK( rtl.status() == tbb::runtime_loader::ec_ok );
+ if ( rtl.status() == tbb::runtime_loader::ec_ok ) {
+ {
+ SAY( "Make sure the library really loaded." );
+ CHECK_TBB_IS_LOADED();
+ }
+ SAY( "Call load() again, it should return a error." );
+ rtl.load( path, TBB_INTERFACE_VERSION, TBB_INTERFACE_VERSION );
+ CHECK( rtl.status() == tbb::runtime_loader::ec_bad_call );
+ {
+ SAY( "Initialize task_scheduler." );
+ tbb::task_scheduler_init init( 1 );
+ // Check what?
+ }
+
+ // There was a problem on Linux, and still a problem on Mac OS X.
+ SAY( "Throw an exception." );
+ // Iterate thru all the ids first.
+ for ( int id = 1; id < tbb::internal::eid_max; ++ id ) {
+ bool ex_caught = false;
+ __TBB_TRY {
+ tbb::internal::throw_exception( tbb::internal::exception_id( id ) );
+ } __TBB_CATCH ( std::exception const & ) {
+ SAY( "Expected exception caught." );
+ ex_caught = true;
+ } __TBB_CATCH ( ... ) {
+ SAY( "Unexpected exception caught." );
+ }; // try
+ CHECK( ex_caught );
+ }; // for
+ // Now try to catch exceptions of specific types.
+ #define CHECK_EXCEPTION( id, type ) \
+ { \
+ SAY( "Trowing " #id " exception of " #type " type..." ); \
+ bool ex_caught = false; \
+ __TBB_TRY { \
+ tbb::internal::throw_exception( tbb::internal::id ); \
+ } __TBB_CATCH ( type const & ) { \
+ SAY( #type " exception caught." ); \
+ ex_caught = true; \
+ } __TBB_CATCH ( ... ) { \
+ SAY( "Unexpected exception caught." ); \
+ }; /* try */ \
+ CHECK( ex_caught ); \
+ }
+ CHECK_EXCEPTION( eid_bad_alloc, std::bad_alloc );
+ CHECK_EXCEPTION( eid_bad_last_alloc, tbb::bad_last_alloc );
+ CHECK_EXCEPTION( eid_nonpositive_step, std::invalid_argument );
+ CHECK_EXCEPTION( eid_out_of_range, std::out_of_range );
+ CHECK_EXCEPTION( eid_segment_range_error, std::range_error );
+ CHECK_EXCEPTION( eid_missing_wait, tbb::missing_wait );
+ CHECK_EXCEPTION( eid_invalid_multiple_scheduling, tbb::invalid_multiple_scheduling );
+ CHECK_EXCEPTION( eid_improper_lock, tbb::improper_lock );
+ CHECK_EXCEPTION( eid_possible_deadlock, std::runtime_error );
+ CHECK_EXCEPTION( eid_reservation_length_error, std::length_error );
+ #undef CHECK_EXCEPTION
+ {
+ bool ex_caught = false;
+ __TBB_TRY {
+ tbb::internal::handle_perror( EAGAIN, "apple" );
+ } __TBB_CATCH ( std::runtime_error const & ) {
+ SAY( "Expected exception caught." );
+ ex_caught = true;
+ } __TBB_CATCH ( ... ) {
+ SAY( "Unexpected exception caught." );
+ }; // try
+ CHECK( ex_caught );
+ }
+ }; // if
+ }
+
+ {
+ SAY( "Test multiple proxies." );
+ char const * path[] = { ".", NULL };
+ tbb::runtime_loader rtl0( tbb::runtime_loader::em_status );
+ tbb::runtime_loader rtl1( tbb::runtime_loader::em_status );
+ CHECK( rtl0.status() == tbb::runtime_loader::ec_ok );
+ CHECK( rtl1.status() == tbb::runtime_loader::ec_ok );
+ SAY( "Load current version with the first rtl." );
+ rtl0.load( path );
+ CHECK( rtl0.status() == tbb::runtime_loader::ec_ok );
+ CHECK_TBB_IS_LOADED();
+ SAY( "Load another version with the second proxy, it should return a error." );
+ rtl1.load( path, TBB_INTERFACE_VERSION + 1 );
+ CHECK( rtl1.status() == tbb::runtime_loader::ec_bad_ver );
+ SAY( "Load the same version with the second proxy, it should return ok." );
+ rtl1.load( path );
+ CHECK( rtl1.status() == tbb::runtime_loader::ec_ok );
+ CHECK_TBB_IS_LOADED();
+ }
+
+ } __TBB_CATCH( ... ) {
+
+ ASSERT( 0, "unexpected exception" );
+
+ }; // __TBB_TRY
+
+ if ( errors > 0 ) {
+ REPORT( "Some tests failed.\n" );
+ exit( 1 );
+ }; // if
+
+ return Harness::Done;
+
+} // main
+
+#endif // !(_WIN32||_WIN64)
+
+// end of file //
diff --git a/src/test/test_semaphore.cpp b/src/test/test_semaphore.cpp
index e3ebd79..d94be4f 100644
--- a/src/test/test_semaphore.cpp
+++ b/src/test/test_semaphore.cpp
@@ -41,6 +41,7 @@
#include "tbb/semaphore.h"
#include "tbb/atomic.h"
+#include "tbb/blocked_range.h"
#include <vector>
using std::vector;
@@ -123,6 +124,41 @@ void testSemaphore( int semInitCnt, int extraThreads ) {
}
}
+#include "tbb/semaphore.cpp"
+#include "tbb/dynamic_link.cpp"
+
+#define N_TIMES 1000
+
+template<typename S>
+struct Counter {
+ volatile long value;
+ S my_sem;
+ Counter() : value(0) {}
+};
+
+//! Function object for use with parallel_for.h.
+template<typename C>
+struct AddOne: NoAssign {
+ C& my_counter;
+ /** Increments counter once for each iteration in the iteration space. */
+ void operator()( int /*tid*/ ) const {
+ for( size_t i=0; i<N_TIMES; ++i ) {
+ my_counter.my_sem.P();
+ my_counter.value = my_counter.value + 1;
+ my_counter.my_sem.V();
+ }
+ }
+ AddOne( C& c_ ) : my_counter(c_) { my_counter.my_sem.V(); }
+};
+
+void testBinarySemaphore( int nThreads ) {
+ REMARK("Testing binary semaphore\n");
+ Counter<tbb::internal::binary_semaphore> counter;
+ AddOne<Counter<tbb::internal::binary_semaphore> > myAddOne(counter);
+ NativeParallelFor( nThreads, myAddOne );
+ ASSERT( nThreads*N_TIMES==counter.value, "Binary semaphore operations P()/V() have a race");
+}
+
// Power of 2, the most tokens that can be in flight.
#define MAX_TOKENS 32
enum FilterType { imaProducer, imaConsumer };
@@ -240,6 +276,7 @@ void testProducerConsumer( unsigned totTokens, unsigned nTokens, unsigned pWait,
int TestMain() {
REMARK("Started\n");
if(MaxThread > 0) {
+ testBinarySemaphore( MaxThread );
for(int semSize = 1; semSize <= MaxThread; ++semSize) {
for(int exThreads = 0; exThreads <= MaxThread - semSize; ++exThreads) {
testSemaphore( semSize, exThreads );
diff --git a/src/test/test_sequencer_node.cpp b/src/test/test_sequencer_node.cpp
index 8df6374..2651157 100644
--- a/src/test/test_sequencer_node.cpp
+++ b/src/test/test_sequencer_node.cpp
@@ -27,8 +27,7 @@
*/
#include "harness.h"
-#define TBB_PREVIEW_GRAPH 1
-#include "tbb/graph.h"
+#include "tbb/flow_graph.h"
#include "tbb/task_scheduler_init.h"
#include "tbb/tick_count.h"
#include "tbb/atomic.h"
@@ -40,27 +39,27 @@
template< typename T >
struct seq_inspector {
- size_t operator()(T &v) const { return size_t(v); }
+ size_t operator()(const T &v) const { return size_t(v); }
};
template< typename T >
-bool wait_try_get( tbb::graph &g, tbb::sequencer_node<T> &q, T &value ) {
+bool wait_try_get( tbb::flow::graph &g, tbb::flow::sequencer_node<T> &q, T &value ) {
g.wait_for_all();
return q.try_get(value);
}
template< typename T >
-void spin_try_get( tbb::queue_node<T> &q, T &value ) {
+void spin_try_get( tbb::flow::queue_node<T> &q, T &value ) {
while ( q.try_get(value) != true ) ;
}
template< typename T >
struct parallel_puts : NoAssign {
- tbb::sequencer_node<T> &my_q;
+ tbb::flow::sequencer_node<T> &my_q;
int my_num_threads;
- parallel_puts( tbb::sequencer_node<T> &q, int num_threads ) : my_q(q), my_num_threads(num_threads) {}
+ parallel_puts( tbb::flow::sequencer_node<T> &q, int num_threads ) : my_q(q), my_num_threads(num_threads) {}
void operator()(int tid) const {
for (int j = tid; j < N; j+=my_num_threads) {
@@ -138,11 +137,11 @@ struct touches {
template< typename T >
struct parallel_gets : NoAssign {
- tbb::sequencer_node<T> &my_q;
+ tbb::flow::sequencer_node<T> &my_q;
int my_num_threads;
touches<T> &my_touches;
- parallel_gets( tbb::sequencer_node<T> &q, int num_threads, touches<T> &t ) : my_q(q), my_num_threads(num_threads), my_touches(t) {}
+ parallel_gets( tbb::flow::sequencer_node<T> &q, int num_threads, touches<T> &t ) : my_q(q), my_num_threads(num_threads), my_touches(t) {}
void operator()(int tid) const {
for (int j = tid; j < N; j+=my_num_threads) {
@@ -157,13 +156,13 @@ struct parallel_gets : NoAssign {
template< typename T >
struct parallel_put_get : NoAssign {
- tbb::sequencer_node<T> &my_s1;
- tbb::sequencer_node<T> &my_s2;
+ tbb::flow::sequencer_node<T> &my_s1;
+ tbb::flow::sequencer_node<T> &my_s2;
int my_num_threads;
tbb::atomic< int > &my_counter;
touches<T> &my_touches;
- parallel_put_get( tbb::sequencer_node<T> &s1, tbb::sequencer_node<T> &s2, int num_threads,
+ parallel_put_get( tbb::flow::sequencer_node<T> &s1, tbb::flow::sequencer_node<T> &s2, int num_threads,
tbb::atomic<int> &counter, touches<T> &t ) : my_s1(s1), my_s2(s2), my_num_threads(num_threads), my_counter(counter), my_touches(t) {}
void operator()(int tid) const {
@@ -195,9 +194,9 @@ struct parallel_put_get : NoAssign {
template< typename T >
int test_parallel(int num_threads) {
- tbb::graph g;
+ tbb::flow::graph g;
- tbb::sequencer_node<T> s(g, seq_inspector<T>());
+ tbb::flow::sequencer_node<T> s(g, seq_inspector<T>());
NativeParallelFor( num_threads, parallel_puts<T>(s, num_threads) );
{
touches<T> t( num_threads );
@@ -211,11 +210,11 @@ int test_parallel(int num_threads) {
ASSERT( j == bogus_value, NULL );
g.wait_for_all();
- tbb::sequencer_node<T> s1(g, seq_inspector<T>());
- tbb::sequencer_node<T> s2(g, seq_inspector<T>());
- tbb::sequencer_node<T> s3(g, seq_inspector<T>());
- ASSERT( s1.register_successor( s2 ) == true, NULL );
- ASSERT( s2.register_successor( s3 ) == true, NULL );
+ tbb::flow::sequencer_node<T> s1(g, seq_inspector<T>());
+ tbb::flow::sequencer_node<T> s2(g, seq_inspector<T>());
+ tbb::flow::sequencer_node<T> s3(g, seq_inspector<T>());
+ tbb::flow::make_edge( s1, s2 );
+ tbb::flow::make_edge( s2, s3 );
{
touches<T> t( num_threads );
@@ -232,6 +231,20 @@ int test_parallel(int num_threads) {
g.wait_for_all();
ASSERT( s3.try_get( j ) == false, NULL );
ASSERT( j == bogus_value, NULL );
+
+ // test copy constructor
+ tbb::flow::sequencer_node<T> s_copy(s);
+ NativeParallelFor( num_threads, parallel_puts<T>(s_copy, num_threads) );
+ for (int i = 0; i < N; ++i) {
+ j = bogus_value;
+ spin_try_get( s_copy, j );
+ ASSERT( i == j, NULL );
+ }
+ j = bogus_value;
+ g.wait_for_all();
+ ASSERT( s_copy.try_get( j ) == false, NULL );
+ ASSERT( j == bogus_value, NULL );
+
return 0;
}
@@ -248,11 +261,11 @@ int test_parallel(int num_threads) {
template< typename T >
int test_serial() {
- tbb::graph g;
+ tbb::flow::graph g;
T bogus_value(-1);
- tbb::sequencer_node<T> s(g, seq_inspector<T>());
- tbb::sequencer_node<T> s2(g, seq_inspector<T>());
+ tbb::flow::sequencer_node<T> s(g, seq_inspector<T>());
+ tbb::flow::sequencer_node<T> s2(g, seq_inspector<T>());
T j = bogus_value;
//
@@ -307,11 +320,11 @@ int test_serial() {
// Chained in-order simple puts and gets
//
- tbb::sequencer_node<T> s3(g, seq_inspector<T>());
- tbb::sequencer_node<T> s4(g, seq_inspector<T>());
- tbb::sequencer_node<T> s5(g, seq_inspector<T>());
- ASSERT( s3.register_successor( s4 ) == true, NULL );
- ASSERT( s4.register_successor( s5 ) == true, NULL );
+ tbb::flow::sequencer_node<T> s3(g, seq_inspector<T>());
+ tbb::flow::sequencer_node<T> s4(g, seq_inspector<T>());
+ tbb::flow::sequencer_node<T> s5(g, seq_inspector<T>());
+ tbb::flow::make_edge( s3, s4 );
+ tbb::flow::make_edge( s4, s5 );
for (int i = 0; i < N; ++i) {
bool msg = s3.try_put( T(i) );
@@ -330,7 +343,7 @@ int test_serial() {
ASSERT( j == bogus_value, NULL );
g.wait_for_all();
- ASSERT( s3.remove_successor( s4 ) == true, NULL );
+ tbb::flow::remove_edge( s3, s4 );
ASSERT( s3.try_put( N ) == true, NULL );
ASSERT( wait_try_get( g, s4, j ) == false, NULL );
ASSERT( j == bogus_value, NULL );
@@ -343,11 +356,11 @@ int test_serial() {
// Chained reverse-order simple puts and gets
//
- tbb::sequencer_node<T> s6(g, seq_inspector<T>());
- tbb::sequencer_node<T> s7(g, seq_inspector<T>());
- tbb::sequencer_node<T> s8(g, seq_inspector<T>());
- ASSERT( s6.register_successor( s7 ) == true, NULL );
- ASSERT( s7.register_successor( s8 ) == true, NULL );
+ tbb::flow::sequencer_node<T> s6(g, seq_inspector<T>());
+ tbb::flow::sequencer_node<T> s7(g, seq_inspector<T>());
+ tbb::flow::sequencer_node<T> s8(g, seq_inspector<T>());
+ tbb::flow::make_edge( s6, s7 );
+ tbb::flow::make_edge( s7, s8 );
for (int i = N-1; i >= 0; --i) {
bool msg = s6.try_put( T(i) );
@@ -366,7 +379,7 @@ int test_serial() {
ASSERT( j == bogus_value, NULL );
g.wait_for_all();
- ASSERT( s6.remove_successor( s7 ) == true, NULL );
+ tbb::flow::remove_edge( s6, s7 );
ASSERT( s6.try_put( N ) == true, NULL );
ASSERT( wait_try_get( g, s7, j ) == false, NULL );
ASSERT( j == bogus_value, NULL );
diff --git a/src/test/test_source_node.cpp b/src/test/test_source_node.cpp
index a403430..c0f0e3c 100644
--- a/src/test/test_source_node.cpp
+++ b/src/test/test_source_node.cpp
@@ -33,7 +33,7 @@
const int N = 1000;
template< typename T >
-class test_push_receiver : public tbb::receiver<T> {
+class test_push_receiver : public tbb::flow::receiver<T> {
tbb::atomic<int> my_counters[N];
@@ -49,7 +49,7 @@ public:
return v;
}
- bool try_put( T v ) {
+ bool try_put( const T &v ) {
int i = (int)v;
++my_counters[i];
return true;
@@ -99,10 +99,10 @@ template< typename T >
void test_single_dest() {
// push only
- tbb::graph g;
- tbb::source_node<T> src(g, source_body<T>() );
+ tbb::flow::graph g;
+ tbb::flow::source_node<T> src(g, source_body<T>() );
test_push_receiver<T> dest;
- ASSERT( src.register_successor(dest), NULL );
+ tbb::flow::make_edge( src, dest );
g.wait_for_all();
for (int i = 0; i < N; ++i ) {
ASSERT( dest.get_count(i) == 1, NULL );
@@ -110,10 +110,10 @@ void test_single_dest() {
// push only
tbb::atomic<int> counters3[N];
- tbb::source_node<T> src3(g, source_body<T>() );
+ tbb::flow::source_node<T> src3(g, source_body<T>() );
function_body<T> b3( counters3 );
- tbb::function_node<T,bool> dest3(g, tbb::graph::unlimited, b3 );
- ASSERT( src3.register_successor(dest3), NULL );
+ tbb::flow::function_node<T,bool> dest3(g, tbb::flow::unlimited, b3 );
+ tbb::flow::make_edge( src3, dest3 );
g.wait_for_all();
for (int i = 0; i < N; ++i ) {
int v = counters3[i];
@@ -121,17 +121,25 @@ void test_single_dest() {
}
// push & pull
- tbb::source_node<T> src2(g, source_body<T>() );
+ tbb::flow::source_node<T> src2(g, source_body<T>() );
tbb::atomic<int> counters2[N];
function_body<T> b2( counters2 );
- tbb::function_node<T,bool> dest2(g, tbb::graph::serial, b2 );
- ASSERT( src2.register_successor(dest2), NULL );
+ tbb::flow::function_node<T,bool> dest2(g, tbb::flow::serial, b2 );
+ tbb::flow::make_edge( src2, dest2 );
g.wait_for_all();
for (int i = 0; i < N; ++i ) {
int v = counters2[i];
ASSERT( v == 1, NULL );
}
+ // test copy constructor
+ tbb::flow::source_node<T> src_copy(src);
+ test_push_receiver<T> dest_c;
+ ASSERT( src_copy.register_successor(dest_c), NULL );
+ g.wait_for_all();
+ for (int i = 0; i < N; ++i ) {
+ ASSERT( dest_c.get_count(i) == 1, NULL );
+ }
}
int TestMain() {
diff --git a/src/test/test_split_node.cpp b/src/test/test_split_node.cpp
new file mode 100644
index 0000000..6996ef9
--- /dev/null
+++ b/src/test/test_split_node.cpp
@@ -0,0 +1,363 @@
+/*
+ Copyright 2005-2011 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 _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
+//
+
+const int Count = 300;
+const int MaxPorts = 10;
+const int MaxNSources = 5; // max # of source_nodes to register for each split_node input in parallel test
+
+std::vector<bool> flags; // for checking output
+
+template<typename T>
+class name_of {
+public:
+ static const char* name() { return "Unknown"; }
+};
+template<>
+class name_of<int> {
+public:
+ static const char* name() { return "int"; }
+};
+template<>
+class name_of<float> {
+public:
+ static const char* name() { return "float"; }
+};
+template<>
+class name_of<double> {
+public:
+ static const char* name() { return "double"; }
+};
+template<>
+class name_of<long> {
+public:
+ static const char* name() { return "long"; }
+};
+template<>
+class name_of<short> {
+public:
+ static const char* name() { return "short"; }
+};
+
+// T must be arithmetic, and shouldn't wrap around for reasonable sizes of Count (which is now 150, and maxPorts is 10,
+// so the max number generated right now is 1500 or so.) Source will generate a series of TT with value
+// (init_val + (i-1)*addend) * my_mult, where i is the i-th invocation of the body. We are attaching addend
+// source nodes to a join_port, and each will generate part of the numerical series the port is expecting
+// to receive. If there is only one source node, the series order will be maintained; if more than one,
+// this is not guaranteed.
+
+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));
+ tuple_helper<N-1>::set_element(t, i);
+ }
+};
+
+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);
+ }
+};
+
+// if we start N source_bodys they will all have the addend N, and my_count should be initialized to 0 .. N-1.
+// the output tuples should have all the sequence, but the order will in general vary.
+template<typename TupleType>
+class source_body {
+ typedef TupleType TT;
+ static const int N = std::tuple_size<TT>::value;
+ int my_count;
+ const int addend;
+ source_body& operator=( const source_body& other);
+public:
+ source_body(int init_val, int addto) : my_count(init_val), addend(addto) { }
+ bool operator()( TT &v) {
+ if(my_count >= Count) return false;
+ tuple_helper<N>::set_element(v, my_count);
+ my_count += addend;
+ return true;
+ }
+};
+
+// allocator for split_node.
+
+template<int N, typename SType>
+class makeSplit {
+public:
+ static SType *create(tbb::flow::graph& g) {
+ SType *temp = new SType(g);
+ return temp;
+ }
+ static void destroy(SType *p) { delete p; }
+};
+
+// holder for sink_node pointers for eventual deletion
+
+static void* all_sink_nodes[MaxPorts];
+
+
+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::queue_node<IT> my_sink_node_type;
+ static void print_parallel_remark() {
+ sink_node_helper<ELEM-1,SType>::print_parallel_remark();
+ REMARK(", %s", name_of<IT>::name());
+ }
+ static void print_serial_remark() {
+ sink_node_helper<ELEM-1,SType>::print_serial_remark();
+ REMARK(", %s", name_of<IT>::name());
+ }
+ static void add_sink_nodes(SType &my_split, tbb::flow::graph &g) {
+ my_sink_node_type *new_node = new my_sink_node_type(g);
+ tbb::flow::make_edge( tbb::flow::output_port<ELEM-1>(my_split) , *new_node);
+ all_sink_nodes[ELEM-1] = (void *)new_node;
+ sink_node_helper<ELEM-1, SType>::add_sink_nodes(my_split, g);
+ }
+
+ static void check_sink_values() {
+ my_sink_node_type *dp = reinterpret_cast<my_sink_node_type *>(all_sink_nodes[ELEM-1]);
+ for(int i = 0; i < Count; ++i) {
+ IT v;
+ ASSERT(dp->try_get(v), NULL);
+ flags[((int)v) / (ELEM+1)] = true;
+ }
+ for(int i = 0; i < Count; ++i) {
+ ASSERT(flags[i], NULL);
+ flags[i] = false; // reset for next test
+ }
+ sink_node_helper<ELEM-1,SType>::check_sink_values();
+ }
+ static void remove_sink_nodes(SType& my_split) {
+ my_sink_node_type *dp = reinterpret_cast<my_sink_node_type *>(all_sink_nodes[ELEM-1]);
+ tbb::flow::remove_edge( tbb::flow::output_port<ELEM-1>(my_split) , *dp);
+ delete dp;
+ sink_node_helper<ELEM-1, SType>::remove_sink_nodes(my_split);
+ }
+};
+
+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::queue_node<IT> my_sink_node_type;
+public:
+ static void print_parallel_remark() {
+ REMARK("Parallel test of split_node< %s", name_of<IT>::name());
+ }
+ static void print_serial_remark() {
+ REMARK("Serial test of split_node< %s", name_of<IT>::name());
+ }
+ static void add_sink_nodes(SType &my_split, tbb::flow::graph &g) {
+ my_sink_node_type *new_node = new my_sink_node_type(g);
+ tbb::flow::make_edge( tbb::flow::output_port<0>(my_split) , *new_node);
+ all_sink_nodes[0] = (void *)new_node;
+ }
+ static void check_sink_values() {
+ my_sink_node_type *dp = reinterpret_cast<my_sink_node_type *>(all_sink_nodes[0]);
+ for(int i = 0; i < Count; ++i) {
+ IT v;
+ ASSERT(dp->try_get(v), NULL);
+ flags[((int)v) / 2] = true;
+ }
+ for(int i = 0; i < Count; ++i) {
+ ASSERT(flags[i], NULL);
+ flags[i] = false; // reset for next test
+ }
+ }
+ static void remove_sink_nodes(SType& my_split) {
+ my_sink_node_type *dp = reinterpret_cast<my_sink_node_type *>(all_sink_nodes[0]);
+ tbb::flow::remove_edge( tbb::flow::output_port<0>(my_split) , *dp);
+ delete dp;
+ }
+};
+
+// parallel_test: create source_nodes that feed tuples into the split node
+// and queue_nodes that receive the output.
+template<typename SType>
+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 void test() {
+ TType v;
+ source_type* all_source_nodes[MaxNSources];
+ sink_node_helper<N,SType>::print_parallel_remark();
+ REMARK(" >\n");
+ for(int i=0; i < MaxPorts; ++i) {
+ all_sink_nodes[i] = NULL;
+ }
+ // try test for # sources 1 .. MaxNSources
+ for(int nInputs = 1; nInputs <= MaxNSources; ++nInputs) {
+ tbb::flow::graph g;
+ SType* my_split = makeSplit<N,SType>::create(g);
+
+ // add sinks first so when sources start spitting out values they are there to catch them
+ sink_node_helper<N, SType>::add_sink_nodes((*my_split), g);
+
+ // now create nInputs source_nodes, each spitting out i, i+nInputs, i+2*nInputs ...
+ // each element of the tuple is i*(n+1), where n is the tuple element index (1-N)
+ for(int i = 0; i < nInputs; ++i) {
+ // create source node
+ source_type *s = new source_type(g, source_body<TType>(i, nInputs) );
+ tbb::flow::make_edge(*s, *my_split);
+ all_source_nodes[i] = s;
+ }
+
+ g.wait_for_all();
+
+ // check that we got Count values in each output queue, and all the index values
+ // are there.
+ sink_node_helper<N, SType>::check_sink_values();
+
+ sink_node_helper<N, SType>::remove_sink_nodes(*my_split);
+ for(int i = 0; i < nInputs; ++i) {
+ delete all_source_nodes[i];
+ }
+ makeSplit<N,SType>::destroy(my_split);
+ }
+ }
+};
+
+//
+// Single predecessor, single accepting successor at each port
+
+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);
+ typedef TType q3_input_type;
+ tbb::flow::queue_node< q3_input_type > q3(g);
+
+ tbb::flow::make_edge( q3, my_split );
+
+ // fill the queue with its value one-at-a-time
+ flags.clear();
+ for (int i = 0; i < Count; ++i ) {
+ TType v;
+ tuple_helper<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<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 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");
+
+ 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);
+
+
+ for(int e = 0; e < ELEMS; ++e) { // exercise each of the vector elements
+ test_one_serial<SType>( split_vector[e], g);
+ }
+}
+
+}; // serial_test
+
+template<
+ template<typename> class TestType, // serial_test or parallel_test
+ typename TupleType > // type of the input of the split
+struct generate_test {
+ typedef tbb::flow::split_node<TupleType> split_node_type;
+ static void do_test() {
+ TestType<split_node_type>::test();
+ }
+}; // generate_test
+
+int TestMain() {
+#if __TBB_USE_TBB_TUPLE
+ REMARK(" Using TBB tuple\n");
+#else
+ 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();
+#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();
+#endif
+ }
+ return Harness::Done;
+}
+#else // __SUNPRO_CC
+
+int TestMain() {
+ return Harness::Skipped;
+}
+
+#endif // SUNPRO_CC
diff --git a/src/test/test_task.cpp b/src/test/test_task.cpp
index 9d5442d..c951a6e 100644
--- a/src/test/test_task.cpp
+++ b/src/test/test_task.cpp
@@ -26,21 +26,13 @@
the GNU General Public License.
*/
-#include "tbb/task.h"
+#include "harness_task.h"
#include "tbb/atomic.h"
#include "tbb/tbb_thread.h"
-#include "harness_assert.h"
+#include "tbb/task_scheduler_init.h"
#include <cstdlib>
//------------------------------------------------------------------------
-// Helper for verifying that old use cases of spawn syntax still work.
-//------------------------------------------------------------------------
-tbb::task* GetTaskPtr( int& counter ) {
- ++counter;
- return NULL;
-}
-
-//------------------------------------------------------------------------
// Test for task::spawn_children and task_list
//------------------------------------------------------------------------
@@ -133,9 +125,6 @@ static int Expected( int child_count, int depth ) {
return depth<=0 ? 1 : 1+child_count*Expected(child_count/2,depth-1);
}
-#include "tbb/task_scheduler_init.h"
-#include "harness.h"
-
void TestStealLimit( int nthread ) {
REMARK( "testing steal limiting heuristics for %d threads\n", nthread );
tbb::task_scheduler_init init(nthread);
@@ -176,33 +165,6 @@ void TestSpawnRootList( int nthread ) {
// Test for task::recycle_as_safe_continuation
//------------------------------------------------------------------------
-class TaskGenerator: public tbb::task {
- int m_ChildCount;
- int m_Depth;
-
-public:
- TaskGenerator( int child_count, int _depth ) : m_ChildCount(child_count), m_Depth(_depth) {}
- ~TaskGenerator( ) { m_ChildCount = m_Depth = -125; }
-
- /*override*/ tbb::task* execute() {
- ASSERT( m_ChildCount>=0 && m_Depth>=0, NULL );
- if( m_Depth>0 ) {
- recycle_as_safe_continuation();
- set_ref_count( m_ChildCount+1 );
- int k=0;
- for( int j=0; j<m_ChildCount; ++j ) {
- tbb::task& t = *new( allocate_child() ) TaskGenerator(m_ChildCount/2,m_Depth-1);
- GetTaskPtr(k)->spawn(t);
- }
- ASSERT(k==m_ChildCount,NULL);
- --m_Depth;
- __TBB_Yield();
- ASSERT( state()==recycle && ref_count()>0, NULL);
- }
- return NULL;
- }
-};
-
void TestSafeContinuation( int nthread ) {
REMARK("testing task::recycle_as_safe_continuation for %d threads\n",nthread);
tbb::task_scheduler_init init(nthread);
@@ -429,7 +391,10 @@ void TestAlignment() {
TestAlignmentOfOneClass<double>();
#if HAVE_m128
TestAlignmentOfOneClass<__m128>();
-#endif /* HAVE_m128 */
+#endif
+#if HAVE_m256
+ if (have_AVX()) TestAlignmentOfOneClass<__m256>();
+#endif
}
//------------------------------------------------------------------------
@@ -625,7 +590,6 @@ void TestUserThread( int p ) {
}
}
-
class TaskWithChildToSteal : public tbb::task {
const int m_Depth;
volatile bool m_GoAhead;
@@ -657,6 +621,7 @@ public:
}
}; // TaskWithChildToSteal
+// Success criterion of this test is not hanging
void TestDispatchLoopResponsiveness() {
REMARK("testing that dispatch loops do not go into eternal sleep when all remaining children are stolen\n");
// Recursion depth values test the following sorts of dispatch loops
@@ -670,7 +635,6 @@ void TestDispatchLoopResponsiveness() {
t.SpawnAndWaitOnParent();
}
r.destroy(r);
- // The success criteria of this test is not hanging
}
void TestWaitDiscriminativenessWithoutStealing() {
@@ -815,143 +779,6 @@ void TestMastersIsolation ( int p ) {
}
}
-//------------------------------------------------------------------------
-// Test for tbb::task::enqueue
-//------------------------------------------------------------------------
-
-const int PairsPerTrack = 100;
-
-class EnqueuedTask : public tbb::task {
- task* my_successor;
- int my_enqueue_order;
- int* my_track;
- tbb::task* execute() {
- // Capture execution order in the very beginning
- int execution_order = 2 - my_successor->decrement_ref_count();
- // Create some local work.
- TaskGenerator& p = *new( allocate_root() ) TaskGenerator(2,2);
- spawn_root_and_wait(p);
- if( execution_order==2 ) { // the "slower" of two peer tasks
- ++nCompletedPairs;
- // Of course execution order can differ from dequeue order.
- // But there is no better approximation at hand; and a single worker
- // will execute in dequeue order, which is enough for our check.
- if (my_enqueue_order==execution_order)
- ++nOrderedPairs;
- FireTwoTasks(my_track);
- destroy(*my_successor);
- }
- return NULL;
- }
-public:
- EnqueuedTask( task* successor, int enq_order, int* track )
- : my_successor(successor), my_enqueue_order(enq_order), my_track(track) {}
-
- // Create and enqueue two tasks
- static void FireTwoTasks( int* track ) {
- int progress = ++*track;
- if( progress < PairsPerTrack ) {
- task* successor = new (allocate_root()) tbb::empty_task;
- successor->set_ref_count(2);
- enqueue( *new (allocate_root()) EnqueuedTask(successor, 1, track) );
- enqueue( *new (allocate_root()) EnqueuedTask(successor, 2, track) );
- }
- }
-
- static tbb::atomic<int> nCompletedPairs;
- static tbb::atomic<int> nOrderedPairs;
-};
-
-tbb::atomic<int> EnqueuedTask::nCompletedPairs;
-tbb::atomic<int> EnqueuedTask::nOrderedPairs;
-
-const int nTracks = 10;
-static int TaskTracks[nTracks];
-const int stall_threshold = 100000;
-
-void TimedYield( double pause_time );
-
-class ProgressMonitor {
-public:
- void operator() ( ) {
- int track_snapshot[nTracks];
- int stall_count = 0, uneven_progress_count = 0, last_progress_mask = 0;
- for(int i=0; i<nTracks; ++i)
- track_snapshot[i]=0;
- bool completed;
- do {
- // Yield repeatedly for at least 1 usec
- TimedYield( 1E-6 );
- int overall_progress = 0, progress_mask = 0;
- const int all_progressed = (1<<nTracks) - 1;
- completed = true;
- for(int i=0; i<nTracks; ++i) {
- int ti = TaskTracks[i];
- int pi = ti-track_snapshot[i];
- if( pi ) progress_mask |= 1<<i;
- overall_progress += pi;
- completed = completed && ti==PairsPerTrack;
- track_snapshot[i]=ti;
- }
- // The constants in the next asserts are subjective and may need correction.
- if( overall_progress )
- stall_count=0;
- else {
- ++stall_count;
- // no progress for at least 0.1 s; consider it dead.
- ASSERT(stall_count < stall_threshold, "no progress on enqueued tasks; deadlock, or the machine is oversubsribed?");
- }
- if( progress_mask==all_progressed || progress_mask^last_progress_mask ) {
- uneven_progress_count = 0;
- last_progress_mask = progress_mask;
- }
- else if ( overall_progress > 2 ) {
- ++uneven_progress_count;
- ASSERT(uneven_progress_count < 5, "some enqueued tasks seem stalling; no simultaneous progress?");
- }
- } while( !completed );
- }
-};
-
-void TestEnqueue( int p ) {
- REMARK("testing task::enqueue for %d threads\n", p);
- for(int mode=0;mode<3;++mode) {
- tbb::task_scheduler_init init(p);
- EnqueuedTask::nCompletedPairs = EnqueuedTask::nOrderedPairs = 0;
- for(int i=0; i<nTracks; ++i) {
- TaskTracks[i] = -1; // to accomodate for the starting call
- EnqueuedTask::FireTwoTasks(TaskTracks+i);
- }
- ProgressMonitor pm;
- tbb::tbb_thread thr( pm );
- if(mode==1) {
- // do some parallel work in the meantime
- for(int i=0; i<10; i++) {
- TaskGenerator& g = *new( tbb::task::allocate_root() ) TaskGenerator(2,5);
- tbb::task::spawn_root_and_wait(g);
- TimedYield( 1E-6 );
- }
- }
- if( mode==2 ) {
- // Additionally enqueue a bunch of empty tasks. The goal is to test that tasks
- // allocated and enqueued by a thread are safe to use after the thread leaves TBB.
- tbb::task* root = new (tbb::task::allocate_root()) tbb::empty_task;
- root->set_ref_count(100);
- for( int i=0; i<100; ++i )
- tbb::task::enqueue( *new (root->allocate_child()) tbb::empty_task );
- init.terminate(); // master thread deregistered
- }
- thr.join();
- ASSERT(EnqueuedTask::nCompletedPairs==nTracks*PairsPerTrack, NULL);
- ASSERT(EnqueuedTask::nOrderedPairs<EnqueuedTask::nCompletedPairs,
- "all task pairs executed in enqueue order; de facto guarantee is too strong?");
- }
-}
-
-//------------------------------------------------------------------------
-// Run all tests.
-//------------------------------------------------------------------------
-
int TestMain () {
#if TBB_USE_EXCEPTIONS
TestUnconstructibleTask<1>();
@@ -966,7 +793,6 @@ int TestMain () {
TestSpawnChildren( p );
TestSpawnRootList( p );
TestSafeContinuation( p );
- TestEnqueue( p );
TestLeftRecursion( p );
TestDag( p );
TestAffinity( p );
@@ -977,11 +803,3 @@ int TestMain () {
}
return Harness::Done;
}
-
-#include "tbb/tick_count.h"
-void TimedYield( double pause_time ) {
- tbb::tick_count start = tbb::tick_count::now();
- while( (tbb::tick_count::now()-start).seconds() < pause_time )
- __TBB_Yield();
-}
-
diff --git a/src/test/test_task_assertions.cpp b/src/test/test_task_assertions.cpp
index 2646ca3..a271682 100644
--- a/src/test/test_task_assertions.cpp
+++ b/src/test/test_task_assertions.cpp
@@ -26,6 +26,21 @@
the GNU General Public License.
*/
+#if HARNESS_USE_PROXY
+
+// The test includes injects scheduler directly, so skip it when proxy tested.
+
+#undef HARNESS_USE_PROXY
+#include "harness.h"
+#undef __TBB_DYNAMIC_LOAD_ENABLED
+#include "harness_tbb_independence.h"
+
+int TestMain () {
+ return Harness::Skipped;
+}
+
+#else // HARNESS_USE_PROXY
+
// Test correctness of forceful TBB initialization before any dynamic initialization
// of static objects inside the library took place.
namespace tbb {
@@ -84,7 +99,7 @@ void TestTaskAssertions() {
AbusedTask = new( tbb::task::allocate_root() ) tbb::empty_task;
NativeParallelFor( 1, AbuseOneTask() );
ASSERT( AbuseOneTaskRan==1, NULL );
- AbusedTask->destroy(*AbusedTask);
+ tbb::task::destroy(*AbusedTask);
// Restore normal assertion handling
tbb::set_assertion_handler( NULL );
}
@@ -101,3 +116,5 @@ int TestMain () {
}
#endif /* !TRY_BAD_EXPR_ENABLED */
+
+#endif // HARNESS_USE_PROXY
diff --git a/src/test/test_task_auto_init.cpp b/src/test/test_task_auto_init.cpp
index 1008fbe..64e4635 100644
--- a/src/test/test_task_auto_init.cpp
+++ b/src/test/test_task_auto_init.cpp
@@ -43,7 +43,10 @@ static tbb::task *g_Root1 = NULL,
*g_Root2 = NULL,
*g_Root3 = NULL,
*g_Task = NULL;
+
+#if __TBB_TASK_GROUP_CONTEXT
static tbb::task_group_context* g_Ctx = NULL;
+#endif /* __TBB_TASK_GROUP_CONTEXT */
void TestTaskSelf () {
@@ -72,10 +75,11 @@ void TestChildAllocation () {
void TestAdditionalChildAllocation () {
TEST_PROLOGUE();
- tbb::task &t = *new( g_Root2->allocate_additional_child_of(*g_Root2) ) tbb::empty_task;
+ tbb::task &t = *new( tbb::task::allocate_additional_child_of(*g_Root2) ) tbb::empty_task;
ExecuteChildAndCleanup( *g_Root2, t );
}
+#if __TBB_TASK_GROUP_CONTEXT
void TestTaskGroupContextCreation () {
TEST_PROLOGUE();
tbb::task_group_context ctx;
@@ -88,23 +92,27 @@ void TestRootAllocationWithContext () {
tbb::task* root = new( tbb::task::allocate_root(*g_Ctx) ) tbb::empty_task;
tbb::task::spawn_root_and_wait(*root);
}
+#endif /* __TBB_TASK_GROUP_CONTEXT */
void TestSpawn () {
TEST_PROLOGUE();
- g_Task->spawn(*g_Task);
+ tbb::task::spawn(*g_Task);
}
void TestWaitForAll () {
TEST_PROLOGUE();
g_Root3->wait_for_all();
- g_Root3->destroy( *g_Root3 );
+ tbb::task::destroy(*g_Root3);
}
typedef void (*TestFnPtr)();
const TestFnPtr TestFuncsTable[] = {
TestTaskSelf, TestRootAllocation, TestChildAllocation, TestAdditionalChildAllocation,
- TestTaskGroupContextCreation, TestRootAllocationWithContext, TestSpawn, TestWaitForAll };
+#if __TBB_TASK_GROUP_CONTEXT
+ TestTaskGroupContextCreation, TestRootAllocationWithContext,
+#endif /* __TBB_TASK_GROUP_CONTEXT */
+ TestSpawn, TestWaitForAll };
const int NumTestFuncs = sizeof(TestFuncsTable) / sizeof(TestFnPtr);
@@ -174,12 +182,18 @@ struct DriverThreadBody : NoAssign, Harness::NoAfterlife {
// auto-initialized master thread (in governor::auto_terminate).
// If anything goes wrong, generic_scheduler::cleanup_master() will assert.
// The context for this task must be valid till the task completion.
+#if __TBB_TASK_GROUP_CONTEXT
tbb::task &r = *new( tbb::task::allocate_root(*g_Ctx) ) FireAndForgetTask;
- r.spawn(r);
+#else
+ tbb::task &r = *new( tbb::task::allocate_root() ) FireAndForgetTask;
+#endif /* __TBB_TASK_GROUP_CONTEXT */
+ tbb::task::spawn(r);
}
else {
+#if __TBB_TASK_GROUP_CONTEXT
tbb::task_group_context ctx;
g_Ctx = &ctx;
+#endif /* __TBB_TASK_GROUP_CONTEXT */
driver_barrier.wait();
spin_wait_until_eq( FafStarted, true );
UseAFewNewTlsKeys();
diff --git a/src/test/test_task_enqueue.cpp b/src/test/test_task_enqueue.cpp
new file mode 100644
index 0000000..0e1a238
--- /dev/null
+++ b/src/test/test_task_enqueue.cpp
@@ -0,0 +1,329 @@
+/*
+ Copyright 2005-2011 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_task.h"
+#include "harness_barrier.h"
+#include "tbb/atomic.h"
+#include "tbb/tbb_thread.h"
+#include "tbb/task_scheduler_init.h"
+#include "tbb/tick_count.h"
+
+////////////////////////////////////////////////////////////////////////////////
+// Test for basic FIFO scheduling functionality
+
+const int PairsPerTrack = 100;
+
+class EnqueuedTask : public tbb::task {
+ task* my_successor;
+ int my_enqueue_order;
+ int* my_track;
+ tbb::task* execute() {
+ // Capture execution order in the very beginning
+ int execution_order = 2 - my_successor->decrement_ref_count();
+ // Create some local work.
+ TaskGenerator& p = *new( allocate_root() ) TaskGenerator(2,2);
+ spawn_root_and_wait(p);
+ if( execution_order==2 ) { // the "slower" of two peer tasks
+ ++nCompletedPairs;
+ // Of course execution order can differ from dequeue order.
+ // But there is no better approximation at hand; and a single worker
+ // will execute in dequeue order, which is enough for our check.
+ if (my_enqueue_order==execution_order)
+ ++nOrderedPairs;
+ FireTwoTasks(my_track);
+ destroy(*my_successor);
+ }
+ return NULL;
+ }
+public:
+ EnqueuedTask( task* successor, int enq_order, int* track )
+ : my_successor(successor), my_enqueue_order(enq_order), my_track(track) {}
+
+ // Create and enqueue two tasks
+ static void FireTwoTasks( int* track ) {
+ int progress = ++*track;
+ if( progress < PairsPerTrack ) {
+ task* successor = new (allocate_root()) tbb::empty_task;
+ successor->set_ref_count(2);
+ enqueue( *new (allocate_root()) EnqueuedTask(successor, 1, track) );
+ enqueue( *new (allocate_root()) EnqueuedTask(successor, 2, track) );
+ }
+ }
+
+ static tbb::atomic<int> nCompletedPairs;
+ static tbb::atomic<int> nOrderedPairs;
+};
+
+tbb::atomic<int> EnqueuedTask::nCompletedPairs;
+tbb::atomic<int> EnqueuedTask::nOrderedPairs;
+
+const int nTracks = 10;
+static int TaskTracks[nTracks];
+const int stall_threshold = 100000;
+
+void TimedYield( double pause_time ) {
+ tbb::tick_count start = tbb::tick_count::now();
+ while( (tbb::tick_count::now()-start).seconds() < pause_time )
+ __TBB_Yield();
+}
+
+class ProgressMonitor {
+public:
+ void operator() ( ) {
+ int track_snapshot[nTracks];
+ int stall_count = 0, uneven_progress_count = 0, last_progress_mask = 0;
+ for(int i=0; i<nTracks; ++i)
+ track_snapshot[i]=0;
+ bool completed;
+ do {
+ // Yield repeatedly for at least 1 usec
+ TimedYield( 1E-6 );
+ int overall_progress = 0, progress_mask = 0;
+ const int all_progressed = (1<<nTracks) - 1;
+ completed = true;
+ for(int i=0; i<nTracks; ++i) {
+ int ti = TaskTracks[i];
+ int pi = ti-track_snapshot[i];
+ if( pi ) progress_mask |= 1<<i;
+ overall_progress += pi;
+ completed = completed && ti==PairsPerTrack;
+ track_snapshot[i]=ti;
+ }
+ // The constants in the next asserts are subjective and may need correction.
+ if( overall_progress )
+ stall_count=0;
+ else {
+ ++stall_count;
+ // no progress for at least 0.1 s; consider it dead.
+ ASSERT(stall_count < stall_threshold, "no progress on enqueued tasks; deadlock, or the machine is oversubsribed?");
+ }
+ if( progress_mask==all_progressed || progress_mask^last_progress_mask ) {
+ uneven_progress_count = 0;
+ last_progress_mask = progress_mask;
+ }
+ else if ( overall_progress > 2 ) {
+ ++uneven_progress_count;
+ ASSERT(uneven_progress_count < 5, "some enqueued tasks seem stalling; no simultaneous progress?");
+ }
+ } while( !completed );
+ }
+};
+
+void TestEnqueue( int p ) {
+ REMARK("Testing task::enqueue for %d threads\n", p);
+ for(int mode=0;mode<3;++mode) {
+ tbb::task_scheduler_init init(p);
+ EnqueuedTask::nCompletedPairs = EnqueuedTask::nOrderedPairs = 0;
+ for(int i=0; i<nTracks; ++i) {
+ TaskTracks[i] = -1; // to accomodate for the starting call
+ EnqueuedTask::FireTwoTasks(TaskTracks+i);
+ }
+ ProgressMonitor pm;
+ tbb::tbb_thread thr( pm );
+ if(mode==1) {
+ // do some parallel work in the meantime
+ for(int i=0; i<10; i++) {
+ TaskGenerator& g = *new( tbb::task::allocate_root() ) TaskGenerator(2,5);
+ tbb::task::spawn_root_and_wait(g);
+ TimedYield( 1E-6 );
+ }
+ }
+ if( mode==2 ) {
+ // Additionally enqueue a bunch of empty tasks. The goal is to test that tasks
+ // allocated and enqueued by a thread are safe to use after the thread leaves TBB.
+ tbb::task* root = new (tbb::task::allocate_root()) tbb::empty_task;
+ root->set_ref_count(100);
+ for( int i=0; i<100; ++i )
+ tbb::task::enqueue( *new (root->allocate_child()) tbb::empty_task );
+ init.terminate(); // master thread deregistered
+ }
+ thr.join();
+ ASSERT(EnqueuedTask::nCompletedPairs==nTracks*PairsPerTrack, NULL);
+ ASSERT(EnqueuedTask::nOrderedPairs<EnqueuedTask::nCompletedPairs,
+ "all task pairs executed in enqueue order; de facto guarantee is too strong?");
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// Tests for Fire-And-Forget scheduling functionality
+
+const int NumRepeats = 200;
+const int MaxNumThreads = 16;
+static volatile bool Finished[MaxNumThreads] = {};
+
+static volatile bool CanStart;
+
+//! Custom user task interface
+class ITask {
+public:
+ virtual ~ITask() {}
+ virtual void Execute() = 0;
+ virtual void Release() { delete this; }
+};
+
+class TestTask : public ITask {
+ volatile bool *m_pDone;
+public:
+ TestTask ( volatile bool *pDone ) : m_pDone(pDone) {}
+
+ /* override */ void Execute() {
+ *m_pDone = true;
+ }
+};
+
+class CarrierTask : public tbb::task {
+ ITask* m_pTask;
+public:
+ CarrierTask(ITask* pTask) : m_pTask(pTask) {}
+
+ /*override*/ task* execute() {
+ m_pTask->Execute();
+ m_pTask->Release();
+ return NULL;
+ }
+};
+
+class SpawnerTask : public ITask {
+ ITask* m_taskToSpawn;
+public:
+ SpawnerTask(ITask* job) : m_taskToSpawn(job) {}
+
+ void Execute() {
+ while ( !CanStart )
+ __TBB_Yield();
+ tbb::task::enqueue( *new( tbb::task::allocate_root() ) CarrierTask(m_taskToSpawn) );
+ }
+};
+
+class EnqueuerBody {
+public:
+ void operator() ( int id ) const {
+ tbb::task_scheduler_init init(tbb::task_scheduler_init::default_num_threads() + 1);
+
+ SpawnerTask* pTask = new SpawnerTask( new TestTask(Finished + id) );
+ tbb::task::enqueue( *new( tbb::task::allocate_root() ) CarrierTask(pTask) );
+ }
+};
+
+//! Regression test for a bug that caused premature arena destruction
+void TestCascadedEnqueue () {
+ REMARK("Testing cascaded enqueue\n");
+ tbb::task_scheduler_init init(tbb::task_scheduler_init::default_num_threads() + 1);
+
+ int minNumThreads = min(tbb::task_scheduler_init::default_num_threads(), MaxNumThreads) / 2;
+ int maxNumThreads = min(tbb::task_scheduler_init::default_num_threads() * 2, MaxNumThreads);
+
+ for ( int numThreads = minNumThreads; numThreads <= maxNumThreads; ++numThreads ) {
+ for ( int i = 0; i < NumRepeats; ++i ) {
+ CanStart = false;
+ __TBB_Yield();
+ NativeParallelFor( numThreads, EnqueuerBody() );
+ CanStart = true;
+ int j = 0;
+ while ( j < numThreads ) {
+ if ( Finished[j] )
+ ++j;
+ else
+ __TBB_Yield();
+ }
+ for ( j = 0; j < numThreads; ++j )
+ Finished[j] = false;
+ REMARK("%02d threads; Iteration %03d\r", numThreads, i);
+ }
+ }
+ REMARK( " \r" );
+}
+
+class DummyTask : public tbb::task {
+public:
+ task *execute() {
+ Harness::Sleep(1);
+ return NULL;
+ }
+};
+
+class SharedRootBody {
+ tbb::task *my_root;
+public:
+ SharedRootBody ( tbb::task *root ) : my_root(root) {}
+
+ void operator() ( int ) const {
+ tbb::task::enqueue( *new( tbb::task::allocate_additional_child_of(*my_root) ) DummyTask );
+ }
+};
+
+//! Test for enqueuing children of the same root from different master threads
+void TestSharedRoot ( int p ) {
+ REMARK("Testing enqueuing siblings from different masters\n");
+ tbb::task_scheduler_init init(p);
+ tbb::task *root = new ( tbb::task::allocate_root() ) tbb::empty_task;
+ root->set_ref_count(1);
+ for( int n = MinThread; n <= MaxThread; ++n ) {
+ REMARK("%d masters, %d requested workers\r", n, p-1);
+ NativeParallelFor( n, SharedRootBody(root) );
+ }
+ REMARK( " \r" );
+ root->wait_for_all();
+ tbb::task::destroy(*root);
+}
+
+class BlockingTask : public tbb::task {
+ Harness::SpinBarrier &m_Barrier;
+
+ tbb::task* execute () {
+ m_Barrier.wait();
+ return 0;
+ }
+
+public:
+ BlockingTask ( Harness::SpinBarrier& bar ) : m_Barrier(bar) {}
+};
+
+//! Test making sure that masters can dequeue tasks
+/** Success criterion is not hanging. **/
+void TestDequeueByMaster () {
+ REMARK("Testing task dequeuing by master\n");
+ tbb::task_scheduler_init init(1);
+ Harness::SpinBarrier bar(2);
+ tbb::task &r = *new ( tbb::task::allocate_root() ) tbb::empty_task;
+ r.set_ref_count(3);
+ tbb::task::enqueue( *new(r.allocate_child()) BlockingTask(bar) );
+ tbb::task::enqueue( *new(r.allocate_child()) BlockingTask(bar) );
+ r.wait_for_all();
+ tbb::task::destroy(r);
+}
+
+int TestMain () {
+ TestDequeueByMaster();
+ TestCascadedEnqueue();
+ for( int p=MinThread; p<=MaxThread; ++p ) {
+ TestEnqueue(p);
+ TestSharedRoot(p);
+ }
+ return Harness::Done;
+}
diff --git a/src/test/test_task_group.cpp b/src/test/test_task_group.cpp
index da036ba..647feef 100644
--- a/src/test/test_task_group.cpp
+++ b/src/test/test_task_group.cpp
@@ -68,6 +68,7 @@
#endif /* !TBBTEST_USE_TBB */
+#if __TBB_TASK_GROUP_CONTEXT
#include "tbb/atomic.h"
#include "harness_concurrency_tracker.h"
@@ -134,7 +135,7 @@ class SharedGroupBodyImpl : NoCopy, Harness::NoAfterlife {
__TBB_Yield();
const uint_t numSpawned = c_numTasks0 + c_numTasks1 * (m_numThreads - 1);
ASSERT ( m_tasksSpawned == numSpawned, "Wrong number of spawned tasks. The test is broken" );
- REMARK("Max spawning parallelism is %u out of %u", Harness::ConcurrencyTracker::PeakParallelism(), g_MaxConcurrency);
+ REMARK("Max spawning parallelism is %u out of %u\n", Harness::ConcurrencyTracker::PeakParallelism(), g_MaxConcurrency);
if ( m_sharingMode & ParallelWait ) {
m_barrier.wait( &Harness::ConcurrencyTracker::Reset );
{
@@ -203,7 +204,7 @@ atomic_t SharedGroupBodyImpl::s_tasksExecuted;
class SharedGroupBody : NoAssign, Harness::NoAfterlife {
bool m_bOwner;
- mutable SharedGroupBodyImpl *m_pImpl;
+ SharedGroupBodyImpl *m_pImpl;
public:
SharedGroupBody ( uint_t numThreads, uint_t sharingMode = 0 )
: m_bOwner(true)
@@ -250,7 +251,7 @@ atomic_t g_Sum;
#define FIB_TEST_EPILOGUE(sum) \
ASSERT( sum == numRepeats * F, NULL ); \
- REMARK("Realized parallelism in Fib test is %u out of %u", Harness::ConcurrencyTracker::PeakParallelism(), g_MaxConcurrency)
+ REMARK("Realized parallelism in Fib test is %u out of %u\n", Harness::ConcurrencyTracker::PeakParallelism(), g_MaxConcurrency)
//------------------------------------------------------------------------
// Test for a complex tree of task groups
@@ -484,7 +485,7 @@ void TestFibWithLambdas () {
//------------------------------------------------------------------------
void TestFibWithMakeTask () {
- REMARK ("Make_task test");
+ REMARK ("Make_task test\n");
atomic_t sum;
sum = 0;
Concurrency::task_group rg;
@@ -679,12 +680,12 @@ void StructuredLaunchChildren () {
count = 0;
Concurrency::structured_task_group g;
bool exceptionCaught = false;
- typedef Concurrency::task_handle<ThrowingTask> handle_type;
- static const unsigned hSize = sizeof(handle_type);
+ typedef Concurrency::task_handle<ThrowingTask> throwing_handle_type;
+ static const unsigned hSize = sizeof(throwing_handle_type);
char handles[NUM_CHORES * hSize];
for( unsigned i = 0; i < NUM_CHORES; ++i ) {
- handle_type *h = (handle_type*)(handles + i * hSize);
- new ( h ) handle_type( ThrowingTask(count) );
+ throwing_handle_type *h = (throwing_handle_type*)(handles + i * hSize);
+ new ( h ) throwing_handle_type( ThrowingTask(count) );
g.run( *h );
}
__TBB_TRY {
@@ -704,7 +705,7 @@ void StructuredLaunchChildren () {
} CATCH_ANY();
ASSERT( !g_Throw || exceptionCaught, "No exception in the child task group" );
for( unsigned i = 0; i < NUM_CHORES; ++i )
- ((handle_type*)(handles + i * hSize))->~handle_type();
+ ((throwing_handle_type*)(handles + i * hSize))->~throwing_handle_type();
if ( g_Rethrow && g_ExceptionCount > SKIP_GROUPS ) {
#if __TBB_SILENT_CANCELLATION_BROKEN
g_CancellationPropagationInProgress = true;
@@ -846,3 +847,13 @@ int TestMain () {
#endif
return Harness::Done;
}
+
+#else /* !__TBB_TASK_GROUP_CONTEXT */
+
+#include "harness.h"
+
+int TestMain () {
+ return Harness::Skipped;
+}
+
+#endif /* !__TBB_TASK_GROUP_CONTEXT */
diff --git a/src/test/test_task_leaks.cpp b/src/test/test_task_leaks.cpp
index 07cbee7..5a7c629 100644
--- a/src/test/test_task_leaks.cpp
+++ b/src/test/test_task_leaks.cpp
@@ -38,6 +38,21 @@
switching producer thread, and the check is repeated.
*/
+#if HARNESS_USE_PROXY
+
+// The test includes injects scheduler directly, so skip it when proxy tested.
+
+#undef HARNESS_USE_PROXY
+#include "harness.h"
+#undef __TBB_DYNAMIC_LOAD_ENABLED
+#include "harness_tbb_independence.h"
+
+int TestMain () {
+ return Harness::Skipped;
+}
+
+#else // HARNESS_USE_PROXY
+
#define __TBB_COUNT_TASK_NODES 1
#include "harness_inject_scheduler.h"
@@ -92,7 +107,7 @@ public:
if( my_depth>0 ) {
int child_count = my_child_count;
scheduler* my_sched = internal::governor::local_scheduler();
- tbb::task& c = *new( tbb::task::allocate_continuation() ) tbb::empty_task;
+ tbb::task& c = *new( allocate_continuation() ) tbb::empty_task;
c.set_ref_count( child_count );
recycle_as_child_of(c);
--child_count;
@@ -140,9 +155,9 @@ void RunTaskGenerators( bool switchProducer = false, bool checkProducer = false
dummy_root->set_ref_count( 2 );
// If no producer, start elections; some worker will take the role
if( Producer )
- dummy_root->spawn( *new( dummy_root->allocate_child() ) tbb::empty_task );
+ tbb::task::spawn( *new( dummy_root->allocate_child() ) tbb::empty_task );
else
- dummy_root->spawn( *new( dummy_root->allocate_child() ) ChangeProducer );
+ tbb::task::spawn( *new( dummy_root->allocate_child() ) ChangeProducer );
if( checkProducer && !Producer )
REPORT("Warning: producer has not changed after 10 attempts; running on a single core?\n");
for( int j=0; j<100; ++j ) {
@@ -150,13 +165,13 @@ void RunTaskGenerators( bool switchProducer = false, bool checkProducer = false
tbb::task& t = *new( tbb::task::allocate_root() ) TaskGenerator(/*child_count=*/4, /*depth=*/6);
tbb::task::spawn_root_and_wait(t);
} else {
- tbb::task& t = *new (dummy_root->allocate_additional_child_of(*dummy_root))
+ tbb::task& t = *new (tbb::task::allocate_additional_child_of(*dummy_root))
TaskGenerator(/*child_count=*/4, /*depth=*/6);
tbb::task::enqueue(t);
}
}
dummy_root->wait_for_all();
- dummy_root->destroy( *dummy_root );
+ tbb::task::destroy( *dummy_root );
}
class TaskList: public tbb::task {
@@ -276,3 +291,5 @@ int TestMain () {
return Harness::Done;
}
+#endif // HARNESS_USE_PROXY
+
diff --git a/src/test/test_task_priority.cpp b/src/test/test_task_priority.cpp
index 056c685..9050ca2 100644
--- a/src/test/test_task_priority.cpp
+++ b/src/test/test_task_priority.cpp
@@ -28,19 +28,17 @@
#include "harness.h"
-#ifndef TBB_PREVIEW_TASK_PRIORITY
- #define TBB_PREVIEW_TASK_PRIORITY __TBB_TASK_PRIORITY
-#endif
+#if __TBB_TASK_GROUP_CONTEXT
#include "tbb/task.h"
#include "tbb/task_scheduler_init.h"
#include "tbb/atomic.h"
#include <cstdlib>
-const int NumIterations = 1000;
+const int NumIterations = 100;
const int NumLeafTasks = 2;
-int MinBaseDepth = 8;
-int MaxBaseDepth = 12;
+int MinBaseDepth = 9;
+int MaxBaseDepth = 11;
int BaseDepth = 0;
const int NumTests = 8;
@@ -102,14 +100,14 @@ class LeafTask : public tbb::task {
for ( int i = 0; i < NumIterations; ++i )
anchor += i;
__TBB_FetchAndAddW(g_LeavesExecuted + m_tid, 1);
-#if TBB_PREVIEW_TASK_PRIORITY
+#if __TBB_TASK_PRIORITY
ASSERT( !m_opts || (m_opts & Flog) || (!(m_opts & TestPreemption) ^ (m_tid == PreemptionActivatorId)), NULL );
if ( (m_opts & TestPreemption) && g_LeavesExecuted[0] > P && group_priority() == tbb::priority_normal ) {
ASSERT( m_tid == PreemptionActivatorId, NULL );
ASSERT( (PreemptionActivatorId == 1 ? High > tbb::priority_normal : Low < tbb::priority_normal), NULL );
set_group_priority( PreemptionActivatorId == 1 ? High : Low );
}
-#endif /* TBB_PREVIEW_TASK_PRIORITY */
+#endif /* __TBB_TASK_PRIORITY */
return NULL;
}
public:
@@ -130,11 +128,11 @@ protected:
ASSERT( m_depth > 0, NULL );
if ( g_LeavesExecuted[m_tid] % (100 / m_depth) == 0 ) {
if ( m_opts & Flog ) {
-#if TBB_PREVIEW_TASK_PRIORITY
+#if __TBB_TASK_PRIORITY
task *r = m_opts & FlogEncloser ? this : m_root;
tbb::priority_t p = r->group_priority();
r->set_group_priority( p == Low ? High : Low );
-#endif /* TBB_PREVIEW_TASK_PRIORITY */
+#endif /* __TBB_TASK_PRIORITY */
}
else
__TBB_Yield();
@@ -208,7 +206,7 @@ public:
tbb::task_scheduler_init init(P-1);
tbb::task_group_context ctx (tbb::task_group_context::isolated);
tbb::empty_task &r = *new( tbb::task::allocate_root(ctx) ) tbb::empty_task;
- const int R = 8;
+ const int R = 4;
r.set_ref_count( R * P + 1 );
// Only thread 1 changes its task tree priority in preemption test mode
uintptr_t opts = m_opts & (id == PreemptionActivatorId ? ~0u : ~(uintptr_t)TestPreemption);
@@ -293,19 +291,27 @@ void TestPrioritySwitchBetweenTwoMasters () {
RunPrioritySwitchBetweenTwoMasters<BlockingNodeTask>( 1, TestPreemption );
RunPrioritySwitchBetweenTwoMasters<NonblockingNodeTask>( 2, NoPriorities );
RunPrioritySwitchBetweenTwoMasters<NonblockingNodeTask>( 3, TestPreemption );
- RunPrioritySwitchBetweenTwoMasters<BlockingNodeTask>( 4, Flog );
- RunPrioritySwitchBetweenTwoMasters<NonblockingNodeTask>( 5, Flog );
- RunPrioritySwitchBetweenTwoMasters<NestedGroupNodeTask>( 6, Flog );
- RunPrioritySwitchBetweenTwoMasters<NestedGroupNodeTask>( 7, FlogEncloser );
+ if ( i == 0 ) {
+ RunPrioritySwitchBetweenTwoMasters<BlockingNodeTask>( 4, Flog );
+ RunPrioritySwitchBetweenTwoMasters<NonblockingNodeTask>( 5, Flog );
+ RunPrioritySwitchBetweenTwoMasters<NestedGroupNodeTask>( 6, Flog );
+ RunPrioritySwitchBetweenTwoMasters<NestedGroupNodeTask>( 7, FlogEncloser );
+ }
}
}
+#if __TBB_TASK_PRIORITY
const int NumRuns = TestRepeats * (MaxBaseDepth - MinBaseDepth + 1);
for ( int i = 0; i < NumTests; ++i ) {
if ( g_TestFailures[i] )
REMARK( "Test %d: %d failures in %d runs\n", i, g_TestFailures[i], NumRuns );
- if ( g_TestFailures[i] * 100 / NumRuns > 45 )
- REPORT( "Warning: test %d misbehaved too often (%d out of %d)\n", i, g_TestFailures[i], NumRuns );
+ if ( g_TestFailures[i] * 100 / NumRuns > 50 ) {
+ if ( i == 1 )
+ REPORT( "Known issue: priority effect is limited in case of blocking-style nesting\n" );
+ else
+ REPORT( "Warning: test %d misbehaved too often (%d out of %d)\n", i, g_TestFailures[i], NumRuns );
+ }
}
+#endif /* __TBB_TASK_PRIORITY */
ClearGlobals();
}
@@ -345,13 +351,13 @@ int TestSimplePriorityOps ( tbb::priority_t prio ) {
void EmulateWork( int ) {
for ( int i = 0; i < 1000; ++i )
__TBB_Yield();
-};
+}
class PeriodicActivitiesBody {
public:
void operator() ( int id ) const {
tbb::task_group_context ctx;
-#if TBB_PREVIEW_TASK_PRIORITY
+#if __TBB_TASK_PRIORITY
ctx.set_priority( id ? High : Low );
#else /* !__TBB_TASK_PRIORITY */
(void)id;
@@ -371,7 +377,7 @@ void TestPeriodicConcurrentActivities () {
#include "harness_bad_expr.h"
void TestPriorityAssertions () {
-#if TRY_BAD_EXPR_ENABLED && TBB_PREVIEW_TASK_PRIORITY
+#if TRY_BAD_EXPR_ENABLED && __TBB_TASK_PRIORITY
REMARK( "TestPriorityAssertions\n" );
tbb::priority_t bad_low_priority = tbb::priority_t( tbb::priority_low - 1 ),
bad_high_priority = tbb::priority_t( tbb::priority_high + 1 );
@@ -383,17 +389,17 @@ void TestPriorityAssertions () {
TRY_BAD_EXPR( tbb::task::enqueue( t, bad_high_priority ), "Invalid priority level value" );
// Restore normal assertion handling
tbb::set_assertion_handler( NULL );
-#endif /* TRY_BAD_EXPR_ENABLED && TBB_PREVIEW_TASK_PRIORITY */
+#endif /* TRY_BAD_EXPR_ENABLED && __TBB_TASK_PRIORITY */
}
int TestMain () {
-#if !TBB_PREVIEW_TASK_PRIORITY
+#if !__TBB_TASK_PRIORITY
REMARK( "Priorities disabled: Running as just yet another task scheduler test\n" );
-#endif /* TBB_PREVIEW_TASK_PRIORITY */
+#endif /* __TBB_TASK_PRIORITY */
TestPriorityAssertions();
TestSimplePriorityOps(tbb::priority_low);
TestSimplePriorityOps(tbb::priority_high);
- P = min( tbb::task_scheduler_init::default_num_threads(), 8 );
+ P = tbb::task_scheduler_init::default_num_threads();
if ( P < 3 )
return Harness::Skipped;
TestPeriodicConcurrentActivities();
@@ -410,3 +416,11 @@ int TestMain () {
TestPrioritySwitchBetweenTwoMasters();
return Harness::Done;
}
+
+#else /* !__TBB_TASK_GROUP_CONTEXT */
+
+int TestMain () {
+ return Harness::Skipped;
+}
+
+#endif /* !__TBB_TASK_GROUP_CONTEXT */
diff --git a/src/test/test_task_scheduler_observer.cpp b/src/test/test_task_scheduler_observer.cpp
index 715d0ae..3d8894c 100644
--- a/src/test/test_task_scheduler_observer.cpp
+++ b/src/test/test_task_scheduler_observer.cpp
@@ -81,8 +81,8 @@ public:
ASSERT( !(~LocalState->MyFlags & flags), NULL );
if( n>=2 ) {
set_ref_count(3);
- spawn(*new( tbb::task::allocate_child() ) FibTask(n-1,flags));
- spawn_and_wait_for_all(*new( tbb::task::allocate_child() ) FibTask(n-2,flags));
+ spawn(*new( allocate_child() ) FibTask(n-1,flags));
+ spawn_and_wait_for_all(*new( allocate_child() ) FibTask(n-2,flags));
}
return NULL;
}
diff --git a/src/test/test_tbb_header.cpp b/src/test/test_tbb_header.cpp
index fdea4d2..727610d 100644
--- a/src/test/test_tbb_header.cpp
+++ b/src/test/test_tbb_header.cpp
@@ -148,12 +148,17 @@ int TestMain ()
TestTypeDefinitionPresence( spin_rw_mutex );
TestTypeDefinitionPresence( critical_section );
TestTypeDefinitionPresence( reader_writer_lock );
+#if __TBB_TASK_GROUP_CONTEXT
TestTypeDefinitionPresence( tbb_exception );
TestTypeDefinitionPresence( captured_exception );
TestTypeDefinitionPresence( movable_exception<int> );
#if !TBB_USE_CAPTURED_EXCEPTION
TestTypeDefinitionPresence( internal::tbb_exception_ptr );
#endif /* !TBB_USE_CAPTURED_EXCEPTION */
+ TestTypeDefinitionPresence( task_group_context );
+ TestTypeDefinitionPresence( task_group );
+ TestTypeDefinitionPresence( task_handle<Body> );
+#endif /* __TBB_TASK_GROUP_CONTEXT */
TestTypeDefinitionPresence( blocked_range3d<int> );
TestFuncDefinitionPresence( parallel_invoke, (const Body&, const Body&), void );
TestFuncDefinitionPresence( parallel_do, (int*, int*, const Body1&), void );
@@ -169,9 +174,6 @@ int TestMain ()
TestTypeDefinitionPresence( task );
TestTypeDefinitionPresence( empty_task );
TestTypeDefinitionPresence( task_list );
- TestTypeDefinitionPresence( task_group_context );
- TestTypeDefinitionPresence( task_group );
- TestTypeDefinitionPresence( task_handle<Body> );
TestTypeDefinitionPresence( task_scheduler_init );
TestTypeDefinitionPresence( task_scheduler_observer );
TestTypeDefinitionPresence( tbb_thread );
diff --git a/src/test/test_tbb_version.cpp b/src/test/test_tbb_version.cpp
index 94c55ad..4fabf3c 100644
--- a/src/test/test_tbb_version.cpp
+++ b/src/test/test_tbb_version.cpp
@@ -81,6 +81,9 @@ int main(int argc, char *argv[] ) {
ASSERT(tbb::TBB_runtime_interface_version()==TBB_INTERFACE_VERSION,
"Running with the library of different version than the test was compiled against");
#endif
+#if __TBB_MPI_INTEROP
+ REPORT("skip\n");
+#else
__TBB_TRY {
FILE *stream_out;
FILE *stream_err;
@@ -205,6 +208,7 @@ int main(int argc, char *argv[] ) {
ASSERT( 0,"unexpected exception" );
}
REPORT("done\n");
+#endif //__TBB_MPI_INTEROP
return 0;
}
@@ -212,8 +216,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\t3.0", required)); // check TBB_VERSION
- vector->push_back(string_pair("TBB: INTERFACE VERSION\t5006", required)); // check TBB_INTERFACE_VERSION
+ vector->push_back(string_pair("TBB: VERSION\t\t4.0", required)); // check TBB_VERSION
+ vector->push_back(string_pair("TBB: INTERFACE VERSION\t6000", 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));
diff --git a/src/test/test_tuple.cpp b/src/test/test_tuple.cpp
index 7ecfeaf..5708937 100644
--- a/src/test/test_tuple.cpp
+++ b/src/test/test_tuple.cpp
@@ -29,9 +29,17 @@
// tbb::tuple
#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
-#define TBB_IMPLEMENT_CPP0X 1
#include "tbb/compat/tuple"
+#else
+#define __TESTING_STD_TUPLE__ 1
+#include <tuple>
+#endif
#include <string>
#include <iostream>
@@ -53,6 +61,11 @@ private:
void RunTests() {
+#if __TESTING_STD_TUPLE__
+ REMARK("Testing platform tuple\n");
+#else
+ REMARK("Testing compat/tuple\n");
+#endif
tuple<int> ituple1(3);
tuple<int> ituple2(5);
tuple<double> ftuple2(4.1);
@@ -142,3 +155,10 @@ 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 906b497..f618560 100644
--- a/src/test/test_write_once_node.cpp
+++ b/src/test/test_write_once_node.cpp
@@ -27,8 +27,6 @@
*/
#include "harness_graph.h"
-#define TBB_PREVIEW_GRAPH 1
-#include "tbb/graph.h"
#include "tbb/task_scheduler_init.h"
@@ -38,7 +36,7 @@
template< typename R >
void simple_read_write_tests() {
- tbb::write_once_node<R> n;
+ tbb::flow::write_once_node<R> n;
for ( int t = 0; t < T; ++t ) {
R v0(0);
@@ -55,7 +53,7 @@ void simple_read_write_tests() {
}
for (int i = 0; i < M; ++i) {
- ASSERT( n.register_successor(r[i]), NULL );
+ tbb::flow::make_edge( n, r[i] );
}
if ( t%2 ) {
@@ -90,7 +88,7 @@ void simple_read_write_tests() {
ASSERT( int(c) == 1, NULL );
}
for (int i = 0; i < M; ++i) {
- ASSERT( n.remove_successor(r[i]), NULL );
+ tbb::flow::remove_edge( n, r[i] );
}
ASSERT( n.try_put( R(0) ) == false, NULL );
for (int i = 0; i < M; ++i) {
@@ -105,11 +103,11 @@ void simple_read_write_tests() {
template< typename R >
class native_body : NoAssign {
- tbb::write_once_node<R> &my_node;
+ tbb::flow::write_once_node<R> &my_node;
public:
- native_body( tbb::write_once_node<R> &n ) : my_node(n) {}
+ native_body( tbb::flow::write_once_node<R> &n ) : my_node(n) {}
void operator()( int i ) const {
R v1(static_cast<R>(i));
@@ -122,37 +120,41 @@ public:
template< typename R >
void parallel_read_write_tests() {
- tbb::write_once_node<R> n;
+ tbb::flow::write_once_node<R> n;
+ //Create a vector of identical nodes
+ std::vector< tbb::flow::write_once_node<R> > wo_vec(2, n);
+ for (size_t node_idx=0; node_idx<wo_vec.size(); ++node_idx) {
for ( int t = 0; t < T; ++t ) {
harness_counting_receiver<R> r[M];
for (int i = 0; i < M; ++i) {
- ASSERT( n.register_successor(r[i]), NULL );
+ tbb::flow::make_edge( wo_vec[node_idx], r[i] );
}
R v0;
- ASSERT( n.is_valid() == false, NULL );
- ASSERT( n.try_get( v0 ) == false, NULL );
+ ASSERT( wo_vec[node_idx].is_valid() == false, NULL );
+ ASSERT( wo_vec[node_idx].try_get( v0 ) == false, NULL );
- ASSERT( n.try_put( R(-1) ), NULL );
+ ASSERT( wo_vec[node_idx].try_put( R(-1) ), NULL );
- NativeParallelFor( N, native_body<R>( n ) );
+ NativeParallelFor( N, native_body<R>( wo_vec[node_idx] ) );
for (int i = 0; i < M; ++i) {
size_t c = r[i].my_count;
ASSERT( int(c) == 1, NULL );
}
for (int i = 0; i < M; ++i) {
- ASSERT( n.remove_successor(r[i]), NULL );
+ tbb::flow::remove_edge( wo_vec[node_idx], r[i] );
}
- ASSERT( n.try_put( R(0) ) == false, NULL );
+ ASSERT( wo_vec[node_idx].try_put( R(0) ) == false, NULL );
for (int i = 0; i < M; ++i) {
size_t c = r[i].my_count;
ASSERT( int(c) == 1, NULL );
}
- n.clear();
- ASSERT( n.is_valid() == false, NULL );
- ASSERT( n.try_get( v0 ) == false, NULL );
+ wo_vec[node_idx].clear();
+ ASSERT( wo_vec[node_idx].is_valid() == false, NULL );
+ ASSERT( wo_vec[node_idx].try_get( v0 ) == false, NULL );
+ }
}
}
--
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